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                 private bool color_chosen;
49
50                 public ColorEditor()
51                 {
52                 }
53
54                 public override object EditValue (ITypeDescriptorContext context,
55                         IServiceProvider provider, object value)
56                 {
57                         if (context != null && provider != null) {
58                                 editorService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
59                                 if (editorService != null) {
60                                         // Create the UI editor control
61                                         
62                                         TabControl tab_control = new TabControl();
63                                         tab_control.Dock = DockStyle.Fill;
64                                         TabPage custom_tab = new TabPage("Custom");
65                                         TabPage web_tab = new TabPage("Web");
66                                         TabPage system_tab = new TabPage("System");
67
68                                         ColorListBox web_listbox = new ColorListBox();
69                                         ColorListBox system_listbox = new ColorListBox();
70                                         web_listbox.Dock = DockStyle.Fill;
71                                         system_listbox.Dock = DockStyle.Fill;
72
73                                         web_tab.Controls.Add(web_listbox);
74                                         system_tab.Controls.Add(system_listbox);
75
76                                         SystemColorCompare system_compare = new SystemColorCompare();
77                                         System.Collections.ArrayList color_list = new System.Collections.ArrayList();
78                                         foreach (System.Reflection.PropertyInfo property in typeof(SystemColors).GetProperties(System.Reflection.BindingFlags.Public |System.Reflection.BindingFlags.Static)) {
79                                                 Color clr = (Color)property.GetValue(null,null);
80                                                 color_list.Add(clr);
81                                         }
82                                         color_list.Sort(system_compare);
83                                         system_listbox.Items.AddRange(color_list.ToArray());
84                                         system_listbox.MouseUp+=new MouseEventHandler(HandleMouseUp);
85                                         system_listbox.SelectedValueChanged+=new EventHandler(HandleChange);
86
87                                         WebColorCompare web_compare = new WebColorCompare();
88                                         color_list = new System.Collections.ArrayList();
89                                         foreach (KnownColor known_color in Enum.GetValues(typeof(KnownColor))) 
90                                         {
91                                                 Color color = Color.FromKnownColor(known_color);
92                                                 if (color.IsSystemColor)
93                                                         continue;
94                                                 color_list.Add(color);
95                                         }
96                                         color_list.Sort(web_compare);
97                                         web_listbox.Items.AddRange(color_list.ToArray());
98                                         web_listbox.MouseUp+=new MouseEventHandler(HandleMouseUp);
99                                         web_listbox.SelectedValueChanged+=new EventHandler(HandleChange);\r
100
101                                         CustomColorPicker custom_picker = new CustomColorPicker ();\r
102                                         custom_picker.Dock = DockStyle.Fill;\r
103                                         custom_picker.ColorChanged += new EventHandler (CustomColorPicked);\r
104                                         custom_tab.Controls.Add (custom_picker);
105
106                                         tab_control.TabPages.Add(custom_tab);
107                                         tab_control.TabPages.Add(web_tab);
108                                         tab_control.TabPages.Add(system_tab);
109
110                                         if (value != null) {
111                                                 Color current_color = (Color)value;
112                                                 if (current_color.IsSystemColor) 
113                                                 {
114                                                         system_listbox.SelectedValue = current_color;
115                                                         tab_control.SelectedTab = system_tab;
116                                                 }
117                                                 else if (current_color.IsKnownColor)
118                                                 {
119                                                         web_listbox.SelectedValue = current_color;
120                                                         tab_control.SelectedTab = web_tab;
121                                                 }
122                                                 selected_color = current_color;
123                                                 color_chosen = true;
124                                         }
125
126
127                                         editorService.DropDownControl(tab_control);
128                                         if (color_chosen) {
129                                                 return selected_color;
130                                         }
131                                         else {
132                                                 return null;
133                                         }
134                                 }
135                         }
136                         return base.EditValue(context, provider, value);
137                 }
138
139                 private void HandleChange(object sender, EventArgs e) 
140                 {
141                         selected_color = (Color)((ColorListBox)sender).Items[((ColorListBox)sender).SelectedIndex];
142                         color_chosen = true;
143                 }
144
145                 private void CustomColorPicked (object sender, EventArgs e)\r
146                 {
147                         selected_color = (Color)sender;
148                         color_chosen = true;
149                         if (editorService != null)
150                                 editorService.CloseDropDown ();\r
151                 }
152
153                 private void HandleMouseUp(object sender, MouseEventArgs e) 
154                 {
155                         if (editorService != null)
156                                 editorService.CloseDropDown();
157                 }
158
159                 public override UITypeEditorEditStyle GetEditStyle (ITypeDescriptorContext context)
160                 {
161                         return UITypeEditorEditStyle.DropDown;
162                 }
163
164                 public override bool GetPaintValueSupported (ITypeDescriptorContext context)
165                 {
166                         return true;
167                 }
168
169                 public override void PaintValue (PaintValueEventArgs e)
170                 {
171                         Graphics G = e.Graphics;
172
173                         if (e.Value != null)
174                         {
175                                 Color C = (Color) e.Value;
176                                 using (SolidBrush sb = new SolidBrush (C))
177                                         G.FillRectangle (sb, e.Bounds);
178                         }
179                 }
180
181                 class ColorListBox : ListBox {
182                         public ColorListBox() {
183                                 this.DrawMode = DrawMode.OwnerDrawFixed;
184                                 this.Sorted = true;
185                                 this.ItemHeight = 14;
186                                 this.BorderStyle = BorderStyle.FixedSingle;
187                         }
188
189                         protected override void OnDrawItem(DrawItemEventArgs e) {
190                                 e.DrawBackground();
191                                 Color color = (Color)this.Items[e.Index];
192                                 using (System.Drawing.SolidBrush brush = new SolidBrush(color))
193                                         e.Graphics.FillRectangle(brush, 2,e.Bounds.Top+2,21,9);
194                                 e.Graphics.DrawRectangle(SystemPens.WindowText, 2,e.Bounds.Top+2,21,9);
195                                 e.Graphics.DrawString(color.Name, this.Font, SystemBrushes.WindowText, 26,e.Bounds.Top);
196                                 if ((e.State & DrawItemState.Selected) != 0)
197                                         e.DrawFocusRectangle();
198                                 base.OnDrawItem (e);
199                         }
200                 }
201
202                 class SystemColorCompare : System.Collections.IComparer {
203                         #region IComparer Members
204
205                         public int Compare(object x, object y) {
206                                 Color c1 = (Color)x;
207                                 Color c2 = (Color)y;
208                                 return String.Compare(c1.Name, c2.Name);
209                         }
210
211                         #endregion
212                 }
213                 class WebColorCompare : System.Collections.IComparer 
214                 {
215                         #region IComparer Members
216
217                         public int Compare(object x, object y) 
218                         {
219                                 Color c1 = (Color)x;
220                                 Color c2 = (Color)y;
221                                 return String.Compare(c1.Name, c2.Name);
222                         }
223
224                         #endregion
225                 }\r
226 \r
227 \r
228                 class CustomColorPicker : UserControl\r
229                 {\r
230                         Color[,] colors;\r
231                         bool highlighting;\r
232                         int x, y;\r
233                         public CustomColorPicker ()\r
234                         {\r
235                                 colors = new Color[8, 8];\r
236                                 colors[0, 0] = Color.White;\r
237                                 colors[1, 0] = Color.FromArgb (224, 224, 224);\r
238                                 colors[2, 0] = Color.Silver;\r
239                                 colors[3, 0] = Color.Gray;\r
240                                 colors[4, 0] = Color.FromArgb (64, 64, 64);\r
241                                 colors[5, 0] = Color.Black;\r
242                                 colors[6, 0] = Color.White;\r
243                                 colors[7, 0] = Color.White;\r
244 \r
245                                 colors[0, 1] = Color.FromArgb (255, 192, 192);\r
246                                 colors[1, 1] = Color.FromArgb (255, 128, 128);\r
247                                 colors[2, 1] = Color.Red;\r
248                                 colors[3, 1] = Color.FromArgb (192, 0, 0);\r
249                                 colors[4, 1] = Color.Maroon;\r
250                                 colors[5, 1] = Color.FromArgb (64, 0, 0);\r
251                                 colors[6, 1] = Color.White;\r
252                                 colors[7, 1] = Color.White;\r
253 \r
254                                 colors[0, 2] = Color.FromArgb (255, 224, 192);\r
255                                 colors[1, 2] = Color.FromArgb (255, 192, 128);\r
256                                 colors[2, 2] = Color.FromArgb (255, 128, 0);\r
257                                 colors[3, 2] = Color.FromArgb (192, 64, 0);\r
258                                 colors[4, 2] = Color.FromArgb (128, 64, 0);\r
259                                 colors[5, 2] = Color.FromArgb (128, 64, 64);\r
260                                 colors[6, 2] = Color.White;\r
261                                 colors[7, 2] = Color.White;\r
262 \r
263                                 colors[0, 3] = Color.FromArgb (255, 255, 192);\r
264                                 colors[1, 3] = Color.FromArgb (255, 255, 128);\r
265                                 colors[2, 3] = Color.Yellow;\r
266                                 colors[3, 3] = Color.FromArgb (192, 192, 0);\r
267                                 colors[4, 3] = Color.Olive;\r
268                                 colors[5, 3] = Color.FromArgb (64, 64, 0);\r
269                                 colors[6, 3] = Color.White;\r
270                                 colors[7, 3] = Color.White;\r
271 \r
272                                 colors[0, 4] = Color.FromArgb (192, 255, 192);\r
273                                 colors[1, 4] = Color.FromArgb (128, 255, 128);\r
274                                 colors[2, 4] = Color.Lime;\r
275                                 colors[3, 4] = Color.FromArgb (0, 192, 0);\r
276                                 colors[4, 4] = Color.Green;\r
277                                 colors[5, 4] = Color.FromArgb (0, 64, 0);\r
278                                 colors[6, 4] = Color.White;\r
279                                 colors[7, 4] = Color.White;\r
280 \r
281                                 colors[0, 5] = Color.FromArgb (192, 255, 255);\r
282                                 colors[1, 5] = Color.FromArgb (128, 255, 255);\r
283                                 colors[2, 5] = Color.Cyan;\r
284                                 colors[3, 5] = Color.FromArgb (0, 192, 192);\r
285                                 colors[4, 5] = Color.Teal;\r
286                                 colors[5, 5] = Color.FromArgb (0, 64, 64);\r
287                                 colors[6, 5] = Color.White;\r
288                                 colors[7, 5] = Color.White;\r
289 \r
290                                 colors[0, 6] = Color.FromArgb (192, 192, 255);\r
291                                 colors[1, 6] = Color.FromArgb (128, 128, 255);\r
292                                 colors[2, 6] = Color.Blue;\r
293                                 colors[3, 6] = Color.FromArgb (0, 0, 192);\r
294                                 colors[4, 6] = Color.Navy;\r
295                                 colors[5, 6] = Color.FromArgb (0, 0, 64);\r
296                                 colors[6, 6] = Color.White;\r
297                                 colors[7, 6] = Color.White;\r
298 \r
299                                 colors[0, 7] = Color.FromArgb (255, 192, 255);\r
300                                 colors[1, 7] = Color.FromArgb (255, 128, 255);\r
301                                 colors[2, 7] = Color.Fuchsia;\r
302                                 colors[3, 7] = Color.FromArgb (192, 0, 192);\r
303                                 colors[4, 7] = Color.Purple;\r
304                                 colors[5, 7] = Color.FromArgb (64, 0, 64);\r
305                                 colors[6, 7] = Color.White;\r
306                                 colors[7, 7] = Color.White;\r
307                         }\r
308 \r
309                         public event EventHandler ColorChanged;\r
310 \r
311                         protected override void OnPaint (PaintEventArgs e)\r
312                         {\r
313                                 for (int i = 0; i < 8; i++)\r
314                                         for (int j = 0; j < 8; j++) {\r
315                                                 DrawRect (e.Graphics, colors[i, j], j * 24, i * 24);\r
316                                         }\r
317 \r
318                                 if (highlighting) {\r
319                                         int i = x / 24;\r
320                                         int j = y / 24;\r
321                                         ControlPaint.DrawFocusRectangle (e.Graphics, new Rectangle (i * 24 - 2, j * 24 - 2, 24, 24));\r
322                                 }\r
323 \r
324                                 base.OnPaint (e);\r
325                         }\r
326 \r
327                         void DrawRect (Graphics g, Color color, int x, int y)\r
328                         {\r
329                                 using (SolidBrush brush = new SolidBrush (color))\r
330                                         g.FillRectangle (brush, x, y, 20, 20);\r
331                                 ControlPaint.DrawBorder3D (g, x, y, 20, 20);\r
332                         }\r
333 \r
334                         protected override void OnMouseDown (MouseEventArgs e)\r
335                         {\r
336                                 if (e.X % 24 < 20 && e.Y % 24 < 20) {\r
337                                         x = e.X;\r
338                                         y = e.Y;\r
339                                         highlighting = true;\r
340                                         Invalidate ();\r
341                                 }\r
342                                 base.OnMouseDown (e);\r
343                         }\r
344 \r
345                         protected override void OnMouseUp (MouseEventArgs e)\r
346                         {\r
347                                 if (highlighting) {\r
348                                         if (ColorChanged != null)\r
349                                                 ColorChanged (colors[y / 24, x / 24], EventArgs.Empty);\r
350                                         highlighting = false;\r
351                                 }\r
352                                 base.OnMouseUp (e);\r
353                         }\r
354 \r
355                         protected override void OnMouseMove (MouseEventArgs e)\r
356                         {\r
357                                 if (highlighting) {\r
358                                         int old_x = x;\r
359                                         int old_y = y;\r
360                                         x = e.X;\r
361                                         y = e.Y;\r
362                                         if ((old_x / 24 != x / 24 || old_y / 24 != y / 24) &&\r
363                                                 x / 24 < 8 && y / 24 < 8) {\r
364                                                 Region r = new Region ();\r
365                                                 r.Union (new Rectangle (old_x - 2, old_y - 2, 24, 24));\r
366                                                 r.Union (new Rectangle (x - 2, y - 2, 24, 24));\r
367                                                 Invalidate (r);\r
368                                         }\r
369                                 }\r
370                                 base.OnMouseMove (e);\r
371                         }\r
372                 }
373         }
374 }