Merge pull request #1466 from schani/stage-unified-card-table-scanning
[mono.git] / mcs / class / System.Drawing.Design / System.Drawing.Design / ColorEditor.cs
index ad682cf5cd73d04cb01bc3570cad8650e9c12544..1f1f23ccccc0ee4aae4b72d1f0088dbf6cf406d0 100644 (file)
@@ -45,6 +45,8 @@ namespace System.Drawing.Design
        {
                private IWindowsFormsEditorService editorService;
                private Color selected_color;
+               private bool color_chosen;
+               private Control editor_control = null;
 
                public ColorEditor()
                {
@@ -56,85 +58,99 @@ namespace System.Drawing.Design
                        if (context != null && provider != null) {
                                editorService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
                                if (editorService != null) {
-                                       // Create the UI editor control
-                                       
-                                       TabControl tab_control = new TabControl();
-                                       tab_control.Dock = DockStyle.Fill;
-                                       TabPage custom_tab = new TabPage("Custom");
-                                       TabPage web_tab = new TabPage("Web");
-                                       TabPage system_tab = new TabPage("System");
+                                       if (editor_control == null)
+                                               editor_control = GetEditorControl (value);
+                                       editorService.DropDownControl(editor_control);
+                                       if (color_chosen)
+                                               return selected_color;
+                                       else
+                                               return null;
+                               }
+                       }
+                       return base.EditValue(context, provider, value);
+               }
 
-                                       ColorListBox web_listbox = new ColorListBox();
-                                       ColorListBox system_listbox = new ColorListBox();
-                                       web_listbox.Dock = DockStyle.Fill;
-                                       system_listbox.Dock = DockStyle.Fill;
+               private Control GetEditorControl (object value)
+               {
+                       TabControl tab_control = new TabControl();
+                       tab_control.Dock = DockStyle.Fill;
+                       TabPage custom_tab = new TabPage("Custom");
+                       TabPage web_tab = new TabPage("Web");
+                       TabPage system_tab = new TabPage("System");
 
-                                       web_tab.Controls.Add(web_listbox);
-                                       system_tab.Controls.Add(system_listbox);
+                       ColorListBox web_listbox = new ColorListBox();
+                       ColorListBox system_listbox = new ColorListBox();
+                       web_listbox.Dock = DockStyle.Fill;
+                       system_listbox.Dock = DockStyle.Fill;
 
-                                       SystemColorCompare system_compare = new SystemColorCompare();
-                                       System.Collections.ArrayList color_list = new System.Collections.ArrayList();
-                                       foreach (System.Reflection.PropertyInfo property in typeof(SystemColors).GetProperties(System.Reflection.BindingFlags.Public |System.Reflection.BindingFlags.Static)) {
-                                               Color clr = (Color)property.GetValue(null,null);
-                                               color_list.Add(clr);
-                                       }
-                                       color_list.Sort(system_compare);
-                                       system_listbox.Items.AddRange(color_list.ToArray());
-                                       system_listbox.MouseUp+=new MouseEventHandler(HandleMouseUp);
-                                       system_listbox.SelectedValueChanged+=new EventHandler(HandleChange);
+                       web_tab.Controls.Add(web_listbox);
+                       system_tab.Controls.Add(system_listbox);
 
-                                       WebColorCompare web_compare = new WebColorCompare();
-                                       color_list = new System.Collections.ArrayList();
-                                       foreach (KnownColor known_color in Enum.GetValues(typeof(KnownColor))) 
-                                       {
-                                               Color color = Color.FromKnownColor(known_color);
-                                               if (color.IsSystemColor)
-                                                       continue;
-                                               color_list.Add(color);
-                                       }
-                                       color_list.Sort(web_compare);
-                                       web_listbox.Items.AddRange(color_list.ToArray());
-                                       web_listbox.MouseUp+=new MouseEventHandler(HandleMouseUp);
-                                       web_listbox.SelectedValueChanged+=new EventHandler(HandleChange);\r
-\r
-                                       CustomColorPicker custom_picker = new CustomColorPicker ();\r
-                                       custom_picker.Dock = DockStyle.Fill;\r
-                                       custom_picker.ColorChanged += new EventHandler (CustomColorPicked);\r
-                                       custom_tab.Controls.Add (custom_picker);
+                       SystemColorCompare system_compare = new SystemColorCompare();
+                       System.Collections.ArrayList color_list = new System.Collections.ArrayList();
+                       foreach (System.Reflection.PropertyInfo property in typeof(SystemColors).GetProperties(System.Reflection.BindingFlags.Public |System.Reflection.BindingFlags.Static)) {
+                               Color clr = (Color)property.GetValue(null,null);
+                               color_list.Add(clr);
+                       }
+                       color_list.Sort(system_compare);
+                       system_listbox.Items.AddRange(color_list.ToArray());
+                       system_listbox.MouseUp+=new MouseEventHandler(HandleMouseUp);
+                       system_listbox.SelectedValueChanged+=new EventHandler(HandleChange);
 
-                                       tab_control.TabPages.Add(custom_tab);
-                                       tab_control.TabPages.Add(web_tab);
-                                       tab_control.TabPages.Add(system_tab);
+                       WebColorCompare web_compare = new WebColorCompare();
+                       color_list = new System.Collections.ArrayList();
+                       foreach (KnownColor known_color in Enum.GetValues(typeof(KnownColor))) 
+                       {
+                               Color color = Color.FromKnownColor(known_color);
+                               if (color.IsSystemColor)
+                                       continue;
+                               color_list.Add(color);
+                       }
+                       color_list.Sort(web_compare);
+                       web_listbox.Items.AddRange(color_list.ToArray());
+                       web_listbox.MouseUp+=new MouseEventHandler(HandleMouseUp);
+                       web_listbox.SelectedValueChanged+=new EventHandler(HandleChange);\r
 
-                                       Color current_color = (Color)value;
-                                       if (current_color.IsSystemColor) 
-                                       {
-                                               system_listbox.SelectedValue = current_color;
-                                               tab_control.SelectedTab = system_tab;
-                                       }
-                                       else if (current_color.IsKnownColor)
-                                       {
-                                               web_listbox.SelectedValue = current_color;
-                                               tab_control.SelectedTab = web_tab;
-                                       }
+                       CustomColorPicker custom_picker = new CustomColorPicker ();\r
+                       custom_picker.Dock = DockStyle.Fill;\r
+                       custom_picker.ColorChanged += new EventHandler (CustomColorPicked);\r
+                       custom_tab.Controls.Add (custom_picker);
 
+                       tab_control.TabPages.Add(custom_tab);
+                       tab_control.TabPages.Add(web_tab);
+                       tab_control.TabPages.Add(system_tab);
 
-                                       editorService.DropDownControl(tab_control);
-                                       return selected_color;
+                       if (value != null) {
+                               Color current_color = (Color)value;
+                               if (current_color.IsSystemColor) 
+                               {
+                                       system_listbox.SelectedValue = current_color;
+                                       tab_control.SelectedTab = system_tab;
+                               }
+                               else if (current_color.IsKnownColor)
+                               {
+                                       web_listbox.SelectedValue = current_color;
+                                       tab_control.SelectedTab = web_tab;
                                }
+                               selected_color = current_color;
+                               color_chosen = true;
                        }
-                       return base.EditValue(context, provider, value);
+
+                       tab_control.Height = 216; // the height of the custom colors tab
+                       return tab_control;
                }
 
                private void HandleChange(object sender, EventArgs e) 
                {
                        selected_color = (Color)((ColorListBox)sender).Items[((ColorListBox)sender).SelectedIndex];
-               }\r
-\r
+                       color_chosen = true;
+               }
+
                private void CustomColorPicked (object sender, EventArgs e)\r
-               {\r
-                       selected_color = (Color)sender;\r
-                       if (editorService != null)\r
+               {
+                       selected_color = (Color)sender;
+                       color_chosen = true;
+                       if (editorService != null)
                                editorService.CloseDropDown ();\r
                }
 
@@ -332,7 +348,7 @@ namespace System.Drawing.Design
 \r
                        protected override void OnMouseUp (MouseEventArgs e)\r
                        {\r
-                               if (highlighting) {\r
+                               if (highlighting && this.ClientRectangle.Contains (e.X, e.Y)) {\r
                                        if (ColorChanged != null)\r
                                                ColorChanged (colors[y / 24, x / 24], EventArgs.Empty);\r
                                        highlighting = false;\r