#region Imports using System; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; using static DPumpHydr.WinFrmUI.RLT.Helper.CrownHelper; #endregion namespace DPumpHydr.WinFrmUI.RLT.Docking.Crown { #region CrownToolWindowDocking [ToolboxItem(false)] public class CrownToolWindow : CrownDockContent { #region Field Region private Rectangle _closeButtonRect; private bool _closeButtonHot = false; private bool _closeButtonPressed = false; private Rectangle _headerRect; private bool _shouldDrag; #endregion #region Property Region [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public new Padding Padding => base.Padding; #endregion #region Constructor Region public CrownToolWindow() { SetStyle ( ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.UserPaint, true ); //BackColor = ThemeProvider.Theme.Colors.GreyBackground; base.Padding = new Padding(0, ThemeProvider.Theme.Sizes.ToolWindowHeaderSize, 0, 0); UpdateCloseButton(); } #endregion #region Method Region private bool IsActive() { if (DockPanel == null) { return false; } return DockPanel.ActiveContent == this; } private void UpdateCloseButton() { _headerRect = new Rectangle { X = ClientRectangle.Left, Y = ClientRectangle.Top, Width = ClientRectangle.Width, Height = ThemeProvider.Theme.Sizes.ToolWindowHeaderSize }; _closeButtonRect = new Rectangle { X = ClientRectangle.Right - Properties.Resources.tw_close.Width - 5 - 3, Y = ClientRectangle.Top + (ThemeProvider.Theme.Sizes.ToolWindowHeaderSize / 2) - (Properties.Resources.tw_close.Height / 2), Width = Properties.Resources.tw_close.Width, Height = Properties.Resources.tw_close.Height }; } #endregion #region Event Handler Region protected override void OnResize(EventArgs e) { base.OnResize(e); UpdateCloseButton(); } protected override void OnMouseMove(MouseEventArgs e) { base.OnMouseMove(e); if (_closeButtonRect.Contains(e.Location) || _closeButtonPressed) { if (!_closeButtonHot) { _closeButtonHot = true; Invalidate(); } } else { if (_closeButtonHot) { _closeButtonHot = false; Invalidate(); } if (_shouldDrag) { DockPanel.DragContent(this); return; } } } protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); if (_closeButtonRect.Contains(e.Location)) { _closeButtonPressed = true; _closeButtonHot = true; Invalidate(); return; } if (_headerRect.Contains(e.Location)) { _shouldDrag = true; return; } } protected override void OnMouseUp(MouseEventArgs e) { base.OnMouseUp(e); if (_closeButtonRect.Contains(e.Location) && _closeButtonPressed) { Close(); } _closeButtonPressed = false; _closeButtonHot = false; _shouldDrag = false; Invalidate(); } #endregion #region Paint Region protected override void OnPaint(PaintEventArgs e) { // if (_isDispCloseIcon) { Graphics g = e.Graphics; // Fill body using (SolidBrush b = new(ThemeProvider.Theme.Colors.GreyBackground)) { g.FillRectangle(b, ClientRectangle); } bool isActive = IsActive(); // Draw header Color bgColor = isActive ? ThemeProvider.Theme.Colors.BlueBackground : ThemeProvider.Theme.Colors.HeaderBackground; Color darkColor = isActive ? ThemeProvider.Theme.Colors.DarkBlueBorder : ThemeProvider.Theme.Colors.DarkBorder; Color lightColor = isActive ? ThemeProvider.Theme.Colors.LightBlueBorder : ThemeProvider.Theme.Colors.LightBorder; using (SolidBrush b = new(bgColor)) { Rectangle bgRect = new(0, 0, ClientRectangle.Width, ThemeProvider.Theme.Sizes.ToolWindowHeaderSize); g.FillRectangle(b, bgRect); } using (Pen p = new(darkColor)) { g.DrawLine(p, ClientRectangle.Left, 0, ClientRectangle.Right, 0); g.DrawLine(p, ClientRectangle.Left, ThemeProvider.Theme.Sizes.ToolWindowHeaderSize - 1, ClientRectangle.Right, ThemeProvider.Theme.Sizes.ToolWindowHeaderSize - 1); } using (Pen p = new(lightColor)) { g.DrawLine(p, ClientRectangle.Left, 1, ClientRectangle.Right, 1); } int xOffset = 2; // Draw icon if (Icon != null) { g.DrawImageUnscaled(Icon, ClientRectangle.Left + 5, ClientRectangle.Top + (ThemeProvider.Theme.Sizes.ToolWindowHeaderSize / 2) - (Icon.Height / 2) + 1); xOffset = Icon.Width + 8; } // Draw text using (SolidBrush b = new(ThemeProvider.Theme.Colors.LightText)) { Rectangle textRect = new(xOffset, 0, ClientRectangle.Width - 4 - xOffset, ThemeProvider.Theme.Sizes.ToolWindowHeaderSize); StringFormat format = new() { Alignment = StringAlignment.Near, LineAlignment = StringAlignment.Center, FormatFlags = StringFormatFlags.NoWrap, Trimming = StringTrimming.EllipsisCharacter }; g.DrawString(DockText, Font, b, textRect, format); } // Close button Bitmap img = _closeButtonHot ? Properties.Resources.tw_close_selected : Properties.Resources.tw_close; if (isActive) { img = _closeButtonHot ? Properties.Resources.tw_active_close_selected : Properties.Resources.tw_active_close; } g.DrawImageUnscaled(img, _closeButtonRect.Left, _closeButtonRect.Top); } } protected bool _isDispCloseIcon = true; //public bool IsDispCloseIcon //{ // get { return _isDispCloseIcon; } // set { _isDispCloseIcon = value; } //} protected override void OnPaintBackground(PaintEventArgs e) { // Absorb event } #endregion } #endregion }