// 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
}
}
+