* Control.cs: ControlCollection.Count must be public. Fixed build of
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / ColorDialog.cs
index 9713932d9674bf3b0d59e01450a767fa45d8b927..1c478bce6e4b8ebade3ae08ed3231cd219fba8de 100644 (file)
@@ -5,10 +5,10 @@
 // distribute, sublicense, and/or sell copies of the Software, and to
 // permit persons to whom the Software is furnished to do so, subject to
 // the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be
 // included in all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
-// Copyright (c) 2004 Novell, Inc. (http://www.novell.com)
+// Copyright (c) 2004-2006 Novell, Inc. (http://www.novell.com)
 //
 // Authors:
-//
-//
+//     Alexander Olk   xenomorph2@onlinehome.de
 //
 
-// NOT COMPLETE - This is a placeholder until our contributors get a chance to check their code in
+// COMPLETE
 
+using System.ComponentModel;
 using System.Drawing;
+using System.Globalization;
+using System.Resources;
+using System;
 
 namespace System.Windows.Forms {
+       [DefaultProperty ("Color")]
        public class ColorDialog : CommonDialog {
+               #region Local Variables
+               private bool allowFullOpen = true;
+               private bool anyColor = false;
+               private Color color;
+               private int[] customColors = null;
+               private bool fullOpen = false;
+               private bool showHelp = false;
+               private bool solidColorOnly = false;
+               
+               private Panel selectedColorPanel;
+               private BaseColorControl baseColorControl;
+               private ColorMatrixControl colorMatrixControl;
+               private BrightnessControl brightnessControl;
+               private TriangleControl triangleControl;
+               
+               private Button okButton;
+               private Button cancelButton;
+               private Button helpButton;
+               private Button addColoursButton;
+               private Button defineColoursButton;
+               
+               private TextBox hueTextBox;
+               private TextBox satTextBox;
+               private TextBox briTextBox;
+               private TextBox redTextBox;
+               private TextBox greenTextBox;
+               private TextBox blueTextBox;
+               
+               private Label briLabel;
+               private Label satLabel;
+               private Label hueLabel;
+               private Label colorBaseLabel;
+               private Label greenLabel;
+               private Label blueLabel;
+               private Label redLabel;
+               #endregion      // Local Variables
+               
                #region Public Constructors
+               public ColorDialog () : base()
+               {
+                       form.SuspendLayout ();
+                       
+                       form.Text = "Color";
+                       
+                       form.FormBorderStyle = FormBorderStyle.FixedDialog;
+                       form.MaximizeBox = false;
+                       
+                       satTextBox = new TextBox ();
+                       briTextBox = new TextBox ();
+                       blueTextBox = new TextBox ();
+                       greenTextBox = new TextBox ();
+                       redTextBox = new TextBox ();
+                       hueTextBox = new TextBox ();
+                       
+                       redLabel = new Label ();
+                       blueLabel = new Label ();
+                       greenLabel = new Label ();
+                       colorBaseLabel = new Label ();
+                       hueLabel = new Label ();
+                       satLabel = new Label ();
+                       briLabel = new Label ();
+                       
+                       okButton = new Button ();
+                       cancelButton = new Button ();
+                       helpButton = new Button ();
+                       defineColoursButton = new Button ();
+                       addColoursButton = new Button ();
+                       
+                       baseColorControl = new BaseColorControl (this);
+                       colorMatrixControl = new ColorMatrixControl (this);
+                       brightnessControl = new BrightnessControl (this);
+                       triangleControl = new TriangleControl (this);
+                       
+                       selectedColorPanel = new Panel ();
+                       
+                       // hueTextBox
+                       hueTextBox.Location = new Point (324, 203);
+                       hueTextBox.Size = new Size (27, 21);
+                       hueTextBox.TabIndex = 11;
+                       hueTextBox.MaxLength = 3;
+                       // satTextBox
+                       satTextBox.Location = new Point (324, 225);
+                       satTextBox.Size = new Size (27, 21);
+                       satTextBox.TabIndex = 15;
+                       satTextBox.MaxLength = 3;
+                       // greenTextBox
+                       greenTextBox.Location = new Point (404, 225);
+                       greenTextBox.Size = new Size (27, 21);
+                       greenTextBox.TabIndex = 18;
+                       greenTextBox.MaxLength = 3;
+                       // briTextBox
+                       briTextBox.Location = new Point (324, 247);
+                       briTextBox.Size = new Size (27, 21);
+                       briTextBox.TabIndex = 16;
+                       briTextBox.MaxLength = 3;
+                       // blueTextBox
+                       blueTextBox.Location = new Point (404, 247);
+                       blueTextBox.Size = new Size (27, 21);
+                       blueTextBox.TabIndex = 19;
+                       blueTextBox.MaxLength = 3;
+                       // redTextBox
+                       redTextBox.Location = new Point (404, 203);
+                       redTextBox.Size = new Size (27, 21);
+                       redTextBox.TabIndex = 17;
+                       redTextBox.MaxLength = 3;
+                       
+                       // redLabel
+                       redLabel.FlatStyle = FlatStyle.System;
+                       redLabel.Location = new Point (361, 206);
+                       redLabel.Size = new Size (40, 16);
+                       redLabel.TabIndex = 25;
+                       redLabel.Text = Locale.GetText ("Red") + ":";
+                       redLabel.TextAlign = ContentAlignment.MiddleRight;
+                       // blueLabel
+                       blueLabel.FlatStyle = FlatStyle.System;
+                       blueLabel.Location = new Point (361, 250);
+                       blueLabel.Size = new Size (40, 16);
+                       blueLabel.TabIndex = 26;
+                       blueLabel.Text = Locale.GetText ("Blue") + ":";
+                       blueLabel.TextAlign = ContentAlignment.MiddleRight;
+                       // greenLabel
+                       greenLabel.FlatStyle = FlatStyle.System;
+                       greenLabel.Location = new Point (361, 228);
+                       greenLabel.Size = new Size (40, 16);
+                       greenLabel.TabIndex = 27;
+                       greenLabel.Text = Locale.GetText ("Green") + ":";
+                       greenLabel.TextAlign = ContentAlignment.MiddleRight;
+                       // colorBaseLabel
+                       colorBaseLabel.Location = new Point (228, 247);
+                       colorBaseLabel.Size = new Size (60, 25);
+                       colorBaseLabel.TabIndex = 28;
+                       colorBaseLabel.Text = Locale.GetText ("Color");
+                       colorBaseLabel.TextAlign = ContentAlignment.MiddleCenter;
+                       // hueLabel
+                       hueLabel.FlatStyle = FlatStyle.System;
+                       hueLabel.Location = new Point (287, 206);
+                       hueLabel.Size = new Size (36, 16);
+                       hueLabel.TabIndex = 23;
+                       hueLabel.Text = Locale.GetText ("Hue") + ":";
+                       hueLabel.TextAlign = ContentAlignment.MiddleRight;
+                       // satLabel
+                       satLabel.FlatStyle = FlatStyle.System;
+                       satLabel.Location = new Point (287, 228);
+                       satLabel.Size = new Size (36, 16);
+                       satLabel.TabIndex = 22;
+                       satLabel.Text = Locale.GetText ("Sat") + ":";
+                       satLabel.TextAlign = ContentAlignment.MiddleRight;
+                       // briLabel
+                       briLabel.FlatStyle = FlatStyle.System;
+                       briLabel.Location = new Point (287, 250);
+                       briLabel.Size = new Size (36, 16);
+                       briLabel.TabIndex = 24;
+                       briLabel.Text = Locale.GetText ("Bri") + ":";
+                       briLabel.TextAlign = ContentAlignment.MiddleRight;
+                       
+                       // defineColoursButton
+                       defineColoursButton.FlatStyle = FlatStyle.System;
+                       defineColoursButton.Location = new Point (5, 244);
+                       defineColoursButton.Size = new Size (210, 22);
+                       defineColoursButton.TabIndex = 6;
+                       // FIXME: update resource files
+                       defineColoursButton.Text = "Define Custom Colors >>";
+                       //defineColoursButton.Text = Locale.GetText ("Define Custom Colors >>");
+                       // okButton
+                       okButton.FlatStyle = FlatStyle.System;
+                       okButton.Location = new Point (5, 271);
+                       okButton.Size = new Size (66, 22);
+                       okButton.TabIndex = 0;
+                       okButton.Text = Locale.GetText ("OK");
+                       // cancelButton
+                       cancelButton.FlatStyle = FlatStyle.System;
+                       cancelButton.Location = new Point (78, 271);
+                       cancelButton.Size = new Size (66, 22);
+                       cancelButton.TabIndex = 1;
+                       cancelButton.Text = Locale.GetText ("Cancel");
+                       // helpButton
+                       helpButton.FlatStyle = FlatStyle.System;
+                       helpButton.Location = new Point (149, 271);
+                       helpButton.Size = new Size (66, 22);
+                       helpButton.TabIndex = 5;
+                       helpButton.Text = Locale.GetText ("Help");
+                       helpButton.Hide ();
+                       
+                       // addColoursButton
+                       addColoursButton.FlatStyle = FlatStyle.System;
+                       addColoursButton.Location = new Point (227, 271);
+                       addColoursButton.Size = new Size (213, 22);
+                       addColoursButton.TabIndex = 7;
+                       // FIXME: update resource files
+                       addColoursButton.Text =  "Add To Custom Colors";
+                       //addColoursButton.Text =  Locale.GetText ("Add To Custom Colors");
+                       
+                       // baseColorControl
+                       baseColorControl.Location = new Point (3, 6);
+                       baseColorControl.Size = new Size (212, 231);
+                       baseColorControl.TabIndex = 13;
+                       // colorMatrixControl
+                       colorMatrixControl.Location = new Point (227, 7);
+                       colorMatrixControl.Size = new Size (179, 190);
+                       colorMatrixControl.TabIndex = 14;
+                       // triangleControl
+                       triangleControl.Location = new Point (432, 0);
+                       triangleControl.Size = new Size (16, 204);
+                       triangleControl.TabIndex = 12;
+                       // brightnessControl
+                       brightnessControl.Location = new Point (415, 7);
+                       brightnessControl.Size = new Size (14, 190);
+                       brightnessControl.TabIndex = 20;
+                       
+                       // selectedColorPanel
+                       selectedColorPanel.BackColor = SystemColors.Desktop;
+                       selectedColorPanel.BorderStyle = BorderStyle.Fixed3D;
+                       selectedColorPanel.Location = new Point (227, 202);
+                       selectedColorPanel.Size = new Size (60, 42);
+                       selectedColorPanel.TabIndex = 10;
+                       
+                       form.Controls.Add (hueTextBox);
+                       form.Controls.Add (satTextBox);
+                       form.Controls.Add (briTextBox);
+                       form.Controls.Add (redTextBox);
+                       form.Controls.Add (greenTextBox);
+                       form.Controls.Add (blueTextBox);
+                       
+                       form.Controls.Add (defineColoursButton);
+                       form.Controls.Add (okButton);
+                       form.Controls.Add (cancelButton);
+                       form.Controls.Add (addColoursButton);
+                       
+                       form.Controls.Add (baseColorControl);
+                       form.Controls.Add (colorMatrixControl);
+                       form.Controls.Add (brightnessControl);
+                       form.Controls.Add (triangleControl);
+                       
+                       form.Controls.Add (colorBaseLabel);
+                       form.Controls.Add (greenLabel);
+                       form.Controls.Add (blueLabel);
+                       form.Controls.Add (redLabel);
+                       form.Controls.Add (briLabel);
+                       form.Controls.Add (hueLabel);
+                       form.Controls.Add (satLabel);
+                       
+                       form.Controls.Add (selectedColorPanel);
+                       
+                       form.ResumeLayout (false);
+                       
+                       Color = Color.Black;
+                       
+                       defineColoursButton.Click += new EventHandler (OnClickButtonDefineColours);
+                       addColoursButton.Click += new EventHandler (OnClickButtonAddColours);
+                       helpButton.Click += new EventHandler (OnClickHelpButton);
+                       cancelButton.Click += new EventHandler (OnClickCancelButton);
+                       okButton.Click += new EventHandler (OnClickOkButton);
+                       
+                       hueTextBox.KeyPress += new KeyPressEventHandler (OnKeyPressTextBoxes);
+                       satTextBox.KeyPress += new KeyPressEventHandler (OnKeyPressTextBoxes);
+                       briTextBox.KeyPress += new KeyPressEventHandler (OnKeyPressTextBoxes);
+                       redTextBox.KeyPress += new KeyPressEventHandler (OnKeyPressTextBoxes);
+                       greenTextBox.KeyPress += new KeyPressEventHandler (OnKeyPressTextBoxes);
+                       blueTextBox.KeyPress += new KeyPressEventHandler (OnKeyPressTextBoxes);
+                       
+                       hueTextBox.TextChanged += new EventHandler (OnTextChangedTextBoxes);
+                       satTextBox.TextChanged += new EventHandler (OnTextChangedTextBoxes);
+                       briTextBox.TextChanged += new EventHandler (OnTextChangedTextBoxes);
+                       redTextBox.TextChanged += new EventHandler (OnTextChangedTextBoxes);
+                       greenTextBox.TextChanged += new EventHandler (OnTextChangedTextBoxes);
+                       blueTextBox.TextChanged += new EventHandler (OnTextChangedTextBoxes);
+                       
+                       hueTextBox.GotFocus += new EventHandler (OnGotFocusTextBoxes);
+                       satTextBox.GotFocus += new EventHandler (OnGotFocusTextBoxes);
+                       briTextBox.GotFocus += new EventHandler (OnGotFocusTextBoxes);
+                       redTextBox.GotFocus += new EventHandler (OnGotFocusTextBoxes);
+                       greenTextBox.GotFocus += new EventHandler (OnGotFocusTextBoxes);
+                       blueTextBox.GotFocus += new EventHandler (OnGotFocusTextBoxes);
+                       
+                       hueTextBox.LostFocus += new EventHandler (OnLostFocusTextBoxes);
+                       satTextBox.LostFocus += new EventHandler (OnLostFocusTextBoxes);
+                       briTextBox.LostFocus += new EventHandler (OnLostFocusTextBoxes);
+                       redTextBox.LostFocus += new EventHandler (OnLostFocusTextBoxes);
+                       greenTextBox.LostFocus += new EventHandler (OnLostFocusTextBoxes);
+                       blueTextBox.LostFocus += new EventHandler (OnLostFocusTextBoxes);
+                       
+                       ResetCustomColors ();
+               }
                #endregion      // Public Constructors
-
+               
                #region Public Instance Properties
                public Color Color {
                        get {
-                               throw new NotImplementedException ();
+                               return selectedColorPanel.BackColor;
                        }
-
+                       
                        set {
-                               throw new NotImplementedException ();
+                               if (value.IsEmpty) {
+                                       color = Color.Black;
+                                       baseColorControl.SetColor (color);
+                               } else if (color != value) {
+                                       color = value;
+                                       baseColorControl.SetColor (color);
+                               }
                        }
                }
-
+               
+               [DefaultValue(true)]
+               public virtual bool AllowFullOpen {
+                       get {
+                               return allowFullOpen;
+                       }
+                       
+                       set {
+                               if (allowFullOpen != value) {
+                                       allowFullOpen = value;
+                                       
+                                       if (!allowFullOpen)
+                                               defineColoursButton.Enabled = false;
+                                       else
+                                               defineColoursButton.Enabled = true;
+                               }
+                       }
+               }
+               
+               // Currently AnyColor internally is always true
+               // Does really anybody still use 256 or less colors ???
+               // Naw, cairo only supports 24bit anyway - pdb
+               [DefaultValue(false)]
+               public virtual bool AnyColor {
+                       get {
+                               return anyColor;
+                       }
+                       
+                       set {
+                               anyColor = value;
+                       }
+               }
+               
+               [DefaultValue(false)]
                public virtual bool FullOpen {
                        get {
-                               throw new NotImplementedException ();
+                               return fullOpen;
                        }
-
+                       
                        set {
-                               throw new NotImplementedException ();
+                               if (fullOpen != value) {
+                                       fullOpen = value;
+                                       
+                                       if (fullOpen && allowFullOpen) {
+                                               defineColoursButton.Enabled = false;
+                                               colorMatrixControl.ColorToShow = baseColorControl.ColorToShow;
+                                               form.Size = GetFormSize (true);
+                                       } else {
+                                               if (allowFullOpen)
+                                                       defineColoursButton.Enabled = true;
+                                               form.Size = GetFormSize (false);
+                                       }
+                               }
+                       }
+               }
+               
+               [Browsable(false)]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
+               public int[] CustomColors {
+                       get {
+                               return customColors;
+                       }
+                       
+                       set {
+                               if (value == null)
+                                       ResetCustomColors ();
+                               else {
+                                       int[] tmp_colors = value;
+                                       
+                                       Array.Copy (tmp_colors, customColors, tmp_colors.Length);
+                               }
+                                       
+                               baseColorControl.SetCustomColors ();
+                       }
+               }
+               
+               [DefaultValue(false)]
+               public virtual bool ShowHelp {
+                       get {
+                               return showHelp;
+                       }
+                       
+                       set {
+                               if (showHelp != value) {
+                                       showHelp = value;
+                                       if (showHelp)
+                                               helpButton.Show ();
+                                       else
+                                               helpButton.Hide ();
+                               }
+                       }
+               }
+               
+               [DefaultValue(false)]
+               public virtual bool SolidColorOnly {
+                       get {
+                               return solidColorOnly;
+                       }
+                       
+                       set {
+                               solidColorOnly = value;
                        }
                }
                #endregion      // Public Instance Properties
-
-               #region Protected Instance Properties
-               #endregion      // Protected Instance Properties
-
+               
                #region Public Instance Methods
-               [MonoTODO]
-               public override void Reset() {
-                       throw new NotImplementedException();
+               public override void Reset ()
+               {
+                       AllowFullOpen = true;
+                       anyColor = false;
+                       Color = Color.Black;
+                       CustomColors = null;
+                       FullOpen = false;
+                       ShowHelp = false;
+                       solidColorOnly = false;
+               }
+               
+               public override string ToString ()
+               {
+                       return base.ToString () + ",  Color: " + Color.ToString ();
                }
                #endregion      // Public Instance Methods
-
+               
+               #region Protected Instance Properties
+               protected virtual IntPtr Instance {
+                       get {
+                               // MS Internal
+                               return (IntPtr)GetHashCode ();
+                       }
+               }
+               
+               protected virtual int Options {
+                       get {
+                               // MS Internal
+                               return 0;
+                       }
+               }
+               #endregion      // Protected Instance Properties
+               
                #region Protected Instance Methods
-               [MonoTODO]
-               protected override bool RunDialog(IntPtr hwndOwner) {
-                       throw new NotImplementedException();
+               protected override bool RunDialog (IntPtr hwndOwner)
+               {
+                       defineColoursButton.Enabled = (AllowFullOpen && !FullOpen);
+                       defineColoursButton.Refresh ();
+
+                       form.Size = GetFormSize (FullOpen && AllowFullOpen);
+                       // currently needed, otherwise there are a lot of drawing artefacts/transparent controls if the same dialog gets opened again
+                       form.Refresh ();
+                       
+                       return true;
                }
                #endregion      // Protected Instance Methods
+               
+               #region Private Methods
+
+               Size GetFormSize (bool fullOpen)
+               {
+                       if (fullOpen)
+                               return new Size (448, 332);
+                       else
+                               return new Size (221, 332); // 300
+               }
+
+               void OnClickCancelButton (object sender, EventArgs e)
+               {
+                       form.DialogResult = DialogResult.Cancel;
+               }
+               
+               void OnClickOkButton (object sender, EventArgs e)
+               {
+                       form.DialogResult = DialogResult.OK;
+               }
+               
+               void OnClickButtonAddColours (object sender, EventArgs e)
+               {
+                       baseColorControl.SetUserColor (selectedColorPanel.BackColor);
+               }
+               
+               void OnClickButtonDefineColours (object sender, EventArgs e)
+               {
+                       if (allowFullOpen) {
+                               defineColoursButton.Enabled = false;
+                               colorMatrixControl.ColorToShow = baseColorControl.ColorToShow;
+                               form.Size = GetFormSize (true);
+                       }
+               }
+               
+               // FIXME: Is this correct ?
+               void OnClickHelpButton (object sender, EventArgs e)
+               {
+                       OnHelpRequest (e);
+               }
+               
+               string textBox_text_old = "";
+               
+               void OnGotFocusTextBoxes (object sender, EventArgs e)
+               {
+                       TextBox textbox = sender as TextBox;
+                       textBox_text_old = textbox.Text;
+               }
+               
+               void OnLostFocusTextBoxes (object sender, EventArgs e)
+               {
+                       TextBox textbox = sender as TextBox;
+                       
+                       if (textbox.Text.Length == 0)
+                               textbox.Text = textBox_text_old;
+               }
+               
+               void OnKeyPressTextBoxes (object sender, KeyPressEventArgs e)
+               {
+                       if (Char.IsLetter (e.KeyChar) || Char.IsWhiteSpace (e.KeyChar) || Char.IsPunctuation (e.KeyChar) || e.KeyChar == ',') {
+                               e.Handled = true;
+                               return; 
+                       }
+                       
+                       internal_textbox_change = true;
+               }
+               
+               internal TextBox edit_textbox = null;
+               bool internal_textbox_change = false;
+               
+               void OnTextChangedTextBoxes (object sender, EventArgs e)
+               {
+                       if (!internal_textbox_change)
+                               return;
+                       
+                       internal_textbox_change = false;
+                       
+                       TextBox tmp_box = sender as TextBox;
+                       
+                       if (tmp_box.Text.Length == 0)
+                               return;
+                       
+                       string text = tmp_box.Text;
+                       
+                       int val = 0;
+                       
+                       try {
+                               val = System.Convert.ToInt32 (text);
+                       } catch (Exception) {
+                               // bla
+                       }
+                       
+                       if (sender == hueTextBox) {
+                               if (val > 239) {
+                                       val = 239;
+                                       hueTextBox.Text = val.ToString ();
+                               } else
+                               if (val < 0) {
+                                       val = 0;
+                                       hueTextBox.Text = val.ToString ();
+                               }
+                               
+                               edit_textbox = hueTextBox;
+                               
+                               UpdateFromHSBTextBoxes ();
+                               
+                               UpdateControls (selectedColorPanel.BackColor);
+                       } else
+                       if (sender == satTextBox) {
+                               if (val > 240) {
+                                       val = 240;
+                                       satTextBox.Text = val.ToString ();
+                               } else
+                               if (val < 0) {
+                                       val = 0;
+                                       satTextBox.Text = val.ToString ();
+                               }
+                               
+                               edit_textbox = satTextBox;
+                               
+                               UpdateFromHSBTextBoxes ();
+                               
+                               UpdateControls (selectedColorPanel.BackColor);
+                       } else
+                       if (sender == briTextBox) {
+                               if (val > 240) {
+                                       val = 240;
+                                       briTextBox.Text = val.ToString ();
+                               } else
+                               if (val < 0) {
+                                       val = 0;
+                                       briTextBox.Text = val.ToString ();
+                               }
+                               
+                               edit_textbox = briTextBox;
+                               
+                               UpdateFromHSBTextBoxes ();
+                               
+                               UpdateControls (selectedColorPanel.BackColor);
+                       } else
+                       if (sender == redTextBox) {
+                               if (val > 255) {
+                                       val = 255;
+                                       redTextBox.Text = val.ToString ();
+                               } else
+                               if (val < 0) {
+                                       val = 0;
+                                       redTextBox.Text = val.ToString ();
+                               }
+                               
+                               edit_textbox = redTextBox;
+                               
+                               UpdateFromRGBTextBoxes ();
+                       } else
+                       if (sender == greenTextBox) {
+                               if (val > 255) {
+                                       val = 255;
+                                       greenTextBox.Text = val.ToString ();
+                               } else
+                               if (val < 0) {
+                                       val = 0;
+                                       greenTextBox.Text = val.ToString ();
+                               }
+                               
+                               edit_textbox = greenTextBox;
+                               
+                               UpdateFromRGBTextBoxes ();
+                       } else
+                       if (sender == blueTextBox) {
+                               if (val > 255) {
+                                       val = 255;
+                                       blueTextBox.Text = val.ToString ();
+                               } else
+                               if (val < 0) {
+                                       val = 0;
+                                       blueTextBox.Text = val.ToString ();
+                               }
+                               
+                               edit_textbox = blueTextBox;
+                               
+                               UpdateFromRGBTextBoxes ();
+                       }
+                       
+                       textBox_text_old = edit_textbox.Text;
+                       
+                       edit_textbox = null;
+               }
+               
+               internal void UpdateControls (Color acolor)
+               {
+                       selectedColorPanel.BackColor = acolor;
+                       colorMatrixControl.ColorToShow = acolor;
+                       brightnessControl.ColorToShow = acolor;
+                       triangleControl.ColorToShow = acolor;
+               }
+               
+               internal void UpdateRGBTextBoxes (Color acolor)
+               {
+                       if (edit_textbox != redTextBox)
+                               redTextBox.Text = acolor.R.ToString ();
+                       if (edit_textbox != greenTextBox)
+                               greenTextBox.Text = acolor.G.ToString ();
+                       if (edit_textbox != blueTextBox)
+                               blueTextBox.Text = acolor.B.ToString ();
+               }
+               
+               internal void UpdateHSBTextBoxes (Color acolor)
+               {
+                       HSB hsb = HSB.RGB2HSB (acolor);
+                       
+                       if (edit_textbox != hueTextBox)
+                               hueTextBox.Text = hsb.hue.ToString ();
+                       if (edit_textbox != satTextBox)
+                               satTextBox.Text = hsb.sat.ToString ();
+                       if (edit_textbox != briTextBox)
+                               briTextBox.Text = hsb.bri.ToString ();
+               }
+               
+               internal void UpdateFromHSBTextBoxes ()
+               {
+                       Color col = HSB.HSB2RGB (System.Convert.ToInt32 (hueTextBox.Text),
+                                                System.Convert.ToInt32 (satTextBox.Text),
+                                                System.Convert.ToInt32 (briTextBox.Text));
+                       
+                       selectedColorPanel.BackColor = col;
+                       UpdateRGBTextBoxes (col);
+               }
+               
+               internal void UpdateFromRGBTextBoxes ()
+               {
+                       Color col = Color.FromArgb (System.Convert.ToInt32 (redTextBox.Text),
+                                                   System.Convert.ToInt32 (greenTextBox.Text),
+                                                   System.Convert.ToInt32 (blueTextBox.Text));
+                       
+                       selectedColorPanel.BackColor = col;
+                       
+                       UpdateHSBTextBoxes (col);
+                       
+                       UpdateControls (col);
+               }
+               
+               void ResetCustomColors ()
+               {
+                       // check if this.customColors already exists
+                       if (customColors == null)
+                               customColors = new int [16];
+                       
+                       int default_color = Color.FromArgb(0, 255, 255, 255).ToArgb ();
+                               
+                       for (int i = 0; i < customColors.Length; i++)
+                               customColors [i] = default_color;
+               }
+               #endregion
+               
+               #region Internal structs and classes
+               internal struct HSB {
+                       public int hue;
+                       public int sat;
+                       public int bri;
+                       
+                       public static HSB RGB2HSB (Color color)
+                       {
+                               HSB hsb = new HSB ();
+                               
+                               hsb.hue = (int)((color.GetHue () / 360.0f) * 240);
+                               hsb.sat = (int)(color.GetSaturation () * 241);
+                               hsb.bri = (int)(color.GetBrightness () * 241);
+                               
+                               if (hsb.hue > 239) hsb.hue = 239;
+                               if (hsb.sat > 240) hsb.sat = 240;
+                               if (hsb.bri > 240) hsb.bri = 240;
+                               
+                               return hsb;
+                       }
+                       
+                       // not using ControlPaint HBS2Color, this algo is more precise
+                       public static Color HSB2RGB (int hue, int saturation, int brightness)
+                       {
+                               if (hue > 239)
+                                       hue = 239;
+                               else
+                               if (hue < 0)
+                                       hue = 0;
+                               
+                               if (saturation > 240)
+                                       saturation = 240;
+                               else
+                               if (saturation < 0)
+                                       saturation = 0;
+                               
+                               if (brightness > 240)
+                                       brightness = 240;
+                               else
+                               if (brightness < 0)
+                                       brightness = 0;
+                               
+                               float H = hue / 239.0f;
+                               float S = saturation / 240.0f;
+                               float L = brightness / 240.0f;
+                               
+                               float r = 0, g = 0, b = 0;
+                               float d1, d2;
+                               
+                               if (L == 0) {
+                                       r = g =  b = 0;
+                               } else {
+                                       if (S == 0) {
+                                               r = g = b = L;
+                                       } else {
+                                               d2 = (L <= 0.5f) ? L * (1.0f + S) : L + S - (L * S);
+                                               d1 = 2.0f * L - d2;
+                                               
+                                               float[] d3 = new float [] { H + 1.0f / 3.0f , H, H - 1.0f / 3.0f };
+                                               float[] rgb = new float [] { 0,0,0 };
+                                               
+                                               for (int i = 0; i < 3; i++) {
+                                                       if (d3 [i] < 0)
+                                                               d3 [i] += 1.0f;
+                                                       if (d3 [i] > 1.0f)
+                                                               d3 [i] -= 1.0f;
+                                                       
+                                                       if (6.0f * d3 [i] < 1.0f)
+                                                               rgb [i] = d1 + (d2 - d1) * d3 [i] * 6.0f;
+                                                       else
+                                                       if (2.0f * d3 [i] < 1.0f)
+                                                               rgb [i] = d2;
+                                                       else
+                                                       if (3.0f * d3 [i] < 2.0f)
+                                                               rgb [i] = (d1 + (d2 - d1) * ((2.0f / 3.0f) - d3 [i]) * 6.0f);
+                                                       else
+                                                               rgb [i] = d1;
+                                               }
+                                               
+                                               r = rgb [0];
+                                               g = rgb [1];
+                                               b = rgb [2];
+                                       }
+                               }
+                               
+                               r = 255.0f * r;
+                               g = 255.0f * g;
+                               b = 255.0f * b;
+                               
+                               if (r < 1)
+                                       r = 0.0f;
+                               else
+                               if (r > 255.0f)
+                                       r = 255.0f;
+                               
+                               if (g < 1)
+                                       g = 0.0f;
+                               else
+                               if (g > 255.0f)
+                                       g = 255.0f;
+                               
+                               if (b < 1)
+                                       b = 0.0f;
+                               else
+                               if (b > 255.0f)
+                                       b = 255.0f;
+                               
+                               return Color.FromArgb ((int)r, (int)g, (int)b);
+                       }
+                       
+                       public static int Brightness (Color color)
+                       {
+                               return (int)(color.GetBrightness () * 241);
+                       }
+                       
+                       public static void GetHueSaturation (Color color, out int hue, out int sat)
+                       {
+                               hue = (int)((color.GetHue () / 360.0f) * 240);
+                               sat = (int)(color.GetSaturation () * 241);
+                       }
+                       
+                       // only for testing
+                       // there are some small glitches, but it is still better than ControlPaint implementation
+                       public static void TestColor (Color color)
+                       {
+                               Console.WriteLine ("Color: " + color);
+                               HSB hsb = HSB.RGB2HSB (color);
+                               Console.WriteLine ("RGB2HSB: " + hsb.hue + ", " + hsb.sat + ", " + hsb.bri);
+                               Console.WriteLine ("HSB2RGB: " + HSB.HSB2RGB (hsb.hue, hsb.sat, hsb.bri));
+                               Console.WriteLine ();
+                       }
+               }
+               
+               internal class BaseColorControl : Control {
+                       internal class SmallColorControl : Control {
+                               private Color internalcolor;
+                               
+                               private bool isSelected = false;
+                               
+                               public SmallColorControl (Color color)
+                               {
+                                       SuspendLayout ();
+                                       
+                                       this.internalcolor = color;
+                                       
+                                       Size = new Size (25, 23);
+                                       
+                                       ResumeLayout (false);
+                                       
+                                       SetStyle (ControlStyles.DoubleBuffer, true);
+                                       SetStyle (ControlStyles.AllPaintingInWmPaint, true);
+                                       SetStyle (ControlStyles.UserPaint, true);
+                                       SetStyle (ControlStyles.Selectable, true);
+                               }
+                               
+                               public bool IsSelected {
+                                       set {
+                                               isSelected = value;
+                                               Invalidate ();
+                                       }
+                               }
+                               
+                               public Color InternalColor {
+                                       set {
+                                               internalcolor = value;
+                                               Invalidate ();
+                                       }
+                                       
+                                       get {
+                                               return internalcolor;
+                                       }
+                               }
+                               
+                               protected override void OnPaint (PaintEventArgs pe)
+                               {
+                                       base.OnPaint (pe);
+                                       
+                                       pe.Graphics.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (internalcolor),
+                                                                  new Rectangle (4, 4, 17, 15));
+                                       
+                                       ControlPaint.DrawBorder3D (pe.Graphics, 3, 3, 19, 17, Border3DStyle.Sunken);
+                                       
+                                       if (isSelected) {
+                                               pe.Graphics.DrawRectangle (ThemeEngine.Current.ResPool.GetPen (Color.Black),
+                                                                          new Rectangle (2, 2, 20, 18));
+                                       }
+                                       
+                                       if (Focused) {
+                                               ControlPaint.DrawFocusRectangle (
+                                                       pe.Graphics, new Rectangle (0, 0, 25, 23)
+                                               );
+                                       }
+                               }
+                               
+                               protected override void OnClick (EventArgs e)
+                               {
+                                       Focus ();
+                                       IsSelected = true;
+                                       
+                                       base.OnClick (e);
+                               }
+                               
+                               
+                               protected override void OnLostFocus (EventArgs e)
+                               {
+                                       Invalidate ();
+                                       
+                                       base.OnLostFocus (e);
+                               }
+                       }
+                       
+                       private SmallColorControl[] smallColorControl;
+                       
+                       private SmallColorControl[] userSmallColorControl;
+                       
+                       private Label userColorLabel;
+                       private Label baseColorLabel;
+                       
+                       private SmallColorControl selectedSmallColorControl;
+                       
+                       private int currentlyUsedUserSmallColorControl = 0;
+                       
+                       private ColorDialog colorDialog = null;
+                       
+                       public BaseColorControl (ColorDialog colorDialog)
+                       {
+                               this.colorDialog = colorDialog;
+                               
+                               userSmallColorControl = new SmallColorControl [16];
+                               userSmallColorControl [0] = new SmallColorControl (Color.White);
+                               userSmallColorControl [1] = new SmallColorControl (Color.White);
+                               userSmallColorControl [2] = new SmallColorControl (Color.White);
+                               userSmallColorControl [3] = new SmallColorControl (Color.White);
+                               userSmallColorControl [4] = new SmallColorControl (Color.White);
+                               userSmallColorControl [5] = new SmallColorControl (Color.White);
+                               userSmallColorControl [6] = new SmallColorControl (Color.White);
+                               userSmallColorControl [7] = new SmallColorControl (Color.White);
+                               userSmallColorControl [8] = new SmallColorControl (Color.White);
+                               userSmallColorControl [9] = new SmallColorControl (Color.White);
+                               userSmallColorControl [10] = new SmallColorControl (Color.White);
+                               userSmallColorControl [11] = new SmallColorControl (Color.White);
+                               userSmallColorControl [12] = new SmallColorControl (Color.White);
+                               userSmallColorControl [13] = new SmallColorControl (Color.White);
+                               userSmallColorControl [14] = new SmallColorControl (Color.White);
+                               userSmallColorControl [15] = new SmallColorControl (Color.White);
+                               
+                               smallColorControl = new SmallColorControl [48];
+                               smallColorControl [0] = new SmallColorControl (Color.FromArgb (((Byte)(255)), ((Byte)(128)), ((Byte)(128))));
+                               smallColorControl [1] = new SmallColorControl (Color.FromArgb (((Byte)(128)), ((Byte)(128)), ((Byte)(64))));
+                               smallColorControl [2] = new SmallColorControl (Color.Gray);
+                               smallColorControl [3] = new SmallColorControl (Color.FromArgb (((Byte)(128)), ((Byte)(0)), ((Byte)(255))));
+                               smallColorControl [4] = new SmallColorControl (Color.Silver);
+                               smallColorControl [5] = new SmallColorControl (Color.FromArgb (((Byte)(64)), ((Byte)(128)), ((Byte)(128))));
+                               smallColorControl [6] = new SmallColorControl (Color.White);
+                               smallColorControl [7] = new SmallColorControl (Color.FromArgb (((Byte)(64)), ((Byte)(0)), ((Byte)(64))));
+                               smallColorControl [8] = new SmallColorControl (Color.FromArgb (((Byte)(255)), ((Byte)(128)), ((Byte)(64))));
+                               smallColorControl [9] = new SmallColorControl (Color.FromArgb (((Byte)(128)), ((Byte)(64)), ((Byte)(64))));
+                               smallColorControl [10] = new SmallColorControl (Color.Teal);
+                               smallColorControl [11] = new SmallColorControl (Color.Lime);
+                               smallColorControl [12] = new SmallColorControl (Color.FromArgb (((Byte)(128)), ((Byte)(128)), ((Byte)(255))));
+                               smallColorControl [13] = new SmallColorControl (Color.FromArgb (((Byte)(0)), ((Byte)(64)), ((Byte)(128))));
+                               smallColorControl [14] = new SmallColorControl (Color.FromArgb (((Byte)(255)), ((Byte)(0)), ((Byte)(128))));
+                               smallColorControl [15] = new SmallColorControl (Color.FromArgb (((Byte)(128)), ((Byte)(255)), ((Byte)(0))));
+                               smallColorControl [16] = new SmallColorControl (Color.FromArgb (((Byte)(0)), ((Byte)(255)), ((Byte)(64))));
+                               smallColorControl [17] = new SmallColorControl (Color.Red);
+                               smallColorControl [18] = new SmallColorControl (Color.FromArgb (((Byte)(255)), ((Byte)(128)), ((Byte)(0))));
+                               smallColorControl [19] = new SmallColorControl (Color.FromArgb (((Byte)(255)), ((Byte)(128)), ((Byte)(255))));
+                               smallColorControl [20] = new SmallColorControl (Color.Fuchsia);
+                               smallColorControl [21] = new SmallColorControl (Color.Aqua);
+                               smallColorControl [22] = new SmallColorControl (Color.FromArgb (((Byte)(128)), ((Byte)(255)), ((Byte)(128))));
+                               smallColorControl [23] = new SmallColorControl (Color.FromArgb (((Byte)(128)), ((Byte)(255)), ((Byte)(255))));
+                               smallColorControl [24] = new SmallColorControl (Color.FromArgb (((Byte)(0)), ((Byte)(128)), ((Byte)(255))));
+                               smallColorControl [25] = new SmallColorControl (Color.FromArgb (((Byte)(128)), ((Byte)(64)), ((Byte)(0))));
+                               smallColorControl [26] = new SmallColorControl (Color.FromArgb (((Byte)(64)), ((Byte)(0)), ((Byte)(0))));
+                               smallColorControl [27] = new SmallColorControl (Color.Maroon);
+                               smallColorControl [28] = new SmallColorControl (Color.Purple);
+                               smallColorControl [29] = new SmallColorControl (Color.FromArgb (((Byte)(0)), ((Byte)(0)), ((Byte)(160))));
+                               smallColorControl [30] = new SmallColorControl (Color.Blue);
+                               smallColorControl [31] = new SmallColorControl (Color.FromArgb (((Byte)(0)), ((Byte)(128)), ((Byte)(64))));
+                               smallColorControl [32] = new SmallColorControl (Color.Green);
+                               smallColorControl [33] = new SmallColorControl (Color.Yellow);
+                               smallColorControl [34] = new SmallColorControl (Color.FromArgb (((Byte)(128)), ((Byte)(128)), ((Byte)(192))));
+                               smallColorControl [35] = new SmallColorControl (Color.FromArgb (((Byte)(0)), ((Byte)(128)), ((Byte)(192))));
+                               smallColorControl [36] = new SmallColorControl (Color.FromArgb (((Byte)(128)), ((Byte)(0)), ((Byte)(64))));
+                               smallColorControl [37] = new SmallColorControl (Color.FromArgb (((Byte)(255)), ((Byte)(128)), ((Byte)(192))));
+                               smallColorControl [38] = new SmallColorControl (Color.FromArgb (((Byte)(0)), ((Byte)(255)), ((Byte)(128))));
+                               smallColorControl [39] = new SmallColorControl (Color.FromArgb (((Byte)(255)), ((Byte)(255)), ((Byte)(128))));
+                               smallColorControl [40] = new SmallColorControl (Color.FromArgb (((Byte)(0)), ((Byte)(64)), ((Byte)(0))));
+                               smallColorControl [41] = new SmallColorControl (Color.FromArgb (((Byte)(0)), ((Byte)(64)), ((Byte)(64))));
+                               smallColorControl [42] = new SmallColorControl (Color.Navy);
+                               smallColorControl [43] = new SmallColorControl (Color.FromArgb (((Byte)(0)), ((Byte)(0)), ((Byte)(64))));
+                               smallColorControl [44] = new SmallColorControl (Color.FromArgb (((Byte)(64)), ((Byte)(0)), ((Byte)(64))));
+                               smallColorControl [45] = new SmallColorControl (Color.FromArgb (((Byte)(64)), ((Byte)(0)), ((Byte)(128))));
+                               smallColorControl [46] = new SmallColorControl (Color.Black); //Black
+                               smallColorControl [47] = new SmallColorControl (Color.Olive);
+                               
+                               baseColorLabel = new Label ();
+                               userColorLabel = new Label ();
+                               
+                               SuspendLayout ();
+                               
+                               // colorPanel1
+                               smallColorControl [0].Location = new Point (0, 15);
+                               smallColorControl [0].TabIndex = 51;
+                               smallColorControl [0].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel2
+                               smallColorControl [1].Location = new Point (50, 130);
+                               smallColorControl [1].TabIndex = 92;
+                               smallColorControl [1].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel3
+                               smallColorControl [2].Location = new Point (75, 130);
+                               smallColorControl [2].TabIndex = 93;
+                               smallColorControl [2].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel4
+                               smallColorControl [3].Location = new Point (175, 84);
+                               smallColorControl [3].TabIndex = 98;
+                               smallColorControl [3].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel5
+                               smallColorControl [4].Location = new Point (125, 130);
+                               smallColorControl [4].TabIndex = 95;
+                               smallColorControl [4].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel6
+                               smallColorControl [5].Location = new Point (100, 130);
+                               smallColorControl [5].TabIndex = 94;
+                               smallColorControl [5].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel7
+                               smallColorControl [6].Location = new Point (175, 130);
+                               smallColorControl [6].TabIndex = 97;
+                               smallColorControl [6].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel8
+                               smallColorControl [7].Location = new Point (150, 130);
+                               smallColorControl [7].TabIndex = 96;
+                               smallColorControl [7].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel9
+                               smallColorControl [8].Location = new Point (25, 61);
+                               smallColorControl [8].TabIndex = 68;
+                               smallColorControl [8].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel10
+                               smallColorControl [9].Location = new Point (0, 61);
+                               smallColorControl [9].TabIndex = 67;
+                               smallColorControl [9].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel11
+                               smallColorControl [10].Location = new Point (75, 61);
+                               smallColorControl [10].TabIndex = 70;
+                               smallColorControl [10].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel12
+                               smallColorControl [11].Location = new Point (50, 61);
+                               smallColorControl [11].TabIndex = 69;
+                               smallColorControl [11].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel13
+                               smallColorControl [12].Location = new Point (125, 61);
+                               smallColorControl [12].TabIndex = 72;
+                               smallColorControl [12].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel14
+                               smallColorControl [13].Location = new Point (100, 61);
+                               smallColorControl [13].TabIndex = 71;
+                               smallColorControl [13].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel15
+                               smallColorControl [14].Location = new Point (175, 61);
+                               smallColorControl [14].TabIndex = 74;
+                               smallColorControl [14].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel16
+                               smallColorControl [15].Location = new Point (50, 38);
+                               smallColorControl [15].TabIndex = 61;
+                               smallColorControl [15].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel17
+                               smallColorControl [16].Location = new Point (75, 38);
+                               smallColorControl [16].TabIndex = 62;
+                               smallColorControl [16].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel18
+                               smallColorControl [17].Location = new Point (0, 38);
+                               smallColorControl [17].TabIndex = 59;
+                               smallColorControl [17].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel19
+                               smallColorControl [18].Location = new Point (25, 84);
+                               smallColorControl [18].TabIndex = 75;
+                               smallColorControl [18].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel20
+                               smallColorControl [19].Location = new Point (175, 15);
+                               smallColorControl [19].TabIndex = 58;
+                               smallColorControl [19].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel21
+                               smallColorControl [20].Location = new Point (175, 38);
+                               smallColorControl [20].TabIndex = 66;
+                               smallColorControl [20].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel22
+                               smallColorControl [21].Location = new Point (100, 38);
+                               smallColorControl [21].TabIndex = 63;
+                               smallColorControl [21].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel23
+                               smallColorControl [22].Location = new Point (50, 15);
+                               smallColorControl [22].TabIndex = 53;
+                               smallColorControl [22].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel24
+                               smallColorControl [23].Location = new Point (100, 15);
+                               smallColorControl [23].TabIndex = 55;
+                               smallColorControl [23].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel25
+                               smallColorControl [24].Location = new Point (125, 15);
+                               smallColorControl [24].TabIndex = 56;
+                               smallColorControl [24].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel26
+                               smallColorControl [25].Location = new Point (25, 107);
+                               smallColorControl [25].TabIndex = 83;
+                               smallColorControl [25].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel27
+                               smallColorControl [26].Location = new Point (0, 107);
+                               smallColorControl [26].TabIndex = 82;
+                               smallColorControl [26].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel28
+                               smallColorControl [27].Location = new Point (0, 84);
+                               smallColorControl [27].TabIndex = 81;
+                               smallColorControl [27].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel29
+                               smallColorControl [28].Location = new Point (150, 84);
+                               smallColorControl [28].TabIndex = 80;
+                               smallColorControl [28].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel30
+                               smallColorControl [29].Location = new Point (125, 84);
+                               smallColorControl [29].TabIndex = 79;
+                               smallColorControl [29].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel31
+                               smallColorControl [30].Location  = new Point (100, 84);
+                               smallColorControl [30].TabIndex = 78;
+                               smallColorControl [30].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel32
+                               smallColorControl [31].Location = new Point (75, 84);
+                               smallColorControl [31].TabIndex = 77;
+                               smallColorControl [31].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel33
+                               smallColorControl [32].Location = new Point (50, 84);
+                               smallColorControl [32].TabIndex = 76;
+                               smallColorControl [32].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel34
+                               smallColorControl [33].Location = new Point (25, 38);
+                               smallColorControl [33].TabIndex = 60;
+                               smallColorControl [33].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel35
+                               smallColorControl [34].Location = new Point (150, 38);
+                               smallColorControl [34].TabIndex = 65;
+                               smallColorControl [34].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel36
+                               smallColorControl [35].Location = new Point (125, 38);
+                               smallColorControl [35].TabIndex = 64;
+                               smallColorControl [35].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel37
+                               smallColorControl [36].Location = new Point (150, 61);
+                               smallColorControl [36].TabIndex = 73;
+                               smallColorControl [36].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel38
+                               smallColorControl [37].Location = new Point (150, 15);
+                               smallColorControl [37].TabIndex = 57;
+                               smallColorControl [37].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel39
+                               smallColorControl [38].Location = new Point (75, 15);
+                               smallColorControl [38].TabIndex = 54;
+                               smallColorControl [38].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel40
+                               smallColorControl [39].Location = new Point (25, 15);
+                               smallColorControl [39].TabIndex = 52;
+                               smallColorControl [39].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel41
+                               smallColorControl [40].Location = new Point (50, 107);
+                               smallColorControl [40].TabIndex = 84;
+                               smallColorControl [40].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel42
+                               smallColorControl [41].Location = new Point (75, 107);
+                               smallColorControl [41].TabIndex = 85;
+                               smallColorControl [41].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel43
+                               smallColorControl [42].Location = new Point (100, 107);
+                               smallColorControl [42].TabIndex = 86;
+                               smallColorControl [42].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel44
+                               smallColorControl [43].Location = new Point (125, 107);
+                               smallColorControl [43].TabIndex = 87;
+                               smallColorControl [43].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel45
+                               smallColorControl [44].Location = new Point (150, 107);
+                               smallColorControl [44].TabIndex = 88;
+                               smallColorControl [44].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel46
+                               smallColorControl [45].Location = new Point (175, 107);
+                               smallColorControl [45].TabIndex = 89;
+                               smallColorControl [45].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel47
+                               smallColorControl [46].Location = new Point (0, 130);
+                               smallColorControl [46].TabIndex = 90;
+                               smallColorControl [46].Click += new EventHandler (OnSmallColorControlClick);
+                               // colorPanel48
+                               smallColorControl [47].Location = new Point (25, 130);
+                               smallColorControl [47].TabIndex = 91;
+                               smallColorControl [47].Click += new EventHandler (OnSmallColorControlClick);
+                               
+                               // userColorPane1
+                               userSmallColorControl [0].Location = new Point (0, 180);
+                               userSmallColorControl [0].TabIndex = 99;
+                               userSmallColorControl [0].Click += new EventHandler (OnSmallColorControlClick);
+                               // userColorPanel2
+                               userSmallColorControl [1].Location = new Point (0, 203);
+                               userSmallColorControl [1].TabIndex = 108;
+                               userSmallColorControl [1].Click += new EventHandler (OnSmallColorControlClick);
+                               // userColorPanel13
+                               userSmallColorControl [2].Location = new Point (25, 180);
+                               userSmallColorControl [2].TabIndex = 100;
+                               userSmallColorControl [2].Click += new EventHandler (OnSmallColorControlClick);
+                               // userColorPanel4
+                               userSmallColorControl [3].Location = new Point (25, 203);
+                               userSmallColorControl [3].TabIndex = 109;
+                               userSmallColorControl [3].Click += new EventHandler (OnSmallColorControlClick);
+                               // userColorPanel5
+                               userSmallColorControl [4].Location = new Point (50, 180);
+                               userSmallColorControl [4].TabIndex = 101;
+                               userSmallColorControl [4].Click += new EventHandler (OnSmallColorControlClick);
+                               // userColorPanel6
+                               userSmallColorControl [5].Location = new Point (50, 203);
+                               userSmallColorControl [5].TabIndex = 110;
+                               userSmallColorControl [5].Click += new EventHandler (OnSmallColorControlClick);
+                               // userColorPanel7
+                               userSmallColorControl [6].Location = new Point (75, 180);
+                               userSmallColorControl [6].TabIndex = 102;
+                               userSmallColorControl [6].Click += new EventHandler (OnSmallColorControlClick);
+                               // userColorPanel8
+                               userSmallColorControl [7].Location = new Point (75, 203);
+                               userSmallColorControl [7].TabIndex = 111;
+                               userSmallColorControl [7].Click += new EventHandler (OnSmallColorControlClick);
+                               // userColorPanel9
+                               userSmallColorControl [8].Location = new Point (100, 180);
+                               userSmallColorControl [8].TabIndex = 103;
+                               userSmallColorControl [8].Click += new EventHandler (OnSmallColorControlClick);
+                               // userColorPanel10
+                               userSmallColorControl [9].Location = new Point (100, 203);
+                               userSmallColorControl [9].TabIndex = 112;
+                               userSmallColorControl [9].Click += new EventHandler (OnSmallColorControlClick);
+                               // userColorPanel11
+                               userSmallColorControl [10].Location = new Point (125, 180);
+                               userSmallColorControl [10].TabIndex = 105;
+                               userSmallColorControl [10].Click += new EventHandler (OnSmallColorControlClick);
+                               // userColorPanel2
+                               userSmallColorControl [11].Location = new Point (125, 203);
+                               userSmallColorControl [11].TabIndex = 113;
+                               userSmallColorControl [11].Click += new EventHandler (OnSmallColorControlClick);
+                               // userColorPanel13
+                               userSmallColorControl [12].Location = new Point (150, 180);
+                               userSmallColorControl [12].TabIndex = 106;
+                               userSmallColorControl [12].Click += new EventHandler (OnSmallColorControlClick);
+                               // userColorPanel4
+                               userSmallColorControl [13].Location = new Point (150, 203);
+                               userSmallColorControl [13].TabIndex = 114;
+                               userSmallColorControl [13].Click += new EventHandler (OnSmallColorControlClick);
+                               // userColorPanel15
+                               userSmallColorControl [14].Location = new Point (175, 180);
+                               userSmallColorControl [14].TabIndex = 107;
+                               userSmallColorControl [14].Click += new EventHandler (OnSmallColorControlClick);
+                               // userColorPanel16
+                               userSmallColorControl [15].Location = new Point (175, 203);
+                               userSmallColorControl [15].TabIndex = 115;
+                               userSmallColorControl [15].Click += new EventHandler (OnSmallColorControlClick);
+                               
+                               // baseColorLabel
+                               baseColorLabel.Location = new Point (2, 0);
+                               baseColorLabel.Size = new Size (200, 12);
+                               baseColorLabel.TabIndex = 5;
+                               baseColorLabel.Text = Locale.GetText ("Base Colors") + ":";
+                               // userColorLabel
+                               userColorLabel.FlatStyle = FlatStyle.System;
+                               userColorLabel.Location = new Point (2, 164);
+                               userColorLabel.Size = new Size (200, 14);
+                               userColorLabel.TabIndex = 104;
+                               userColorLabel.Text = Locale.GetText ("User Colors") + ":";
+                               
+                               Controls.Add (userSmallColorControl [7]);
+                               Controls.Add (userSmallColorControl [6]);
+                               Controls.Add (userSmallColorControl [5]);
+                               Controls.Add (userSmallColorControl [4]);
+                               Controls.Add (userSmallColorControl [3]);
+                               Controls.Add (userSmallColorControl [2]);
+                               Controls.Add (userSmallColorControl [1]);
+                               Controls.Add (userSmallColorControl [0]);
+                               Controls.Add (userSmallColorControl [15]);
+                               Controls.Add (userSmallColorControl [14]);
+                               Controls.Add (userSmallColorControl [13]);
+                               Controls.Add (userSmallColorControl [12]);
+                               Controls.Add (userSmallColorControl [11]);
+                               Controls.Add (userSmallColorControl [10]);
+                               Controls.Add (userSmallColorControl [9]);
+                               Controls.Add (userSmallColorControl [8]);
+                               
+                               Controls.Add (smallColorControl [0]);
+                               Controls.Add (smallColorControl [3]);
+                               Controls.Add (smallColorControl [6]);
+                               Controls.Add (smallColorControl [7]);
+                               Controls.Add (smallColorControl [4]);
+                               Controls.Add (smallColorControl [5]);
+                               Controls.Add (smallColorControl [2]);
+                               Controls.Add (smallColorControl [1]);
+                               Controls.Add (smallColorControl [47]);
+                               Controls.Add (smallColorControl [46]);
+                               Controls.Add (smallColorControl [45]);
+                               Controls.Add (smallColorControl [44]);
+                               Controls.Add (smallColorControl [43]);
+                               Controls.Add (smallColorControl [42]);
+                               Controls.Add (smallColorControl [41]);
+                               Controls.Add (smallColorControl [40]);
+                               Controls.Add (smallColorControl [25]);
+                               Controls.Add (smallColorControl [26]);
+                               Controls.Add (smallColorControl [27]);
+                               Controls.Add (smallColorControl [28]);
+                               Controls.Add (smallColorControl [29]);
+                               Controls.Add (smallColorControl [30]);
+                               Controls.Add (smallColorControl [31]);
+                               Controls.Add (smallColorControl [32]);
+                               Controls.Add (smallColorControl [18]);
+                               Controls.Add (smallColorControl [14]);
+                               Controls.Add (smallColorControl [36]);
+                               Controls.Add (smallColorControl [12]);
+                               Controls.Add (smallColorControl [13]);
+                               Controls.Add (smallColorControl [10]);
+                               Controls.Add (smallColorControl [11]);
+                               Controls.Add (smallColorControl [8]);
+                               Controls.Add (smallColorControl [9]);
+                               Controls.Add (smallColorControl [20]);
+                               Controls.Add (smallColorControl [34]);
+                               Controls.Add (smallColorControl [35]);
+                               Controls.Add (smallColorControl [21]);
+                               Controls.Add (smallColorControl [16]);
+                               Controls.Add (smallColorControl [15]);
+                               Controls.Add (smallColorControl [33]);
+                               Controls.Add (smallColorControl [17]);
+                               Controls.Add (smallColorControl [19]);
+                               Controls.Add (smallColorControl [37]);
+                               Controls.Add (smallColorControl [24]);
+                               Controls.Add (smallColorControl [23]);
+                               Controls.Add (smallColorControl [38]);
+                               Controls.Add (smallColorControl [22]);
+                               Controls.Add (smallColorControl [39]);
+                               
+                               Controls.Add (userColorLabel);
+                               Controls.Add (baseColorLabel);
+                               
+                               Size = new Size (212, 238);
+                               
+                               ResumeLayout (false);
+                       }
+                       
+                       private void CheckIfColorIsInPanel (Color color)
+                       {
+                               // check if we have a panel with a BackColor = color...
+                               for (int i = 0; i < smallColorControl.Length; i++) {
+                                       if (smallColorControl [i].InternalColor == color) {
+                                               selectedSmallColorControl = smallColorControl [i];
+                                               selectedSmallColorControl.IsSelected = true;
+                                               break;
+                                       }
+                               }
+                       }
+                       
+                       void OnSmallColorControlClick (object sender, EventArgs e)
+                       {
+                               // previous selected smallcolorcontrol
+                               if (selectedSmallColorControl != (SmallColorControl)sender)
+                                       selectedSmallColorControl.IsSelected = false;
+                               
+                               selectedSmallColorControl = (SmallColorControl)sender;
+                               
+                               TriangleControl.CurrentBrightness = HSB.Brightness (selectedSmallColorControl.InternalColor);
+                               
+                               colorDialog.UpdateControls (selectedSmallColorControl.InternalColor);
+                               colorDialog.UpdateRGBTextBoxes (selectedSmallColorControl.InternalColor);
+                               colorDialog.UpdateHSBTextBoxes (selectedSmallColorControl.InternalColor);
+                       }
+                       
+                       public Color ColorToShow {
+                               get {
+                                       return selectedSmallColorControl.InternalColor;
+                               }
+                       }
+                       
+                       
+                       public void SetColor (Color acolor)
+                       {
+                               if (selectedSmallColorControl != null)
+                                       selectedSmallColorControl.IsSelected = false;
+                               
+                               CheckIfColorIsInPanel (acolor);
+                               
+                               TriangleControl.CurrentBrightness = HSB.Brightness (acolor);
+                               
+                               colorDialog.UpdateControls (acolor);
+                               colorDialog.UpdateRGBTextBoxes (acolor);
+                               colorDialog.UpdateHSBTextBoxes (acolor);
+                       }
+                       
+                       public void SetUserColor (Color col)
+                       {
+                               userSmallColorControl [currentlyUsedUserSmallColorControl].InternalColor = col;
+                               
+                               colorDialog.customColors [currentlyUsedUserSmallColorControl] = col.ToArgb ();
+                               
+                               currentlyUsedUserSmallColorControl++;
+                               if (currentlyUsedUserSmallColorControl > 15)
+                                       currentlyUsedUserSmallColorControl = 0;
+                       }
+                       
+                       public void SetCustomColors ()
+                       {
+                               for (int i = 0; i < colorDialog.customColors.Length; i++) {
+                                       userSmallColorControl [i].InternalColor = Color.FromArgb (colorDialog.customColors [i]);
+                               }
+                       }
+               }
+               
+               internal class ColorMatrixControl : Panel {
+                       internal class DrawingBitmap {
+                               private Bitmap bitmap;
+                               
+                               public DrawingBitmap (Size size)
+                               {
+                                       bitmap = new Bitmap (size.Width, size.Height);
+                                       
+                                       float hueadd = 240.0f / (size.Width - 1);
+                                       float satsub = 241.0f / (size.Height - 1);
+                                       float satpos = 240.0f;
+                                       
+                                       // paint the matrix to the bitmap
+                                       for (int height = 0; height < size.Height; height++) {
+                                               float huepos = 0.0f;
+                                               
+                                               for (int width = 0; width < size.Width; width++) {
+                                                       HSB hsb = new HSB ();
+                                                       
+                                                       hsb.hue = (int)huepos;
+                                                       hsb.sat = (int)satpos;
+                                                       hsb.bri = 120; // paint it with 120 to get a nice bitmap
+                                                       
+                                                       bitmap.SetPixel (width, height, HSB.HSB2RGB (hsb.hue, hsb.sat, hsb.bri));
+                                                       
+                                                       huepos += hueadd;
+                                               }
+                                               
+                                               satpos -= satsub;
+                                       }
+                               }
+                               
+                               public Bitmap Bitmap {
+                                       set {
+                                               bitmap = value;
+                                       }
+                                       
+                                       get {
+                                               return bitmap;
+                                       }
+                               }
+                       }
+                       
+                       internal class CrossCursor {
+                               private Bitmap bitmap;
+                               
+                               private Color cursorColor;
+                               
+                               public CrossCursor ()
+                               {
+                                       bitmap = new Bitmap (22, 22);
+                                       
+                                       cursorColor = Color.Black;
+                                       
+                                       Draw ();
+                               }
+                               
+                               public void Draw ()
+                               {
+                                       using (Pen pen = new Pen (ThemeEngine.Current.ResPool.GetSolidBrush (cursorColor), 3)) {
+                                               using (Graphics graphics = Graphics.FromImage (bitmap)) {
+                                                       graphics.DrawLine (pen, 11, 0, 11, 7);
+                                                       graphics.DrawLine (pen, 11, 14, 11, 21);
+                                                       graphics.DrawLine (pen, 0, 11, 7, 11);
+                                                       graphics.DrawLine (pen, 14, 11, 21, 11);
+                                               }
+                                       }
+                               }
+                               
+                               public Bitmap Bitmap {
+                                       set {
+                                               bitmap = value;
+                                       }
+                                       
+                                       get {
+                                               return bitmap;
+                                       }
+                               }
+                               
+                               public Color CursorColor {
+                                       set {
+                                               cursorColor = value;
+                                       }
+                                       
+                                       get {
+                                               return cursorColor;
+                                       }
+                               }
+                       }
+                       
+                       private DrawingBitmap drawingBitmap = null;
+                       
+                       private CrossCursor crossCursor = new CrossCursor();
+                       
+                       private bool mouseButtonDown = false;
+                       
+                       private bool drawCross = true;
+                       
+                       private Color color;
+                       
+                       private int currentXPos;
+                       private int currentYPos;
+                       
+                       private float xstep;
+                       private float ystep;
+                       
+                       private ColorDialog colorDialog;
+                       
+                       public ColorMatrixControl (ColorDialog colorDialog)
+                       {
+                               this.colorDialog = colorDialog;
+                               
+                               SuspendLayout ();
+                               
+                               BorderStyle = BorderStyle.Fixed3D;
+                               Location = new Point (0, 0);
+                               Size = new Size (179, 190);
+                               TabIndex = 0;
+                               TabStop = false;
+                               
+                               ResumeLayout (false);
+                               
+                               xstep = 240.0f / (ClientSize.Width - 1);
+                               ystep = 241.0f / (ClientSize.Height - 1);
+                               
+                               SetStyle (ControlStyles.DoubleBuffer, true);
+                               SetStyle (ControlStyles.AllPaintingInWmPaint, true);
+                               SetStyle (ControlStyles.UserPaint, true);
+                       }
+                       
+                       protected override void OnPaint (PaintEventArgs e)
+                       {
+                               if (drawingBitmap == null)
+                                       drawingBitmap = new DrawingBitmap (ClientSize);
+                               
+                               Draw (e);
+                               
+                               base.OnPaint (e);
+                       }
+                       
+                       private void Draw (PaintEventArgs e)
+                       {
+                               e.Graphics.DrawImage (drawingBitmap.Bitmap, ClientRectangle.X, ClientRectangle.Y);
+                               
+                               // drawCross is false if the mouse gets moved...
+                               if (drawCross) {
+                                       e.Graphics.DrawImage (crossCursor.Bitmap, currentXPos - 11 , currentYPos - 11);
+                               }
+                       }
+                       
+                       protected override void OnMouseDown (MouseEventArgs e)
+                       {
+                               mouseButtonDown = true;
+                               currentXPos = e.X;
+                               currentYPos = e.Y;
+                               if (drawCross) {
+                                       drawCross = false;
+                                       Invalidate ();
+                                       Update ();
+                               }
+                               
+                               UpdateControls ();
+                               XplatUI.GrabWindow (Handle, Handle);
+                               
+                               base.OnMouseDown (e);
+                       }
+                       
+                       protected override void OnMouseMove (MouseEventArgs e)
+                       {
+                               if (mouseButtonDown)
+                                       if ((e.X < ClientSize.Width && e.X >= 0) && (e.Y < ClientSize.Height && e.Y >= 0)) {
+                                               currentXPos = e.X;
+                                               currentYPos = e.Y;
+                                               UpdateControls ();
+                                       }
+                               
+                               base.OnMouseMove (e);
+                       }
+                       
+                       protected override void OnMouseUp (MouseEventArgs e)
+                       {
+                               XplatUI.UngrabWindow (Handle);
+                               mouseButtonDown = false;
+                               drawCross = true;
+                               Invalidate ();
+                               Update ();
+                       }
+                       
+                       public Color ColorToShow {
+                               set {
+                                       ComputePos (value);
+                               }
+                       }
+                       
+                       private void ComputePos (Color acolor)
+                       {
+                               if (acolor != color) {
+                                       color = acolor;
+                                       
+                                       HSB hsb = HSB.RGB2HSB (color);
+                                       
+                                       currentXPos = (int)((float)hsb.hue / xstep);
+                                       currentYPos = ClientSize.Height - 1 - (int)((float)hsb.sat / ystep);
+                                       
+                                       if (currentXPos < 0)
+                                               currentXPos = 0;
+                                       if (currentYPos < 0)
+                                               currentYPos = 0;
+                                       
+                                       Invalidate ();
+                                       Update ();
+                               }
+                       }
+                       
+                       private Color GetColorFromHSB ()
+                       {
+                               int hue = (int)((float)currentXPos * xstep);
+                               int sat = 240 - ((int)((float)currentYPos * ystep));
+                               int bri = TriangleControl.CurrentBrightness;
+                               
+                               return HSB.HSB2RGB (hue, sat, bri);
+                       }
+                       
+                       private void UpdateControls ()
+                       {
+                               Color tmpColor = GetColorFromHSB ();
+                               
+                               // update the brightness control
+                               colorDialog.brightnessControl.ShowColor ((int)((float)currentXPos * xstep), 240 - ((int)((float)currentYPos * ystep)));
+                               
+                               // update saturation text box
+                               int satvalue = (240 - ((int)((float)currentYPos * ystep)));
+                               colorDialog.satTextBox.Text = satvalue.ToString ();
+                               
+                               // update hue text box
+                               int huevalue = (int)((float)currentXPos * xstep);
+                               if (huevalue > 239)
+                                       huevalue = 239;
+                               colorDialog.hueTextBox.Text = huevalue.ToString ();
+                               
+                               // update the main selected color panel
+                               colorDialog.selectedColorPanel.BackColor = tmpColor;
+                               
+                               // and finally the rgb text boxes
+                               colorDialog.UpdateRGBTextBoxes (tmpColor);
+                       }
+               }
+               
+               
+               internal class BrightnessControl : Panel {
+                       internal class DrawingBitmap {
+                               private Bitmap bitmap;
+                               
+                               public DrawingBitmap ()
+                               {
+                                       bitmap = new Bitmap (14, 190);
+                               }
+                               
+                               public Bitmap Bitmap {
+                                       set {
+                                               bitmap = value;
+                                       }
+                                       
+                                       get {
+                                               return bitmap;
+                                       }
+                               }
+                               
+                               // only hue and saturation are needed.
+                               // color will be computed with an iteration
+                               public void Draw (int hue, int sat)
+                               {
+                                       float brisub = 241.0f / 190.0f;
+                                       float bri = 241.0f;
+                                       
+                                       for (int height = 0; height < 190; height++) {
+                                               for (int width = 0; width < 14; width++) {
+                                                       Color pixcolor = HSB.HSB2RGB (hue, sat, (int)bri);
+                                                       bitmap.SetPixel (width, height, pixcolor);
+                                               }
+                                               bri = bri - brisub;
+                                       }
+                               }
+                       }
+                       
+                       private const float step = 241.0f/189.0f;
+                       
+                       private DrawingBitmap bitmap;
+                       
+                       private ColorDialog colorDialog = null;
+                       
+                       public BrightnessControl (ColorDialog colorDialog)
+                       {
+                               this.colorDialog = colorDialog;
+                               
+                               bitmap = new DrawingBitmap ();
+                               
+                               SuspendLayout ();
+                               
+                               BorderStyle = BorderStyle.Fixed3D;
+                               Location = new Point (0, 0);
+                               Size = new Size (14, 190);
+                               TabIndex = 0;
+                               TabStop = false;
+                               Size = new Size (14, 190);
+                               
+                               ResumeLayout (false);
+                               
+                               SetStyle (ControlStyles.DoubleBuffer, true);
+                               SetStyle (ControlStyles.AllPaintingInWmPaint, true);
+                               SetStyle (ControlStyles.UserPaint, true);
+                       }
+                       
+                       
+                       protected override void OnPaint (PaintEventArgs e)
+                       {
+                               e.Graphics.DrawImage (bitmap.Bitmap, 0, 0);
+                               
+                               base.OnPaint (e);
+                       }
+                       
+                       protected override void OnMouseDown (MouseEventArgs e)
+                       {
+                               colorDialog.triangleControl.TrianglePosition = (int)((float)(189 - e.Y) * step);
+                               
+                               base.OnMouseDown (e);
+                       }
+                       
+                       // this one is for ColorMatrixControl
+                       public void ShowColor (int hue, int sat)
+                       {
+                               bitmap.Draw (hue, sat);
+                               Invalidate ();
+                               Update ();
+                       }
+                       
+                       // this one for the other controls
+                       public Color ColorToShow {
+                               set {
+                                       int hue, sat;
+                                       HSB.GetHueSaturation (value, out hue, out sat);
+                                       bitmap.Draw (hue, sat);
+                                       Invalidate ();
+                                       Update ();
+                               }
+                       }
+               }
+               
+               
+               internal class TriangleControl : Panel {
+                       private bool mouseButtonDown = false;
+                       
+                       private int currentTrianglePosition = 195;
+//                     private Rectangle clipRectangle;
+                       
+                       private const float briStep = 241.0f/186.0f;
+                       
+                       private static int currentBrightness = 0;
+                       
+                       private ColorDialog colorDialog;
+                       
+                       public TriangleControl (ColorDialog colorDialog)
+                       {
+                               this.colorDialog = colorDialog;
+                               
+                               SuspendLayout ();
+                               
+                               Size = new Size (16, 203);
+                               
+                               ResumeLayout (false);
+                               
+                               SetStyle (ControlStyles.DoubleBuffer, true);
+                               SetStyle (ControlStyles.AllPaintingInWmPaint, true);
+                               SetStyle (ControlStyles.UserPaint, true);
+                       }
+                       
+                       public static int CurrentBrightness {
+                               set {
+                                       currentBrightness = value;
+                               }
+                               
+                               get {
+                                       return currentBrightness;
+                               }
+                       }
+                       
+                       protected override void OnPaint (PaintEventArgs e)
+                       {
+                               Draw (e);
+                               
+                               base.OnPaint (e);
+                       }
+                       
+                       private void Draw (PaintEventArgs e)
+                       {
+                               e.Graphics.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (BackColor), new Rectangle (0, 0, 16, 203));
+                               
+                               Point[] trianglePoints = new Point [3]
+                               {
+                                       new Point (0, currentTrianglePosition),
+                                       new Point (8, currentTrianglePosition - 8),
+                                       new Point (8, currentTrianglePosition + 8)
+                               };
+                               
+                               e.Graphics.FillPolygon (ThemeEngine.Current.ResPool.GetSolidBrush (Color.Black), trianglePoints);
+                       }
+                       
+                       protected override void OnMouseDown (MouseEventArgs e)
+                       {
+                               if (e.Y > 195 || e.Y < 9) return; // helper until Cursor.Clip works
+                               
+                               mouseButtonDown = true;
+                               currentTrianglePosition = e.Y;
+                               
+                               // Cursor.Clip doesn't yet work in Managed.Windows.Forms
+//                             clipRectangle = Cursor.Clip;
+//                             Point p = Location;
+//                             p.Y += 8;
+//                             Size s = Size;
+//                             s.Width -= 5;
+//                             s.Height -= 16;
+//                             Cursor.Clip = new Rectangle( Parent.PointToScreen( p ), s );
+                               
+                               colorDialog.briTextBox.Text = TrianglePosition.ToString ();
+                               colorDialog.UpdateFromHSBTextBoxes ();
+                               
+                               Invalidate ();
+                               Update ();
+                               
+                               base.OnMouseDown (e);
+                       }
+                       
+                       protected override void OnMouseMove (MouseEventArgs e)
+                       {
+                               if (mouseButtonDown)
+                                       if (e.Y < 196 && e.Y > 8) {
+                                               currentTrianglePosition = e.Y;
+                                               
+                                               colorDialog.briTextBox.Text = TrianglePosition.ToString ();
+                                               colorDialog.UpdateFromHSBTextBoxes ();
+                                               
+                                               Invalidate ();
+                                               Update ();
+                                       }
+                               
+                               base.OnMouseMove (e);
+                       }
+                       
+                       protected override void OnMouseUp (MouseEventArgs e)
+                       {
+                               mouseButtonDown = false;
+//                             Cursor.Clip = clipRectangle;
+                               
+                               base.OnMouseUp (e);
+                       }
+                       
+                       public int TrianglePosition {
+                               get {
+                                       float tmp = (float)(currentTrianglePosition - 9);
+                                       tmp = tmp * briStep;
+                                       
+                                       int retval = 240 - (int)tmp;
+                                       
+                                       TriangleControl.CurrentBrightness = retval;
+                                       
+                                       return retval;
+                               }
+                               
+                               set {
+                                       float tmp = (float)value / briStep;
+                                       currentTrianglePosition = 186 - (int)tmp + 9;
+                                       
+                                       colorDialog.briTextBox.Text = TrianglePosition.ToString ();
+                                       
+                                       colorDialog.UpdateFromHSBTextBoxes ();
+                                       
+                                       Invalidate ();
+                                       Update ();
+                               }
+                       }
+                       
+                       public Color ColorToShow {
+                               set {
+                                       SetColor (value);
+                               }
+                       }
+                       
+                       public void SetColor (Color color)
+                       {
+                               int pos_raw = HSB.Brightness (color);
+                               
+                               float tmp = (float)pos_raw / briStep;
+                               currentTrianglePosition = 186 - (int)tmp + 9;
+                               
+                               if (colorDialog.edit_textbox == null)
+                                       colorDialog.briTextBox.Text = TrianglePosition.ToString ();
+                               
+                               Invalidate ();
+                       }
+               }
+               #endregion
        }
 }
+