New test.
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / ComboBox.cs
index 70efdb6b73a2c3ee636ddb13695844602c1916e3..89bf462a095e3f93960b9b321e6ae56670a5a5e0 100644 (file)
@@ -46,7 +46,7 @@ namespace System.Windows.Forms
                private DrawMode draw_mode = DrawMode.Normal;
                private ComboBoxStyle dropdown_style = (ComboBoxStyle)(-1);
                private int dropdown_width = -1;                
-               private object selected_item = null;
+               private int selected_index = -1;
                internal ObjectCollection items = null;
                private bool suspend_ctrlupdate;
                private int maxdrop_items = 8;                  
@@ -223,10 +223,12 @@ namespace System.Windows.Forms
        
                                if (dropdown_style != ComboBoxStyle.DropDownList && textbox_ctrl == null) {
                                        textbox_ctrl = new ComboTextBox (this);
+                                       object selected_item = SelectedItem;
                                        if (selected_item != null)
                                                textbox_ctrl.Text = GetItemText (selected_item);
                                        textbox_ctrl.BorderStyle = BorderStyle.None;
                                        textbox_ctrl.TextChanged += new EventHandler (OnTextChangedEdit);
+                                       textbox_ctrl.Click += new EventHandler (OnTextBoxClick);
 
                                        if (IsHandleCreated == true) {
                                                Controls.AddImplicit (textbox_ctrl);
@@ -381,35 +383,17 @@ namespace System.Windows.Forms
                [Browsable (false)]
                [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
                public override int SelectedIndex {
-                       get { return Items.IndexOf (selected_item); }
+                       get { return selected_index; }
                        set {
                                if (value <= -2 || value >= Items.Count)
                                        throw new ArgumentOutOfRangeException ("Index of out range");
+                               selected_index = value;
 
-                               object item = null;
-                               if (value != -1)
-                                       item = Items [value];
-
-                               SelectedItem = item;
-                       }
-               }
-
-               [Browsable (false)]
-               [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
-               [Bindable(true)]
-               public object SelectedItem {
-                       get { return selected_item; }
-                       set {                           
-                               if (selected_item == value)
-                                       return;
-
-                               selected_item = value;
-                               
                                if (dropdown_style != ComboBoxStyle.DropDownList) {
-                                       if (selected_item == null)
+                                       if (value == -1)
                                                SetControlText("");
                                        else
-                                               SetControlText (GetItemText (selected_item));
+                                               SetControlText (GetItemText (Items [value]));
                                }
 
                                OnSelectedValueChanged (new EventArgs ());
@@ -419,7 +403,21 @@ namespace System.Windows.Forms
                                        Invalidate ();
 
                                if (listbox_ctrl != null)
-                                       listbox_ctrl.HighlightedItem = value;
+                                       listbox_ctrl.HighlightedIndex = value;
+                       }
+               }
+
+               [Browsable (false)]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
+               [Bindable(true)]
+               public object SelectedItem {
+                       get { return selected_index == -1 ? null : Items [selected_index]; }
+                       set {                           
+                               object item = selected_index == -1 ? null : Items [selected_index];
+                               if (item == value)
+                                       return;
+
+                               SelectedIndex = Items.IndexOf (value);
                        }
                }
                
@@ -489,6 +487,11 @@ namespace System.Windows.Forms
                                        return;
 
                                sorted = value;
+                               SelectedIndex = -1;
+                               if (sorted) {
+                                       Items.Sort ();
+                                       Layout ();
+                               }
                        }
                }
 
@@ -991,8 +994,7 @@ namespace System.Windows.Forms
                private void CreateComboListBox ()
                {                       
                        listbox_ctrl = new ComboListBox (this);                 
-                       if (selected_item != null)
-                               listbox_ctrl.HighlightedItem = selected_item;
+                       listbox_ctrl.HighlightedIndex = SelectedIndex;
                }
                
                internal void Draw (Rectangle clip, Graphics dc)
@@ -1189,11 +1191,18 @@ namespace System.Windows.Forms
                        Draw (ClientRectangle, pevent.Graphics);                        
                }
                
+               private void OnTextBoxClick (object sender, EventArgs e)
+               {
+                       OnClick (e);
+               }
+
                private void OnTextChangedEdit (object sender, EventArgs e)
                {
                        if (process_textchanged_event == false)
                                return; 
                                
+                       OnTextChanged (EventArgs.Empty);
+
                        int item = FindStringCaseInsensitive (textbox_ctrl.Text);
                        
                        if (item == -1)
@@ -1205,7 +1214,7 @@ namespace System.Windows.Forms
                        
                        if (listbox_ctrl != null) {
                                listbox_ctrl.SetTopItem (item);
-                               listbox_ctrl.HighlightedItem = Items [item];
+                               listbox_ctrl.HighlightedIndex = item;
                        }
 
                        base.Text = textbox_ctrl.Text;
@@ -1221,7 +1230,7 @@ namespace System.Windows.Forms
                void UpdateBounds ()
                {
                        if (requested_height != -1)
-                               SetBoundsCore (0, 0, 0, requested_height, BoundsSpecified.Height);
+                               SetBounds (0, 0, 0, requested_height, BoundsSpecified.Height);
                }
 
                private void UpdatedItems ()
@@ -1268,8 +1277,18 @@ namespace System.Windows.Forms
                                set {
                                        if (index < 0 || index >= Count)
                                                throw new ArgumentOutOfRangeException ("Index of out range");
+                                       if (value == null)
+                                               throw new ArgumentNullException ("value");
 
                                        object_items[index] = value;
+                                       if (owner.listbox_ctrl != null)
+                                               owner.listbox_ctrl.InvalidateItem (index);
+                                       if (index == owner.SelectedIndex) {
+                                               if (owner.textbox_ctrl == null)
+                                                       owner.Refresh ();
+                                               else
+                                                       owner.textbox_ctrl.SelectedText = value.ToString ();
+                                       }
                                }
                        }
 
@@ -1287,16 +1306,6 @@ namespace System.Windows.Forms
 
                        #endregion Public Properties
                        
-                       #region Private Properties                      
-                       internal ArrayList ObjectItems {
-                               get { return object_items;}
-                               set {
-                                       object_items = value;
-                               }
-                       }
-                       
-                       #endregion Private Properties
-
                        #region Public Methods
                        public int Add (object item)
                        {
@@ -1309,6 +1318,9 @@ namespace System.Windows.Forms
 
                        public void AddRange (object[] items)
                        {
+                               if (items == null)
+                                       throw new ArgumentNullException ("items");
+
                                foreach (object mi in items)
                                        AddItem (mi);
                                        
@@ -1317,7 +1329,7 @@ namespace System.Windows.Forms
 
                        public void Clear ()
                        {
-                               owner.selected_item = null;
+                               owner.selected_index = -1;
                                object_items.Clear ();
                                owner.UpdatedItems ();
                                owner.Refresh ();
@@ -1325,6 +1337,9 @@ namespace System.Windows.Forms
                        
                        public bool Contains (object obj)
                        {
+                               if (obj == null)
+                                       throw new ArgumentNullException ("obj");
+
                                return object_items.Contains (obj);
                        }
 
@@ -1350,6 +1365,9 @@ namespace System.Windows.Forms
 
                        public int IndexOf (object value)
                        {
+                               if (value == null)
+                                       throw new ArgumentNullException ("value");
+
                                return object_items.IndexOf (value);
                        }
 
@@ -1357,21 +1375,28 @@ namespace System.Windows.Forms
                        {
                                if (index < 0 || index > Count)
                                        throw new ArgumentOutOfRangeException ("Index of out range");                                   
+                               if (item == null)
+                                       throw new ArgumentNullException ("item");
                                
                                owner.BeginUpdate ();
                                
-                               object_items.Insert (index, item);
+                               if (owner.Sorted)
+                                       AddItem (item);
+                               else
+                                       object_items.Insert (index, item);
                                                                                                
                                owner.EndUpdate ();     // Calls UpdatedItems
                        }
 
                        public void Remove (object value)
                        {                               
+                               if (value == null)
+                                       return;
+
                                if (IndexOf (value) == owner.SelectedIndex)
-                                       owner.SelectedItem = null;
+                                       owner.SelectedIndex = -1;
                                
                                RemoveAt (IndexOf (value));                             
-                               
                        }
 
                        public void RemoveAt (int index)
@@ -1380,7 +1405,7 @@ namespace System.Windows.Forms
                                        throw new ArgumentOutOfRangeException ("Index of out range");
                                        
                                if (index == owner.SelectedIndex)
-                                       owner.SelectedItem = null;
+                                       owner.SelectedIndex = -1;
 
                                object_items.RemoveAt (index);
                                owner.UpdatedItems ();
@@ -1390,9 +1415,21 @@ namespace System.Windows.Forms
                        #region Private Methods
                        private int AddItem (object item)
                        {
-                               int cnt = object_items.Count;
+                               if (item == null)
+                                       throw new ArgumentNullException ("item");
+
+                               if (owner.Sorted) {
+                                       int index = 0;
+                                       foreach (string s in object_items) {
+                                               if (String.Compare (item as String, s) < 0) {
+                                                       object_items.Insert (index, item);
+                                                       return index;
+                                               }
+                                               index++;
+                                       }
+                               }
                                object_items.Add (item);
-                               return cnt;
+                               return object_items.Count - 1;
                        }
                        
                        internal void AddRange (IList items)
@@ -1403,6 +1440,11 @@ namespace System.Windows.Forms
                                owner.UpdatedItems ();
                        }
 
+                       internal void Sort ()
+                       {
+                               object_items.Sort ();
+                       }
+
                        #endregion Private Methods
                }
 
@@ -1661,34 +1703,22 @@ namespace System.Windows.Forms
                                }
                        }
 
