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;
53 public override object EditValue (ITypeDescriptorContext context,
54 IServiceProvider provider, object value)
56 if (context != null && provider != null) {
57 editorService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
58 if (editorService != null) {
59 // Create the UI editor control
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");
67 ColorListBox web_listbox = new ColorListBox();
68 ColorListBox system_listbox = new ColorListBox();
69 web_listbox.Dock = DockStyle.Fill;
70 system_listbox.Dock = DockStyle.Fill;
72 web_tab.Controls.Add(web_listbox);
73 system_tab.Controls.Add(system_listbox);
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);
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);
86 WebColorCompare web_compare = new WebColorCompare();
87 color_list = new System.Collections.ArrayList();
88 foreach (KnownColor known_color in Enum.GetValues(typeof(KnownColor)))
90 Color color = Color.FromKnownColor(known_color);
91 if (color.IsSystemColor)
93 color_list.Add(color);
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
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);
105 tab_control.TabPages.Add(custom_tab);
106 tab_control.TabPages.Add(web_tab);
107 tab_control.TabPages.Add(system_tab);
109 Color current_color = (Color)value;
110 if (current_color.IsSystemColor)
112 system_listbox.SelectedValue = current_color;
113 tab_control.SelectedTab = system_tab;
115 else if (current_color.IsKnownColor)
117 web_listbox.SelectedValue = current_color;
118 tab_control.SelectedTab = web_tab;
122 editorService.DropDownControl(tab_control);
123 return selected_color;
126 return base.EditValue(context, provider, value);
129 private void HandleChange(object sender, EventArgs e)
131 selected_color = (Color)((ColorListBox)sender).Items[((ColorListBox)sender).SelectedIndex];
134 private void CustomColorPicked (object sender, EventArgs e)
\r
136 selected_color = (Color)sender;
\r
137 if (editorService != null)
\r
138 editorService.CloseDropDown ();
\r
141 private void HandleMouseUp(object sender, MouseEventArgs e)
143 if (editorService != null)
144 editorService.CloseDropDown();
147 public override UITypeEditorEditStyle GetEditStyle (ITypeDescriptorContext context)
149 return UITypeEditorEditStyle.DropDown;
152 public override bool GetPaintValueSupported (ITypeDescriptorContext context)
157 public override void PaintValue (PaintValueEventArgs e)
159 Graphics G = e.Graphics;
163 Color C = (Color) e.Value;
164 using (SolidBrush sb = new SolidBrush (C))
165 G.FillRectangle (sb, e.Bounds);
169 class ColorListBox : ListBox {
170 public ColorListBox() {
171 this.DrawMode = DrawMode.OwnerDrawFixed;
173 this.ItemHeight = 14;
174 this.BorderStyle = BorderStyle.FixedSingle;
177 protected override void OnDrawItem(DrawItemEventArgs e) {
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();
190 class SystemColorCompare : System.Collections.IComparer {
191 #region IComparer Members
193 public int Compare(object x, object y) {
196 return String.Compare(c1.Name, c2.Name);
201 class WebColorCompare : System.Collections.IComparer
203 #region IComparer Members
205 public int Compare(object x, object y)
209 return String.Compare(c1.Name, c2.Name);
216 class CustomColorPicker : UserControl
\r
221 public CustomColorPicker ()
\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
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
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
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
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
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
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
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
297 public event EventHandler ColorChanged;
\r
299 protected override void OnPaint (PaintEventArgs e)
\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
306 if (highlighting) {
\r
309 ControlPaint.DrawFocusRectangle (e.Graphics, new Rectangle (i * 24 - 2, j * 24 - 2, 24, 24));
\r
315 void DrawRect (Graphics g, Color color, int x, int y)
\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
322 protected override void OnMouseDown (MouseEventArgs e)
\r
324 if (e.X % 24 < 20 && e.Y % 24 < 20) {
\r
327 highlighting = true;
\r
330 base.OnMouseDown (e);
\r
333 protected override void OnMouseUp (MouseEventArgs e)
\r
335 if (highlighting) {
\r
336 if (ColorChanged != null)
\r
337 ColorChanged (colors[y / 24, x / 24], EventArgs.Empty);
\r
338 highlighting = false;
\r
340 base.OnMouseUp (e);
\r
343 protected override void OnMouseMove (MouseEventArgs e)
\r
345 if (highlighting) {
\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
358 base.OnMouseMove (e);
\r