2008-04-03 Ivan N. Zlatev <contact@i-nz.net>
authorIvan Zlatev <ivan@ivanz.com>
Thu, 3 Apr 2008 16:39:18 +0000 (16:39 -0000)
committerIvan Zlatev <ivan@ivanz.com>
Thu, 3 Apr 2008 16:39:18 +0000 (16:39 -0000)
* CollectionEditor.cs: The display name of an object in the
list is not static. It can dynamically change when the object
get's modified.
[Fixes bug #375786]

svn path=/trunk/mcs/; revision=99772

mcs/class/System.Design/System.ComponentModel.Design/ChangeLog
mcs/class/System.Design/System.ComponentModel.Design/CollectionEditor.cs

index df96157c916d62e637bf6981373a0c7be7ade0ac..bffd756c93d8572b42a79befc358bcf9182379af 100644 (file)
@@ -1,3 +1,10 @@
+2008-04-03  Ivan N. Zlatev  <contact@i-nz.net>
+
+       * CollectionEditor.cs: The display name of an object in the 
+       list is not static. It can dynamically change when the object 
+       get's modified.
+       [Fixes bug #375786]
+
 2008-03-28  Ivan N. Zlatev  <contact@i-nz.net>
 
        * CollectionEditor.cs: Fix multiple bugs.
index ae65f4a20acb3f5e36146f3cd6b972ad7f7d46c0..6d33cd5e5b1247cba4ad12054d3ff3624fe3defb 100644 (file)
@@ -199,17 +199,19 @@ namespace System.ComponentModel.Design
                        [TypeConverter (typeof (ObjectContainerConverter))]
                        private class ObjectContainer
                        {
-                               internal string Name;
                                internal object Object;
                                internal CollectionEditor editor;
 
-                               public ObjectContainer (string name, object obj, CollectionEditor editor)
+                               public ObjectContainer (object obj, CollectionEditor editor)
                                {
-                                       this.Name = name;
                                        this.Object = obj;
                                        this.editor = editor;
                                }
 
+                               internal string Name {
+                                       get { return editor.GetDisplayText (Object); }
+                               }
+
                                public override string ToString ()
                                {
                                        return Name;
@@ -401,7 +403,7 @@ namespace System.ComponentModel.Design
                                        itemsList.BeginUpdate ();
                                        itemsList.Items.Clear ();
                                        foreach (object o in items)
-                                               this.itemsList.Items.Add (new ObjectContainer (editor.GetDisplayText (o), o, editor));
+                                               this.itemsList.Items.Add (new ObjectContainer (o, editor));
                                        if (itemsList.Items.Count > 0)
                                                itemsList.SelectedIndex = 0;
                                        itemsList.EndUpdate ();
@@ -474,12 +476,19 @@ namespace System.ComponentModel.Design
                                for (int i = 0; i < itemsList.SelectedItems.Count; i++)
                                        selected[i] = itemsList.Items.IndexOf (itemsList.SelectedItems[i]);
 
-                               SetEditValue (); // ends up calling OnEditValueChanged which repopulates the list
+                               // The list might be repopulated if a new instance of the collection edited
+                               // is created during the update. This happen for example for Arrays.
+                               SetEditValue ();
 
+                               // Restore current selection in case the list gets repopulated.
+                               // Refresh the item after that to reflect possible value change.
+                               // 
                                itemsList.BeginUpdate ();
                                itemsList.ClearSelected ();
-                               foreach (int index in selected)
+                               foreach (int index in selected) {
+                                       itemsList.DoRefreshItem (index);
                                        itemsList.SetSelected (index, true);
+                               }
                                itemsList.SelectedIndex = selected[0];
                                itemsList.EndUpdate ();
                        }
@@ -517,7 +526,7 @@ namespace System.ComponentModel.Design
                                        DisplayError (ex);
                                        return;
                                }
-                               itemsList.Items.Add (new ObjectContainer (editor.GetDisplayText (o), o, editor));
+                               itemsList.Items.Add (new ObjectContainer (o, editor));
                                itemsList.SelectedIndex = -1;
                                itemsList.SelectedIndex = itemsList.Items.Count - 1;
                        }
@@ -530,6 +539,10 @@ namespace System.ComponentModel.Design
                                        itemDisplay.SelectedObject = null;
                        }
 
+                       // OnEditValueChanged is called only if the  EditValue has changed,
+                       // which is only in the case when a new instance of the collection is 
+                       // required, e.g for arrays.
+                       // 
                        protected override void OnEditValueChanged ()
                        {
                                UpdateItems ();