diff --git a/DarkUI/Config/Colors.cs b/DarkUI/Config/Colors.cs index 0f55f88..6ebda15 100644 --- a/DarkUI/Config/Colors.cs +++ b/DarkUI/Config/Colors.cs @@ -44,6 +44,11 @@ namespace DarkUI.Config get { return Color.FromArgb(95, 101, 102); } } + public static Color LightestBackground + { + get { return Color.FromArgb(178, 178, 178); } + } + public static Color LightBorder { get { return Color.FromArgb(81, 81, 81); } diff --git a/DarkUI/Config/Consts.cs b/DarkUI/Config/Consts.cs index b0c7324..f234d2e 100644 --- a/DarkUI/Config/Consts.cs +++ b/DarkUI/Config/Consts.cs @@ -8,6 +8,8 @@ public static int ArrowButtonSize = 15; public static int MinimumThumbSize = 11; + public static int CheckBoxSize = 12; + public const int ToolWindowHeaderSize = 25; public const int DocumentTabAreaSize = 24; public const int ToolWindowTabAreaSize = 21; diff --git a/DarkUI/Controls/DarkButton.cs b/DarkUI/Controls/DarkButton.cs index e9e53c6..6f84d45 100644 --- a/DarkUI/Controls/DarkButton.cs +++ b/DarkUI/Controls/DarkButton.cs @@ -75,6 +75,13 @@ namespace DarkUI.Controls #region Code Property Region + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new bool AutoEllipsis + { + get { return false; } + } + [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public DarkControlState ButtonState @@ -82,13 +89,6 @@ namespace DarkUI.Controls get { return _buttonState; } } - [Browsable(false)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public new ContentAlignment TextAlign - { - get { return base.TextAlign; } - } - [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public new ContentAlignment ImageAlign @@ -96,13 +96,6 @@ namespace DarkUI.Controls get { return base.ImageAlign; } } - [Browsable(false)] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public new bool AutoEllipsis - { - get { return false; } - } - [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public new bool FlatAppearance @@ -117,6 +110,13 @@ namespace DarkUI.Controls get { return base.FlatStyle; } } + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new ContentAlignment TextAlign + { + get { return base.TextAlign; } + } + [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public new bool UseCompatibleTextRendering diff --git a/DarkUI/Controls/DarkCheckBox.cs b/DarkUI/Controls/DarkCheckBox.cs new file mode 100644 index 0000000..a133f81 --- /dev/null +++ b/DarkUI/Controls/DarkCheckBox.cs @@ -0,0 +1,346 @@ +using DarkUI.Config; +using DarkUI.Icons; +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace DarkUI.Controls +{ + public class DarkCheckBox : CheckBox + { + #region Field Region + + private DarkControlState _controlState = DarkControlState.Normal; + + private bool _spacePressed; + + #endregion + + #region Property Region + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new Appearance Appearance + { + get { return base.Appearance; } + } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new bool AutoEllipsis + { + get { return base.AutoEllipsis; } + } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new Image BackgroundImage + { + get { return base.BackgroundImage; } + } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new ImageLayout BackgroundImageLayout + { + get { return base.BackgroundImageLayout; } + } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new bool FlatAppearance + { + get { return false; } + } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new FlatStyle FlatStyle + { + get { return base.FlatStyle; } + } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new Image Image + { + get { return base.Image; } + } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new ContentAlignment ImageAlign + { + get { return base.ImageAlign; } + } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new int ImageIndex + { + get { return base.ImageIndex; } + } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new string ImageKey + { + get { return base.ImageKey; } + } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new ImageList ImageList + { + get { return base.ImageList; } + } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new ContentAlignment TextAlign + { + get { return base.TextAlign; } + } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new TextImageRelation TextImageRelation + { + get { return base.TextImageRelation; } + } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new bool ThreeState + { + get { return base.ThreeState; } + } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new bool UseCompatibleTextRendering + { + get { return false; } + } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new bool UseVisualStyleBackColor + { + get { return false; } + } + + #endregion + + #region Constructor Region + + public DarkCheckBox() + { + SetStyle(ControlStyles.SupportsTransparentBackColor | + ControlStyles.OptimizedDoubleBuffer | + ControlStyles.ResizeRedraw | + ControlStyles.UserPaint, true); + } + + #endregion + + #region Method Region + + private void SetControlState(DarkControlState controlState) + { + if (_controlState != controlState) + { + _controlState = controlState; + Invalidate(); + } + } + + #endregion + + #region Event Handler Region + + protected override void OnMouseMove(MouseEventArgs e) + { + base.OnMouseMove(e); + + if (_spacePressed) + return; + + if (e.Button == MouseButtons.Left) + { + if (ClientRectangle.Contains(e.Location)) + SetControlState(DarkControlState.Pressed); + else + SetControlState(DarkControlState.Hover); + } + else + { + SetControlState(DarkControlState.Hover); + } + } + + protected override void OnMouseDown(MouseEventArgs e) + { + base.OnMouseDown(e); + + if (!ClientRectangle.Contains(e.Location)) + return; + + SetControlState(DarkControlState.Pressed); + } + + protected override void OnMouseUp(MouseEventArgs e) + { + base.OnMouseUp(e); + + if (_spacePressed) + return; + + SetControlState(DarkControlState.Normal); + } + + protected override void OnMouseLeave(EventArgs e) + { + base.OnMouseLeave(e); + + if (_spacePressed) + return; + + SetControlState(DarkControlState.Normal); + } + + protected override void OnMouseCaptureChanged(EventArgs e) + { + base.OnMouseCaptureChanged(e); + + if (_spacePressed) + return; + + var location = Cursor.Position; + + if (!ClientRectangle.Contains(location)) + SetControlState(DarkControlState.Normal); + } + + protected override void OnGotFocus(EventArgs e) + { + base.OnGotFocus(e); + + Invalidate(); + } + + protected override void OnLostFocus(EventArgs e) + { + base.OnLostFocus(e); + + _spacePressed = false; + + var location = Cursor.Position; + + if (!ClientRectangle.Contains(location)) + SetControlState(DarkControlState.Normal); + else + SetControlState(DarkControlState.Hover); + } + + protected override void OnKeyDown(KeyEventArgs e) + { + base.OnKeyDown(e); + + if (e.KeyCode == Keys.Space) + { + _spacePressed = true; + SetControlState(DarkControlState.Pressed); + } + } + + protected override void OnKeyUp(KeyEventArgs e) + { + base.OnKeyUp(e); + + if (e.KeyCode == Keys.Space) + { + _spacePressed = false; + + var location = Cursor.Position; + + if (!ClientRectangle.Contains(location)) + SetControlState(DarkControlState.Normal); + else + SetControlState(DarkControlState.Hover); + } + } + + #endregion + + #region Paint Region + + protected override void OnPaint(PaintEventArgs e) + { + var g = e.Graphics; + var rect = new Rectangle(0, 0, ClientSize.Width, ClientSize.Height); + + var size = Consts.CheckBoxSize; + + var textColor = Colors.LightText; + var borderColor = Colors.LightText; + var fillColor = Colors.LightestBackground; + + if (Enabled) + { + if (Focused) + { + textColor = Colors.BlueHighlight; + borderColor = Colors.BlueHighlight; + fillColor = Colors.BlueSelection; + } + + if (_controlState == DarkControlState.Hover) + { + borderColor = Colors.BlueHighlight; + fillColor = Colors.BlueSelection; + } + else if (_controlState == DarkControlState.Pressed) + { + borderColor = Colors.GreyHighlight; + fillColor = Colors.GreySelection; + } + } + else + { + textColor = Colors.DisabledText; + borderColor = Colors.GreyHighlight; + fillColor = Colors.GreySelection; + } + + using (var b = new SolidBrush(Colors.GreyBackground)) + { + g.FillRectangle(b, rect); + } + + using (var p = new Pen(borderColor)) + { + var boxRect = new Rectangle(0, (rect.Height / 2) - (size / 2), size, size); + g.DrawRectangle(p, boxRect); + } + + if (Checked) + { + using (var b = new SolidBrush(fillColor)) + { + Rectangle boxRect = new Rectangle(2, (rect.Height / 2) - ((size - 4) / 2), size - 3, size - 3); + g.FillRectangle(b, boxRect); + } + } + + using (var b = new SolidBrush(textColor)) + { + var modRect = new Rectangle(size + 5, 0, rect.Width - (size + 5), rect.Height); + g.DrawString(Text, Font, b, modRect); + } + } + + #endregion + } +} diff --git a/DarkUI/DarkUI.csproj b/DarkUI/DarkUI.csproj index f02f8c3..1acab31 100644 --- a/DarkUI/DarkUI.csproj +++ b/DarkUI/DarkUI.csproj @@ -43,6 +43,9 @@ + + Component + Component diff --git a/DarkUI/Docking/DarkDockPanel.cs b/DarkUI/Docking/DarkDockPanel.cs index 5961f0b..92c74e4 100644 --- a/DarkUI/Docking/DarkDockPanel.cs +++ b/DarkUI/Docking/DarkDockPanel.cs @@ -113,7 +113,7 @@ namespace DarkUI.Docking if (_contents.Contains(dockContent)) return; - if (dockContent.DockArea != dockGroup.DockArea) + if (dockGroup != null && dockContent.DockArea != dockGroup.DockArea) throw new Exception($"Attempting to add '{dockContent.DockArea}' content to '{dockGroup.DockArea}' group."); dockContent.DockPanel = this; diff --git a/Example/Example.csproj b/Example/Example.csproj index 8cf6514..965f6b2 100644 --- a/Example/Example.csproj +++ b/Example/Example.csproj @@ -47,11 +47,11 @@ DialogAbout.cs - + Form - - DialogTest.cs + + DialogControls.cs UserControl @@ -105,8 +105,8 @@ DialogAbout.cs - - DialogTest.cs + + DialogControls.cs DockDocument.cs @@ -195,6 +195,9 @@ + + +