diff --git a/DarkUI/DarkUI.csproj b/DarkUI/DarkUI.csproj
index 93d3e2a..c2855f9 100644
--- a/DarkUI/DarkUI.csproj
+++ b/DarkUI/DarkUI.csproj
@@ -107,6 +107,7 @@
UserControl
+
diff --git a/DarkUI/Docking/DarkDockGroup.cs b/DarkUI/Docking/DarkDockGroup.cs
index b386945..c5a9dcb 100644
--- a/DarkUI/Docking/DarkDockGroup.cs
+++ b/DarkUI/Docking/DarkDockGroup.cs
@@ -1,7 +1,6 @@
using DarkUI.Config;
using System.Collections.Generic;
using System.ComponentModel;
-using System.Drawing;
using System.Windows.Forms;
namespace DarkUI.Docking
@@ -23,25 +22,25 @@ namespace DarkUI.Docking
public DarkDockArea DockArea { get; private set; }
- public int ContentCount
- {
- get
- {
- return _contents.Count;
- }
- }
+ public DarkDockContent VisibleContent { get; private set; }
+
+ public int Order { get; set; }
+
+ public int ContentCount { get { return _contents.Count; } }
#endregion
#region Constructor Region
- public DarkDockGroup(DarkDockPanel dockPanel, DarkDockRegion dockRegion)
+ public DarkDockGroup(DarkDockPanel dockPanel, DarkDockRegion dockRegion, int order)
{
_contents = new List();
DockPanel = dockPanel;
DockRegion = dockRegion;
DockArea = dockRegion.DockArea;
+
+ Order = order;
}
#endregion
@@ -55,6 +54,9 @@ namespace DarkUI.Docking
_contents.Add(dockContent);
Controls.Add(dockContent);
+
+ if (VisibleContent == null)
+ VisibleContent = dockContent;
}
public void RemoveContent(DarkDockContent dockContent)
@@ -63,6 +65,15 @@ namespace DarkUI.Docking
_contents.Remove(dockContent);
Controls.Remove(dockContent);
+
+ if (VisibleContent == dockContent)
+ {
+ VisibleContent = null;
+
+ // todo: order?
+ foreach (var content in _contents)
+ VisibleContent = content;
+ }
}
#endregion
diff --git a/DarkUI/Docking/DarkDockRegion.cs b/DarkUI/Docking/DarkDockRegion.cs
index e79c2ae..c1e38ad 100644
--- a/DarkUI/Docking/DarkDockRegion.cs
+++ b/DarkUI/Docking/DarkDockRegion.cs
@@ -4,6 +4,7 @@ using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
+using System.Linq;
using System.Windows.Forms;
namespace DarkUI.Docking
@@ -68,6 +69,8 @@ namespace DarkUI.Docking
// Show the region if it was previously hidden
if (!Visible)
Visible = true;
+
+ PositionGroups();
}
public void RemoveContent(DarkDockContent dockContent)
@@ -84,25 +87,43 @@ namespace DarkUI.Docking
// If we just removed the final group, and this isn't the document region, then hide
if (_groups.Count == 0 && DockArea != DarkDockArea.Document)
Visible = false;
+
+ PositionGroups();
}
private DarkDockGroup CreateGroup()
{
- var newGroup = new DarkDockGroup(DockPanel, this);
+ var order = 0;
+
+ if (_groups.Count >= 1)
+ {
+ order = -1;
+ foreach (var group in _groups)
+ {
+ if (group.Order >= order)
+ order = group.Order + 1;
+ }
+ }
+
+ var newGroup = new DarkDockGroup(DockPanel, this, order);
_groups.Add(newGroup);
Controls.Add(newGroup);
- PositionGroups();
-
return newGroup;
}
private void RemoveGroup(DarkDockGroup group)
{
+ var lastOrder = group.Order;
+
_groups.Remove(group);
Controls.Remove(group);
- PositionGroups();
+ foreach (var otherGroup in _groups)
+ {
+ if (otherGroup.Order > lastOrder)
+ otherGroup.Order--;
+ }
}
private void PositionGroups()
@@ -127,21 +148,52 @@ namespace DarkUI.Docking
if (_groups.Count == 1)
{
_groups[0].Dock = DockStyle.Fill;
+ return;
}
- else if (_groups.Count > 1)
+
+ if (_groups.Count > 1)
{
- foreach (var group in _groups)
+ var lastGroup = _groups.OrderByDescending(g => g.Order).First();
+
+ foreach (var group in _groups.OrderByDescending(g => g.Order))
{
group.SendToBack();
- if (_groups.IsFirst(group))
+ if (group.Order == lastGroup.Order)
group.Dock = DockStyle.Fill;
else
group.Dock = dockStyle;
}
+
+ SizeGroups();
}
}
+ private void SizeGroups()
+ {
+ if (_groups.Count <= 1)
+ return;
+
+ var size = new Size(0, 0);
+
+ switch (DockArea)
+ {
+ default:
+ case DarkDockArea.Document:
+ return;
+ case DarkDockArea.Left:
+ case DarkDockArea.Right:
+ size = new Size(Width, Height / _groups.Count);
+ break;
+ case DarkDockArea.Bottom:
+ size = new Size(Width / _groups.Count, Height);
+ break;
+ }
+
+ foreach (var group in _groups)
+ group.Size = size;
+ }
+
private void BuildProperties()
{
MinimumSize = new Size(50, 50);
@@ -205,6 +257,8 @@ namespace DarkUI.Docking
private void ParentForm_ResizeEnd(object sender, EventArgs e)
{
+ SizeGroups();
+
if (_splitter != null)
_splitter.UpdateBounds();
}
@@ -213,6 +267,8 @@ namespace DarkUI.Docking
{
base.OnLayout(e);
+ SizeGroups();
+
if (_splitter != null)
_splitter.UpdateBounds();
}
diff --git a/DarkUI/Docking/Items/DarkDockTab.cs b/DarkUI/Docking/Items/DarkDockTab.cs
new file mode 100644
index 0000000..8e17979
--- /dev/null
+++ b/DarkUI/Docking/Items/DarkDockTab.cs
@@ -0,0 +1,46 @@
+using System.Drawing;
+
+namespace DarkUI.Docking
+{
+ internal class DarkDockTab
+ {
+ #region Property Region
+
+ public DarkDockContent DockContent { get; set; }
+
+ public Rectangle ClientRectangle { get; set; }
+
+ public Rectangle CloseButtonRectangle { get; set; }
+
+ public bool Hot { get; set; }
+
+ public bool Pressed { get; set; }
+
+ public bool CloseButtonHot { get; set; }
+
+ public bool ShowSeparator { get; set; }
+
+ #endregion
+
+ #region Constructor Region
+
+ public DarkDockTab(DarkDockContent content)
+ {
+ DockContent = content;
+ }
+
+ #endregion
+
+ #region Method Region
+
+ public int CalculateWidth(Graphics g, Font font)
+ {
+ var width = (int)g.MeasureString(DockContent.DockText, font).Width;
+ width += 10;
+
+ return width;
+ }
+
+ #endregion
+ }
+}
diff --git a/Example/Forms/Docking/DockHistory.Designer.cs b/Example/Forms/Docking/DockHistory.Designer.cs
index 84d5a8f..461f574 100644
--- a/Example/Forms/Docking/DockHistory.Designer.cs
+++ b/Example/Forms/Docking/DockHistory.Designer.cs
@@ -31,7 +31,7 @@ namespace Example
///
private void InitializeComponent()
{
- this.lstHistory = new DarkListView();
+ this.lstHistory = new DarkUI.Controls.DarkListView();
this.SuspendLayout();
//
// lstHistory
@@ -48,7 +48,7 @@ namespace Example
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.lstHistory);
- this.DockArea = DarkDockArea.Bottom;
+ this.DockArea = DarkUI.Config.DarkDockArea.Right;
this.DockText = "History";
this.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.Icon = global::Example.Icons.RefactoringLog_12810;