Author: lluis
Date: 2005-04-14 08:24:07 -0400 (Thu, 14 Apr 2005)
New Revision: 42997

Modified:
   trunk/mcs/class/System.Web/System.Web.UI.WebControls/AutoGeneratedField.cs
   trunk/mcs/class/System.Web/System.Web.UI.WebControls/BoundField.cs
   trunk/mcs/class/System.Web/System.Web.UI.WebControls/ChangeLog
   trunk/mcs/class/System.Web/System.Web.UI.WebControls/CheckBoxField.cs
   trunk/mcs/class/System.Web/System.Web.UI.WebControls/CommandField.cs
   trunk/mcs/class/System.Web/System.Web.UI.WebControls/DataBoundControl.cs
   trunk/mcs/class/System.Web/System.Web.UI.WebControls/DetailsView.cs
   
trunk/mcs/class/System.Web/System.Web.UI.WebControls/DetailsViewInsertEventArgs.cs
   
trunk/mcs/class/System.Web/System.Web.UI.WebControls/DetailsViewInsertedEventArgs.cs
   trunk/mcs/class/System.Web/System.Web.UI.WebControls/ImageField.cs
   trunk/mcs/class/System.Web/System.Web.UI.WebControls/ObjectDataSource.cs
   trunk/mcs/class/System.Web/System.Web.UI.WebControls/ObjectDataSourceView.cs
   trunk/mcs/class/System.Web/System.Web.UI.WebControls/Parameter.cs
   trunk/mcs/class/System.Web/System.Web.UI.WebControls/ParameterCollection.cs
