New test.
[mono.git] / mcs / class / System.Drawing.Design / System.Drawing.Design / ColorEditor.cs
1 //
2 // System.Drawing.Design.ColorEditor.cs
3 // 
4 // Authors:
5 //  Martin Willemoes Hansen (mwh@sysrq.dk)\r
6 //  Andreas Nahr (ClassDevelopment@A-SoftTech.com)\r
7 //  Jonathan Chambers (joncham@gmail.com)
8 // 
9 // (C) 2003 Martin Willemoes Hansen\r
10 // (C) 2003 Andreas Nahr\r
11 // (C) 2006 Jonathan Chambers
12 // 
13
14 //
15 // Permission is hereby granted, free of charge, to any person obtaining
16 // a copy of this software and associated documentation files (the
17 // "Software"), to deal in the Software without restriction, including
18 // without limitation the rights to use, copy, modify, merge, publish,
19 // distribute, sublicense, and/or sell copies of the Software, and to
20 // permit persons to whom the Software is furnished to do so, subject to
21 // the following conditions:
22 // 
23 // The above copyright notice and this permission notice shall be
24 // included in all copies or substantial portions of the Software.
25 // 
26 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
30 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
31 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
32 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33 //
34
35 using System;
36 using System.Drawing;
37 using System.Drawing.Design;
38 using System.ComponentModel;
39 using System.Windows.Forms;
40 using System.Windows.Forms.Design;
41
42 namespace System.Drawing.Design
43 {
44         public class ColorEditor : UITypeEditor
45         {
46                 private IWindowsFormsEditorService editorService;
47                 private Color selected_color;
48
49                 public ColorEditor()
50                 {
51                 }
52
53                 public override object EditValue (ITypeDescriptorContext context,
54                         IServiceProvider provider, object value)
55                 {
56                         if (context != null && provider != null) {
57                                 editorService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
58                                 if (editorService != null) {
59                                         // Create the UI editor control
60                                         
61                                         TabControl tab_control = new TabControl();
62                                         tab_control.Dock = DockStyle.Fill;
63                                         TabPage custom_tab = new TabPage("Custom");
64                                         TabPage web_tab = new TabPage("Web");
65                                         TabPage system_tab = new TabPage("System");
66
67                                         ColorListBox web_listbox = new ColorListBox();
68                                         ColorListBox system_listbox = new ColorListBox();
69                                         web_listbox.Dock = DockStyle.Fill;
70                                         system_listbox.Dock = DockStyle.Fill;
71
72                                         web_tab.Controls.Add(web_listbox);
73                                         system_tab.Controls.Add(system_listbox);
74
75                                         SystemColorCompare system_compare = new SystemColorCompare();
76                                         System.Collections.ArrayList color_list = new System.Collections.ArrayList();
77                                         foreach (System.Reflection.PropertyInfo property in typeof(SystemColors).GetProperties(System.Reflection.BindingFlags.Public |System.Reflection.BindingFlags.Static)) {
78                                                 Color clr = (Color)property.GetValue(null,null);
79                                                 color_list.Add(clr);
80                                         }
81                                         color_list.Sort(system_compare);
82                                         system_listbox.Items.AddRange(color_list.ToArray());
83                                         system_listbox.MouseUp+=new MouseEventHandler(HandleMouseUp);
84                                         system_listbox.SelectedValueChanged+=new EventHandler(HandleChange);
85
86                                         WebColorCompare web_compare = new WebColorCompare();
87                                         color_list = new System.Collections.ArrayList();
88                                         foreach (KnownColor known_color in Enum.GetValues(typeof(KnownColor))) 
89                                         {
90                                                 Color color = Color.FromKnownColor(known_color);
91                                                 if (color.IsSystemColor)
92                                                         continue;
93                                                 color_list.Add(color);
94                                         }
95                                         color_list.Sort(web_compare);
96                                         web_listbox.Items.AddRange(color_list.ToArray());
97                                         web_listbox.MouseUp+=new MouseEventHandler(HandleMouseUp);
98                                         web_listbox.SelectedValueChanged+=new EventHandler(HandleChange);\r
99 \r
100                                         CustomColorPicker custom_picker = new CustomColorPicker ();\r
101                                         custom_picker.Dock = DockStyle.Fill;\r
102                                         custom_picker.ColorChanged += new EventHandler (CustomColorPicked);\r
103                                         custom_tab.Controls.Add (custom_picker);
104
105                                         tab_control.TabPages.Add(custom_tab);
106                                         tab_control.TabPages.Add(web_tab);
107                                         tab_control.TabPages.Add(system_tab);
108
109                                         Color current_color = (Color)value;
110                                         if (current_color.IsSystemColor) 
111                                         {
112                                                 system_listbox.SelectedValue = current_color;
113                                                 tab_control.SelectedTab = system_tab;
114                                         }
115                                         else if (current_color.IsKnownColor)
116                                         {
117                                                 web_listbox.SelectedValue = current_color;
118                                                 tab_control.SelectedTab = web_tab;
119                                         }
120
121
122                                         editorService.DropDownControl(tab_control);
123                                         return selected_color;
124                                 }
125                         }
126                         return base.EditValue(context, provider, value);
127                 }
128
129                 private void HandleChange(object sender, EventArgs e) 
130                 {
131                         selected_color = (Color)((ColorListBox)sender).Items[((ColorListBox)sender).SelectedIndex];
132                 }\r
133 \r
134                 private void CustomColorPicked (object sender, EventArgs e)\r
135                 {\r
136                         selected_color = (Color)sender;\r
137                         if (editorService != null)\r
138                                 editorService.CloseDropDown ();\r
139                 }
140
141                 private void HandleMouseUp(object sender, MouseEventArgs e) 
142                 {
143                         if (editorService != null)
144                                 editorService.CloseDropDown();
145                 }
146
147                 public override UITypeEditorEditStyle GetEditStyle (ITypeDescriptorContext context)
148                 {
149                         return UITypeEditorEditStyle.DropDown;
150                 }
151
152                 public override bool GetPaintValueSupported (ITypeDescriptorContext context)
153                 {
154                         return true;
155                 }
156
157                 public override void PaintValue (PaintValueEventArgs e)
158                 {
159                         Graphics G = e.Graphics;
160
161                         if (e.Value != null)
162                         {
163                                 Color C = (Color) e.Value;
164                                 using (SolidBrush sb = new SolidBrush (C))
165                                         G.FillRectangle (sb, e.Bounds);
166                         }
167                 }
168
169                 class ColorListBox : ListBox {
170                         public ColorListBox() {
171                                 this.DrawMode = DrawMode.OwnerDrawFixed;
172                                 this.Sorted = true;
173                                 this.ItemHeight = 14;
174                                 this.BorderStyle = BorderStyle.FixedSingle;
175                         }
176
177                         protected override void OnDrawItem(DrawItemEventArgs e) {
178                                 e.DrawBackground();
179                                 Color color = (Color)this.Items[e.Index];
180                                 using (System.Drawing.SolidBrush brush = new SolidBrush(color))
181                                         e.Graphics.FillRectangle(brush, 2,e.Bounds.Top+2,21,9);
182                                 e.Graphics.DrawRectangle(SystemPens.WindowText, 2,e.Bounds.Top+2,21,9);
183                                 e.Graphics.DrawString(color.Name, this.Font, SystemBrushes.WindowText, 26,e.Bounds.Top);
184                                 if ((e.State & DrawItemState.Selected) != 0)
185                                         e.DrawFocusRectangle();
186                                 base.OnDrawItem (e);
187                         }
188                 }
189
190                 class SystemColorCompare : System.Collections.IComparer {
191                         #region IComparer Members
192
193                         public int Compare(object x, object y) {
194                                 Color c1 = (Color)x;
195                                 Color c2 = (Color)y;
196                                 return String.Compare(c1.Name, c2.Name);
197                         }
198
199                         #endregion
200                 }
201                 class WebColorCompare : System.Collections.IComparer 
202                 {
203                         #region IComparer Members
204
205                         public int Compare(object x, object y) 
206                         {
207                                 Color c1 = (Color)x;
208                                 Color c2 = (Color)y;
209                                 return String.Compare(c1.Name, c2.Name);
210                         }
211
212                         #endregion
213                 }\r
214 \r
215 \r
216                 class CustomColorPicker : UserControl\r
217                 {\r
218                         Color[,] colors;\r
219                         bool highlighting;\r
220                         int x, y;\r
221                         public CustomColorPicker ()\r
222                         {\r
223                                 colors = new Color[8, 8];\r
224                                 colors[0, 0] = Color.White;\r
225                                 colors[1, 0] = Color.FromArgb (224, 224, 224);\r
226                                 colors[2, 0] = Color.Silver;\r
227                                 colors[3, 0] = Color.Gray;\r
228                                 colors[4, 0] = Color.FromArgb (64, 64, 64);\r
229                                 colors[5, 0] = Color.Black;\r
230                                 colors[6, 0] = Color.White;\r
231                                 colors[7, 0] = Color.White;\r
232 \r
233                                 colors[0, 1] = Color.FromArgb (255, 192, 192);\r
234                                 colors[1, 1] = Color.FromArgb (255, 128, 128);\r
235                                 colors[2, 1] = Color.Red;\r
236                                 colors[3, 1] = Color.FromArgb (192, 0, 0);\r
237                                 colors[4, 1] = Color.Maroon;\r
238                                 colors[5, 1] = Color.FromArgb (64, 0, 0);\r
239                                 colors[6, 1] = Color.White;\r
240                                 colors[7, 1] = Color.White;\r
241 \r
242                                 colors[0, 2] = Color.FromArgb (255, 224, 192);\r
243                                 colors[1, 2] = Color.FromArgb (255, 192, 128);\r
244                                 colors[2, 2] = Color.FromArgb (255, 128, 0);\r
245                                 colors[3, 2] = Color.FromArgb (192, 64, 0);\r
246                                 colors[4, 2] = Color.FromArgb (128, 64, 0);\r
247                                 colors[5, 2] = Color.FromArgb (128, 64, 64);\r
248                                 colors[6, 2] = Color.White;\r
249                                 colors[7, 2] = Color.White;\r
250 \r
251                                 colors[0, 3] = Color.FromArgb (255, 255, 192);\r
252                                 colors[1, 3] = Color.FromArgb (255, 255, 128);\r
253                                 colors[2, 3] = Color.Yellow;\r
254                                 colors[3, 3] = Color.FromArgb (192, 192, 0);\r
255                                 colors[4, 3] = Color.Olive;\r
256                                 colors[5, 3] = Color.FromArgb (64, 64, 0);\r
257                                 colors[6, 3] = Color.White;\r
258                                 colors[7, 3] = Color.White;\r
259 \r
260                                 colors[0, 4] = Color.FromArgb (192, 255, 192);\r
261                                 colors[1, 4] = Color.FromArgb (128, 255, 128);\r
262                                 colors[2, 4] = Color.Lime;\r
263                                 colors[3, 4] = Color.FromArgb (0, 192, 0);\r
264                                 colors[4, 4] = Color.Green;\r
265                                 colors[5, 4] = Color.FromArgb (0, 64, 0);\r
266                                 colors[6, 4] = Color.White;\r
267                                 colors[7, 4] = Color.White;\r
268 \r
269                                 colors[0, 5] = Color.FromArgb (192, 255, 255);\r
270                                 colors[1, 5] = Color.FromArgb (128, 255, 255);\r
271                                 colors[2, 5] = Color.Cyan;\r
272                                 colors[3, 5] = Color.FromArgb (0, 192, 192);\r
273                                 colors[4, 5] = Color.Teal;\r
274                                 colors[5, 5] = Color.FromArgb (0, 64, 64);\r
275                                 colors[6, 5] = Color.White;\r
276                                 colors[7, 5] = Color.White;\r
277 \r
278                                 colors[0, 6] = Color.FromArgb (192, 192, 255);\r
279                                 colors[1, 6] = Color.FromArgb (128, 128, 255);\r
280                                 colors[2, 6] = Color.Blue;\r
281                                 colors[3, 6] = Color.FromArgb (0, 0, 192);\r
282                                 colors[4, 6] = Color.Navy;\r
283                                 colors[5, 6] = Color.FromArgb (0, 0, 64);\r
284                                 colors[6, 6] = Color.White;\r
285                                 colors[7, 6] = Color.White;\r
286 \r
287                                 colors[0, 7] = Color.FromArgb (255, 192, 255);\r
288                                 colors[1, 7] = Color.FromArgb (255, 128, 255);\r
289                                 colors[2, 7] = Color.Fuchsia;\r
290                                 colors[3, 7] = Color.FromArgb (192, 0, 192);\r
291                                 colors[4, 7] = Color.Purple;\r
292                                 colors[5, 7] = Color.FromArgb (64, 0, 64);\r
293                                 colors[6, 7] = Color.White;\r
294                                 colors[7, 7] = Color.White;\r
295                         }\r
296 \r
297                         public event EventHandler ColorChanged;\r
298 \r
299                         protected override void OnPaint (PaintEventArgs e)\r
300                         {\r
301                                 for (int i = 0; i < 8; i++)\r
302                                         for (int j = 0; j < 8; j++) {\r
303                                                 DrawRect (e.Graphics, colors[i, j], j * 24, i * 24);\r
304                                         }\r
305 \r
306                                 if (highlighting) {\r
307                                         int i = x / 24;\r
308                                         int j = y / 24;\r
309                                         ControlPaint.DrawFocusRectangle (e.Graphics, new Rectangle (i * 24 - 2, j * 24 - 2, 24, 24));\r
310                                 }\r
311 \r
312                                 base.OnPaint (e);\r
313                         }\r
314 \r
315                         void DrawRect (Graphics g, Color color, int x, int y)\r
316                         {\r
317                                 using (SolidBrush brush = new SolidBrush (color))\r
318                                         g.FillRectangle (brush, x, y, 20, 20);\r
319                                 ControlPaint.DrawBorder3D (g, x, y, 20, 20);\r
320                         }\r
321 \r
322                         protected override void OnMouseDown (MouseEventArgs e)\r
323                         {\r
324                                 if (e.X % 24 < 20 && e.Y % 24 < 20) {\r
325                                         x = e.X;\r
326                                         y = e.Y;\r
327                                         highlighting = true;\r
328                                         Invalidate ();\r
329                                 }\r
330                                 base.OnMouseDown (e);\r
331                         }\r
332 \r
333                         protected override void OnMouseUp (MouseEventArgs e)\r
334                         {\r
335                                 if (highlighting) {\r
336                                         if (ColorChanged != null)\r
337                                                 ColorChanged (colors[y / 24, x / 24], EventArgs.Empty);\r
338                                         highlighting = false;\r
339                                 }\r
340                                 base.OnMouseUp (e);\r
341                         }\r
342 \r
343                         protected override void OnMouseMove (MouseEventArgs e)\r
344                         {\r
345                                 if (highlighting) {\r
346                                         int old_x = x;\r
347                                         int old_y = y;\r
348                                         x = e.X;\r
349                                         y = e.Y;\r
350                                         if ((old_x / 24 != x / 24 || old_y / 24 != y / 24) &&\r
351                                                 x / 24 < 8 && y / 24 < 8) {\r
352                                                 Region r = new Region ();\r
353                                                 r.Union (new Rectangle (old_x - 2, old_y - 2, 24, 24));\r
354                                                 r.Union (new Rectangle (x - 2, y - 2, 24, 24));\r
355                                                 Invalidate (r);\r
356                                         }\r
357                                 }\r
358                                 base.OnMouseMove (e);\r
359                         }\r
360                 }
361         }
362 }