Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'mcs/class/Managed.Windows.Forms/System.Windows.Forms/ColorDialog.cs')
-rw-r--r--mcs/class/Managed.Windows.Forms/System.Windows.Forms/ColorDialog.cs1856
1 files changed, 1856 insertions, 0 deletions
diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ColorDialog.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ColorDialog.cs
new file mode 100644
index 00000000000..e2bcd2c4f92
--- /dev/null
+++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ColorDialog.cs
@@ -0,0 +1,1856 @@
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// 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
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// 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-2006 Novell, Inc. (http://www.novell.com)
+//
+// Authors:
+// Alexander Olk xenomorph2@onlinehome.de
+//
+
+// 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 = Color.Black;
+ 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.Size = new Size (221, 332); // 300
+
+ 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.TextAlign = HorizontalAlignment.Right;
+ hueTextBox.MaxLength = 3;
+ // satTextBox
+ satTextBox.Location = new Point (324, 225);
+ satTextBox.Size = new Size (27, 21);
+ satTextBox.TabIndex = 15;
+ satTextBox.TextAlign = HorizontalAlignment.Right;
+ satTextBox.MaxLength = 3;
+ // greenTextBox
+ greenTextBox.Location = new Point (404, 225);
+ greenTextBox.Size = new Size (27, 21);
+ greenTextBox.TabIndex = 18;
+ greenTextBox.TextAlign = HorizontalAlignment.Right;
+ greenTextBox.MaxLength = 3;
+ // briTextBox
+ briTextBox.Location = new Point (324, 247);
+ briTextBox.Size = new Size (27, 21);
+ briTextBox.TabIndex = 16;
+ briTextBox.TextAlign = HorizontalAlignment.Right;
+ briTextBox.MaxLength = 3;
+ // blueTextBox
+ blueTextBox.Location = new Point (404, 247);
+ blueTextBox.Size = new Size (27, 21);
+ blueTextBox.TabIndex = 19;
+ blueTextBox.TextAlign = HorizontalAlignment.Right;
+ blueTextBox.MaxLength = 3;
+ // redTextBox
+ redTextBox.Location = new Point (404, 203);
+ redTextBox.Size = new Size (27, 21);
+ redTextBox.TabIndex = 17;
+ redTextBox.TextAlign = HorizontalAlignment.Right;
+ 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;
+ defineColoursButton.Text = Locale.GetText ("Define Colours >>");
+ // 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;
+ addColoursButton.Text = Locale.GetText ("Add Colours");
+
+ // 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);
+
+ brightnessControl.ColorToShow = selectedColorPanel.BackColor;
+
+ redTextBox.Text = selectedColorPanel.BackColor.R.ToString ();
+ greenTextBox.Text = selectedColorPanel.BackColor.G.ToString ();
+ blueTextBox.Text = selectedColorPanel.BackColor.B.ToString ();
+
+ HSB hsb = HSB.RGB2HSB (selectedColorPanel.BackColor);
+ hueTextBox.Text = hsb.hue.ToString ();
+ satTextBox.Text = hsb.sat.ToString ();
+ briTextBox.Text = hsb.bri.ToString ();
+
+ if (!allowFullOpen)
+ defineColoursButton.Enabled = false;
+
+ if (fullOpen)
+ DoButtonDefineColours ();
+
+ defineColoursButton.Click += new EventHandler (OnClickButtonDefineColours);
+ addColoursButton.Click += new EventHandler (OnClickButtonAddColours);
+ if (showHelp)
+ 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);
+ }
+ #endregion // Public Constructors
+
+ #region Public Instance Properties
+ public Color Color {
+ get {
+ return color;
+ }
+
+ set {
+ color = value;
+ }
+ }
+
+ [DefaultValue(true)]
+ public virtual bool AllowFullOpen {
+ get {
+ return allowFullOpen;
+ }
+
+ set {
+ allowFullOpen = value;
+ }
+ }
+
+ // 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 {
+ return fullOpen;
+ }
+
+ set {
+ fullOpen = value;
+ }
+ }
+
+ [Browsable(false)]
+ [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
+ public int[] CustomColors {
+ get {
+ return customColors;
+ }
+
+ set {
+ customColors = value;
+ }
+ }
+
+ [DefaultValue(false)]
+ public virtual bool ShowHelp {
+ get {
+ return showHelp;
+ }
+
+ set {
+ 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 Public Instance Methods
+ 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
+ protected override bool RunDialog (IntPtr hwndOwner)
+ {
+ // currently needed, otherwise there are a lot of drawing artefacts/transparent controls if the same dialog gets opened again
+ form.Refresh ();
+
+ if (customColors != null)
+ baseColorControl.SetCustomColors ();
+
+ return true;
+ }
+ #endregion // Protected Instance Methods
+
+ #region Private Methods
+ void OnClickCancelButton (object sender, EventArgs e)
+ {
+ form.DialogResult = DialogResult.Cancel;
+ }
+
+ void OnClickOkButton (object sender, EventArgs e)
+ {
+ form.DialogResult = DialogResult.OK;
+ }
+
+ void OnClickButtonDefineColours (object sender, EventArgs e)
+ {
+ DoButtonDefineColours ();
+ }
+
+ void DoButtonDefineColours ()
+ {
+ defineColoursButton.Enabled = false;
+
+ fullOpen = true;
+
+ colorMatrixControl.ColorToShow = baseColorControl.ColorToShow;
+
+ form.ClientSize = new Size (448, 332);
+ }
+
+ void OnClickButtonAddColours (object sender, EventArgs e)
+ {
+ baseColorControl.SetUserColor (selectedColorPanel.BackColor);
+ }
+
+ // FIXME: Is this correct ?
+ void OnClickHelpButton (object sender, EventArgs e)
+ {
+ OnHelpRequest (e);
+ }
+
+ // not working 100 %, S.W.F.TextBox isn't finished yet
+ void OnKeyPressTextBoxes (object sender, KeyPressEventArgs e)
+ {
+ // accept only '0', '1', ... , '9'
+ // 48 = '0', 57 = '9'
+ if (e.KeyChar < (char)48 || e.KeyChar > (char)57)
+ e.Handled = true;
+
+ TextChangedTextBoxes (sender);
+ }
+
+ // not working 100 %, S.W.F.TextBox isn't finished yet
+ void TextChangedTextBoxes (object sender)
+ {
+ if (((TextBox)sender).Text.Length == 0)
+ return;
+
+ int val;
+
+ if (sender == hueTextBox) {
+ val = System.Convert.ToInt32 (hueTextBox.Text);
+
+ if (val > 240) {
+ val = 240;
+ hueTextBox.Text = val.ToString ();
+ } else
+ if (val < 0) {
+ val = 0;
+ hueTextBox.Text = val.ToString ();
+ }
+
+ UpdateFromHSBTextBoxes ();
+
+ UpdateControls (selectedColorPanel.BackColor);
+ } else
+ if (sender == satTextBox) {
+ val = System.Convert.ToInt32 (satTextBox.Text);
+
+ if (val > 239) {
+ val = 239;
+ satTextBox.Text = val.ToString ();
+ } else
+ if (val < 0) {
+ val = 0;
+ satTextBox.Text = val.ToString ();
+ }
+
+ UpdateFromHSBTextBoxes ();
+
+ UpdateControls (selectedColorPanel.BackColor);
+ } else
+ if (sender == briTextBox) {
+ val = System.Convert.ToInt32 (briTextBox.Text);
+
+ if (val > 239) {
+ val = 239;
+ briTextBox.Text = val.ToString ();
+ } else
+ if (val < 0) {
+ val = 0;
+ briTextBox.Text = val.ToString ();
+ }
+
+ UpdateFromHSBTextBoxes ();
+
+ UpdateControls (selectedColorPanel.BackColor);
+ } else
+ if (sender == redTextBox) {
+ val = System.Convert.ToInt32 (redTextBox.Text);
+
+ if (val > 255) {
+ val = 255;
+ redTextBox.Text = val.ToString ();
+ } else
+ if (val < 0) {
+ val = 0;
+ redTextBox.Text = val.ToString ();
+ }
+
+ UpdateFromRGBTextBoxes ();
+ } else
+ if (sender == greenTextBox) {
+ val = System.Convert.ToInt32 (greenTextBox.Text);
+
+ if (val > 255) {
+ val = 255;
+ greenTextBox.Text = val.ToString ();
+ } else
+ if (val < 0) {
+ val = 0;
+ greenTextBox.Text = val.ToString ();
+ }
+
+ UpdateFromRGBTextBoxes ();
+ } else
+ if (sender == blueTextBox) {
+ val = System.Convert.ToInt32 (blueTextBox.Text);
+
+ if (val > 255) {
+ val = 255;
+ blueTextBox.Text = val.ToString ();
+ } else
+ if (val < 0) {
+ val = 0;
+ blueTextBox.Text = val.ToString ();
+ }
+
+ UpdateFromRGBTextBoxes ();
+ }
+ }
+
+ private void UpdateControls (Color acolor)
+ {
+ color = acolor;
+ selectedColorPanel.BackColor = acolor;
+ colorMatrixControl.ColorToShow = acolor;
+ brightnessControl.ColorToShow = acolor;
+ triangleControl.ColorToShow = acolor;
+ }
+
+ private void UpdateRGBTextBoxes (Color color)
+ {
+ redTextBox.Text = color.R.ToString ();
+ greenTextBox.Text = color.G.ToString ();
+ blueTextBox.Text = color.B.ToString ();
+ }
+
+ private void UpdateHSBTextBoxes (Color color)
+ {
+ HSB hsb = HSB.RGB2HSB (color);
+
+ hueTextBox.Text = hsb.hue.ToString ();
+ satTextBox.Text = hsb.sat.ToString ();
+ briTextBox.Text = hsb.bri.ToString ();
+ }
+
+ private 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);
+ }
+
+ private 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);
+
+ UpdateFromHSBTextBoxes ();
+
+ UpdateControls (col);
+ }
+ #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) * 241);
+ hsb.sat = (int)(color.GetSaturation () * 241);
+ hsb.bri = (int)(color.GetBrightness () * 240);
+
+ if (hsb.hue > 240) hsb.hue = 240;
+ if (hsb.sat > 240) hsb.sat = 240;
+ if (hsb.bri > 239) hsb.bri = 239;
+
+ return hsb;
+ }
+
+ // not using ControlPaint HBS2Color, this algo is more precise
+ public static Color HSB2RGB (int hue, int saturation, int brightness)
+ {
+ if (hue > 240)
+ hue = 240;
+ else
+ if (hue < 0)
+ hue = 0;
+
+ if (saturation > 240)
+ saturation = 240;
+ else
+ if (saturation < 0)
+ saturation = 0;
+
+ if (brightness > 239)
+ brightness = 239;
+ else
+ if (brightness < 0)
+ brightness = 0;
+
+ float H = hue / 240.0f;
+ float S = saturation / 240.0f;
+ float L = brightness / 239.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 () * 240);
+ }
+
+ public static void GetHueSaturation (Color color, out int hue, out int sat)
+ {
+ hue = (int)((color.GetHue () / 360.0f) * 241);
+ 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 color;
+
+ private bool isSelected = false;
+
+ public SmallColorControl (Color color)
+ {
+ SuspendLayout ();
+
+ this.color = 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 Color {
+ set {
+ color = value;
+ Invalidate ();
+ }
+
+ get {
+ return color;
+ }
+ }
+
+ protected override void OnPaint (PaintEventArgs pe)
+ {
+ base.OnPaint (pe);
+
+ pe.Graphics.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (BackColor), 0, 0, 26, 23);
+
+ pe.Graphics.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (color),
+ new Rectangle (4, 4, 17, 15));
+
+ DrawBorder (pe.Graphics, new Rectangle (4, 4, 17, 15));
+
+ 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 void DrawBorder (Graphics dc, Rectangle rect)
+ {
+ Pen pen = ThemeEngine.Current.ResPool.GetPen (Color.Black);
+ dc.DrawLine (pen, rect.X, rect.Y, rect.X, rect.Bottom - 1);
+ dc.DrawLine (pen, rect.X + 1, rect.Y, rect.Right - 1, rect.Y);
+ }
+ }
+
+ private SmallColorControl[] smallColorControl;
+
+ private SmallColorControl[] userSmallColorControl;
+
+ private Label userColorLabel;
+ private Label baseColorLabel;
+
+ private SmallColorControl selectedSmallColorControl;
+
+ private int currentlyUsedUserSmallColorControl = 0;
+ private int[] customColors = null;
+
+ 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)(138))));
+ 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 Colours") + ":";
+ // 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);
+
+ selectedSmallColorControl = smallColorControl [46]; // default, Black
+ selectedSmallColorControl.IsSelected = true;
+
+ CheckIfColorIsInPanel ();
+ }
+
+ private void CheckIfColorIsInPanel ()
+ {
+ if (colorDialog.Color != Color.Black) {
+ // check if we have a panel with a BackColor = ColorDialog.Color...
+ for (int i = 0; i < smallColorControl.Length; i++) {
+ if (smallColorControl [i].BackColor == colorDialog.Color) {
+ selectedSmallColorControl = smallColorControl [i];
+ 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.Color);
+
+ colorDialog.UpdateControls (selectedSmallColorControl.Color);
+ colorDialog.UpdateRGBTextBoxes (selectedSmallColorControl.Color);
+ colorDialog.UpdateHSBTextBoxes (selectedSmallColorControl.Color);
+ }
+
+ public Color ColorToShow {
+ get {
+ return selectedSmallColorControl.Color;
+ }
+ }
+
+ public void SetUserColor (Color col)
+ {
+ userSmallColorControl [currentlyUsedUserSmallColorControl].Color = col;
+
+ // check if this.customColors already exists
+ if (customColors == null) {
+ customColors = new int [16];
+ int white = Color.White.ToArgb ();
+
+ for (int i = 0; i < customColors.Length; i++)
+ customColors [i] = white;
+ }
+
+ customColors [currentlyUsedUserSmallColorControl] = col.ToArgb ();
+
+ // update ColorDialog dialog property
+ colorDialog.CustomColors = customColors;
+
+ currentlyUsedUserSmallColorControl++;
+ if (currentlyUsedUserSmallColorControl > 15)
+ currentlyUsedUserSmallColorControl = 0;
+ }
+
+ public void SetCustomColors ()
+ {
+ int[] customColors = colorDialog.CustomColors;
+
+ for (int i = 0; i < customColors.Length; i++) {
+ userSmallColorControl [i].Color = Color.FromArgb (customColors [i]);
+ }
+ }
+ }
+
+ internal class ColorMatrixControl : Panel {
+ internal class DrawingBitmap {
+ private Bitmap bitmap;
+
+ public DrawingBitmap ()
+ {
+ bitmap = new Bitmap (180, 191);
+
+ float hueadd = 241.0f / 178.0f;
+ float satsub = 241.0f / 189.0f;
+ float satpos = 240.0f;
+
+ // paint the matrix to the bitmap
+ for (int height = 0; height < 191; height++) {
+ float huepos = 0.0f;
+
+ for (int width = 0; width < 180; 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 = new DrawingBitmap( );
+
+ private CrossCursor crossCursor = new CrossCursor();
+
+ private bool mouseButtonDown = false;
+
+ private bool drawCross = true;
+
+ private Color color;
+
+ private int currentXPos;
+ private int currentYPos;
+
+ private const float xstep = 240.0f/178.0f;
+ private const float ystep = 240.0f/189.0f;
+
+ 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;
+ //BackColor = SystemColors.Control;
+ Size = new Size (179, 190);
+
+ ResumeLayout (false);
+
+ SetStyle (ControlStyles.DoubleBuffer, true);
+ SetStyle (ControlStyles.AllPaintingInWmPaint, true);
+ SetStyle (ControlStyles.UserPaint, true);
+ }
+
+ protected override void OnPaint (PaintEventArgs e)
+ {
+ Draw (e);
+
+ base.OnPaint (e);
+ }
+
+ private void Draw (PaintEventArgs e)
+ {
+ e.Graphics.DrawImage (drawingBitmap.Bitmap, 0, 0);
+
+ // 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 ();
+
+ base.OnMouseDown (e);
+ }
+
+ protected override void OnMouseMove (MouseEventArgs e)
+ {
+ if (mouseButtonDown)
+ if ((e.X < 178 && e.X >= 0) && (e.Y < 189 && e.Y >= 0)) {
+ currentXPos = e.X;
+ currentYPos = e.Y;
+ UpdateControls ();
+ }
+
+ base.OnMouseMove (e);
+ }
+
+ protected override void OnMouseUp (MouseEventArgs e)
+ {
+ mouseButtonDown = false;
+ drawCross = true;
+ Invalidate ();
+ Update ();
+ }
+
+ public Color ColorToShow {
+ set {
+ color = value;
+
+ HSB hsb = HSB.RGB2HSB (color);
+
+ currentXPos = (int)((float)hsb.hue / xstep);
+ currentYPos = 189 - (int)((float)hsb.sat / ystep);
+
+ if (currentXPos < 0)
+ currentXPos = 0;
+ if (currentYPos < 0)
+ currentYPos = 0;
+
+ Invalidate ();
+ Update ();
+
+ UpdateControls ();
+ }
+ }
+
+ 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)));
+ satvalue = satvalue == 240 ? 239 : satvalue;
+ colorDialog.satTextBox.Text = satvalue.ToString ();
+
+ // update hue text box
+ colorDialog.hueTextBox.Text = ((int)((float)currentXPos * xstep)).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 = 240.0f / 190.0f;
+ float bri = 240.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 = 240.0f/189.0f;
+
+ private DrawingBitmap bitmap;
+
+ private Color color;
+
+ private ColorDialog colorDialog;
+
+ public BrightnessControl (ColorDialog colorDialogPanel)
+ {
+ this.colorDialog = colorDialogPanel;
+
+ 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 = 239.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 = 239 - (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 {
+ TrianglePosition = HSB.Brightness (value);
+ }
+ }
+ }
+ #endregion
+ }
+}
+