/*
* 本代码受中华人民共和国著作权法保护,作者仅授权下载代码之人在学习和交流范围内
* 自由使用与修改代码;欲将代码用于商业用途的,请与作者联系。
* 使用本代码请保留此处信息。作者联系方式:ping3108@163.com, 欢迎进行技术交流
*/
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using MGdu.WinFormUI.MyGraphics;
//忽略没有注释警告
#pragma warning disable 1591
namespace MGdu.WinFormUI
{
///
/// 该类处理mdi-bar的绘制及鼠标事件管理
///
internal class MdiBarController
{
#region private var
GMForm _owner;
public List _listTabItems { get; private set; }
// 有时候可能有很多tab,不能全部显示,那么就用两个变量来标识
// 是第几个到第几个tab被显示出来了。
int _beginShowIndex;
int _endShowIndex;
int _activeTabIndex;
// 有多少tab被隐藏了
int _hiddenTabsCount;
Point _lastMouseUpLocation;
WLButton _newTabBtn;
WLButton _listAllBtn;
EventHandler _newTabBtnClick;
EventHandler _tabCloseBtnClick;
ContextMenuStrip _menuPopup;
private Rectangle _hitTestBounds;
#endregion
#region event & event handler
public event EventHandler NewTabButtonClick
{
add { _newTabBtnClick = value; }
remove { _newTabBtnClick = null; }
}
public event EventHandler TabCloseButtonClick
{
add { _tabCloseBtnClick = value; }
remove { _tabCloseBtnClick = null; }
}
private void OnNewTabBtnClick(object sender, EventArgs e)
{
_newTabBtnClick?.Invoke(this, EventArgs.Empty);
}
private void OnTabCloseBtnClick(object sender, EventArgs e)
{
if (sender is Form f)
{
_tabCloseBtnClick?.Invoke(f, EventArgs.Empty);
}
}
private void OnListAllBtnClick(object sender, EventArgs e)
{
if (_listTabItems.Count < 1)
return;
foreach (MdiGMTabItem tab in _listTabItems)
{
if (tab.IsFormActive)
{
tab.MenuItemPop.Checked = true;
tab.MenuItemPop.Image = null;
}
else
{
tab.MenuItemPop.Checked = false;
tab.MenuItemPop.Image = tab.Form.Icon.ToBitmap();
}
tab.MenuItemPop.Text = tab.Form.Text;
if (!tab.IsHidden)
tab.MenuItemPop.Font = new Font(tab.MenuItemPop.Font, FontStyle.Bold);
else
tab.MenuItemPop.Font = new Font(tab.MenuItemPop.Font, FontStyle.Regular);
}
_menuPopup.Show(_owner, ListAllBtnBounds.Left, ListAllBtnBounds.Bottom);
}
private void OnActivateChild(Form child)
{
if (child != _owner.ActiveMdiChild)
{
if (_owner.XTheme.Mdi_UseMsgToActivateChild)
_owner.ActivateMdiChildForm(child);
else
child.Activate();
}
}
private void OnPopMenuItemClick(object sender, EventArgs e)
{
if (sender is ToolStripMenuItem ctl)
{
if (ctl.Tag is Form f)
{
OnActivateChild(f);
}
}
}
#endregion
#region Constructor & initial
public MdiBarController(GMForm owner)
{
_owner = owner;
_listTabItems = new List();
_newTabBtn = new WLButton(owner);
_listAllBtn = new WLButton(owner);
// ini _newtabbtn
_newTabBtn.ColorTable = NewTabBtnColor;
_newTabBtn.Click += new EventHandler(OnNewTabBtnClick);
_newTabBtn.ForePathGetter = new ButtonForePathGetter(
MGdu.WinFormUI.MyGraphics.GraphicsPathHelper.CreatePlusFlag);
_listAllBtn.ColorTable = ListAllBtnColor;
_listAllBtn.Click +=new EventHandler(OnListAllBtnClick);
_listAllBtn.ForePathGetter = new ButtonForePathGetter(
MGdu.WinFormUI.MyGraphics.GraphicsPathHelper.CreateDownTriangleFlag);
_listAllBtn.ForePathSize = new Size(10, 9);
_listAllBtn.ForeFont = new Font("微软雅黑", 8);
_menuPopup = new ContextMenuStrip();
}
#endregion
#region editable properties from thmem info
///
/// use left,top,right to location the bar in owner form,
/// the margin is from Form.ClientRectangle
///
public Padding Margin
{
get { return _owner.XTheme.Mdi_BarMargin; }
}
///
/// 整个标签栏高度,包含标签栏底部区域、标签、标签顶部空隙
///
public int BarHeight
{
get { return BarBottomRegionHeight + Math.Max(TabHeight, TabHeightActive) + TabTopSpace; }
}
///
/// 标签栏底部区域的高度
///
public int BarBottomRegionHeight
{
get { return _owner.XTheme.Mdi_BarBottomRegionHeight; }
}
///
/// 是否显示标签栏边框
///
public bool DrawBarBorder
{
get { return _owner.XTheme.Mdi_DrawBarBorder; }
}
///
/// 是否显示标签栏背景
///
public bool DrawBarBackgound
{
get { return _owner.XTheme.Mdi_DrawBarBackground; }
}
///
///标签栏左内边距
///
public int BarLeftPadding
{
get { return _owner.XTheme.Mdi_BarLeftPadding; }
}
///
/// 标签栏右内边距
///
public int BarRightPadding
{
get { return _owner.XTheme.Mdi_BarRightPadding; }
}
///
/// 标签高度
///
public int TabHeight
{
get { return _owner.XTheme.Mdi_TabHeight; }
}
///
/// 激活的标签高度
///
public int TabHeightActive
{
get { return _owner.XTheme.Mdi_TabHeightActive; }
}
///
/// tab顶部与bar顶部的空间,这个值用来计算 BarHeight
///
public int TabTopSpace
{
get { return _owner.XTheme.Mdi_TabTopSpace; }
}
///
/// 每个标签的左右边界可以不是垂直的,而是都有一个斜度
///
public int TabSlopeWidth
{
get { return _owner.XTheme.Mdi_TabSlopeWidth; }
}
///
/// tab与tab之间的距离,用负值可以使tab有重叠的效果
///
public int TabAndTabSpace
{
get { return _owner.XTheme.Mdi_TabAndTabSpace; }
}
///
/// 标签是否显示图标
///
public bool ShowTabIcon
{
get { return _owner.XTheme.Mdi_ShowTabIcon; }
}
///
/// 是否显示标签关闭按钮
///
public bool ShowTabCloseIcon
{
get { return _owner.XTheme.Mdi_ShowTabCloseIcon; }
}
///
/// 标签图标大小
///
public Size IconSize
{
get { return ShowTabIcon ? new Size(16, 16) : Size.Empty; }
}
///
/// 标签图标距离左边的距离
///
public int IconLeftSpace
{
get { return TabSlopeWidth + (ShowTabIcon ? 2 : 0); }
}
///
/// 标签文字距离左边的距离
///
public int TextLeftSpace
{
get { return 2; }
}
///
/// 标签关闭按钮的大小
///
public Size TabCloseBtnSize
{
get { return new Size(16, 16); }
}
///
/// 标签关闭按钮距离右边的距离
///
public int TabCloseBtnRightSpace
{
get { return TabSlopeWidth + 2; }
}
///
/// 是否显示新建标签按钮
///
public bool ShowNewTabBtn
{
get { return _owner.XTheme.Mdi_ShowNewTabBtn; }
}
///
/// 新建标签按钮的大小
///
public Size NewTabBtnSize
{
get { return _owner.XTheme.Mdi_NewTabBtnSize; }
}
public Rectangle NewTabBtnBounds
{
get;
set;
}
///
/// 新建标签距离左边的距离
///
public int NewTabBtnLeftSpace
{
get { return _owner.XTheme.Mdi_NewTabBtnLeftSpace; }
}
///
/// 按钮与Bar底部的距离
///
public int NewTabBtnBottomSpace
{
get { return _owner.XTheme.Mdi_NewTabBtnBottomSpace; }
}
public Rectangle ListAllBtnBounds { get; set; }
public Size ListAllBtnSize
{
get { return _owner.XTheme.Mdi_ListAllBtnSize; }
}
public int ListAllBtnLeftSpace
{
get { return _owner.XTheme.Mdi_ListAllBtnLeftSpace; }
}
public int ListAllBtnBottomSpace
{
get { return _owner.XTheme.Mdi_ListAllBtnBottomSpace; }
}
public BarButtonAlignmentType ListAllBtnAlign
{
get { return _owner.XTheme.Mdi_ListAllBtnAlign; }
}
public bool AlwaysShowListAllBtn
{ get { return _owner.XTheme.Mdi_AlwaysShowListAllBtn; } }
///
/// 一个tab允许的最小宽度
///
public int TabMinWidth
{
get
{
return Math.Max(TabSlopeWidth * 2 + IconLeftSpace + IconSize.Width
+ TabCloseBtnRightSpace + TabCloseBtnSize.Width + 36,
_owner.XTheme.Mdi_TabMinWidth);
}
}
///
/// 一个tab允许的最大显示宽度
///
public int TabMaxWidth
{
get { return _owner.XTheme.Mdi_TabMaxWidth; }
}
///
/// 标签正常宽度
///
public int TabNormalWidth
{
get { return _owner.XTheme.Mdi_TabNormalWidth; }
}
#region bar & tab color
public Color BarBorderColor
{
get { return _owner.XTheme.Mdi_BarBorderColor; }
}
public Color BarBackColor
{
get { return _owner.XTheme.Mdi_BarBackColor; }
}
public Color TabOutterBorderColor
{
get { return _owner.XTheme.Mdi_TabOutterBorderColor; }
}
public Color TabInnerBorderColor
{
get { return _owner.XTheme.Mdi_TabInnerBorderColor; }
}
public bool TabShowBorder
{
get { return _owner.XTheme.Mdi_TabShowBorder; }
}
public Color TabActiveBackColorTop
{
get { return _owner.XTheme.Mdi_TabActiveBackColorTop; }
}
public Color TabActiveBackColorBottom
{
get { return _owner.XTheme.Mdi_TabActiveBackColorBottom; }
}
public Color TabDeactiveBackColorTop
{
get { return _owner.XTheme.Mdi_TabDeactiveBackColorTop; }
}
public Color TabDeactiveBackColorBottom
{
get { return _owner.XTheme.Mdi_TabDeactiveBackColorBottom; }
}
public Color BarBottomRegionBackColor
{
get { return _owner.XTheme.Mdi_BarBottomRegionBackColor; }
}
public Color TabActiveForeColor
{
get { return _owner.XTheme.Mdi_TabActiveForeColor; }
}
public Color TabDeactiveForeColor
{
get { return _owner.XTheme.Mdi_TabDeactiveForeColor; }
}
#endregion
#region tab btn color
public ButtonColorTable NewTabBtnColor
{
get { return _owner.XTheme.Mdi_NewTabBtnColor; }
}
public ButtonColorTable ListAllBtnColor
{
get { return _owner.XTheme.Mdi_ListAllBtnColor; }
}
public ButtonColorTable TabCloseBtnColor
{
get { return ButtonColorTable.GetDefaultCloseBtnColor(); }
}
#endregion
#endregion
#region Calculated Properties
public int BarWidth
{
get { return _owner.ClientSize.Width - Margin.Left - Margin.Right; }
}
public Rectangle Bounds
{
get
{
return new Rectangle(
_owner.ClientRectangle.Left + Margin.Left,
_owner.ClientRectangle.Top + Margin.Top,
BarWidth,
BarHeight);
}
}
public Rectangle BarBottomRegionBounds
{
get
{
return new Rectangle(
Bounds.Left,
Bounds.Top + (Bounds.Height - BarBottomRegionHeight),
BarWidth,
BarBottomRegionHeight);
}
}
public Rectangle HitTestBounds
{
get { return _hitTestBounds; }
}
#endregion
#region private method
private MdiGMTabItem CreateNewTab(Form f)
{
MdiGMTabItem tab = new MdiGMTabItem(this);
tab.Form = f;
tab.CloseBtn = new WLButton(_owner)
{
ColorTable = TabCloseBtnColor,
BorderType = ButtonBorderType.Ellipse,
DrawForePathTwice = true,
//tab.CloseBtn.DrawLightGlass = true;
ClickSendBackOject = f,
ForePathGetter = new
ButtonForePathGetter(MGdu.WinFormUI.MyGraphics.GraphicsPathHelper.CreateSingleLineCloseFlag)
};
tab.CloseBtn.Click += new EventHandler(OnTabCloseBtnClick);
// menu item
tab.MenuItemPop = new ToolStripMenuItem();
tab.MenuItemPop.Tag = f;
tab.MenuItemPop.Click += new EventHandler(OnPopMenuItemClick);
_menuPopup.Items.Add(tab.MenuItemPop);
return tab;
}
///
/// 同步_listTabItems与mdi主窗体实际存在的子form
///
private void CheckTabItemsWithOwnerMdiForm()
{
List