diff --git a/DarkUI/DarkUI.csproj b/DarkUI/DarkUI.csproj index c2855f9..731fc72 100644 --- a/DarkUI/DarkUI.csproj +++ b/DarkUI/DarkUI.csproj @@ -108,6 +108,7 @@ + diff --git a/DarkUI/Docking/DarkDockGroup.cs b/DarkUI/Docking/DarkDockGroup.cs index c5a9dcb..cd4df38 100644 --- a/DarkUI/Docking/DarkDockGroup.cs +++ b/DarkUI/Docking/DarkDockGroup.cs @@ -1,6 +1,8 @@ using DarkUI.Config; +using System; using System.Collections.Generic; using System.ComponentModel; +using System.Drawing; using System.Windows.Forms; namespace DarkUI.Docking @@ -12,6 +14,8 @@ namespace DarkUI.Docking private List _contents; + private DarkDockTabArea _tabArea; + #endregion #region Property Region @@ -41,6 +45,8 @@ namespace DarkUI.Docking DockArea = dockRegion.DockArea; Order = order; + + _tabArea = new DarkDockTabArea(DockArea); } #endregion @@ -57,6 +63,14 @@ namespace DarkUI.Docking if (VisibleContent == null) VisibleContent = dockContent; + + var menuItem = new ToolStripMenuItem(dockContent.DockText); + menuItem.Tag = dockContent; + menuItem.Click += TabMenuItem_Select; + menuItem.Image = dockContent.Icon; + _tabArea.TabMenu.Items.Add(menuItem); + + UpdateTabArea(); } public void RemoveContent(DarkDockContent dockContent) @@ -74,6 +88,115 @@ namespace DarkUI.Docking foreach (var content in _contents) VisibleContent = content; } + + ToolStripMenuItem itemToRemove = null; + foreach (ToolStripMenuItem item in _tabArea.TabMenu.Items) + { + var menuContent = item.Tag as DarkDockContent; + if (menuContent == null) + continue; + + if (menuContent == dockContent) + itemToRemove = item; + } + + if (itemToRemove != null) + { + itemToRemove.Click -= TabMenuItem_Select; + _tabArea.TabMenu.Items.Remove(itemToRemove); + } + + UpdateTabArea(); + } + + private void UpdateTabArea() + { + if (DockArea == DarkDockArea.Document) + _tabArea.Visible = (_contents.Count > 0); + else + _tabArea.Visible = (_contents.Count > 1); + + var size = 0; + + switch (DockArea) + { + case DarkDockArea.Document: + size = _tabArea.Visible ? Consts.DocumentTabAreaSize : 0; + Padding = new Padding(0, size, 0, 0); + _tabArea.Area = new Rectangle(Padding.Left, 0, ClientRectangle.Width - Padding.Horizontal, size); + break; + case DarkDockArea.Left: + case DarkDockArea.Right: + size = _tabArea.Visible ? Consts.ToolWindowTabAreaSize : 0; + Padding = new Padding(0, 0, 0, size); + _tabArea.Area = new Rectangle(Padding.Left, ClientRectangle.Height - size, ClientRectangle.Width - Padding.Horizontal, size); + break; + case DarkDockArea.Bottom: + size = _tabArea.Visible ? Consts.ToolWindowTabAreaSize : 0; + Padding = new Padding(1, 0, 0, size); + _tabArea.Area = new Rectangle(Padding.Left, ClientRectangle.Height - size, ClientRectangle.Width - Padding.Horizontal, size); + break; + } + + BuildTabs(); + } + + private void BuildTabs() + { + if (!_tabArea.Visible) + return; + + SuspendLayout(); + + + + ResumeLayout(); + + Invalidate(); + } + + #endregion + + #region Event Handler Region + + private void TabMenuItem_Select(object sender, EventArgs e) + { + var menuItem = sender as ToolStripMenuItem; + if (menuItem == null) + return; + + var content = menuItem.Tag as DarkDockContent; + if (content == null) + return; + + DockPanel.ActiveContent = content; + } + + #endregion + + #region Render Region + + protected override void OnPaint(PaintEventArgs e) + { + var g = e.Graphics; + + using (var b = new SolidBrush(Colors.GreyBackground)) + { + g.FillRectangle(b, ClientRectangle); + } + + if (!_tabArea.Visible) + return; + + using (var b = new SolidBrush(Colors.MediumBackground)) + { + g.FillRectangle(b, _tabArea.Area); + } + } + + protected override void OnPaintBackground(PaintEventArgs e) + { + // Absorb event } #endregion diff --git a/DarkUI/Docking/DarkDockPanel.cs b/DarkUI/Docking/DarkDockPanel.cs index 4160818..3c785df 100644 --- a/DarkUI/Docking/DarkDockPanel.cs +++ b/DarkUI/Docking/DarkDockPanel.cs @@ -83,6 +83,11 @@ namespace DarkUI.Docking #region Method Region public void AddContent(DarkDockContent dockContent) + { + AddContent(dockContent, null); + } + + public void AddContent(DarkDockContent dockContent, DarkDockGroup dockGroup) { if (_contents.Contains(dockContent)) return; @@ -94,7 +99,7 @@ namespace DarkUI.Docking _contents.Add(dockContent); var region = _regions[dockContent.DockArea]; - region.AddContent(dockContent); + region.AddContent(dockContent, dockGroup); } public void RemoveContent(DarkDockContent dockContent) diff --git a/DarkUI/Docking/DarkDockRegion.cs b/DarkUI/Docking/DarkDockRegion.cs index c1e38ad..b061668 100644 --- a/DarkUI/Docking/DarkDockRegion.cs +++ b/DarkUI/Docking/DarkDockRegion.cs @@ -1,5 +1,4 @@ using DarkUI.Config; -using DarkUI.Extensions; using System; using System.Collections.Generic; using System.ComponentModel; @@ -46,12 +45,12 @@ namespace DarkUI.Docking #region Method Region - public void AddContent(DarkDockContent dockContent) + internal void AddContent(DarkDockContent dockContent) { AddContent(dockContent, null); } - public void AddContent(DarkDockContent dockContent, DarkDockGroup dockGroup) + internal void AddContent(DarkDockContent dockContent, DarkDockGroup dockGroup) { // If no existing group is specified then create a new one if (dockGroup == null) @@ -73,7 +72,7 @@ namespace DarkUI.Docking PositionGroups(); } - public void RemoveContent(DarkDockContent dockContent) + internal void RemoveContent(DarkDockContent dockContent) { dockContent.DockRegion = null; diff --git a/DarkUI/Docking/Items/DarkDockTabArea.cs b/DarkUI/Docking/Items/DarkDockTabArea.cs new file mode 100644 index 0000000..8683a50 --- /dev/null +++ b/DarkUI/Docking/Items/DarkDockTabArea.cs @@ -0,0 +1,41 @@ +using DarkUI.Config; +using DarkUI.Controls; +using System.Collections.Generic; +using System.Drawing; + +namespace DarkUI.Docking +{ + public class DarkDockTabArea + { + #region Field Region + + private Dictionary _tabs = new Dictionary(); + + private DarkContextMenu _tabMenu = new DarkContextMenu(); + + #endregion + + #region Property Region + + public DarkDockArea DockArea { get; private set; } + + public Rectangle Area { get; set; } + + public int Offset { get; set; } + + public bool Visible { get; set; } + + public DarkContextMenu TabMenu { get { return _tabMenu; } } + + #endregion + + #region Constructor Region + + public DarkDockTabArea(DarkDockArea dockArea) + { + DockArea = dockArea; + } + + #endregion + } +} diff --git a/Example/Forms/MainForm.cs b/Example/Forms/MainForm.cs index 0e7c0cd..2c0b030 100644 --- a/Example/Forms/MainForm.cs +++ b/Example/Forms/MainForm.cs @@ -43,7 +43,7 @@ namespace Example DockPanel.AddContent(_dockProperties); DockPanel.AddContent(_dockConsole); DockPanel.AddContent(_dockLayers); - DockPanel.AddContent(_dockHistory); + DockPanel.AddContent(_dockHistory, _dockLayers.DockGroup); // Add dummy documents to the main document area of the dock panel DockPanel.AddContent(new DockDocument { DockText = "Document 1" });