diff options
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.cs | 1856 |
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 + } +} + |