+                       int highlighted_index = -1;
+
                        public int HighlightedIndex {
-                               get { return owner.Items.IndexOf (highlighted_item); }
+                               get { return highlighted_index; }
                                set { 
-                                       object item = null;
-                                       if (value != -1)
-                                               item = owner.Items [value];
-                                       HighlightedItem = item; 
-                               }
-                       }
-
-                       object highlighted_item = null;
-
-                       public object HighlightedItem {
-                               get { return highlighted_item; }
-                               set {
-                                       if (highlighted_item == value)
+                                       if (highlighted_index == value)
                                                return;
-                               
-                                       int index = owner.Items.IndexOf (highlighted_item);
-                                       if (index != -1)
-                                               Invalidate (GetItemDisplayRectangle (index, top_item));
-                                       highlighted_item = value;
-                                       index = owner.Items.IndexOf (highlighted_item);
-                                       if (index != -1)
-                                               Invalidate (GetItemDisplayRectangle (index, top_item));
+
+                                       if (highlighted_index != -1)
+                                               Invalidate (GetItemDisplayRectangle (highlighted_index, top_item));
+                                       highlighted_index = value;
+                                       if (highlighted_index != -1)
+                                               Invalidate (GetItemDisplayRectangle (highlighted_index, top_item));
                                }
                        }
