2 // System.Drawing.Design.ColorEditor.cs
5 // Martin Willemoes Hansen (mwh@sysrq.dk)
\r
6 // Andreas Nahr (ClassDevelopment@A-SoftTech.com)
\r
7 // Jonathan Chambers (joncham@gmail.com)
9 // (C) 2003 Martin Willemoes Hansen
\r
10 // (C) 2003 Andreas Nahr
\r
11 // (C) 2006 Jonathan Chambers
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:
23 // The above copyright notice and this permission notice shall be
24 // included in all copies or substantial portions of the Software.
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.
37 using System.Drawing.Design;
38 using System.ComponentModel;
39 using System.Windows.Forms;
40 using System.Windows.Forms.Design;
42 namespace System.Drawing.Design
44 public class ColorEditor : UITypeEditor
46 private IWindowsFormsEditorService editorService;
47 private Color selected_color;
48 private bool color_chosen;
54 public override object EditValue (ITypeDescriptorContext context,
55 IServiceProvider provider, object value)
57 if (context != null && provider != null) {
58 editorService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
59 if (editorService != null) {
60 // Create the UI editor control
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");
68 ColorListBox web_listbox = new ColorListBox();
69 ColorListBox system_listbox = new ColorListBox();
70 web_listbox.Dock = DockStyle.Fill;
71 system_listbox.Dock = DockStyle.Fill;
73 web_tab.Controls.Add(web_listbox);
74 system_tab.Controls.Add(system_listbox);
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);
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);
87 WebColorCompare web_compare = new WebColorCompare();
88 color_list = new System.Collections.ArrayList();
89 foreach (KnownColor known_color in Enum.GetValues(typeof(KnownColor)))
91 Color color = Color.FromKnownColor(known_color);
92 if (color.IsSystemColor)
94 color_list.Add(color);
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
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);
106 tab_control.TabPages.Add(custom_tab);
107 tab_control.TabPages.Add(web_tab);
108 tab_control.TabPages.Add(system_tab);
111 Color current_color = (Color)value;
112 if (current_color.IsSystemColor)
114 system_listbox.SelectedValue = current_color;
115 tab_control.SelectedTab = system_tab;
117 else if (current_color.IsKnownColor)
119 web_listbox.SelectedValue = current_color;
120 tab_control.SelectedTab = web_tab;
122 selected_color = current_color;
127 editorService.DropDownControl(tab_control);
129 return selected_color;
136 return base.EditValue(context, provider, value);
139 private void HandleChange(object sender, EventArgs e)
141 selected_color = (Color)((ColorListBox)sender).Items[((ColorListBox)sender).SelectedIndex];
145 private void CustomColorPicked (object sender, EventArgs e)
\r
147 selected_color = (Color)sender;
149 if (editorService != null)
150 editorService.CloseDropDown ();
\r
153 private void HandleMouseUp(object sender, MouseEventArgs e)
155 if (editorService != null)
156 editorService.CloseDropDown();
159 public override UITypeEditorEditStyle GetEditStyle (ITypeDescriptorContext context)
161 return UITypeEditorEditStyle.DropDown;
164 public override bool GetPaintValueSupported (ITypeDescriptorContext context)
169 public override void PaintValue (PaintValueEventArgs e)
171 Graphics G = e.Graphics;
175 Color C = (Color) e.Value;
176 using (SolidBrush sb = new SolidBrush (C))
177 G.FillRectangle (sb, e.Bounds);
181 class ColorListBox : ListBox {
182 public ColorListBox() {
183 this.DrawMode = DrawMode.OwnerDrawFixed;
185 this.ItemHeight = 14;
186 this.BorderStyle = BorderStyle.FixedSingle;
189 protected override void OnDrawItem(DrawItemEventArgs e) {
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();
202 class SystemColorCompare : System.Collections.IComparer {
203 #region IComparer Members
205 public int Compare(object x, object y) {
208 return String.Compare(c1.Name, c2.Name);
213 class WebColorCompare : System.Collections.IComparer
215 #region IComparer Members
217 public int Compare(object x, object y)
221 return String.Compare(c1.Name, c2.Name);
228 class CustomColorPicker : UserControl
\r
233 public CustomColorPicker ()
\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
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
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
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
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
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
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
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
309 public event EventHandler ColorChanged;
\r
311 protected override void OnPaint (PaintEventArgs e)
\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
318 if (highlighting) {
\r
321 ControlPaint.DrawFocusRectangle (e.Graphics, new Rectangle (i * 24 - 2, j * 24 - 2, 24, 24));
\r
327 void DrawRect (Graphics g, Color color, int x, int y)
\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
334 protected override void OnMouseDown (MouseEventArgs e)
\r
336 if (e.X % 24 < 20 && e.Y % 24 < 20) {
\r
339 highlighting = true;
\r
342 base.OnMouseDown (e);
\r
345 protected override void OnMouseUp (MouseEventArgs e)
\r
347 if (highlighting) {
\r
348 if (ColorChanged != null)
\r
349 ColorChanged (colors[y / 24, x / 24], EventArgs.Empty);
\r
350 highlighting = false;
\r
352 base.OnMouseUp (e);
\r
355 protected override void OnMouseMove (MouseEventArgs e)
\r
357 if (highlighting) {
\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
370 base.OnMouseMove (e);
\r