Log:
2005-04-14  Lluis Sanchez Gual <[EMAIL PROTECTED]>

        * DetailsView.cs: Implemented support for Insert operation. 
        Added header and footer templates. Added missing style
        properties. 
        * ObjectDataSourceView.cs: Use ParameterCollection.GetValues
        to get filter values. Other minor fixes.
        * CommandField.cs: Properly render the Insert and New buttons.
        * ObjectDataSource.cs: Update the parameter collections after
        the page is loaded. This will fire the ParameterChanged event
        if needed.
        * DataBoundControl.cs: The OnDataSourceViewChanged method
        is called when the view changes, not when the datasource
        changes.
        
        * DetailsViewInsertedEventArgs.cs:
        * DetailsViewInsertEventArgs.cs: Implement Values property.
        
        * ImageField.cs:
        * AutoGeneratedField.cs
        * BoundField.cs:
        * CheckBoxField.cs:
        Take into account the Insert mode.
        
        * ParameterCollection.cs: Implemented UpdateValues and fixed
        GetValues (values can't be cached because can change).
        * Parameter.cs: Detect value changes in GetValue, and fire
        the change event if needed. Removed unused ParameterValue
        property. Other fixes.



Modified: 
trunk/mcs/class/System.Web/System.Web.UI.WebControls/AutoGeneratedField.cs
===================================================================
--- trunk/mcs/class/System.Web/System.Web.UI.WebControls/AutoGeneratedField.cs  
2005-04-14 12:22:26 UTC (rev 42996)
+++ trunk/mcs/class/System.Web/System.Web.UI.WebControls/AutoGeneratedField.cs  
2005-04-14 12:24:07 UTC (rev 42997)
@@ -94,7 +94,7 @@
                [MonoTODO ("Support other data types")]
                public override void InitializeDataCell (DataControlFieldCell 
cell, DataControlRowState rowState)
                {
-                       bool editable = (rowState & DataControlRowState.Edit) 
!= 0;
+                       bool editable = (rowState & (DataControlRowState.Edit | 
DataControlRowState.Insert)) != 0;
                        
                        if (dataType == typeof(bool)) {
                                CheckBox box = new CheckBox ();

Modified: trunk/mcs/class/System.Web/System.Web.UI.WebControls/BoundField.cs
===================================================================
--- trunk/mcs/class/System.Web/System.Web.UI.WebControls/BoundField.cs  
2005-04-14 12:22:26 UTC (rev 42996)
+++ trunk/mcs/class/System.Web/System.Web.UI.WebControls/BoundField.cs  
2005-04-14 12:24:07 UTC (rev 42997)
@@ -132,7 +132,8 @@
                public override void ExtractValuesFromCell (IOrderedDictionary 
dictionary,
                        DataControlFieldCell cell, DataControlRowState 
rowState, bool includeReadOnly)
                {
-                       if ((rowState & DataControlRowState.Edit) != 0 && 
!ReadOnly) {
+                       bool editable = (rowState & (DataControlRowState.Edit | 
DataControlRowState.Insert)) != 0;
+                       if (editable && !ReadOnly) {
                                if (cell.Controls.Count > 0) {
                                        TextBox box = (TextBox) cell.Controls 
[0];
                                        dictionary [DataField] = box.Text;
@@ -154,7 +155,8 @@
                
                public virtual void InitializeDataCell (DataControlFieldCell 
cell, DataControlRowState rowState)
                {
-                       if ((rowState & DataControlRowState.Edit) != 0 && 
!ReadOnly) {
+                       bool editable = (rowState & (DataControlRowState.Edit | 
DataControlRowState.Insert)) != 0;
+                       if (editable && !ReadOnly) {
                                TextBox box = new TextBox ();
                                cell.Controls.Add (box);
                        }

Modified: trunk/mcs/class/System.Web/System.Web.UI.WebControls/ChangeLog
===================================================================
--- trunk/mcs/class/System.Web/System.Web.UI.WebControls/ChangeLog      
2005-04-14 12:22:26 UTC (rev 42996)
+++ trunk/mcs/class/System.Web/System.Web.UI.WebControls/ChangeLog      
2005-04-14 12:24:07 UTC (rev 42997)
@@ -1,3 +1,33 @@
+2005-04-14  Lluis Sanchez Gual <[EMAIL PROTECTED]>
+
+       * DetailsView.cs: Implemented support for Insert operation. 
+       Added header and footer templates. Added missing style
+       properties. 
+       * ObjectDataSourceView.cs: Use ParameterCollection.GetValues
+       to get filter values. Other minor fixes.
+       * CommandField.cs: Properly render the Insert and New buttons.
+       * ObjectDataSource.cs: Update the parameter collections after
+       the page is loaded. This will fire the ParameterChanged event
+       if needed.
+       * DataBoundControl.cs: The OnDataSourceViewChanged method
+       is called when the view changes, not when the datasource
+       changes.
+       
+       * DetailsViewInsertedEventArgs.cs:
+       * DetailsViewInsertEventArgs.cs: Implement Values property.
+       
+       * ImageField.cs:
+       * AutoGeneratedField.cs
+       * BoundField.cs:
+       * CheckBoxField.cs:
+       Take into account the Insert mode.
+       
+       * ParameterCollection.cs: Implemented UpdateValues and fixed
+       GetValues (values can't be cached because can change).
+       * Parameter.cs: Detect value changes in GetValue, and fire
+       the change event if needed. Removed unused ParameterValue
+       property. Other fixes.
+
 2005-04-08  Lluis Sanchez Gual <[EMAIL PROTECTED]>
 
        * DetailsView.cs: Initial implementation.

Modified: trunk/mcs/class/System.Web/System.Web.UI.WebControls/CheckBoxField.cs
===================================================================
--- trunk/mcs/class/System.Web/System.Web.UI.WebControls/CheckBoxField.cs       
2005-04-14 12:22:26 UTC (rev 42996)
+++ trunk/mcs/class/System.Web/System.Web.UI.WebControls/CheckBoxField.cs       
2005-04-14 12:24:07 UTC (rev 42997)
@@ -94,7 +94,7 @@
                
                public override void InitializeDataCell (DataControlFieldCell 
cell, DataControlRowState rowState)
                {
-                       bool editable = (rowState & DataControlRowState.Edit) 
!= 0;
+                       bool editable = (rowState & (DataControlRowState.Edit | 
DataControlRowState.Insert)) != 0;
                        CheckBox box = new CheckBox ();
                        box.Enabled = editable && !ReadOnly;
                        cell.Controls.Add (box);

Modified: trunk/mcs/class/System.Web/System.Web.UI.WebControls/CommandField.cs
===================================================================
--- trunk/mcs/class/System.Web/System.Web.UI.WebControls/CommandField.cs        
2005-04-14 12:22:26 UTC (rev 42996)
+++ trunk/mcs/class/System.Web/System.Web.UI.WebControls/CommandField.cs        
2005-04-14 12:24:07 UTC (rev 42997)
@@ -334,6 +334,12 @@
                                                AddSeparator (cell);
                                                cell.Controls.Add (new 
DataControlButton (Control, CancelText, CancelImageUrl, "Cancel", index, 
false));
                                        }
+                               } else if ((rowState & 
DataControlRowState.Insert) != 0) {
+                                       cell.Controls.Add (new 
DataControlButton (Control, InsertText, InsertImageUrl, "Insert", index, 
false));
+                                       if (ShowCancelButton) {
+                                               AddSeparator (cell);
+                                               cell.Controls.Add (new 
DataControlButton (Control, CancelText, CancelImageUrl, "Cancel", index, 
false));
+                                       }
                                } else {
                                        if (ShowEditButton) {
                                                AddSeparator (cell);
@@ -349,7 +355,7 @@
                                        }
                                        if (ShowInsertButton) {
                                                AddSeparator (cell);
-                                               cell.Controls.Add (new 
DataControlButton (Control, InsertText, InsertImageUrl, "Insert", index, 
false));
+                                               cell.Controls.Add (new 
DataControlButton (Control, NewText, NewImageUrl, "New", index, false));
                                        }
                                }
                        } else

Modified: 
trunk/mcs/class/System.Web/System.Web.UI.WebControls/DataBoundControl.cs
===================================================================
--- trunk/mcs/class/System.Web/System.Web.UI.WebControls/DataBoundControl.cs    
2005-04-14 12:22:26 UTC (rev 42996)
+++ trunk/mcs/class/System.Web/System.Web.UI.WebControls/DataBoundControl.cs    
2005-04-14 12:24:07 UTC (rev 42997)
@@ -43,7 +43,7 @@
        public abstract class DataBoundControl : BaseDataBoundControl
        {
                DataSourceSelectArguments selectArguments;
-               IDataSource currentSource;
+               DataSourceView currentView;
 
                protected DataBoundControl ()
                {
@@ -73,6 +73,13 @@
                
                protected DataSourceView GetData ()
                {
+                       if (currentView == null)
+                               UpdateViewData ();
+                       return currentView;
+               }
+               
+               protected DataSourceView InternalGetData ()
+               {
                        if (DataSource != null && IsBoundUsingDataSourceID)
                                throw new HttpException ("Control bound using 
both DataSourceID and DataSource properties.");
                        
@@ -86,7 +93,7 @@
                protected override void OnDataPropertyChanged ()
                {
                        base.OnDataPropertyChanged ();
-                       SubscribeSourceChangeEvent ();
+                       UpdateViewData ();
                }
                
                protected virtual void OnDataSourceViewChanged (object sender, 
EventArgs e)
@@ -97,20 +104,21 @@
                protected override void OnPagePreLoad (object sender, EventArgs 
e)
                {
                        base.OnPagePreLoad (sender, e);
-                       SubscribeSourceChangeEvent ();
+                       UpdateViewData ();
                }
                
-               void SubscribeSourceChangeEvent ()
+               void UpdateViewData ()
                {
-                       IDataSource ds = GetDataSource ();
-                       
-                       if (currentSource != null && currentSource != ds) {
-                               currentSource.DataSourceChanged -= new 
EventHandler (OnDataSourceViewChanged);
-                               currentSource = ds;
-                       }
-                               
-                       if (ds != null)
-                               ds.DataSourceChanged += new EventHandler 
(OnDataSourceViewChanged);
+                       DataSourceView view = InternalGetData ();
+                       if (view == currentView) return;
+
+                       if (currentView != null)
+                               currentView.DataSourceViewChanged -= new 
EventHandler (OnDataSourceViewChanged);
+
+                       currentView = view;
+
+                       if (view != null)
+                               view.DataSourceViewChanged += new EventHandler 
(OnDataSourceViewChanged);
                }
                
                // should be `internal protected' (why, oh WHY did they do that 
!?!)

Modified: trunk/mcs/class/System.Web/System.Web.UI.WebControls/DetailsView.cs
===================================================================
--- trunk/mcs/class/System.Web/System.Web.UI.WebControls/DetailsView.cs 
2005-04-14 12:22:26 UTC (rev 42996)
+++ trunk/mcs/class/System.Web/System.Web.UI.WebControls/DetailsView.cs 
2005-04-14 12:24:07 UTC (rev 42997)
@@ -63,9 +63,14 @@
                
                ITemplate pagerTemplate;
                ITemplate emptyDataTemplate;
+               ITemplate headerTemplate;
+               ITemplate footerTemplate;
                
                PropertyDescriptor[] cachedKeyProperties;
                readonly string[] emptyKeys = new string[0];
+               
+               CommandField commandField;
+               DetailsViewRow commandRow;
                        
                // View state
                DataControlFieldCollection columns;
@@ -73,11 +78,15 @@
                
                TableItemStyle alternatingRowStyle;
                TableItemStyle editRowStyle;
+               TableItemStyle insertRowStyle;
                TableItemStyle emptyDataRowStyle;
                TableItemStyle footerStyle;
                TableItemStyle headerStyle;
                TableItemStyle pagerStyle;
                TableItemStyle rowStyle;
+               TableItemStyle commandRowStyle;
+               TableItemStyle fieldHeaderStyle;
+               
                DataKey key;
                DataKey oldEditValues;
                AutoGeneratedFieldProperties[] autoFieldProperties;
@@ -88,7 +97,10 @@
                private static readonly object ItemCreatedEvent = new object();
                private static readonly object ItemDeletedEvent = new object();
                private static readonly object ItemDeletingEvent = new object();
+               private static readonly object ItemInsertedEvent = new object();
+               private static readonly object ItemInsertingEvent = new 
object();
                private static readonly object ModeChangingEvent = new object();
+               private static readonly object ModeChangedEvent = new object();
                private static readonly object ItemUpdatedEvent = new object();
                private static readonly object ItemUpdatingEvent = new object();
                
@@ -131,11 +143,26 @@
                        remove { Events.RemoveHandler (ItemDeletingEvent, 
value); }
                }
                
+               public event DetailsViewInsertedEventHandler ItemInserted {
+                       add { Events.AddHandler (ItemInsertedEvent, value); }
+                       remove { Events.RemoveHandler (ItemInsertedEvent, 
value); }
+               }
+               
+               public event DetailsViewInsertEventHandler ItemInserting {
+                       add { Events.AddHandler (ItemInsertingEvent, value); }
+                       remove { Events.RemoveHandler (ItemInsertingEvent, 
value); }
+               }
+               
                public event DetailsViewModeEventHandler ModeChanging {
                        add { Events.AddHandler (ModeChangingEvent, value); }
                        remove { Events.RemoveHandler (ModeChangingEvent, 
value); }
                }
                
+               public event EventHandler ModeChanged {
+                       add { Events.AddHandler (ModeChangedEvent, value); }
+                       remove { Events.RemoveHandler (ModeChangedEvent, 
value); }
+               }
+               
                public event DetailsViewUpdatedEventHandler ItemUpdated {
                        add { Events.AddHandler (ItemUpdatedEvent, value); }
                        remove { Events.RemoveHandler (ItemUpdatedEvent, 
value); }
@@ -186,6 +213,22 @@
                        }
                }
                
+               protected virtual void OnItemInserted 
(DetailsViewInsertedEventArgs e)
+               {
+                       if (Events != null) {
+                               DetailsViewInsertedEventHandler eh = 
(DetailsViewInsertedEventHandler) Events [ItemInsertedEvent];
+                               if (eh != null) eh (this, e);
+                       }
+               }
+               
+               protected virtual void OnItemInserting 
(DetailsViewInsertEventArgs e)
+               {
+                       if (Events != null) {
+                               DetailsViewInsertEventHandler eh = 
(DetailsViewInsertEventHandler) Events [ItemInsertingEvent];
+                               if (eh != null) eh (this, e);
+                       }
+               }
+               
                protected virtual void OnItemDeleting 
(DetailsViewDeleteEventArgs e)
                {
                        if (Events != null) {
@@ -194,6 +237,14 @@
                        }
                }
                
+               protected virtual void OnModeChanged (EventArgs e)
+               {
+                       if (Events != null) {
+                               EventHandler eh = (EventHandler) Events 
[ModeChangedEvent];
+                               if (eh != null) eh (this, e);
+                       }
+               }
+               
                protected virtual void OnModeChanging (DetailsViewModeEventArgs 
e)
                {
                        if (Events != null) {
@@ -278,6 +329,20 @@
                }
 
                [WebCategoryAttribute ("Behavior")]
+               [DefaultValueAttribute (false)]
+               public virtual bool AutoGenerateInsertButton {
+                       get {
+                               object ob = ViewState 
["AutoGenerateInsertButton"];
+                               if (ob != null) return (bool) ob;
+                               return false;
+                       }
+                       set {
+                               ViewState ["AutoGenerateInsertButton"] = value;
+                               RequireBinding ();
+                       }
+               }
+
+               [WebCategoryAttribute ("Behavior")]
                [DefaultValueAttribute (true)]
                public virtual bool AutoGenerateRows {
                        get {
@@ -376,6 +441,22 @@
                        }
                }
                
+               [DefaultValueAttribute (null)]
+           [WebCategoryAttribute ("Styles")]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+               [NotifyParentProperty (true)]
+               [DesignerSerializationVisibility 
(DesignerSerializationVisibility.Content)]
+               public virtual TableItemStyle CommandRowStyle {
+                       get {
+                               if (commandRowStyle == null) {
+                                       commandRowStyle = new TableItemStyle ();
+                                       if (IsTrackingViewState)
+                                               
commandRowStyle.TrackViewState();
+                               }
+                               return commandRowStyle;
+                       }
+               }
+
            [DesignerSerializationVisibilityAttribute 
(DesignerSerializationVisibility.Hidden)]
            [BrowsableAttribute (false)]
                public DetailsViewMode CurrentMode {
@@ -384,6 +465,20 @@
                        }
                }
        
+           [DefaultValueAttribute (DetailsViewMode.ReadOnly)]
+           [WebCategoryAttribute ("Behavior")]
+               public virtual DetailsViewMode DefaultMode {
+                       get {
+                               object o = ViewState ["DefaultMode"];
+                               if (o != null) return (DetailsViewMode) o;
+                               return DetailsViewMode.ReadOnly;
+                       }
+                       set {
+                               ViewState ["DefaultMode"] = value;
+                               RequireBinding ();
+                       }
+               }
+       
                [EditorAttribute 
("System.Web.UI.Design.WebControls.DataControlFieldTypeEditor, System.Design, 
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", 
"System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, 
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
                [MergablePropertyAttribute (false)]
                [PersistenceModeAttribute (PersistenceMode.InnerProperty)]
@@ -497,6 +592,22 @@
                        }
                }
        
+           [WebCategoryAttribute ("Styles")]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+               [NotifyParentProperty (true)]
+               [DefaultValue (null)]
+               [DesignerSerializationVisibility 
(DesignerSerializationVisibility.Content)]
+               public virtual TableItemStyle FieldHeaderStyle {
+                       get {
+                               if (fieldHeaderStyle == null) {
+                                       fieldHeaderStyle = new TableItemStyle 
();
+                                       if (IsTrackingViewState)
+                                               
fieldHeaderStyle.TrackViewState();
+                               }
+                               return fieldHeaderStyle;
+                       }
+               }
+               
                [DesignerSerializationVisibilityAttribute 
(DesignerSerializationVisibility.Hidden)]
                [BrowsableAttribute (false)]
                public virtual DetailsViewRow FooterRow {
@@ -506,6 +617,30 @@
                        }
                }
        
+               [DefaultValue (null)]
+               [TemplateContainer (typeof(DetailsView), 
BindingDirection.OneWay)]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+           [Browsable (false)]
+               public ITemplate FooterTemplate {
+                       get { return footerTemplate; }
+                       set { footerTemplate = value; RequireBinding (); }
+               }
+
+           [LocalizableAttribute (true)]
+           [WebCategoryAttribute ("Appearance")]
+           [DefaultValueAttribute ("")]
+               public string FooterText {
+                       get {
+                               object ob = ViewState ["FooterText"];
+                               if (ob != null) return (string) ob;
+                               return string.Empty;
+                       }
+                       set {
+                               ViewState ["FooterText"] = value;
+                               RequireBinding ();
+                       }
+               }
+               
            [WebCategoryAttribute ("Styles")]
                [PersistenceMode (PersistenceMode.InnerProperty)]
                [NotifyParentProperty (true)]
@@ -560,6 +695,30 @@
                        }
                }
                
+               [DefaultValue (null)]
+               [TemplateContainer (typeof(DetailsView), 
BindingDirection.OneWay)]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+           [Browsable (false)]
+               public ITemplate HeaderTemplate {
+                       get { return headerTemplate; }
+                       set { headerTemplate = value; RequireBinding (); }
+               }
+
+           [LocalizableAttribute (true)]
+           [WebCategoryAttribute ("Appearance")]
+           [DefaultValueAttribute ("")]
+               public string HeaderText {
+                       get {
+                               object ob = ViewState ["HeaderText"];
+                               if (ob != null) return (string) ob;
+                               return string.Empty;
+                       }
+                       set {
+                               ViewState ["HeaderText"] = value;
+                               RequireBinding ();
+                       }
+               }
+               
                [DefaultValueAttribute (HorizontalAlign.NotSet)]
                public virtual HorizontalAlign HorizontalAlign {
                        get {
@@ -573,6 +732,22 @@
                        }
                }
 
+           [WebCategoryAttribute ("Styles")]
+               [PersistenceMode (PersistenceMode.InnerProperty)]
+               [NotifyParentProperty (true)]
+               [DesignerSerializationVisibility 
(DesignerSerializationVisibility.Content)]
+           [DefaultValueAttribute (null)]
+               public virtual TableItemStyle InsertRowStyle {
+                       get {
+                               if (insertRowStyle == null) {
+                                       insertRowStyle = new TableItemStyle ();
+                                       if (IsTrackingViewState)
+                                               insertRowStyle.TrackViewState();
+                               }
+                               return insertRowStyle;
+                       }
+               }
+               
                [BrowsableAttribute (false)]
                [DesignerSerializationVisibilityAttribute 
(DesignerSerializationVisibility.Hidden)]
                public int PageCount {
@@ -684,7 +859,19 @@
                                return dataItem;
                        }
                }
+               
+               [DesignerSerializationVisibilityAttribute 
(DesignerSerializationVisibility.Hidden)]
+               [BrowsableAttribute (false)]
+               public int DataItemCount {
+                       get { return PageCount; }
+               }               
        
+               [DesignerSerializationVisibilityAttribute 
(DesignerSerializationVisibility.Hidden)]
+               [BrowsableAttribute (false)]
+               public int DataItemIndex {
+                       get { return PageIndex; }
+               }               
+       
                public virtual bool IsBindableType (Type type)
                {
                        return type.IsPrimitive || type == typeof(string) || 
type == typeof(DateTime) || type == typeof(Guid);
@@ -712,11 +899,13 @@
                        
                        fields.AddRange (Fields);
                        
-                       if (AutoGenerateEditButton || AutoGenerateDeleteButton) 
{
+                       if (AutoGenerateEditButton || AutoGenerateDeleteButton 
|| AutoGenerateInsertButton) {
                                CommandField field = new CommandField ();
                                field.ShowEditButton = AutoGenerateEditButton;
                                field.ShowDeleteButton = 
AutoGenerateDeleteButton;
+                               field.ShowInsertButton = 
AutoGenerateInsertButton;
                                fields.Add (field);
+                               commandField = field;
                        }
                        
                        return fields;
@@ -834,6 +1023,10 @@
                        Controls.Add (table);
                                
                        ArrayList list = new ArrayList ();
+
+                       if (!Page.IsPostBack)
+                               currentMode = DefaultMode;
+
                        
                        // Gets the current data item
                        
@@ -857,6 +1050,18 @@
 
                        // Main table creation
                        
+                       if (HeaderText.Length != 0 || headerTemplate != null) {
+                               headerRow = CreateRow (-1, 
DataControlRowType.Header, DataControlRowState.Normal);
+                               DataControlFieldCell cell = new 
DataControlFieldCell (null);
+                               cell.ColumnSpan = 2;
+                               if (headerTemplate != null)
+                                       headerTemplate.InstantiateIn (cell);
+                               else
+                                       cell.Text = HeaderText;
+                               headerRow.Cells.Add (cell);
+                               table.Rows.Add (headerRow);
+                       }
+                       
                        if (showPager && PagerSettings.Position == 
PagerPosition.Top || PagerSettings.Position == PagerPosition.TopAndBottom) {
                                topPagerRow = CreatePagerRow (dataSource);
                                table.Rows.Add (topPagerRow);
@@ -868,9 +1073,15 @@
                                table.Rows.Add (row);
                                list.Add (row);
                                InitializeRow (row, field);
-                               if (dataBinding)
+                               if (dataBinding && CurrentMode != 
DetailsViewMode.Insert)
                                        row.DataBind ();
+                                       
+                               if (commandField == field)
+                                       commandRow = row;
                        }
+
+                       rows = new DetailsViewRowCollection (list);
+                       
                        if (dataBinding) {
                                if (CurrentMode == DetailsViewMode.Edit)
                                        oldEditValues = new DataKey 
(GetRowValues (false, true));
@@ -889,7 +1100,17 @@
                                table.Rows.Add (bottomPagerRow);
                        }
 
-                       rows = new DetailsViewRowCollection (list);
+                       if (FooterText.Length != 0 || footerTemplate != null) {
+                               footerRow = CreateRow (-1, 
DataControlRowType.Footer, DataControlRowState.Normal);
+                               DataControlFieldCell cell = new 
DataControlFieldCell (null);
+                               cell.ColumnSpan = 2;
+                               if (footerTemplate != null)
+                                       footerTemplate.InstantiateIn (cell);
+                               else
+                                       cell.Text = FooterText;
+                               footerRow.Cells.Add (cell);
+                               table.Rows.Add (footerRow);
+                       }
                        
                        return dataSource.DataSourceCount;
                }
@@ -898,6 +1119,7 @@
                {
                        DataControlRowState rstate = (index % 2) == 0 ? 
DataControlRowState.Normal : DataControlRowState.Alternate;
                        if (CurrentMode == DetailsViewMode.Edit) rstate |= 
DataControlRowState.Edit;
+                       else if (CurrentMode == DetailsViewMode.Insert) rstate 
|= DataControlRowState.Insert;
                        return rstate;
                }
                
@@ -1086,9 +1308,13 @@
                                        break;
                                        
                                case "Edit":
-                                       EditRow ();
+                                       ChangeMode (DetailsViewMode.Edit);
                                        break;
                                        
+                               case "New":
+                                       ChangeMode (DetailsViewMode.Insert);
+                                       break;
+                                       
                                case "Update":
                                        UpdateItem (param, true);
                                        break;
@@ -1100,6 +1326,10 @@
                                case "Delete":
                                        DeleteItem ();
                                        break;
+                                       
+                               case "Insert":
+                                       InsertItem (true);
+                                       break;
                        }
                }
                
@@ -1114,12 +1344,13 @@
                        }
                }
                
-               void EditRow ()
+               public void ChangeMode (DetailsViewMode newMode)
                {
-                       DetailsViewModeEventArgs args = new 
DetailsViewModeEventArgs (DetailsViewMode.Edit, false);
+                       DetailsViewModeEventArgs args = new 
DetailsViewModeEventArgs (newMode, false);
                        OnModeChanging (args);
                        if (!args.Cancel) {
                                currentMode = args.NewMode;
+                               OnModeChanged (EventArgs.Empty);
                                RequireBinding ();
                        }
                }
@@ -1171,7 +1402,41 @@
 
                        return dargs.ExceptionHandled;
                }
+
+               public virtual void InsertItem (bool causesValidation)
+               {
+                       InsertItem (null, causesValidation);
+               }
                
+               void InsertItem (string param, bool causesValidation)
+               {
+                       if (causesValidation)
+                               Page.Validate ();
+                       
+                       if (currentMode != DetailsViewMode.Insert) throw new 
NotSupportedException ();
+                       
+                       currentEditNewValues = GetRowValues (false, true);
+                       DetailsViewInsertEventArgs args = new 
DetailsViewInsertEventArgs (param, currentEditNewValues);
+                       OnItemInserting (args);
+                       if (!args.Cancel) {
+                               DataSourceView view = GetData ();
+                               if (view == null) throw new HttpException ("The 
DataSourceView associated to data bound control was null");
+                               view.Insert (currentEditNewValues, new 
DataSourceViewOperationCallback (InsertCallback));
+                       } else
+                               EndRowEdit ();
+               }
+               
+        bool InsertCallback (int recordsAffected, Exception exception)
+               {
+                       DetailsViewInsertedEventArgs dargs = new 
DetailsViewInsertedEventArgs (recordsAffected, exception, currentEditNewValues);
+                       OnItemInserted (dargs);
+
+                       if (!dargs.KeepInInsertMode)                            
+                               EndRowEdit ();
+
+                       return dargs.ExceptionHandled;
+               }
+
                public void DeleteItem ()
                {
                        currentEditRowKeys = DataKey.Values;
@@ -1201,7 +1466,7 @@
                
                void EndRowEdit ()
                {
-                       currentMode = DetailsViewMode.ReadOnly;
+                       ChangeMode (DefaultMode);
                        oldEditValues = new DataKey (new OrderedDictionary ());
                        currentEditRowKeys = null;
                        currentEditOldValues = null;
@@ -1238,6 +1503,7 @@
                        if (pagerStyle != null) 
((IStateManager)pagerStyle).TrackViewState();
                        if (rowStyle != null) 
((IStateManager)rowStyle).TrackViewState();
                        if (editRowStyle != null) 
((IStateManager)editRowStyle).TrackViewState();
+                       if (insertRowStyle != null) 
((IStateManager)insertRowStyle).TrackViewState();
                        if (emptyDataRowStyle != null) 
((IStateManager)emptyDataRowStyle).TrackViewState();
                        if (key != null) ((IStateManager)key).TrackViewState();
                        if (autoFieldProperties != null) {
@@ -1257,6 +1523,7 @@
                        states[5] = (headerStyle == null ? null : 
((IStateManager)headerStyle).SaveViewState());
                        states[6] = (pagerStyle == null ? null : 
((IStateManager)pagerStyle).SaveViewState());
                        states[7] = (rowStyle == null ? null : 
((IStateManager)rowStyle).SaveViewState());
+                       states[8] = (insertRowStyle == null ? null : 
((IStateManager)insertRowStyle).SaveViewState());
                        states[9] = (editRowStyle == null ? null : 
((IStateManager)editRowStyle).SaveViewState());
                        states[10] = (emptyDataRowStyle == null ? null : 
((IStateManager)emptyDataRowStyle).SaveViewState());
                        states[11] = (key == null ? null : 
((IStateManager)key).SaveViewState());
@@ -1310,6 +1577,7 @@
                        if (states[5] != null) 
((IStateManager)HeaderStyle).LoadViewState (states[5]);
                        if (states[6] != null) 
((IStateManager)PagerStyle).LoadViewState (states[6]);
                        if (states[7] != null) 
((IStateManager)RowStyle).LoadViewState (states[7]);
+                       if (states[8] != null) 
((IStateManager)InsertRowStyle).LoadViewState (states[8]);
                        if (states[9] != null) 
((IStateManager)EditRowStyle).LoadViewState (states[9]);
                        if (states[10] != null) 
((IStateManager)EmptyDataRowStyle).LoadViewState (states[10]);
                        if (states[11] != null) 
((IStateManager)DataKey).LoadViewState (states[11]);
@@ -1428,22 +1696,26 @@
                                        
alternatingRowStyle.AddAttributesToRender (writer, row);
                                if ((row.RowState & DataControlRowState.Edit) 
!= 0 && editRowStyle != null)
                                        editRowStyle.AddAttributesToRender 
(writer, row);
+                               if ((row.RowState & DataControlRowState.Insert) 
!= 0 && insertRowStyle != null)
+                                       insertRowStyle.AddAttributesToRender 
(writer, row);
+                                       
+                               if (row == commandRow && commandRowStyle != 
null)
+                                       commandRowStyle.AddAttributesToRender 
(writer, row);
                                
                                row.RenderBeginTag (writer);
                                
-                               foreach (TableCell cell in row.Cells) {
-                                       DataControlFieldCell fcell = cell as 
DataControlFieldCell;
+                               for (int n=0; n<row.Cells.Count; n++) {
+                                       DataControlFieldCell fcell = 
row.Cells[n] as DataControlFieldCell;
                                        if (fcell != null) {
-                                               Style cellStyle = null;
-                                               switch (row.RowType) {
-                                                       case 
DataControlRowType.Header: cellStyle = fcell.ContainingField.HeaderStyle; break;
-                                                       case 
DataControlRowType.Footer: cellStyle = fcell.ContainingField.FooterStyle; break;
-                                                       default: cellStyle = 
fcell.ContainingField.ItemStyle; break;
+                                               if (n == 0 && 
fcell.ContainingField.ShowHeader) {
+                                                       if (fieldHeaderStyle != 
null)
+                                                               
fieldHeaderStyle.AddAttributesToRender (writer, fcell);
+                                                       
fcell.ContainingField.HeaderStyle.AddAttributesToRender (writer, fcell);
                                                }
-                                               if (cellStyle != null)
-                                                       
cellStyle.AddAttributesToRender (writer, cell);
+                                               else
+                                                       
fcell.ContainingField.ItemStyle.AddAttributesToRender (writer, fcell);
                                        }
-                                       cell.Render (writer);
+                                       fcell.Render (writer);
                                }
                                row.RenderEndTag (writer);
                        }

Modified: 
trunk/mcs/class/System.Web/System.Web.UI.WebControls/DetailsViewInsertEventArgs.cs
===================================================================
--- 
trunk/mcs/class/System.Web/System.Web.UI.WebControls/DetailsViewInsertEventArgs.cs
  2005-04-14 12:22:26 UTC (rev 42996)
+++ 
trunk/mcs/class/System.Web/System.Web.UI.WebControls/DetailsViewInsertEventArgs.cs
  2005-04-14 12:24:07 UTC (rev 42997)
@@ -38,18 +38,25 @@
        public class DetailsViewInsertEventArgs : CancelEventArgs
        {
                private object argument;
+               private IOrderedDictionary values;
                
                public DetailsViewInsertEventArgs (object argument)
                {
                        this.argument = argument;
                }
                
+               internal DetailsViewInsertEventArgs (object argument, 
IOrderedDictionary values)
+               {
+                       this.argument = argument;
+                       this.values = values;
+               }
+               
                public object CommandArgument {
                        get { return argument; }
                }
 
                public IOrderedDictionary Values {
-                       get { throw new NotImplementedException(); }
+                       get { return values; }
                }
        }
 }

Modified: 
trunk/mcs/class/System.Web/System.Web.UI.WebControls/DetailsViewInsertedEventArgs.cs
===================================================================
--- 
trunk/mcs/class/System.Web/System.Web.UI.WebControls/DetailsViewInsertedEventArgs.cs
        2005-04-14 12:22:26 UTC (rev 42996)
+++ 
trunk/mcs/class/System.Web/System.Web.UI.WebControls/DetailsViewInsertedEventArgs.cs
        2005-04-14 12:24:07 UTC (rev 42997)
@@ -40,6 +40,7 @@
                private Exception e;
                private bool exceptionHandled;
                private bool keepInsertedMode;
+               private IOrderedDictionary values;
                
                public DetailsViewInsertedEventArgs (int affectedRows, 
Exception e)
                {
@@ -49,6 +50,11 @@
                        this.keepInsertedMode = false;
                }
                
+               public DetailsViewInsertedEventArgs (int affectedRows, 
Exception e, IOrderedDictionary values): this (affectedRows, e)
+               {
+                       this.values = values;
+               }
+               
                public int AffectedRows {
                        get { return rowsAffected; }
                }
@@ -68,7 +74,7 @@
                }
 
                public IOrderedDictionary Values {
-                       get { throw new NotImplementedException(); }
+                       get { return values; }
                }
        }
 }

Modified: trunk/mcs/class/System.Web/System.Web.UI.WebControls/ImageField.cs
===================================================================
--- trunk/mcs/class/System.Web/System.Web.UI.WebControls/ImageField.cs  
2005-04-14 12:22:26 UTC (rev 42996)
+++ trunk/mcs/class/System.Web/System.Web.UI.WebControls/ImageField.cs  
2005-04-14 12:24:07 UTC (rev 42997)
@@ -188,7 +188,8 @@
                {
                        if ((ReadOnly && !includeReadOnly) || 
cell.Controls.Count == 0) return;
                        
-                       if ((rowState & DataControlRowState.Edit) != 0 && 
!ReadOnly) {
+                       bool editable = (rowState & (DataControlRowState.Edit | 
DataControlRowState.Insert)) != 0;
+                       if (editable && !ReadOnly) {
                                TextBox box = cell.Controls [0] as TextBox;
                                dictionary [DataImageUrlField] = box.Text;
                        } else if (includeReadOnly) {
@@ -208,7 +209,8 @@
                
                public virtual void InitializeDataCell (DataControlFieldCell 
cell, DataControlRowState rowState)
                {
-                       if ((rowState & DataControlRowState.Edit) != 0 && 
!ReadOnly) {
+                       bool editable = (rowState & (DataControlRowState.Edit | 
DataControlRowState.Insert)) != 0;
+                       if (editable && !ReadOnly) {
                                TextBox box = new TextBox ();
                                cell.Controls.Add (box);
                        } else {

Modified: 
trunk/mcs/class/System.Web/System.Web.UI.WebControls/ObjectDataSource.cs
===================================================================
--- trunk/mcs/class/System.Web/System.Web.UI.WebControls/ObjectDataSource.cs    
2005-04-14 12:22:26 UTC (rev 42996)
+++ trunk/mcs/class/System.Web/System.Web.UI.WebControls/ObjectDataSource.cs    
2005-04-14 12:24:07 UTC (rev 42997)
@@ -308,6 +308,20 @@
                        return DefaultView.Insert (empty);
                }
                
+               protected override void OnInit (EventArgs e)
+               {
+                       Page.LoadComplete += OnPageLoadComplete;
+               }
+               
+               void OnPageLoadComplete (object sender, EventArgs e)
+               {
+                       DeleteParameters.UpdateValues (Context, this);
+                       FilterParameters.UpdateValues (Context, this);
+                       InsertParameters.UpdateValues (Context, this);
+                       SelectParameters.UpdateValues (Context, this);
+                       UpdateParameters.UpdateValues (Context, this);
+               }
+               
                protected override void LoadViewState (object savedState)
                {
                        if (savedState == null) {

Modified: 
trunk/mcs/class/System.Web/System.Web.UI.WebControls/ObjectDataSourceView.cs
===================================================================
--- 
trunk/mcs/class/System.Web/System.Web.UI.WebControls/ObjectDataSourceView.cs    
    2005-04-14 12:22:26 UTC (rev 42996)
+++ 
trunk/mcs/class/System.Web/System.Web.UI.WebControls/ObjectDataSourceView.cs    
    2005-04-14 12:24:07 UTC (rev 42997)
@@ -699,16 +699,13 @@
                                        dview.Sort = arguments.SortExpression;
                                }
                                if (FilterExpression.Length > 0) {
-                                       OrderedDictionary fparams = new 
OrderedDictionary ();
-                                       foreach (Parameter p in 
FilterParameters)
-                                               fparams.Add (p.Name, 
ConvertParameter (p.Type, p.GetValue (context, owner)));
-                                               
+                                       IOrderedDictionary fparams = 
FilterParameters.GetValues (context, owner);
                                        ObjectDataSourceFilteringEventArgs 
fargs = new ObjectDataSourceFilteringEventArgs (fparams);
                                        OnFiltering (fargs);
                                        if (!fargs.Cancel) {
-                                               object[] formatValues = new 
object[fargs.ParameterValues.Count];
+                                               object[] formatValues = new 
object [fparams.Count];
                                                for (int n=0; 
n<formatValues.Length; n++) {
-                                                       formatValues [n] = 
fargs.ParameterValues [n];
+                                                       formatValues [n] = 
fparams [n];
                                                        if (formatValues [n] == 
null) return dview;
                                                }
                                                dview.RowFilter = string.Format 
(FilterExpression, formatValues);
@@ -936,25 +933,21 @@
                
                object ConvertParameter (Type targetType, object value)
                {
-                       if (value == null) {
-                               if (targetType.IsPrimitive)
-                                       value = 0;
-                               else if (targetType == typeof(object) && 
ConvertNullToDBNull)
-                                       return DBNull.Value;
-                       }
-                       return Convert.ChangeType (value, targetType);
+                       return ConvertParameter (Type.GetTypeCode (targetType), 
value);
                }
                
                object ConvertParameter (TypeCode targetType, object value)
                {
-                       Console.WriteLine ("ConvertParameter:" + value);
                        if (value == null) {
                                if (targetType != TypeCode.Object && targetType 
!= TypeCode.String)
                                        value = 0;
                                else if (targetType == TypeCode.Object && 
ConvertNullToDBNull)
                                        return DBNull.Value;
                        }
-                       return Convert.ChangeType (value, targetType);
+                       if (targetType == TypeCode.Object)
+                               return value;
+                       else
+                               return Convert.ChangeType (value, targetType);
                }
                
                string FormatOldParameter (string name)
@@ -968,7 +961,6 @@
                
                void OnParametersChanged (object sender, EventArgs args)
                {
-                       Console.WriteLine ("OnParametersChanged");
                        OnDataSourceViewChanged (EventArgs.Empty);
                }
                

Modified: trunk/mcs/class/System.Web/System.Web.UI.WebControls/Parameter.cs
===================================================================
--- trunk/mcs/class/System.Web/System.Web.UI.WebControls/Parameter.cs   
2005-04-14 12:22:26 UTC (rev 42996)
+++ trunk/mcs/class/System.Web/System.Web.UI.WebControls/Parameter.cs   
2005-04-14 12:24:07 UTC (rev 42997)
@@ -82,17 +82,12 @@
                
                protected virtual void LoadViewState (object savedState)
                {
-                       if (savedState == null)
-                               return;
-                       
                        ViewState.LoadViewState (savedState);
                }
                
                protected virtual object SaveViewState ()
                {
-                       if (viewState == null)
-                               return null;
-                       return viewState.SaveViewState ();
+                       return ViewState.SaveViewState ();
                }
                
                protected virtual void TrackViewState ()
@@ -126,10 +121,9 @@
                        get { return this.IsTrackingViewState; }
                }
                
-               [MonoTODO]
                public override string ToString ()
                {
-                       return base.ToString ();
+                       return Name;
                }
                
                [WebCategoryAttribute ("Parameter"), DefaultValueAttribute (""),
@@ -196,7 +190,7 @@
                                if (o != null)
                                        return (bool) o;
                                
-                               return false;
+                               return true;
                        }
                        set {
                                if (ConvertEmptyStringToNull != value) {
@@ -254,12 +248,30 @@
                
                internal object GetValue (HttpContext context, Control control)
                {
-                       return Evaluate (context, control);
-               }
+                       object oldValue = ViewState ["ParameterValue"];
+                       
+                       object newValue = ConvertValue (Evaluate (context, 
control));
+                       if (newValue == null)
+                               newValue = ConvertValue (DefaultValue);
 
+                       if (!object.Equals (oldValue, newValue)) {
+                               ViewState ["ParameterValue"] = newValue;
+                               OnParameterChanged ();
+                       }
+                       return newValue;
+               }
+               
+               object ConvertValue (object val)
+               {
+                       if (val == null) return null;
+                       if (ConvertEmptyStringToNull && val.Equals 
(string.Empty))
+                               return null;
+                       return Convert.ChangeType (val, Type);
+               }
+               
                protected internal virtual void SetDirty()
                {
-                       this.SaveViewState();
+                       ViewState.SetDirty ();
                }
 
 
@@ -269,22 +281,6 @@
                {
                        _owner = own;
                }
-
-               internal object ParameterValue {
-                       get {
-                               object param = ViewState["ParameterValue"];
-                               //FIXME: need to do some null string checking 
magic with TreatEmptyStringAsNull here
-                               if (param == null)
-                               {
-                                       param = DefaultValue;
-                                       if (param == null)
-                                       {
-                                               return null;
-                                       }
-                               }
-                               return Convert.ChangeType (param, Type);
-                       }
-               }
        }
 }
 #endif

Modified: 
trunk/mcs/class/System.Web/System.Web.UI.WebControls/ParameterCollection.cs
===================================================================
--- trunk/mcs/class/System.Web/System.Web.UI.WebControls/ParameterCollection.cs 
2005-04-14 12:22:26 UTC (rev 42996)
+++ trunk/mcs/class/System.Web/System.Web.UI.WebControls/ParameterCollection.cs 
2005-04-14 12:24:07 UTC (rev 42997)
@@ -47,9 +47,7 @@
                                                    typeof (SessionParameter) };
                                                    
                private EventHandler _parametersChanged;
-               private KeyedList _values;
 
-
                public int Add (Parameter param)
                {
                        return ((IList)this).Add (param);
@@ -90,25 +88,25 @@
                        return _knownTypes;
                }
 
-               [MonoTODO ("Take care of HTTPContext parameter")]
                public IOrderedDictionary GetValues (HttpContext context, 
Control control)
                {
-                       if (_values == null)
+                       OrderedDictionary values = new OrderedDictionary ();
+                       foreach (Parameter param in this)
                        {
-                               _values = new KeyedList ();
-                               foreach (Parameter param in this)
-                               {
-                                       string name = param.Name;
-                                       for (int i = 1; _values.Contains 
(name); i++)
-                                       {
-                                               name = param.Name + i.ToString 
();
-                                       }
-                                       _values.Add (name, 
param.ParameterValue);
-                               }
+                               string name = param.Name;
+                               for (int i = 1; values.Contains (name); i++)
+                                       name = param.Name + i.ToString ();
+                               values.Add (name, param.GetValue (context, 
control));
                        }
-                       return _values;
+                       return values;
                }
                
+               public void UpdateValues (HttpContext context, Control control)
+               {
+                       foreach (Parameter param in this)
+                               param.GetValue (context, control);
+               }
+               
                public void Insert (int idx, Parameter param)
                {
                        ((IList)this).Insert (idx, param);
@@ -136,8 +134,6 @@
                {
                        if (_parametersChanged != null)
                                _parametersChanged(this, e);
-                       
-                       _values = null;
                }
 
                protected override void OnValidate (object o)

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to