-                       
+
                        private Rectangle GetItemDisplayRectangle (int index, int top_index)
                        {
                                if (index < 0 || index >= owner.Items.Count)
@@ -1730,6 +1760,12 @@ namespace System.Windows.Forms
                                return -1;
                        }
 
+                       public void InvalidateItem (int index)
+                       {
+                               if (Visible)
+                                       Invalidate (GetItemDisplayRectangle (index, top_item));
+                       }
+
                        private int LastVisibleItem ()
                        {
                                Rectangle item_rect;
@@ -1751,7 +1787,7 @@ namespace System.Windows.Forms
                                        return;
                                top_item = item;
                                UpdateLastVisibleItem ();
-                               Refresh ();
+                               Invalidate ();
                        }                       
 
                        protected override void OnMouseDown (MouseEventArgs e)
@@ -1787,7 +1823,6 @@ namespace System.Windows.Forms
                                } else {
                                        owner.OnSelectionChangeCommitted (new EventArgs ());
                                        owner.SelectedIndex = index;
-                                       HighlightedIndex = index;
                                        HideWindow ();
                                }
 
@@ -1852,7 +1887,7 @@ namespace System.Windows.Forms
 
                                top_item =  vscrollbar_ctrl.Value;
                                UpdateLastVisibleItem ();
-                               Refresh ();
+                               Invalidate ();
                        }                       
                        
                        protected override void WndProc(ref Message m) {