RaUI/Source/ryControls/WeifenLuo.WinFormsUI/ThemeVS2013/VS2013DockPaneCaption.cs
zilinsoft 3262955f2f ### 2023-11-07更新
------
#### RaUIV4    V4.0.2311.0701
- *.[全新]整合了MyDb、ryControls、MyDb_MySQL等dll文件到RaUI一个项目。
- *.[新增]新增ApkOp类,可以轻松获取APK信息。
- *.[新增]新增JsonExt扩展类,让Json操作更简单。
- *.[新增]新增WebP类,可以支持webp格式的图片。
- *.[改进]ryQuickSQL中的AddField方法改为自动替换已存在的同名值。
- *.[修复]ryQuickSQL中的AddFieldCalc方法无法正常计算的BUG。
2023-11-07 16:37:53 +08:00

365 lines
13 KiB
C#

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using System.ComponentModel;
namespace WeifenLuo.WinFormsUI.Docking
{
using ThemeVS2012;
internal class VS2013DockPaneCaption : DockPaneCaptionBase
{
#region consts
private const int TextGapTop = 3;
private const int TextGapBottom = 2;
private const int TextGapLeft = 2;
private const int TextGapRight = 3;
private const int ButtonGapTop = 4;
private const int ButtonGapBottom = 3;
private const int ButtonGapBetween = 1;
private const int ButtonGapLeft = 1;
private const int ButtonGapRight = 5;
#endregion
private InertButtonBase m_buttonClose;
private InertButtonBase ButtonClose
{
get
{
if (m_buttonClose == null)
{
m_buttonClose = new VS2012DockPaneCaptionInertButton(this,
DockPane.DockPanel.Theme.ImageService.DockPaneHover_Close,
DockPane.DockPanel.Theme.ImageService.DockPane_Close,
DockPane.DockPanel.Theme.ImageService.DockPanePress_Close,
DockPane.DockPanel.Theme.ImageService.DockPaneActiveHover_Close,
DockPane.DockPanel.Theme.ImageService.DockPaneActive_Close);
m_toolTip.SetToolTip(m_buttonClose, ToolTipClose);
m_buttonClose.Click += new EventHandler(Close_Click);
Controls.Add(m_buttonClose);
}
return m_buttonClose;
}
}
private InertButtonBase m_buttonAutoHide;
private InertButtonBase ButtonAutoHide
{
get
{
if (m_buttonAutoHide == null)
{
m_buttonAutoHide = new VS2012DockPaneCaptionInertButton(this,
DockPane.DockPanel.Theme.ImageService.DockPaneHover_Dock,
DockPane.DockPanel.Theme.ImageService.DockPane_Dock,
DockPane.DockPanel.Theme.ImageService.DockPanePress_Dock,
DockPane.DockPanel.Theme.ImageService.DockPaneActiveHover_Dock,
DockPane.DockPanel.Theme.ImageService.DockPaneActive_Dock,
DockPane.DockPanel.Theme.ImageService.DockPaneActiveHover_AutoHide,
DockPane.DockPanel.Theme.ImageService.DockPaneActive_AutoHide,
DockPane.DockPanel.Theme.ImageService.DockPanePress_AutoHide);
m_toolTip.SetToolTip(m_buttonAutoHide, ToolTipAutoHide);
m_buttonAutoHide.Click += new EventHandler(AutoHide_Click);
Controls.Add(m_buttonAutoHide);
}
return m_buttonAutoHide;
}
}
private InertButtonBase m_buttonOptions;
private InertButtonBase ButtonOptions
{
get
{
if (m_buttonOptions == null)
{
m_buttonOptions = new VS2012DockPaneCaptionInertButton(this,
DockPane.DockPanel.Theme.ImageService.DockPaneHover_Option,
DockPane.DockPanel.Theme.ImageService.DockPane_Option,
DockPane.DockPanel.Theme.ImageService.DockPanePress_Option,
DockPane.DockPanel.Theme.ImageService.DockPaneActiveHover_Option,
DockPane.DockPanel.Theme.ImageService.DockPaneActive_Option);
m_toolTip.SetToolTip(m_buttonOptions, ToolTipOptions);
m_buttonOptions.Click += new EventHandler(Options_Click);
Controls.Add(m_buttonOptions);
}
return m_buttonOptions;
}
}
private IContainer m_components;
private IContainer Components
{
get { return m_components; }
}
private ToolTip m_toolTip;
public VS2013DockPaneCaption(DockPane pane) : base(pane)
{
SuspendLayout();
m_components = new Container();
m_toolTip = new ToolTip(Components);
ResumeLayout();
}
protected override void Dispose(bool disposing)
{
if (disposing)
Components.Dispose();
base.Dispose(disposing);
}
public Font TextFont
{
get { return DockPane.DockPanel.Theme.Skin.DockPaneStripSkin.TextFont; }
}
private static string _toolTipClose;
private static string ToolTipClose
{
get
{
if (_toolTipClose == null)
_toolTipClose = Strings.DockPaneCaption_ToolTipClose;
return _toolTipClose;
}
}
private static string _toolTipOptions;
private static string ToolTipOptions
{
get
{
if (_toolTipOptions == null)
_toolTipOptions = Strings.DockPaneCaption_ToolTipOptions;
return _toolTipOptions;
}
}
private static string _toolTipAutoHide;
private static string ToolTipAutoHide
{
get
{
if (_toolTipAutoHide == null)
_toolTipAutoHide = Strings.DockPaneCaption_ToolTipAutoHide;
return _toolTipAutoHide;
}
}
private Color TextColor
{
get
{
if (DockPane.IsActivePane)
return DockPane.DockPanel.Theme.ColorPalette.ToolWindowCaptionActive.Text;
else
return DockPane.DockPanel.Theme.ColorPalette.ToolWindowCaptionInactive.Text;
}
}
private static TextFormatFlags _textFormat =
TextFormatFlags.SingleLine |
TextFormatFlags.EndEllipsis |
TextFormatFlags.VerticalCenter;
private TextFormatFlags TextFormat
{
get
{
if (RightToLeft == RightToLeft.No)
return _textFormat;
else
return _textFormat | TextFormatFlags.RightToLeft | TextFormatFlags.Right;
}
}
protected internal override int MeasureHeight()
{
int height = TextFont.Height + TextGapTop + TextGapBottom;
if (height < ButtonClose.Image.Height + ButtonGapTop + ButtonGapBottom)
height = ButtonClose.Image.Height + ButtonGapTop + ButtonGapBottom;
return height;
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint (e);
DrawCaption(e.Graphics);
}
private void DrawCaption(Graphics g)
{
if (ClientRectangle.Width == 0 || ClientRectangle.Height == 0)
return;
Rectangle rect = ClientRectangle;
var border = DockPane.DockPanel.Theme.ColorPalette.ToolWindowBorder;
ToolWindowCaptionPalette palette;
if (DockPane.IsActivePane)
{
palette = DockPane.DockPanel.Theme.ColorPalette.ToolWindowCaptionActive;
}
else
{
palette = DockPane.DockPanel.Theme.ColorPalette.ToolWindowCaptionInactive;
}
SolidBrush captionBrush = DockPane.DockPanel.Theme.PaintingService.GetBrush(palette.Background);
g.FillRectangle(captionBrush, rect);
g.DrawLine(DockPane.DockPanel.Theme.PaintingService.GetPen(border), rect.Left, rect.Top,
rect.Left, rect.Bottom);
g.DrawLine(DockPane.DockPanel.Theme.PaintingService.GetPen(border), rect.Left, rect.Top,
rect.Right, rect.Top);
g.DrawLine(DockPane.DockPanel.Theme.PaintingService.GetPen(border), rect.Right - 1, rect.Top,
rect.Right - 1, rect.Bottom);
Rectangle rectCaption = rect;
Rectangle rectCaptionText = rectCaption;
rectCaptionText.X += TextGapLeft;
rectCaptionText.Width -= TextGapLeft + TextGapRight;
rectCaptionText.Width -= ButtonGapLeft + ButtonClose.Width + ButtonGapRight;
if (ShouldShowAutoHideButton)
rectCaptionText.Width -= ButtonAutoHide.Width + ButtonGapBetween;
if (HasTabPageContextMenu)
rectCaptionText.Width -= ButtonOptions.Width + ButtonGapBetween;
rectCaptionText.Y += TextGapTop;
rectCaptionText.Height -= TextGapTop + TextGapBottom;
TextRenderer.DrawText(g, DockPane.CaptionText, TextFont, DrawHelper.RtlTransform(this, rectCaptionText), palette.Text, TextFormat);
Rectangle rectDotsStrip = rectCaptionText;
int textLength = (int)g.MeasureString(DockPane.CaptionText, TextFont).Width + TextGapLeft;
rectDotsStrip.X += textLength;
rectDotsStrip.Width -= textLength;
rectDotsStrip.Height = ClientRectangle.Height;
DrawDotsStrip(g, rectDotsStrip, palette.Grip);
}
protected void DrawDotsStrip(Graphics g, Rectangle rectStrip, Color colorDots)
{
if (rectStrip.Width <= 0 || rectStrip.Height <= 0)
return;
var penDots = DockPane.DockPanel.Theme.PaintingService.GetPen(colorDots, 1);
penDots.DashStyle = DashStyle.Custom;
penDots.DashPattern = new float[] { 1, 3 };
int positionY = rectStrip.Height / 2;
g.DrawLine(penDots, rectStrip.X + 2, positionY, rectStrip.X + rectStrip.Width - 2, positionY);
g.DrawLine(penDots, rectStrip.X, positionY - 2, rectStrip.X + rectStrip.Width, positionY - 2);
g.DrawLine(penDots, rectStrip.X, positionY + 2, rectStrip.X + rectStrip.Width, positionY + 2);
}
protected override void OnLayout(LayoutEventArgs levent)
{
SetButtonsPosition();
base.OnLayout (levent);
}
protected override void OnRefreshChanges()
{
SetButtons();
Invalidate();
}
private bool CloseButtonEnabled
{
get { return (DockPane.ActiveContent != null)? DockPane.ActiveContent.DockHandler.CloseButton : false; }
}
/// <summary>
/// Determines whether the close button is visible on the content
/// </summary>
private bool CloseButtonVisible
{
get { return (DockPane.ActiveContent != null) ? DockPane.ActiveContent.DockHandler.CloseButtonVisible : false; }
}
private bool ShouldShowAutoHideButton
{
get { return !DockPane.IsFloat; }
}
private void SetButtons()
{
ButtonClose.Enabled = CloseButtonEnabled;
ButtonClose.Visible = CloseButtonVisible;
ButtonAutoHide.Visible = ShouldShowAutoHideButton;
ButtonOptions.Visible = HasTabPageContextMenu;
ButtonClose.RefreshChanges();
ButtonAutoHide.RefreshChanges();
ButtonOptions.RefreshChanges();
SetButtonsPosition();
}
private void SetButtonsPosition()
{
// set the size and location for close and auto-hide buttons
Rectangle rectCaption = ClientRectangle;
int buttonWidth = ButtonClose.Image.Width;
int buttonHeight = ButtonClose.Image.Height;
Size buttonSize = new Size(buttonWidth, buttonHeight);
int x = rectCaption.X + rectCaption.Width - ButtonGapRight - m_buttonClose.Width;
int y = rectCaption.Y + ButtonGapTop;
Point point = new Point(x, y);
ButtonClose.Bounds = DrawHelper.RtlTransform(this, new Rectangle(point, buttonSize));
// If the close button is not visible draw the auto hide button overtop.
// Otherwise it is drawn to the left of the close button.
if (CloseButtonVisible)
point.Offset(-(buttonWidth + ButtonGapBetween), 0);
ButtonAutoHide.Bounds = DrawHelper.RtlTransform(this, new Rectangle(point, buttonSize));
if (ShouldShowAutoHideButton)
point.Offset(-(buttonWidth + ButtonGapBetween), 0);
ButtonOptions.Bounds = DrawHelper.RtlTransform(this, new Rectangle(point, buttonSize));
}
private void Close_Click(object sender, EventArgs e)
{
DockPane.CloseActiveContent();
}
private void AutoHide_Click(object sender, EventArgs e)
{
DockPane.DockState = DockHelper.ToggleAutoHideState(DockPane.DockState);
if (DockHelper.IsDockStateAutoHide(DockPane.DockState))
{
DockPane.DockPanel.ActiveAutoHideContent = null;
DockPane.NestedDockingStatus.NestedPanes.SwitchPaneWithFirstChild(DockPane);
}
}
private void Options_Click(object sender, EventArgs e)
{
ShowTabPageContextMenu(PointToClient(Control.MousePosition));
}
protected override void OnRightToLeftChanged(EventArgs e)
{
base.OnRightToLeftChanged(e);
PerformLayout();
}
protected override bool CanDragAutoHide
{
get { return true; }
}
}
}