2009-05-21 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / ColorDialog.cs
1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
8 //
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
11 //
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19 //
20 // Copyright (c) 2006 Alexander Olk
21 //
22 // Authors:
23 //      Alexander Olk   alex.olk@googlemail.com
24 //
25
26 // COMPLETE
27
28 using System.ComponentModel;
29 using System.Drawing;
30 using System.Globalization;
31 using System.Resources;
32 using System;
33
34 namespace System.Windows.Forms {
35         [DefaultProperty ("Color")]
36         public class ColorDialog : CommonDialog {
37                 #region Local Variables
38                 private bool allowFullOpen = true;
39                 private bool anyColor = false;
40                 private Color color;
41                 private int[] customColors = null;
42                 private bool fullOpen = false;
43                 private bool showHelp = false;
44                 private bool solidColorOnly = false;
45                 
46                 private Panel selectedColorPanel;
47                 private BaseColorControl baseColorControl;
48                 private ColorMatrixControl colorMatrixControl;
49                 private BrightnessControl brightnessControl;
50                 private TriangleControl triangleControl;
51                 
52                 private Button okButton;
53                 private Button cancelButton;
54                 private Button helpButton;
55                 private Button addColoursButton;
56                 private Button defineColoursButton;
57                 
58                 private TextBox hueTextBox;
59                 private TextBox satTextBox;
60                 private TextBox briTextBox;
61                 private TextBox redTextBox;
62                 private TextBox greenTextBox;
63                 private TextBox blueTextBox;
64                 
65                 private Label briLabel;
66                 private Label satLabel;
67                 private Label hueLabel;
68                 private Label colorBaseLabel;
69                 private Label greenLabel;
70                 private Label blueLabel;
71                 private Label redLabel;
72                 #endregion      // Local Variables
73                 
74                 #region Public Constructors
75                 public ColorDialog () : base()
76                 {
77                         form = new DialogForm (this);
78                         form.SuspendLayout ();
79                         
80                         form.Text = "Color";
81                         
82                         form.FormBorderStyle = FormBorderStyle.FixedDialog;
83                         form.MaximizeBox = false;
84                         
85                         satTextBox = new TextBox ();
86                         briTextBox = new TextBox ();
87                         blueTextBox = new TextBox ();
88                         greenTextBox = new TextBox ();
89                         redTextBox = new TextBox ();
90                         hueTextBox = new TextBox ();
91                         
92                         redLabel = new Label ();
93                         blueLabel = new Label ();
94                         greenLabel = new Label ();
95                         colorBaseLabel = new Label ();
96                         hueLabel = new Label ();
97                         satLabel = new Label ();
98                         briLabel = new Label ();
99                         
100                         okButton = new Button ();
101                         cancelButton = new Button ();
102                         form.CancelButton = cancelButton;
103                         helpButton = new Button ();
104                         defineColoursButton = new Button ();
105                         addColoursButton = new Button ();
106                         
107                         baseColorControl = new BaseColorControl (this);
108                         colorMatrixControl = new ColorMatrixControl (this);
109                         brightnessControl = new BrightnessControl (this);
110                         triangleControl = new TriangleControl (this);
111                         
112                         selectedColorPanel = new Panel ();
113                         
114                         // hueTextBox
115                         hueTextBox.Location = new Point (324, 203);
116                         hueTextBox.Size = new Size (27, 21);
117                         hueTextBox.TabIndex = 11;
118                         hueTextBox.MaxLength = 3;
119                         // satTextBox
120                         satTextBox.Location = new Point (324, 225);
121                         satTextBox.Size = new Size (27, 21);
122                         satTextBox.TabIndex = 15;
123                         satTextBox.MaxLength = 3;
124                         // greenTextBox
125                         greenTextBox.Location = new Point (404, 225);
126                         greenTextBox.Size = new Size (27, 21);
127                         greenTextBox.TabIndex = 18;
128                         greenTextBox.MaxLength = 3;
129                         // briTextBox
130                         briTextBox.Location = new Point (324, 247);
131                         briTextBox.Size = new Size (27, 21);
132                         briTextBox.TabIndex = 16;
133                         briTextBox.MaxLength = 3;
134                         // blueTextBox
135                         blueTextBox.Location = new Point (404, 247);
136                         blueTextBox.Size = new Size (27, 21);
137                         blueTextBox.TabIndex = 19;
138                         blueTextBox.MaxLength = 3;
139                         // redTextBox
140                         redTextBox.Location = new Point (404, 203);
141                         redTextBox.Size = new Size (27, 21);
142                         redTextBox.TabIndex = 17;
143                         redTextBox.MaxLength = 3;
144                         
145                         // redLabel
146                         redLabel.FlatStyle = FlatStyle.System;
147                         redLabel.Location = new Point (361, 206);
148                         redLabel.Size = new Size (40, 16);
149                         redLabel.TabIndex = 25;
150                         redLabel.Text = Locale.GetText ("Red") + ":";
151                         redLabel.TextAlign = ContentAlignment.MiddleRight;
152                         // blueLabel
153                         blueLabel.FlatStyle = FlatStyle.System;
154                         blueLabel.Location = new Point (361, 250);
155                         blueLabel.Size = new Size (40, 16);
156                         blueLabel.TabIndex = 26;
157                         blueLabel.Text = Locale.GetText ("Blue") + ":";
158                         blueLabel.TextAlign = ContentAlignment.MiddleRight;
159                         // greenLabel
160                         greenLabel.FlatStyle = FlatStyle.System;
161                         greenLabel.Location = new Point (361, 228);
162                         greenLabel.Size = new Size (40, 16);
163                         greenLabel.TabIndex = 27;
164                         greenLabel.Text = Locale.GetText ("Green") + ":";
165                         greenLabel.TextAlign = ContentAlignment.MiddleRight;
166                         // colorBaseLabel
167                         colorBaseLabel.Location = new Point (228, 247);
168                         colorBaseLabel.Size = new Size (60, 25);
169                         colorBaseLabel.TabIndex = 28;
170                         colorBaseLabel.Text = Locale.GetText ("Color");
171                         colorBaseLabel.TextAlign = ContentAlignment.MiddleCenter;
172                         // hueLabel
173                         hueLabel.FlatStyle = FlatStyle.System;
174                         hueLabel.Location = new Point (287, 206);
175                         hueLabel.Size = new Size (36, 16);
176                         hueLabel.TabIndex = 23;
177                         hueLabel.Text = Locale.GetText ("Hue") + ":";
178                         hueLabel.TextAlign = ContentAlignment.MiddleRight;
179                         // satLabel
180                         satLabel.FlatStyle = FlatStyle.System;
181                         satLabel.Location = new Point (287, 228);
182                         satLabel.Size = new Size (36, 16);
183                         satLabel.TabIndex = 22;
184                         satLabel.Text = Locale.GetText ("Sat") + ":";
185                         satLabel.TextAlign = ContentAlignment.MiddleRight;
186                         // briLabel
187                         briLabel.FlatStyle = FlatStyle.System;
188                         briLabel.Location = new Point (287, 250);
189                         briLabel.Size = new Size (36, 16);
190                         briLabel.TabIndex = 24;
191                         briLabel.Text = Locale.GetText ("Bri") + ":";
192                         briLabel.TextAlign = ContentAlignment.MiddleRight;
193                         
194                         // defineColoursButton
195                         defineColoursButton.FlatStyle = FlatStyle.System;
196                         defineColoursButton.Location = new Point (5, 244);
197                         defineColoursButton.Size = new Size (210, 22);
198                         defineColoursButton.TabIndex = 6;
199                         // FIXME: update resource files
200                         defineColoursButton.Text = "Define Custom Colors >>";
201                         //defineColoursButton.Text = Locale.GetText ("Define Custom Colors >>");
202                         // okButton
203                         okButton.FlatStyle = FlatStyle.System;
204                         okButton.Location = new Point (5, 271);
205                         okButton.Size = new Size (66, 22);
206                         okButton.TabIndex = 0;
207                         okButton.Text = Locale.GetText ("OK");
208                         // cancelButton
209                         cancelButton.FlatStyle = FlatStyle.System;
210                         cancelButton.Location = new Point (78, 271);
211                         cancelButton.Size = new Size (66, 22);
212                         cancelButton.TabIndex = 1;
213                         cancelButton.Text = Locale.GetText ("Cancel");
214                         // helpButton
215                         helpButton.FlatStyle = FlatStyle.System;
216                         helpButton.Location = new Point (149, 271);
217                         helpButton.Size = new Size (66, 22);
218                         helpButton.TabIndex = 5;
219                         helpButton.Text = Locale.GetText ("Help");
220                         helpButton.Hide ();
221                         
222                         // addColoursButton
223                         addColoursButton.FlatStyle = FlatStyle.System;
224                         addColoursButton.Location = new Point (227, 271);
225                         addColoursButton.Size = new Size (213, 22);
226                         addColoursButton.TabIndex = 7;
227                         // FIXME: update resource files
228                         addColoursButton.Text =  "Add To Custom Colors";
229                         //addColoursButton.Text =  Locale.GetText ("Add To Custom Colors");
230                         
231                         // baseColorControl
232                         baseColorControl.Location = new Point (3, 6);
233                         baseColorControl.Size = new Size (212, 231);
234                         baseColorControl.TabIndex = 13;
235                         // colorMatrixControl
236                         colorMatrixControl.Location = new Point (227, 7);
237                         colorMatrixControl.Size = new Size (179, 190);
238                         colorMatrixControl.TabIndex = 14;
239                         // triangleControl
240                         triangleControl.Location = new Point (432, 0);
241                         triangleControl.Size = new Size (16, 204);
242                         triangleControl.TabIndex = 12;
243                         // brightnessControl
244                         brightnessControl.Location = new Point (415, 7);
245                         brightnessControl.Size = new Size (14, 190);
246                         brightnessControl.TabIndex = 20;
247                         
248                         // selectedColorPanel
249                         selectedColorPanel.BackColor = SystemColors.Desktop;
250                         selectedColorPanel.BorderStyle = BorderStyle.Fixed3D;
251                         selectedColorPanel.Location = new Point (227, 202);
252                         selectedColorPanel.Size = new Size (60, 42);
253                         selectedColorPanel.TabIndex = 10;
254                         
255                         form.Controls.Add (hueTextBox);
256                         form.Controls.Add (satTextBox);
257                         form.Controls.Add (briTextBox);
258                         form.Controls.Add (redTextBox);
259                         form.Controls.Add (greenTextBox);
260                         form.Controls.Add (blueTextBox);
261                         
262                         form.Controls.Add (defineColoursButton);
263                         form.Controls.Add (okButton);
264                         form.Controls.Add (cancelButton);
265                         form.Controls.Add (addColoursButton);
266                         
267                         form.Controls.Add (baseColorControl);
268                         form.Controls.Add (colorMatrixControl);
269                         form.Controls.Add (brightnessControl);
270                         form.Controls.Add (triangleControl);
271                         
272                         form.Controls.Add (colorBaseLabel);
273                         form.Controls.Add (greenLabel);
274                         form.Controls.Add (blueLabel);
275                         form.Controls.Add (redLabel);
276                         form.Controls.Add (briLabel);
277                         form.Controls.Add (hueLabel);
278                         form.Controls.Add (satLabel);
279                         
280                         form.Controls.Add (selectedColorPanel);
281                         
282                         form.ResumeLayout (false);
283                         
284                         Color = Color.Black;
285                         
286                         defineColoursButton.Click += new EventHandler (OnClickButtonDefineColours);
287                         addColoursButton.Click += new EventHandler (OnClickButtonAddColours);
288                         helpButton.Click += new EventHandler (OnClickHelpButton);
289                         cancelButton.Click += new EventHandler (OnClickCancelButton);
290                         okButton.Click += new EventHandler (OnClickOkButton);
291                         
292                         hueTextBox.KeyPress += new KeyPressEventHandler (OnKeyPressTextBoxes);
293                         satTextBox.KeyPress += new KeyPressEventHandler (OnKeyPressTextBoxes);
294                         briTextBox.KeyPress += new KeyPressEventHandler (OnKeyPressTextBoxes);
295                         redTextBox.KeyPress += new KeyPressEventHandler (OnKeyPressTextBoxes);
296                         greenTextBox.KeyPress += new KeyPressEventHandler (OnKeyPressTextBoxes);
297                         blueTextBox.KeyPress += new KeyPressEventHandler (OnKeyPressTextBoxes);
298                         
299                         hueTextBox.TextChanged += new EventHandler (OnTextChangedTextBoxes);
300                         satTextBox.TextChanged += new EventHandler (OnTextChangedTextBoxes);
301                         briTextBox.TextChanged += new EventHandler (OnTextChangedTextBoxes);
302                         redTextBox.TextChanged += new EventHandler (OnTextChangedTextBoxes);
303                         greenTextBox.TextChanged += new EventHandler (OnTextChangedTextBoxes);
304                         blueTextBox.TextChanged += new EventHandler (OnTextChangedTextBoxes);
305                         
306                         hueTextBox.GotFocus += new EventHandler (OnGotFocusTextBoxes);
307                         satTextBox.GotFocus += new EventHandler (OnGotFocusTextBoxes);
308                         briTextBox.GotFocus += new EventHandler (OnGotFocusTextBoxes);
309                         redTextBox.GotFocus += new EventHandler (OnGotFocusTextBoxes);
310                         greenTextBox.GotFocus += new EventHandler (OnGotFocusTextBoxes);
311                         blueTextBox.GotFocus += new EventHandler (OnGotFocusTextBoxes);
312                         
313                         hueTextBox.LostFocus += new EventHandler (OnLostFocusTextBoxes);
314                         satTextBox.LostFocus += new EventHandler (OnLostFocusTextBoxes);
315                         briTextBox.LostFocus += new EventHandler (OnLostFocusTextBoxes);
316                         redTextBox.LostFocus += new EventHandler (OnLostFocusTextBoxes);
317                         greenTextBox.LostFocus += new EventHandler (OnLostFocusTextBoxes);
318                         blueTextBox.LostFocus += new EventHandler (OnLostFocusTextBoxes);
319                         
320                         ResetCustomColors ();
321                 }
322                 #endregion      // Public Constructors
323                 
324                 #region Public Instance Properties
325                 public Color Color {
326                         get {
327                                 return selectedColorPanel.BackColor;
328                         }
329                         
330                         set {
331                                 if (value.IsEmpty) {
332                                         color = Color.Black;
333                                         baseColorControl.SetColor (color);
334                                 } else if (color != value) {
335                                         color = value;
336                                         baseColorControl.SetColor (color);
337                                 }
338                         }
339                 }
340                 
341                 [DefaultValue(true)]
342                 public virtual bool AllowFullOpen {
343                         get {
344                                 return allowFullOpen;
345                         }
346                         
347                         set {
348                                 if (allowFullOpen != value) {
349                                         allowFullOpen = value;
350                                         
351                                         if (!allowFullOpen)
352                                                 defineColoursButton.Enabled = false;
353                                         else
354                                                 defineColoursButton.Enabled = true;
355                                 }
356                         }
357                 }
358                 
359                 // Currently AnyColor internally is always true
360                 // Does really anybody still use 256 or less colors ???
361                 // Naw, cairo only supports 24bit anyway - pdb
362                 [DefaultValue(false)]
363                 public virtual bool AnyColor {
364                         get {
365                                 return anyColor;
366                         }
367                         
368                         set {
369                                 anyColor = value;
370                         }
371                 }
372                 
373                 [DefaultValue(false)]
374                 public virtual bool FullOpen {
375                         get {
376                                 return fullOpen;
377                         }
378                         
379                         set {
380                                 if (fullOpen != value) {
381                                         fullOpen = value;
382                                         
383                                         if (fullOpen && allowFullOpen) {
384                                                 defineColoursButton.Enabled = false;
385                                                 colorMatrixControl.ColorToShow = baseColorControl.ColorToShow;
386                                                 form.Size = GetFormSize (true);
387                                         } else {
388                                                 if (allowFullOpen)
389                                                         defineColoursButton.Enabled = true;
390                                                 form.Size = GetFormSize (false);
391                                         }
392                                 }
393                         }
394                 }
395                 
396                 [Browsable(false)]
397                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
398                 public int[] CustomColors {
399                         get {
400                                 return customColors;
401                         }
402                         
403                         set {
404                                 if (value == null)
405                                         ResetCustomColors ();
406                                 else {
407                                         int[] tmp_colors = value;
408                                         
409                                         Array.Copy (tmp_colors, customColors, tmp_colors.Length);
410                                 }
411                                         
412                                 baseColorControl.SetCustomColors ();
413                         }
414                 }
415                 
416                 [DefaultValue(false)]
417                 public virtual bool ShowHelp {
418                         get {
419                                 return showHelp;
420                         }
421                         
422                         set {
423                                 if (showHelp != value) {
424                                         showHelp = value;
425                                         if (showHelp)
426                                                 helpButton.Show ();
427                                         else
428                                                 helpButton.Hide ();
429                                 }
430                         }
431                 }
432                 
433                 [DefaultValue(false)]
434                 public virtual bool SolidColorOnly {
435                         get {
436                                 return solidColorOnly;
437                         }
438                         
439                         set {
440                                 solidColorOnly = value;
441                         }
442                 }
443                 #endregion      // Public Instance Properties
444                 
445                 #region Public Instance Methods
446                 public override void Reset ()
447                 {
448                         AllowFullOpen = true;
449                         anyColor = false;
450                         Color = Color.Black;
451                         CustomColors = null;
452                         FullOpen = false;
453                         ShowHelp = false;
454                         solidColorOnly = false;
455                 }
456                 
457                 public override string ToString ()
458                 {
459                         return base.ToString () + ",  Color: " + Color.ToString ();
460                 }
461                 #endregion      // Public Instance Methods
462                 
463                 #region Protected Instance Properties
464                 protected virtual IntPtr Instance {
465                         get {
466                                 // MS Internal
467                                 return (IntPtr)GetHashCode ();
468                         }
469                 }
470                 
471                 protected virtual int Options {
472                         get {
473                                 // MS Internal
474                                 return 0;
475                         }
476                 }
477                 #endregion      // Protected Instance Properties
478                 
479                 #region Protected Instance Methods
480                 protected override bool RunDialog (IntPtr hwndOwner)
481                 {
482                         defineColoursButton.Enabled = (AllowFullOpen && !FullOpen);
483                         defineColoursButton.Refresh ();
484
485                         form.Size = GetFormSize (FullOpen && AllowFullOpen);
486                         // currently needed, otherwise there are a lot of drawing artefacts/transparent controls if the same dialog gets opened again
487                         form.Refresh ();
488                         
489                         return true;
490                 }
491                 #endregion      // Protected Instance Methods
492                 
493                 #region Private Methods
494
495                 Size GetFormSize (bool fullOpen)
496                 {
497                         if (fullOpen)
498                                 return new Size (448, 332);
499                         else
500                                 return new Size (221, 332); // 300
501                 }
502
503                 void OnClickCancelButton (object sender, EventArgs e)
504                 {
505                         form.DialogResult = DialogResult.Cancel;
506                 }
507                 
508                 void OnClickOkButton (object sender, EventArgs e)
509                 {
510                         form.DialogResult = DialogResult.OK;
511                 }
512                 
513                 void OnClickButtonAddColours (object sender, EventArgs e)
514                 {
515                         baseColorControl.SetUserColor (selectedColorPanel.BackColor);
516                 }
517                 
518                 void OnClickButtonDefineColours (object sender, EventArgs e)
519                 {
520                         if (allowFullOpen) {
521                                 defineColoursButton.Enabled = false;
522                                 colorMatrixControl.ColorToShow = baseColorControl.ColorToShow;
523                                 form.Size = GetFormSize (true);
524                         }
525                 }
526                 
527                 // FIXME: Is this correct ?
528                 void OnClickHelpButton (object sender, EventArgs e)
529                 {
530                         OnHelpRequest (e);
531                 }
532                 
533                 string textBox_text_old = "";
534                 
535                 void OnGotFocusTextBoxes (object sender, EventArgs e)
536                 {
537                         TextBox textbox = sender as TextBox;
538                         textBox_text_old = textbox.Text;
539                 }
540                 
541                 void OnLostFocusTextBoxes (object sender, EventArgs e)
542                 {
543                         TextBox textbox = sender as TextBox;
544                         
545                         if (textbox.Text.Length == 0)
546                                 textbox.Text = textBox_text_old;
547                 }
548                 
549                 void OnKeyPressTextBoxes (object sender, KeyPressEventArgs e)
550                 {
551                         if (Char.IsLetter (e.KeyChar) || Char.IsWhiteSpace (e.KeyChar) || Char.IsPunctuation (e.KeyChar) || e.KeyChar == ',') {
552                                 e.Handled = true;
553                                 return; 
554                         }
555                         
556                         internal_textbox_change = true;
557                 }
558                 
559                 internal TextBox edit_textbox = null;
560                 bool internal_textbox_change = false;
561                 
562                 void OnTextChangedTextBoxes (object sender, EventArgs e)
563                 {
564                         if (!internal_textbox_change)
565                                 return;
566                         
567                         internal_textbox_change = false;
568                         
569                         TextBox tmp_box = sender as TextBox;
570                         
571                         if (tmp_box.Text.Length == 0)
572                                 return;
573                         
574                         string text = tmp_box.Text;
575                         
576                         int val = 0;
577                         
578                         try {
579                                 val = System.Convert.ToInt32 (text);
580                         } catch (Exception) {
581                                 // bla
582                         }
583                         
584                         if (sender == hueTextBox) {
585                                 if (val > 239) {
586                                         val = 239;
587                                         hueTextBox.Text = val.ToString ();
588                                 } else
589                                 if (val < 0) {
590                                         val = 0;
591                                         hueTextBox.Text = val.ToString ();
592                                 }
593                                 
594                                 edit_textbox = hueTextBox;
595                                 
596                                 UpdateFromHSBTextBoxes ();
597                                 
598                                 UpdateControls (selectedColorPanel.BackColor);
599                         } else
600                         if (sender == satTextBox) {
601                                 if (val > 240) {
602                                         val = 240;
603                                         satTextBox.Text = val.ToString ();
604                                 } else
605                                 if (val < 0) {
606                                         val = 0;
607                                         satTextBox.Text = val.ToString ();
608                                 }
609                                 
610                                 edit_textbox = satTextBox;
611                                 
612                                 UpdateFromHSBTextBoxes ();
613                                 
614                                 UpdateControls (selectedColorPanel.BackColor);
615                         } else
616                         if (sender == briTextBox) {
617                                 if (val > 240) {
618                                         val = 240;
619                                         briTextBox.Text = val.ToString ();
620                                 } else
621                                 if (val < 0) {
622                                         val = 0;
623                                         briTextBox.Text = val.ToString ();
624                                 }
625                                 
626                                 edit_textbox = briTextBox;
627                                 
628                                 UpdateFromHSBTextBoxes ();
629                                 
630                                 UpdateControls (selectedColorPanel.BackColor);
631                         } else
632                         if (sender == redTextBox) {
633                                 if (val > 255) {
634                                         val = 255;
635                                         redTextBox.Text = val.ToString ();
636                                 } else
637                                 if (val < 0) {
638                                         val = 0;
639                                         redTextBox.Text = val.ToString ();
640                                 }
641                                 
642                                 edit_textbox = redTextBox;
643                                 
644                                 UpdateFromRGBTextBoxes ();
645                         } else
646                         if (sender == greenTextBox) {
647                                 if (val > 255) {
648                                         val = 255;
649                                         greenTextBox.Text = val.ToString ();
650                                 } else
651                                 if (val < 0) {
652                                         val = 0;
653                                         greenTextBox.Text = val.ToString ();
654                                 }
655                                 
656                                 edit_textbox = greenTextBox;
657                                 
658                                 UpdateFromRGBTextBoxes ();
659                         } else
660                         if (sender == blueTextBox) {
661                                 if (val > 255) {
662                                         val = 255;
663                                         blueTextBox.Text = val.ToString ();
664                                 } else
665                                 if (val < 0) {
666                                         val = 0;
667                                         blueTextBox.Text = val.ToString ();
668                                 }
669                                 
670                                 edit_textbox = blueTextBox;
671                                 
672                                 UpdateFromRGBTextBoxes ();
673                         }
674                         
675                         textBox_text_old = edit_textbox.Text;
676                         
677                         edit_textbox = null;
678                 }
679                 
680                 internal void UpdateControls (Color acolor)
681                 {
682                         selectedColorPanel.BackColor = acolor;
683                         colorMatrixControl.ColorToShow = acolor;
684                         brightnessControl.ColorToShow = acolor;
685                         triangleControl.ColorToShow = acolor;
686                 }
687                 
688                 internal void UpdateRGBTextBoxes (Color acolor)
689                 {
690                         if (edit_textbox != redTextBox)
691                                 redTextBox.Text = acolor.R.ToString ();
692                         if (edit_textbox != greenTextBox)
693                                 greenTextBox.Text = acolor.G.ToString ();
694                         if (edit_textbox != blueTextBox)
695                                 blueTextBox.Text = acolor.B.ToString ();
696                 }
697                 
698                 internal void UpdateHSBTextBoxes (Color acolor)
699                 {
700                         HSB hsb = HSB.RGB2HSB (acolor);
701                         
702                         if (edit_textbox != hueTextBox)
703                                 hueTextBox.Text = hsb.hue.ToString ();
704                         if (edit_textbox != satTextBox)
705                                 satTextBox.Text = hsb.sat.ToString ();
706                         if (edit_textbox != briTextBox)
707                                 briTextBox.Text = hsb.bri.ToString ();
708                 }
709                 
710                 internal void UpdateFromHSBTextBoxes ()
711                 {
712                         Color col = HSB.HSB2RGB (System.Convert.ToInt32 (hueTextBox.Text),
713                                                  System.Convert.ToInt32 (satTextBox.Text),
714                                                  System.Convert.ToInt32 (briTextBox.Text));
715                         
716                         selectedColorPanel.BackColor = col;
717                         UpdateRGBTextBoxes (col);
718                 }
719                 
720                 internal void UpdateFromRGBTextBoxes ()
721                 {
722                         Color col = Color.FromArgb (System.Convert.ToInt32 (redTextBox.Text),
723                                                     System.Convert.ToInt32 (greenTextBox.Text),
724                                                     System.Convert.ToInt32 (blueTextBox.Text));
725                         
726                         selectedColorPanel.BackColor = col;
727                         
728                         UpdateHSBTextBoxes (col);
729                         
730                         UpdateControls (col);
731                 }
732                 
733                 void ResetCustomColors ()
734                 {
735                         // check if this.customColors already exists
736                         if (customColors == null)
737                                 customColors = new int [16];
738                         
739                         int default_color = Color.FromArgb(0, 255, 255, 255).ToArgb ();
740                                 
741                         for (int i = 0; i < customColors.Length; i++)
742                                 customColors [i] = default_color;
743                 }
744                 #endregion
745                 
746                 #region Internal structs and classes
747                 internal struct HSB {
748                         public int hue;
749                         public int sat;
750                         public int bri;
751                         
752                         public static HSB RGB2HSB (Color color)
753                         {
754                                 HSB hsb = new HSB ();
755                                 
756                                 hsb.hue = (int)((color.GetHue () / 360.0f) * 240);
757                                 hsb.sat = (int)(color.GetSaturation () * 241);
758                                 hsb.bri = (int)(color.GetBrightness () * 241);
759                                 
760                                 if (hsb.hue > 239) hsb.hue = 239;
761                                 if (hsb.sat > 240) hsb.sat = 240;
762                                 if (hsb.bri > 240) hsb.bri = 240;
763                                 
764                                 return hsb;
765                         }
766                         
767                         // not using ControlPaint HBS2Color, this algo is more precise
768                         public static Color HSB2RGB (int hue, int saturation, int brightness)
769                         {
770                                 if (hue > 239)
771                                         hue = 239;
772                                 else
773                                 if (hue < 0)
774                                         hue = 0;
775                                 
776                                 if (saturation > 240)
777                                         saturation = 240;
778                                 else
779                                 if (saturation < 0)
780                                         saturation = 0;
781                                 
782                                 if (brightness > 240)
783                                         brightness = 240;
784                                 else
785                                 if (brightness < 0)
786                                         brightness = 0;
787                                 
788                                 float H = hue / 239.0f;
789                                 float S = saturation / 240.0f;
790                                 float L = brightness / 240.0f;
791                                 
792                                 float r = 0, g = 0, b = 0;
793                                 float d1, d2;
794                                 
795                                 if (L == 0) {
796                                         r = g =  b = 0;
797                                 } else {
798                                         if (S == 0) {
799                                                 r = g = b = L;
800                                         } else {
801                                                 d2 = (L <= 0.5f) ? L * (1.0f + S) : L + S - (L * S);
802                                                 d1 = 2.0f * L - d2;
803                                                 
804                                                 float[] d3 = new float [] { H + 1.0f / 3.0f , H, H - 1.0f / 3.0f };
805                                                 float[] rgb = new float [] { 0,0,0 };
806                                                 
807                                                 for (int i = 0; i < 3; i++) {
808                                                         if (d3 [i] < 0)
809                                                                 d3 [i] += 1.0f;
810                                                         if (d3 [i] > 1.0f)
811                                                                 d3 [i] -= 1.0f;
812                                                         
813                                                         if (6.0f * d3 [i] < 1.0f)
814                                                                 rgb [i] = d1 + (d2 - d1) * d3 [i] * 6.0f;
815                                                         else
816                                                         if (2.0f * d3 [i] < 1.0f)
817                                                                 rgb [i] = d2;
818                                                         else
819                                                         if (3.0f * d3 [i] < 2.0f)
820                                                                 rgb [i] = (d1 + (d2 - d1) * ((2.0f / 3.0f) - d3 [i]) * 6.0f);
821                                                         else
822                                                                 rgb [i] = d1;
823                                                 }
824                                                 
825                                                 r = rgb [0];
826                                                 g = rgb [1];
827                                                 b = rgb [2];
828                                         }
829                                 }
830                                 
831                                 r = 255.0f * r;
832                                 g = 255.0f * g;
833                                 b = 255.0f * b;
834                                 
835                                 if (r < 1)
836                                         r = 0.0f;
837                                 else
838                                 if (r > 255.0f)
839                                         r = 255.0f;
840                                 
841                                 if (g < 1)
842                                         g = 0.0f;
843                                 else
844                                 if (g > 255.0f)
845                                         g = 255.0f;
846                                 
847                                 if (b < 1)
848                                         b = 0.0f;
849                                 else
850                                 if (b > 255.0f)
851                                         b = 255.0f;
852                                 
853                                 return Color.FromArgb ((int)r, (int)g, (int)b);
854                         }
855                         
856                         public static int Brightness (Color color)
857                         {
858                                 return (int)(color.GetBrightness () * 241);
859                         }
860                         
861                         public static void GetHueSaturation (Color color, out int hue, out int sat)
862                         {
863                                 hue = (int)((color.GetHue () / 360.0f) * 240);
864                                 sat = (int)(color.GetSaturation () * 241);
865                         }
866                         
867                         // only for testing
868                         // there are some small glitches, but it is still better than ControlPaint implementation
869                         public static void TestColor (Color color)
870                         {
871                                 Console.WriteLine ("Color: " + color);
872                                 HSB hsb = HSB.RGB2HSB (color);
873                                 Console.WriteLine ("RGB2HSB: " + hsb.hue + ", " + hsb.sat + ", " + hsb.bri);
874                                 Console.WriteLine ("HSB2RGB: " + HSB.HSB2RGB (hsb.hue, hsb.sat, hsb.bri));
875                                 Console.WriteLine ();
876                         }
877                 }
878                 
879                 internal class BaseColorControl : Control {
880                         internal class SmallColorControl : Control {
881                                 private Color internalcolor;
882                                 
883                                 private bool isSelected = false;
884                                 
885                                 public SmallColorControl (Color color)
886                                 {
887                                         SuspendLayout ();
888                                         
889                                         this.internalcolor = color;
890                                         
891                                         Size = new Size (25, 23);
892                                         
893                                         ResumeLayout (false);
894                                         
895                                         SetStyle (ControlStyles.DoubleBuffer, true);
896                                         SetStyle (ControlStyles.AllPaintingInWmPaint, true);
897                                         SetStyle (ControlStyles.UserPaint, true);
898                                         SetStyle (ControlStyles.Selectable, true);
899                                 }
900                                 
901                                 public bool IsSelected {
902                                         set {
903                                                 isSelected = value;
904                                                 Invalidate ();
905                                         }
906
907                                         get {
908                                                 return isSelected;
909                                         }
910                                 }
911                                 
912                                 public Color InternalColor {
913                                         set {
914                                                 internalcolor = value;
915                                                 Invalidate ();
916                                         }
917                                         
918                                         get {
919                                                 return internalcolor;
920                                         }
921                                 }
922                                 
923                                 protected override void OnPaint (PaintEventArgs pe)
924                                 {
925                                         base.OnPaint (pe);
926                                         
927                                         pe.Graphics.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (internalcolor),
928                                                                    new Rectangle (4, 4, 17, 15));
929                                         
930                                         ControlPaint.DrawBorder3D (pe.Graphics, 3, 3, 19, 17, Border3DStyle.Sunken);
931                                         
932                                         if (isSelected) {
933                                                 pe.Graphics.DrawRectangle (ThemeEngine.Current.ResPool.GetPen (Color.Black),
934                                                                            new Rectangle (2, 2, 20, 18));
935                                         }
936                                         
937                                         if (Focused) {
938                                                 ControlPaint.DrawFocusRectangle (
939                                                         pe.Graphics, new Rectangle (0, 0, 25, 23)
940                                                 );
941                                         }
942                                 }
943                                 
944                                 protected override void OnClick (EventArgs e)
945                                 {
946                                         Focus ();
947                                         IsSelected = true;
948                                         
949                                         base.OnClick (e);
950                                 }
951                                 
952                                 
953                                 protected override void OnLostFocus (EventArgs e)
954                                 {
955                                         Invalidate ();
956                                         
957                                         base.OnLostFocus (e);
958                                 }
959                         }
960                         
961                         private SmallColorControl[] smallColorControl;
962                         
963                         private SmallColorControl[] userSmallColorControl;
964                         
965                         private Label userColorLabel;
966                         private Label baseColorLabel;
967                         
968                         private SmallColorControl selectedSmallColorControl;
969
970                         #region UIA Framework Property
971 #if NET_2_0
972                         public SmallColorControl UIASelectedSmallColorControl {
973                                 get {
974                                         for (int i = 0; i < smallColorControl.Length - 1; ++i)
975                                                 if (smallColorControl [i].IsSelected)
976                                                         return smallColorControl [i];
977                                         for (int j = 0; j < userSmallColorControl.Length - 1; ++j)
978                                                 if (userSmallColorControl [j].IsSelected)
979                                                         return userSmallColorControl [j];
980                                         return null;
981                                 }
982                         }
983 #endif
984                         #endregion
985
986                         private int currentlyUsedUserSmallColorControl = 0;
987                         
988                         private ColorDialog colorDialog = null;
989                         
990                         public BaseColorControl (ColorDialog colorDialog)
991                         {
992                                 this.colorDialog = colorDialog;
993                                 
994                                 userSmallColorControl = new SmallColorControl [16];
995                                 userSmallColorControl [0] = new SmallColorControl (Color.White);
996                                 userSmallColorControl [1] = new SmallColorControl (Color.White);
997                                 userSmallColorControl [2] = new SmallColorControl (Color.White);
998                                 userSmallColorControl [3] = new SmallColorControl (Color.White);
999                                 userSmallColorControl [4] = new SmallColorControl (Color.White);
1000                                 userSmallColorControl [5] = new SmallColorControl (Color.White);
1001                                 userSmallColorControl [6] = new SmallColorControl (Color.White);
1002                                 userSmallColorControl [7] = new SmallColorControl (Color.White);
1003                                 userSmallColorControl [8] = new SmallColorControl (Color.White);
1004                                 userSmallColorControl [9] = new SmallColorControl (Color.White);
1005                                 userSmallColorControl [10] = new SmallColorControl (Color.White);
1006                                 userSmallColorControl [11] = new SmallColorControl (Color.White);
1007                                 userSmallColorControl [12] = new SmallColorControl (Color.White);
1008                                 userSmallColorControl [13] = new SmallColorControl (Color.White);
1009                                 userSmallColorControl [14] = new SmallColorControl (Color.White);
1010                                 userSmallColorControl [15] = new SmallColorControl (Color.White);
1011                                 
1012                                 smallColorControl = new SmallColorControl [48];
1013                                 smallColorControl [0] = new SmallColorControl (Color.FromArgb (((Byte)(255)), ((Byte)(128)), ((Byte)(128))));
1014                                 smallColorControl [1] = new SmallColorControl (Color.FromArgb (((Byte)(128)), ((Byte)(128)), ((Byte)(64))));
1015                                 smallColorControl [2] = new SmallColorControl (Color.Gray);
1016                                 smallColorControl [3] = new SmallColorControl (Color.FromArgb (((Byte)(128)), ((Byte)(0)), ((Byte)(255))));
1017                                 smallColorControl [4] = new SmallColorControl (Color.Silver);
1018                                 smallColorControl [5] = new SmallColorControl (Color.FromArgb (((Byte)(64)), ((Byte)(128)), ((Byte)(128))));
1019                                 smallColorControl [6] = new SmallColorControl (Color.White);
1020                                 smallColorControl [7] = new SmallColorControl (Color.FromArgb (((Byte)(64)), ((Byte)(0)), ((Byte)(64))));
1021                                 smallColorControl [8] = new SmallColorControl (Color.FromArgb (((Byte)(255)), ((Byte)(128)), ((Byte)(64))));
1022                                 smallColorControl [9] = new SmallColorControl (Color.FromArgb (((Byte)(128)), ((Byte)(64)), ((Byte)(64))));
1023                                 smallColorControl [10] = new SmallColorControl (Color.Teal);
1024                                 smallColorControl [11] = new SmallColorControl (Color.Lime);
1025                                 smallColorControl [12] = new SmallColorControl (Color.FromArgb (((Byte)(128)), ((Byte)(128)), ((Byte)(255))));
1026                                 smallColorControl [13] = new SmallColorControl (Color.FromArgb (((Byte)(0)), ((Byte)(64)), ((Byte)(128))));
1027                                 smallColorControl [14] = new SmallColorControl (Color.FromArgb (((Byte)(255)), ((Byte)(0)), ((Byte)(128))));
1028                                 smallColorControl [15] = new SmallColorControl (Color.FromArgb (((Byte)(128)), ((Byte)(255)), ((Byte)(0))));
1029                                 smallColorControl [16] = new SmallColorControl (Color.FromArgb (((Byte)(0)), ((Byte)(255)), ((Byte)(64))));
1030                                 smallColorControl [17] = new SmallColorControl (Color.Red);
1031                                 smallColorControl [18] = new SmallColorControl (Color.FromArgb (((Byte)(255)), ((Byte)(128)), ((Byte)(0))));
1032                                 smallColorControl [19] = new SmallColorControl (Color.FromArgb (((Byte)(255)), ((Byte)(128)), ((Byte)(255))));
1033                                 smallColorControl [20] = new SmallColorControl (Color.Fuchsia);
1034                                 smallColorControl [21] = new SmallColorControl (Color.Aqua);
1035                                 smallColorControl [22] = new SmallColorControl (Color.FromArgb (((Byte)(128)), ((Byte)(255)), ((Byte)(128))));
1036                                 smallColorControl [23] = new SmallColorControl (Color.FromArgb (((Byte)(128)), ((Byte)(255)), ((Byte)(255))));
1037                                 smallColorControl [24] = new SmallColorControl (Color.FromArgb (((Byte)(0)), ((Byte)(128)), ((Byte)(255))));
1038                                 smallColorControl [25] = new SmallColorControl (Color.FromArgb (((Byte)(128)), ((Byte)(64)), ((Byte)(0))));
1039                                 smallColorControl [26] = new SmallColorControl (Color.FromArgb (((Byte)(64)), ((Byte)(0)), ((Byte)(0))));
1040                                 smallColorControl [27] = new SmallColorControl (Color.Maroon);
1041                                 smallColorControl [28] = new SmallColorControl (Color.Purple);
1042                                 smallColorControl [29] = new SmallColorControl (Color.FromArgb (((Byte)(0)), ((Byte)(0)), ((Byte)(160))));
1043                                 smallColorControl [30] = new SmallColorControl (Color.Blue);
1044                                 smallColorControl [31] = new SmallColorControl (Color.FromArgb (((Byte)(0)), ((Byte)(128)), ((Byte)(64))));
1045                                 smallColorControl [32] = new SmallColorControl (Color.Green);
1046                                 smallColorControl [33] = new SmallColorControl (Color.Yellow);
1047                                 smallColorControl [34] = new SmallColorControl (Color.FromArgb (((Byte)(128)), ((Byte)(128)), ((Byte)(192))));
1048                                 smallColorControl [35] = new SmallColorControl (Color.FromArgb (((Byte)(0)), ((Byte)(128)), ((Byte)(192))));
1049                                 smallColorControl [36] = new SmallColorControl (Color.FromArgb (((Byte)(128)), ((Byte)(0)), ((Byte)(64))));
1050                                 smallColorControl [37] = new SmallColorControl (Color.FromArgb (((Byte)(255)), ((Byte)(128)), ((Byte)(192))));
1051                                 smallColorControl [38] = new SmallColorControl (Color.FromArgb (((Byte)(0)), ((Byte)(255)), ((Byte)(128))));
1052                                 smallColorControl [39] = new SmallColorControl (Color.FromArgb (((Byte)(255)), ((Byte)(255)), ((Byte)(128))));
1053                                 smallColorControl [40] = new SmallColorControl (Color.FromArgb (((Byte)(0)), ((Byte)(64)), ((Byte)(0))));
1054                                 smallColorControl [41] = new SmallColorControl (Color.FromArgb (((Byte)(0)), ((Byte)(64)), ((Byte)(64))));
1055                                 smallColorControl [42] = new SmallColorControl (Color.Navy);
1056                                 smallColorControl [43] = new SmallColorControl (Color.FromArgb (((Byte)(0)), ((Byte)(0)), ((Byte)(64))));
1057                                 smallColorControl [44] = new SmallColorControl (Color.FromArgb (((Byte)(64)), ((Byte)(0)), ((Byte)(64))));
1058                                 smallColorControl [45] = new SmallColorControl (Color.FromArgb (((Byte)(64)), ((Byte)(0)), ((Byte)(128))));
1059                                 smallColorControl [46] = new SmallColorControl (Color.Black); //Black
1060                                 smallColorControl [47] = new SmallColorControl (Color.Olive);
1061                                 
1062                                 baseColorLabel = new Label ();
1063                                 userColorLabel = new Label ();
1064                                 
1065                                 SuspendLayout ();
1066                                 
1067                                 // colorPanel1
1068                                 smallColorControl [0].Location = new Point (0, 15);
1069                                 smallColorControl [0].TabIndex = 51;
1070                                 smallColorControl [0].Click += new EventHandler (OnSmallColorControlClick);
1071                                 // colorPanel2
1072                                 smallColorControl [1].Location = new Point (50, 130);
1073                                 smallColorControl [1].TabIndex = 92;
1074                                 smallColorControl [1].Click += new EventHandler (OnSmallColorControlClick);
1075                                 // colorPanel3
1076                                 smallColorControl [2].Location = new Point (75, 130);
1077                                 smallColorControl [2].TabIndex = 93;
1078                                 smallColorControl [2].Click += new EventHandler (OnSmallColorControlClick);
1079                                 // colorPanel4
1080                                 smallColorControl [3].Location = new Point (175, 84);
1081                                 smallColorControl [3].TabIndex = 98;
1082                                 smallColorControl [3].Click += new EventHandler (OnSmallColorControlClick);
1083                                 // colorPanel5
1084                                 smallColorControl [4].Location = new Point (125, 130);
1085                                 smallColorControl [4].TabIndex = 95;
1086                                 smallColorControl [4].Click += new EventHandler (OnSmallColorControlClick);
1087                                 // colorPanel6
1088                                 smallColorControl [5].Location = new Point (100, 130);
1089                                 smallColorControl [5].TabIndex = 94;
1090                                 smallColorControl [5].Click += new EventHandler (OnSmallColorControlClick);
1091                                 // colorPanel7
1092                                 smallColorControl [6].Location = new Point (175, 130);
1093                                 smallColorControl [6].TabIndex = 97;
1094                                 smallColorControl [6].Click += new EventHandler (OnSmallColorControlClick);
1095                                 // colorPanel8
1096                                 smallColorControl [7].Location = new Point (150, 130);
1097                                 smallColorControl [7].TabIndex = 96;
1098                                 smallColorControl [7].Click += new EventHandler (OnSmallColorControlClick);
1099                                 // colorPanel9
1100                                 smallColorControl [8].Location = new Point (25, 61);
1101                                 smallColorControl [8].TabIndex = 68;
1102                                 smallColorControl [8].Click += new EventHandler (OnSmallColorControlClick);
1103                                 // colorPanel10
1104                                 smallColorControl [9].Location = new Point (0, 61);
1105                                 smallColorControl [9].TabIndex = 67;
1106                                 smallColorControl [9].Click += new EventHandler (OnSmallColorControlClick);
1107                                 // colorPanel11
1108                                 smallColorControl [10].Location = new Point (75, 61);
1109                                 smallColorControl [10].TabIndex = 70;
1110                                 smallColorControl [10].Click += new EventHandler (OnSmallColorControlClick);
1111                                 // colorPanel12
1112                                 smallColorControl [11].Location = new Point (50, 61);
1113                                 smallColorControl [11].TabIndex = 69;
1114                                 smallColorControl [11].Click += new EventHandler (OnSmallColorControlClick);
1115                                 // colorPanel13
1116                                 smallColorControl [12].Location = new Point (125, 61);
1117                                 smallColorControl [12].TabIndex = 72;
1118                                 smallColorControl [12].Click += new EventHandler (OnSmallColorControlClick);
1119                                 // colorPanel14
1120                                 smallColorControl [13].Location = new Point (100, 61);
1121                                 smallColorControl [13].TabIndex = 71;
1122                                 smallColorControl [13].Click += new EventHandler (OnSmallColorControlClick);
1123                                 // colorPanel15
1124                                 smallColorControl [14].Location = new Point (175, 61);
1125                                 smallColorControl [14].TabIndex = 74;
1126                                 smallColorControl [14].Click += new EventHandler (OnSmallColorControlClick);
1127                                 // colorPanel16
1128                                 smallColorControl [15].Location = new Point (50, 38);
1129                                 smallColorControl [15].TabIndex = 61;
1130                                 smallColorControl [15].Click += new EventHandler (OnSmallColorControlClick);
1131                                 // colorPanel17
1132                                 smallColorControl [16].Location = new Point (75, 38);
1133                                 smallColorControl [16].TabIndex = 62;
1134                                 smallColorControl [16].Click += new EventHandler (OnSmallColorControlClick);
1135                                 // colorPanel18
1136                                 smallColorControl [17].Location = new Point (0, 38);
1137                                 smallColorControl [17].TabIndex = 59;
1138                                 smallColorControl [17].Click += new EventHandler (OnSmallColorControlClick);
1139                                 // colorPanel19
1140                                 smallColorControl [18].Location = new Point (25, 84);
1141                                 smallColorControl [18].TabIndex = 75;
1142                                 smallColorControl [18].Click += new EventHandler (OnSmallColorControlClick);
1143                                 // colorPanel20
1144                                 smallColorControl [19].Location = new Point (175, 15);
1145                                 smallColorControl [19].TabIndex = 58;
1146                                 smallColorControl [19].Click += new EventHandler (OnSmallColorControlClick);
1147                                 // colorPanel21
1148                                 smallColorControl [20].Location = new Point (175, 38);
1149                                 smallColorControl [20].TabIndex = 66;
1150                                 smallColorControl [20].Click += new EventHandler (OnSmallColorControlClick);
1151                                 // colorPanel22
1152                                 smallColorControl [21].Location = new Point (100, 38);
1153                                 smallColorControl [21].TabIndex = 63;
1154                                 smallColorControl [21].Click += new EventHandler (OnSmallColorControlClick);
1155                                 // colorPanel23
1156                                 smallColorControl [22].Location = new Point (50, 15);
1157                                 smallColorControl [22].TabIndex = 53;
1158                                 smallColorControl [22].Click += new EventHandler (OnSmallColorControlClick);
1159                                 // colorPanel24
1160                                 smallColorControl [23].Location = new Point (100, 15);
1161                                 smallColorControl [23].TabIndex = 55;
1162                                 smallColorControl [23].Click += new EventHandler (OnSmallColorControlClick);
1163                                 // colorPanel25
1164                                 smallColorControl [24].Location = new Point (125, 15);
1165                                 smallColorControl [24].TabIndex = 56;
1166                                 smallColorControl [24].Click += new EventHandler (OnSmallColorControlClick);
1167                                 // colorPanel26
1168                                 smallColorControl [25].Location = new Point (25, 107);
1169                                 smallColorControl [25].TabIndex = 83;
1170                                 smallColorControl [25].Click += new EventHandler (OnSmallColorControlClick);
1171                                 // colorPanel27
1172                                 smallColorControl [26].Location = new Point (0, 107);
1173                                 smallColorControl [26].TabIndex = 82;
1174                                 smallColorControl [26].Click += new EventHandler (OnSmallColorControlClick);
1175                                 // colorPanel28
1176                                 smallColorControl [27].Location = new Point (0, 84);
1177                                 smallColorControl [27].TabIndex = 81;
1178                                 smallColorControl [27].Click += new EventHandler (OnSmallColorControlClick);
1179                                 // colorPanel29
1180                                 smallColorControl [28].Location = new Point (150, 84);
1181                                 smallColorControl [28].TabIndex = 80;
1182                                 smallColorControl [28].Click += new EventHandler (OnSmallColorControlClick);
1183                                 // colorPanel30
1184                                 smallColorControl [29].Location = new Point (125, 84);
1185                                 smallColorControl [29].TabIndex = 79;
1186                                 smallColorControl [29].Click += new EventHandler (OnSmallColorControlClick);
1187                                 // colorPanel31
1188                                 smallColorControl [30].Location  = new Point (100, 84);
1189                                 smallColorControl [30].TabIndex = 78;
1190                                 smallColorControl [30].Click += new EventHandler (OnSmallColorControlClick);
1191                                 // colorPanel32
1192                                 smallColorControl [31].Location = new Point (75, 84);
1193                                 smallColorControl [31].TabIndex = 77;
1194                                 smallColorControl [31].Click += new EventHandler (OnSmallColorControlClick);
1195                                 // colorPanel33
1196                                 smallColorControl [32].Location = new Point (50, 84);
1197                                 smallColorControl [32].TabIndex = 76;
1198                                 smallColorControl [32].Click += new EventHandler (OnSmallColorControlClick);
1199                                 // colorPanel34
1200                                 smallColorControl [33].Location = new Point (25, 38);
1201                                 smallColorControl [33].TabIndex = 60;
1202                                 smallColorControl [33].Click += new EventHandler (OnSmallColorControlClick);
1203                                 // colorPanel35
1204                                 smallColorControl [34].Location = new Point (150, 38);
1205                                 smallColorControl [34].TabIndex = 65;
1206                                 smallColorControl [34].Click += new EventHandler (OnSmallColorControlClick);
1207                                 // colorPanel36
1208                                 smallColorControl [35].Location = new Point (125, 38);
1209                                 smallColorControl [35].TabIndex = 64;
1210                                 smallColorControl [35].Click += new EventHandler (OnSmallColorControlClick);
1211                                 // colorPanel37
1212                                 smallColorControl [36].Location = new Point (150, 61);
1213                                 smallColorControl [36].TabIndex = 73;
1214                                 smallColorControl [36].Click += new EventHandler (OnSmallColorControlClick);
1215                                 // colorPanel38
1216                                 smallColorControl [37].Location = new Point (150, 15);
1217                                 smallColorControl [37].TabIndex = 57;
1218                                 smallColorControl [37].Click += new EventHandler (OnSmallColorControlClick);
1219                                 // colorPanel39
1220                                 smallColorControl [38].Location = new Point (75, 15);
1221                                 smallColorControl [38].TabIndex = 54;
1222                                 smallColorControl [38].Click += new EventHandler (OnSmallColorControlClick);
1223                                 // colorPanel40
1224                                 smallColorControl [39].Location = new Point (25, 15);
1225                                 smallColorControl [39].TabIndex = 52;
1226                                 smallColorControl [39].Click += new EventHandler (OnSmallColorControlClick);
1227                                 // colorPanel41
1228                                 smallColorControl [40].Location = new Point (50, 107);
1229                                 smallColorControl [40].TabIndex = 84;
1230                                 smallColorControl [40].Click += new EventHandler (OnSmallColorControlClick);
1231                                 // colorPanel42
1232                                 smallColorControl [41].Location = new Point (75, 107);
1233                                 smallColorControl [41].TabIndex = 85;
1234                                 smallColorControl [41].Click += new EventHandler (OnSmallColorControlClick);
1235                                 // colorPanel43
1236                                 smallColorControl [42].Location = new Point (100, 107);
1237                                 smallColorControl [42].TabIndex = 86;
1238                                 smallColorControl [42].Click += new EventHandler (OnSmallColorControlClick);
1239                                 // colorPanel44
1240                                 smallColorControl [43].Location = new Point (125, 107);
1241                                 smallColorControl [43].TabIndex = 87;
1242                                 smallColorControl [43].Click += new EventHandler (OnSmallColorControlClick);
1243                                 // colorPanel45
1244                                 smallColorControl [44].Location = new Point (150, 107);
1245                                 smallColorControl [44].TabIndex = 88;
1246                                 smallColorControl [44].Click += new EventHandler (OnSmallColorControlClick);
1247                                 // colorPanel46
1248                                 smallColorControl [45].Location = new Point (175, 107);
1249                                 smallColorControl [45].TabIndex = 89;
1250                                 smallColorControl [45].Click += new EventHandler (OnSmallColorControlClick);
1251                                 // colorPanel47
1252                                 smallColorControl [46].Location = new Point (0, 130);
1253                                 smallColorControl [46].TabIndex = 90;
1254                                 smallColorControl [46].Click += new EventHandler (OnSmallColorControlClick);
1255                                 // colorPanel48
1256                                 smallColorControl [47].Location = new Point (25, 130);
1257                                 smallColorControl [47].TabIndex = 91;
1258                                 smallColorControl [47].Click += new EventHandler (OnSmallColorControlClick);
1259                                 
1260                                 // userColorPane1
1261                                 userSmallColorControl [0].Location = new Point (0, 180);
1262                                 userSmallColorControl [0].TabIndex = 99;
1263                                 userSmallColorControl [0].Click += new EventHandler (OnSmallColorControlClick);
1264                                 // userColorPanel2
1265                                 userSmallColorControl [1].Location = new Point (0, 203);
1266                                 userSmallColorControl [1].TabIndex = 108;
1267                                 userSmallColorControl [1].Click += new EventHandler (OnSmallColorControlClick);
1268                                 // userColorPanel13
1269                                 userSmallColorControl [2].Location = new Point (25, 180);
1270                                 userSmallColorControl [2].TabIndex = 100;
1271                                 userSmallColorControl [2].Click += new EventHandler (OnSmallColorControlClick);
1272                                 // userColorPanel4
1273                                 userSmallColorControl [3].Location = new Point (25, 203);
1274                                 userSmallColorControl [3].TabIndex = 109;
1275                                 userSmallColorControl [3].Click += new EventHandler (OnSmallColorControlClick);
1276                                 // userColorPanel5
1277                                 userSmallColorControl [4].Location = new Point (50, 180);
1278                                 userSmallColorControl [4].TabIndex = 101;
1279                                 userSmallColorControl [4].Click += new EventHandler (OnSmallColorControlClick);
1280                                 // userColorPanel6
1281                                 userSmallColorControl [5].Location = new Point (50, 203);
1282                                 userSmallColorControl [5].TabIndex = 110;
1283                                 userSmallColorControl [5].Click += new EventHandler (OnSmallColorControlClick);
1284                                 // userColorPanel7
1285                                 userSmallColorControl [6].Location = new Point (75, 180);
1286                                 userSmallColorControl [6].TabIndex = 102;
1287                                 userSmallColorControl [6].Click += new EventHandler (OnSmallColorControlClick);
1288                                 // userColorPanel8
1289                                 userSmallColorControl [7].Location = new Point (75, 203);
1290                                 userSmallColorControl [7].TabIndex = 111;
1291                                 userSmallColorControl [7].Click += new EventHandler (OnSmallColorControlClick);
1292                                 // userColorPanel9
1293                                 userSmallColorControl [8].Location = new Point (100, 180);
1294                                 userSmallColorControl [8].TabIndex = 103;
1295                                 userSmallColorControl [8].Click += new EventHandler (OnSmallColorControlClick);
1296                                 // userColorPanel10
1297                                 userSmallColorControl [9].Location = new Point (100, 203);
1298                                 userSmallColorControl [9].TabIndex = 112;
1299                                 userSmallColorControl [9].Click += new EventHandler (OnSmallColorControlClick);
1300                                 // userColorPanel11
1301                                 userSmallColorControl [10].Location = new Point (125, 180);
1302                                 userSmallColorControl [10].TabIndex = 105;
1303                                 userSmallColorControl [10].Click += new EventHandler (OnSmallColorControlClick);
1304                                 // userColorPanel2
1305                                 userSmallColorControl [11].Location = new Point (125, 203);
1306                                 userSmallColorControl [11].TabIndex = 113;
1307                                 userSmallColorControl [11].Click += new EventHandler (OnSmallColorControlClick);
1308                                 // userColorPanel13
1309                                 userSmallColorControl [12].Location = new Point (150, 180);
1310                                 userSmallColorControl [12].TabIndex = 106;
1311                                 userSmallColorControl [12].Click += new EventHandler (OnSmallColorControlClick);
1312                                 // userColorPanel4
1313                                 userSmallColorControl [13].Location = new Point (150, 203);
1314                                 userSmallColorControl [13].TabIndex = 114;
1315                                 userSmallColorControl [13].Click += new EventHandler (OnSmallColorControlClick);
1316                                 // userColorPanel15
1317                                 userSmallColorControl [14].Location = new Point (175, 180);
1318                                 userSmallColorControl [14].TabIndex = 107;
1319                                 userSmallColorControl [14].Click += new EventHandler (OnSmallColorControlClick);
1320                                 // userColorPanel16
1321                                 userSmallColorControl [15].Location = new Point (175, 203);
1322                                 userSmallColorControl [15].TabIndex = 115;
1323                                 userSmallColorControl [15].Click += new EventHandler (OnSmallColorControlClick);
1324                                 
1325                                 // baseColorLabel
1326                                 baseColorLabel.Location = new Point (2, 0);
1327                                 baseColorLabel.Size = new Size (200, 12);
1328                                 baseColorLabel.TabIndex = 5;
1329                                 baseColorLabel.Text = Locale.GetText ("Base Colors") + ":";
1330                                 // userColorLabel
1331                                 userColorLabel.FlatStyle = FlatStyle.System;
1332                                 userColorLabel.Location = new Point (2, 164);
1333                                 userColorLabel.Size = new Size (200, 14);
1334                                 userColorLabel.TabIndex = 104;
1335                                 userColorLabel.Text = Locale.GetText ("User Colors") + ":";
1336                                 
1337                                 Controls.Add (userSmallColorControl [7]);
1338                                 Controls.Add (userSmallColorControl [6]);
1339                                 Controls.Add (userSmallColorControl [5]);
1340                                 Controls.Add (userSmallColorControl [4]);
1341                                 Controls.Add (userSmallColorControl [3]);
1342                                 Controls.Add (userSmallColorControl [2]);
1343                                 Controls.Add (userSmallColorControl [1]);
1344                                 Controls.Add (userSmallColorControl [0]);
1345                                 Controls.Add (userSmallColorControl [15]);
1346                                 Controls.Add (userSmallColorControl [14]);
1347                                 Controls.Add (userSmallColorControl [13]);
1348                                 Controls.Add (userSmallColorControl [12]);
1349                                 Controls.Add (userSmallColorControl [11]);
1350                                 Controls.Add (userSmallColorControl [10]);
1351                                 Controls.Add (userSmallColorControl [9]);
1352                                 Controls.Add (userSmallColorControl [8]);
1353                                 
1354                                 Controls.Add (smallColorControl [0]);
1355                                 Controls.Add (smallColorControl [3]);
1356                                 Controls.Add (smallColorControl [6]);
1357                                 Controls.Add (smallColorControl [7]);
1358                                 Controls.Add (smallColorControl [4]);
1359                                 Controls.Add (smallColorControl [5]);
1360                                 Controls.Add (smallColorControl [2]);
1361                                 Controls.Add (smallColorControl [1]);
1362                                 Controls.Add (smallColorControl [47]);
1363                                 Controls.Add (smallColorControl [46]);
1364                                 Controls.Add (smallColorControl [45]);
1365                                 Controls.Add (smallColorControl [44]);
1366                                 Controls.Add (smallColorControl [43]);
1367                                 Controls.Add (smallColorControl [42]);
1368                                 Controls.Add (smallColorControl [41]);
1369                                 Controls.Add (smallColorControl [40]);
1370                                 Controls.Add (smallColorControl [25]);
1371                                 Controls.Add (smallColorControl [26]);
1372                                 Controls.Add (smallColorControl [27]);
1373                                 Controls.Add (smallColorControl [28]);
1374                                 Controls.Add (smallColorControl [29]);
1375                                 Controls.Add (smallColorControl [30]);
1376                                 Controls.Add (smallColorControl [31]);
1377                                 Controls.Add (smallColorControl [32]);
1378                                 Controls.Add (smallColorControl [18]);
1379                                 Controls.Add (smallColorControl [14]);
1380                                 Controls.Add (smallColorControl [36]);
1381                                 Controls.Add (smallColorControl [12]);
1382                                 Controls.Add (smallColorControl [13]);
1383                                 Controls.Add (smallColorControl [10]);
1384                                 Controls.Add (smallColorControl [11]);
1385                                 Controls.Add (smallColorControl [8]);
1386                                 Controls.Add (smallColorControl [9]);
1387                                 Controls.Add (smallColorControl [20]);
1388                                 Controls.Add (smallColorControl [34]);
1389                                 Controls.Add (smallColorControl [35]);
1390                                 Controls.Add (smallColorControl [21]);
1391                                 Controls.Add (smallColorControl [16]);
1392                                 Controls.Add (smallColorControl [15]);
1393                                 Controls.Add (smallColorControl [33]);
1394                                 Controls.Add (smallColorControl [17]);
1395                                 Controls.Add (smallColorControl [19]);
1396                                 Controls.Add (smallColorControl [37]);
1397                                 Controls.Add (smallColorControl [24]);
1398                                 Controls.Add (smallColorControl [23]);
1399                                 Controls.Add (smallColorControl [38]);
1400                                 Controls.Add (smallColorControl [22]);
1401                                 Controls.Add (smallColorControl [39]);
1402                                 
1403                                 Controls.Add (userColorLabel);
1404                                 Controls.Add (baseColorLabel);
1405                                 
1406                                 Size = new Size (212, 238);
1407                                 
1408                                 ResumeLayout (false);
1409                         }
1410                         
1411                         private void CheckIfColorIsInPanel (Color color)
1412                         {
1413                                 // check if we have a panel with a BackColor = color...
1414                                 for (int i = 0; i < smallColorControl.Length; i++) {
1415                                         if (smallColorControl [i].InternalColor == color) {
1416                                                 selectedSmallColorControl = smallColorControl [i];
1417                                                 selectedSmallColorControl.IsSelected = true;
1418                                                 break;
1419                                         }
1420                                 }
1421                         }
1422                         
1423                         void OnSmallColorControlClick (object sender, EventArgs e)
1424                         {
1425                                 // previous selected smallcolorcontrol
1426                                 if (selectedSmallColorControl != (SmallColorControl)sender)
1427                                         selectedSmallColorControl.IsSelected = false;
1428                                 
1429                                 selectedSmallColorControl = (SmallColorControl)sender;
1430                                 
1431                                 TriangleControl.CurrentBrightness = HSB.Brightness (selectedSmallColorControl.InternalColor);
1432                                 
1433                                 colorDialog.UpdateControls (selectedSmallColorControl.InternalColor);
1434                                 colorDialog.UpdateRGBTextBoxes (selectedSmallColorControl.InternalColor);
1435                                 colorDialog.UpdateHSBTextBoxes (selectedSmallColorControl.InternalColor);
1436                         }
1437                         
1438                         public Color ColorToShow {
1439                                 get {
1440                                         return selectedSmallColorControl.InternalColor;
1441                                 }
1442                         }
1443                         
1444                         
1445                         public void SetColor (Color acolor)
1446                         {
1447                                 if (selectedSmallColorControl != null)
1448                                         selectedSmallColorControl.IsSelected = false;
1449                                 
1450                                 CheckIfColorIsInPanel (acolor);
1451                                 
1452                                 TriangleControl.CurrentBrightness = HSB.Brightness (acolor);
1453                                 
1454                                 colorDialog.UpdateControls (acolor);
1455                                 colorDialog.UpdateRGBTextBoxes (acolor);
1456                                 colorDialog.UpdateHSBTextBoxes (acolor);
1457                         }
1458                         
1459                         public void SetUserColor (Color col)
1460                         {
1461                                 userSmallColorControl [currentlyUsedUserSmallColorControl].InternalColor = col;
1462                                 
1463                                 colorDialog.customColors [currentlyUsedUserSmallColorControl] = col.ToArgb ();
1464                                 
1465                                 currentlyUsedUserSmallColorControl++;
1466                                 if (currentlyUsedUserSmallColorControl > 15)
1467                                         currentlyUsedUserSmallColorControl = 0;
1468                         }
1469                         
1470                         public void SetCustomColors ()
1471                         {
1472                                 for (int i = 0; i < colorDialog.customColors.Length; i++) {
1473                                         userSmallColorControl [i].InternalColor = Color.FromArgb (colorDialog.customColors [i]);
1474                                 }
1475                         }
1476                 }
1477                 
1478                 internal class ColorMatrixControl : Panel {
1479                         internal class DrawingBitmap {
1480                                 private Bitmap bitmap;
1481                                 
1482                                 public DrawingBitmap (Size size)
1483                                 {
1484                                         bitmap = new Bitmap (size.Width, size.Height);
1485                                         
1486                                         float hueadd = 240.0f / (size.Width - 1);
1487                                         float satsub = 241.0f / (size.Height - 1);
1488                                         float satpos = 240.0f;
1489                                         
1490                                         // paint the matrix to the bitmap
1491                                         for (int height = 0; height < size.Height; height++) {
1492                                                 float huepos = 0.0f;
1493                                                 
1494                                                 for (int width = 0; width < size.Width; width++) {
1495                                                         HSB hsb = new HSB ();
1496                                                         
1497                                                         hsb.hue = (int)huepos;
1498                                                         hsb.sat = (int)satpos;
1499                                                         hsb.bri = 120; // paint it with 120 to get a nice bitmap
1500                                                         
1501                                                         bitmap.SetPixel (width, height, HSB.HSB2RGB (hsb.hue, hsb.sat, hsb.bri));
1502                                                         
1503                                                         huepos += hueadd;
1504                                                 }
1505                                                 
1506                                                 satpos -= satsub;
1507                                         }
1508                                 }
1509                                 
1510                                 public Bitmap Bitmap {
1511                                         set {
1512                                                 bitmap = value;
1513                                         }
1514                                         
1515                                         get {
1516                                                 return bitmap;
1517                                         }
1518                                 }
1519                         }
1520                         
1521                         internal class CrossCursor {
1522                                 private Bitmap bitmap;
1523                                 
1524                                 private Color cursorColor;
1525                                 
1526                                 public CrossCursor ()
1527                                 {
1528                                         bitmap = new Bitmap (22, 22);
1529                                         
1530                                         cursorColor = Color.Black;
1531                                         
1532                                         Draw ();
1533                                 }
1534                                 
1535                                 public void Draw ()
1536                                 {
1537                                         using (Pen pen = new Pen (ThemeEngine.Current.ResPool.GetSolidBrush (cursorColor), 3)) {
1538                                                 using (Graphics graphics = Graphics.FromImage (bitmap)) {
1539                                                         graphics.DrawLine (pen, 11, 0, 11, 7);
1540                                                         graphics.DrawLine (pen, 11, 14, 11, 21);
1541                                                         graphics.DrawLine (pen, 0, 11, 7, 11);
1542                                                         graphics.DrawLine (pen, 14, 11, 21, 11);
1543                                                 }
1544                                         }
1545                                 }
1546                                 
1547                                 public Bitmap Bitmap {
1548                                         set {
1549                                                 bitmap = value;
1550                                         }
1551                                         
1552                                         get {
1553                                                 return bitmap;
1554                                         }
1555                                 }
1556                                 
1557                                 public Color CursorColor {
1558                                         set {
1559                                                 cursorColor = value;
1560                                         }
1561                                         
1562                                         get {
1563                                                 return cursorColor;
1564                                         }
1565                                 }
1566                         }
1567                         
1568                         private DrawingBitmap drawingBitmap = null;
1569                         
1570                         private CrossCursor crossCursor = new CrossCursor();
1571                         
1572                         private bool mouseButtonDown = false;
1573                         
1574                         private bool drawCross = true;
1575                         
1576                         private Color color;
1577                         
1578                         private int currentXPos;
1579                         private int currentYPos;
1580                         
1581                         private float xstep;
1582                         private float ystep;
1583                         
1584                         private ColorDialog colorDialog;
1585                         
1586                         public ColorMatrixControl (ColorDialog colorDialog)
1587                         {
1588                                 this.colorDialog = colorDialog;
1589                                 
1590                                 SuspendLayout ();
1591                                 
1592                                 BorderStyle = BorderStyle.Fixed3D;
1593                                 Location = new Point (0, 0);
1594                                 Size = new Size (179, 190);
1595                                 TabIndex = 0;
1596                                 TabStop = false;
1597                                 
1598                                 ResumeLayout (false);
1599                                 
1600                                 xstep = 240.0f / (ClientSize.Width - 1);
1601                                 ystep = 241.0f / (ClientSize.Height - 1);
1602                                 
1603                                 SetStyle (ControlStyles.DoubleBuffer, true);
1604                                 SetStyle (ControlStyles.AllPaintingInWmPaint, true);
1605                                 SetStyle (ControlStyles.UserPaint, true);
1606                         }
1607                         
1608                         protected override void OnPaint (PaintEventArgs e)
1609                         {
1610                                 if (drawingBitmap == null)
1611                                         drawingBitmap = new DrawingBitmap (ClientSize);
1612                                 
1613                                 Draw (e);
1614                                 
1615                                 base.OnPaint (e);
1616                         }
1617                         
1618                         private void Draw (PaintEventArgs e)
1619                         {
1620                                 e.Graphics.DrawImage (drawingBitmap.Bitmap, ClientRectangle.X, ClientRectangle.Y);
1621                                 
1622                                 // drawCross is false if the mouse gets moved...
1623                                 if (drawCross) {
1624                                         e.Graphics.DrawImage (crossCursor.Bitmap, currentXPos - 11 , currentYPos - 11);
1625                                 }
1626                         }
1627                         
1628                         protected override void OnMouseDown (MouseEventArgs e)
1629                         {
1630                                 mouseButtonDown = true;
1631                                 currentXPos = e.X;
1632                                 currentYPos = e.Y;
1633                                 if (drawCross) {
1634                                         drawCross = false;
1635                                         Invalidate ();
1636                                         Update ();
1637                                 }
1638                                 
1639                                 UpdateControls ();
1640                                 XplatUI.GrabWindow (Handle, Handle);
1641                                 
1642                                 base.OnMouseDown (e);
1643                         }
1644                         
1645                         protected override void OnMouseMove (MouseEventArgs e)
1646                         {
1647                                 if (mouseButtonDown)
1648                                         if ((e.X < ClientSize.Width && e.X >= 0) && (e.Y < ClientSize.Height && e.Y >= 0)) {
1649                                                 currentXPos = e.X;
1650                                                 currentYPos = e.Y;
1651                                                 UpdateControls ();
1652                                         }
1653                                 
1654                                 base.OnMouseMove (e);
1655                         }
1656                         
1657                         protected override void OnMouseUp (MouseEventArgs e)
1658                         {
1659                                 XplatUI.UngrabWindow (Handle);
1660                                 mouseButtonDown = false;
1661                                 drawCross = true;
1662                                 Invalidate ();
1663                                 Update ();
1664                         }
1665                         
1666                         public Color ColorToShow {
1667                                 set {
1668                                         ComputePos (value);
1669                                 }
1670                         }
1671                         
1672                         private void ComputePos (Color acolor)
1673                         {
1674                                 if (acolor != color) {
1675                                         color = acolor;
1676                                         
1677                                         HSB hsb = HSB.RGB2HSB (color);
1678                                         
1679                                         currentXPos = (int)((float)hsb.hue / xstep);
1680                                         currentYPos = ClientSize.Height - 1 - (int)((float)hsb.sat / ystep);
1681                                         
1682                                         if (currentXPos < 0)
1683                                                 currentXPos = 0;
1684                                         if (currentYPos < 0)
1685                                                 currentYPos = 0;
1686                                         
1687                                         Invalidate ();
1688                                         Update ();
1689                                 }
1690                         }
1691                         
1692                         private Color GetColorFromHSB ()
1693                         {
1694                                 int hue = (int)((float)currentXPos * xstep);
1695                                 int sat = 240 - ((int)((float)currentYPos * ystep));
1696                                 int bri = TriangleControl.CurrentBrightness;
1697                                 
1698                                 return HSB.HSB2RGB (hue, sat, bri);
1699                         }
1700                         
1701                         private void UpdateControls ()
1702                         {
1703                                 Color tmpColor = GetColorFromHSB ();
1704                                 
1705                                 // update the brightness control
1706                                 colorDialog.brightnessControl.ShowColor ((int)((float)currentXPos * xstep), 240 - ((int)((float)currentYPos * ystep)));
1707                                 
1708                                 // update saturation text box
1709                                 int satvalue = (240 - ((int)((float)currentYPos * ystep)));
1710                                 colorDialog.satTextBox.Text = satvalue.ToString ();
1711                                 
1712                                 // update hue text box
1713                                 int huevalue = (int)((float)currentXPos * xstep);
1714                                 if (huevalue > 239)
1715                                         huevalue = 239;
1716                                 colorDialog.hueTextBox.Text = huevalue.ToString ();
1717                                 
1718                                 // update the main selected color panel
1719                                 colorDialog.selectedColorPanel.BackColor = tmpColor;
1720                                 
1721                                 // and finally the rgb text boxes
1722                                 colorDialog.UpdateRGBTextBoxes (tmpColor);
1723                         }
1724                 }
1725                 
1726                 
1727                 internal class BrightnessControl : Panel {
1728                         internal class DrawingBitmap {
1729                                 private Bitmap bitmap;
1730                                 
1731                                 public DrawingBitmap ()
1732                                 {
1733                                         bitmap = new Bitmap (14, 190);
1734                                 }
1735                                 
1736                                 public Bitmap Bitmap {
1737                                         set {
1738                                                 bitmap = value;
1739                                         }
1740                                         
1741                                         get {
1742                                                 return bitmap;
1743                                         }
1744                                 }
1745                                 
1746                                 // only hue and saturation are needed.
1747                                 // color will be computed with an iteration
1748                                 public void Draw (int hue, int sat)
1749                                 {
1750                                         float brisub = 241.0f / 190.0f;
1751                                         float bri = 241.0f;
1752                                         
1753                                         for (int height = 0; height < 190; height++) {
1754                                                 for (int width = 0; width < 14; width++) {
1755                                                         Color pixcolor = HSB.HSB2RGB (hue, sat, (int)bri);
1756                                                         bitmap.SetPixel (width, height, pixcolor);
1757                                                 }
1758                                                 bri = bri - brisub;
1759                                         }
1760                                 }
1761                         }
1762                         
1763                         private const float step = 241.0f/189.0f;
1764                         
1765                         private DrawingBitmap bitmap;
1766                         
1767                         private ColorDialog colorDialog = null;
1768                         
1769                         public BrightnessControl (ColorDialog colorDialog)
1770                         {
1771                                 this.colorDialog = colorDialog;
1772                                 
1773                                 bitmap = new DrawingBitmap ();
1774                                 
1775                                 SuspendLayout ();
1776                                 
1777                                 BorderStyle = BorderStyle.Fixed3D;
1778                                 Location = new Point (0, 0);
1779                                 Size = new Size (14, 190);
1780                                 TabIndex = 0;
1781                                 TabStop = false;
1782                                 Size = new Size (14, 190);
1783                                 
1784                                 ResumeLayout (false);
1785                                 
1786                                 SetStyle (ControlStyles.DoubleBuffer, true);
1787                                 SetStyle (ControlStyles.AllPaintingInWmPaint, true);
1788                                 SetStyle (ControlStyles.UserPaint, true);
1789                         }
1790                         
1791                         
1792                         protected override void OnPaint (PaintEventArgs e)
1793                         {
1794                                 e.Graphics.DrawImage (bitmap.Bitmap, 0, 0);
1795                                 
1796                                 base.OnPaint (e);
1797                         }
1798                         
1799                         protected override void OnMouseDown (MouseEventArgs e)
1800                         {
1801                                 colorDialog.triangleControl.TrianglePosition = (int)((float)(189 - e.Y) * step);
1802                                 
1803                                 base.OnMouseDown (e);
1804                         }
1805                         
1806                         // this one is for ColorMatrixControl
1807                         public void ShowColor (int hue, int sat)
1808                         {
1809                                 bitmap.Draw (hue, sat);
1810                                 Invalidate ();
1811                                 Update ();
1812                         }
1813                         
1814                         // this one for the other controls
1815                         public Color ColorToShow {
1816                                 set {
1817                                         int hue, sat;
1818                                         HSB.GetHueSaturation (value, out hue, out sat);
1819                                         bitmap.Draw (hue, sat);
1820                                         Invalidate ();
1821                                         Update ();
1822                                 }
1823                         }
1824                 }
1825                 
1826                 
1827                 internal class TriangleControl : Panel {
1828                         private bool mouseButtonDown = false;
1829                         
1830                         private int currentTrianglePosition = 195;
1831 //                      private Rectangle clipRectangle;
1832                         
1833                         private const float briStep = 241.0f/186.0f;
1834                         
1835                         private static int currentBrightness = 0;
1836                         
1837                         private ColorDialog colorDialog;
1838                         
1839                         public TriangleControl (ColorDialog colorDialog)
1840                         {
1841                                 this.colorDialog = colorDialog;
1842                                 
1843                                 SuspendLayout ();
1844                                 
1845                                 Size = new Size (16, 203);
1846                                 
1847                                 ResumeLayout (false);
1848                                 
1849                                 SetStyle (ControlStyles.DoubleBuffer, true);
1850                                 SetStyle (ControlStyles.AllPaintingInWmPaint, true);
1851                                 SetStyle (ControlStyles.UserPaint, true);
1852                         }
1853                         
1854                         public static int CurrentBrightness {
1855                                 set {
1856                                         currentBrightness = value;
1857                                 }
1858                                 
1859                                 get {
1860                                         return currentBrightness;
1861                                 }
1862                         }
1863                         
1864                         protected override void OnPaint (PaintEventArgs e)
1865                         {
1866                                 Draw (e);
1867                                 
1868                                 base.OnPaint (e);
1869                         }
1870                         
1871                         private void Draw (PaintEventArgs e)
1872                         {
1873                                 e.Graphics.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (BackColor), new Rectangle (0, 0, 16, 203));
1874                                 
1875                                 Point[] trianglePoints = new Point [3]
1876                                 {
1877                                         new Point (0, currentTrianglePosition),
1878                                         new Point (8, currentTrianglePosition - 8),
1879                                         new Point (8, currentTrianglePosition + 8)
1880                                 };
1881                                 
1882                                 e.Graphics.FillPolygon (ThemeEngine.Current.ResPool.GetSolidBrush (Color.Black), trianglePoints);
1883                         }
1884                         
1885                         protected override void OnMouseDown (MouseEventArgs e)
1886                         {
1887                                 if (e.Y > 195 || e.Y < 9) return; // helper until Cursor.Clip works
1888                                 
1889                                 mouseButtonDown = true;
1890                                 currentTrianglePosition = e.Y;
1891                                 
1892                                 // Cursor.Clip doesn't yet work in Managed.Windows.Forms
1893 //                              clipRectangle = Cursor.Clip;
1894 //                              Point p = Location;
1895 //                              p.Y += 8;
1896 //                              Size s = Size;
1897 //                              s.Width -= 5;
1898 //                              s.Height -= 16;
1899 //                              Cursor.Clip = new Rectangle( Parent.PointToScreen( p ), s );
1900                                 
1901                                 colorDialog.briTextBox.Text = TrianglePosition.ToString ();
1902                                 colorDialog.UpdateFromHSBTextBoxes ();
1903                                 
1904                                 Invalidate ();
1905                                 Update ();
1906                                 
1907                                 base.OnMouseDown (e);
1908                         }
1909                         
1910                         protected override void OnMouseMove (MouseEventArgs e)
1911                         {
1912                                 if (mouseButtonDown)
1913                                         if (e.Y < 196 && e.Y > 8) {
1914                                                 currentTrianglePosition = e.Y;
1915                                                 
1916                                                 colorDialog.briTextBox.Text = TrianglePosition.ToString ();
1917                                                 colorDialog.UpdateFromHSBTextBoxes ();
1918                                                 
1919                                                 Invalidate ();
1920                                                 Update ();
1921                                         }
1922                                 
1923                                 base.OnMouseMove (e);
1924                         }
1925                         
1926                         protected override void OnMouseUp (MouseEventArgs e)
1927                         {
1928                                 mouseButtonDown = false;
1929 //                              Cursor.Clip = clipRectangle;
1930                                 
1931                                 base.OnMouseUp (e);
1932                         }
1933                         
1934                         public int TrianglePosition {
1935                                 get {
1936                                         float tmp = (float)(currentTrianglePosition - 9);
1937                                         tmp = tmp * briStep;
1938                                         
1939                                         int retval = 240 - (int)tmp;
1940                                         
1941                                         TriangleControl.CurrentBrightness = retval;
1942                                         
1943                                         return retval;
1944                                 }
1945                                 
1946                                 set {
1947                                         float tmp = (float)value / briStep;
1948                                         currentTrianglePosition = 186 - (int)tmp + 9;
1949                                         
1950                                         colorDialog.briTextBox.Text = TrianglePosition.ToString ();
1951                                         
1952                                         colorDialog.UpdateFromHSBTextBoxes ();
1953                                         
1954                                         Invalidate ();
1955                                         Update ();
1956                                 }
1957                         }
1958                         
1959                         public Color ColorToShow {
1960                                 set {
1961                                         SetColor (value);
1962                                 }
1963                         }
1964                         
1965                         public void SetColor (Color color)
1966                         {
1967                                 int pos_raw = HSB.Brightness (color);
1968                                 
1969                                 float tmp = (float)pos_raw / briStep;
1970                                 currentTrianglePosition = 186 - (int)tmp + 9;
1971                                 
1972                                 if (colorDialog.edit_textbox == null)
1973                                         colorDialog.briTextBox.Text = TrianglePosition.ToString ();
1974                                 
1975                                 Invalidate ();
1976                         }
1977                 }
1978                 #endregion
1979         }
1980 }
1981