From 45bedfcbd7585c76abbd864dc228cdd02808eda6 Mon Sep 17 00:00:00 2001 From: Robin Date: Sun, 6 Dec 2015 18:58:30 +0000 Subject: [PATCH] Added ContentAdded and ContentRemoved events. --- DarkUI/Config/Enums.cs | 1 - DarkUI/Docking/DarkDockContent.cs | 2 +- DarkUI/Docking/DarkDockGroup.cs | 2 +- DarkUI/Docking/DarkDockPanel.cs | 17 ++++++- Example/Forms/MainForm.cs | 76 ++++++++++++++++++++----------- 5 files changed, 66 insertions(+), 32 deletions(-) diff --git a/DarkUI/Config/Enums.cs b/DarkUI/Config/Enums.cs index 29a5508..3856673 100644 --- a/DarkUI/Config/Enums.cs +++ b/DarkUI/Config/Enums.cs @@ -47,7 +47,6 @@ public enum DarkDockArea { - None, Document, Left, Right, diff --git a/DarkUI/Docking/DarkDockContent.cs b/DarkUI/Docking/DarkDockContent.cs index 5f1adcf..b1d11a8 100644 --- a/DarkUI/Docking/DarkDockContent.cs +++ b/DarkUI/Docking/DarkDockContent.cs @@ -45,7 +45,7 @@ namespace DarkUI.Docking [Category("Layout")] [Description("Determines which area of the dock panel this content will dock to.")] - [DefaultValue(DarkDockArea.None)] + [DefaultValue(DarkDockArea.Document)] public DarkDockArea DockArea { get; set; } [Browsable(false)] diff --git a/DarkUI/Docking/DarkDockGroup.cs b/DarkUI/Docking/DarkDockGroup.cs index 3d64aa6..2bc2486 100644 --- a/DarkUI/Docking/DarkDockGroup.cs +++ b/DarkUI/Docking/DarkDockGroup.cs @@ -233,7 +233,7 @@ namespace DarkUI.Docking { // Check if previous iteration of loop met the difference if (differenceMadeUp >= difference) - continue; + break; if (tab.ClientRectangle.Width >= largest) { diff --git a/DarkUI/Docking/DarkDockPanel.cs b/DarkUI/Docking/DarkDockPanel.cs index 01a3dd7..5961f0b 100644 --- a/DarkUI/Docking/DarkDockPanel.cs +++ b/DarkUI/Docking/DarkDockPanel.cs @@ -12,6 +12,8 @@ namespace DarkUI.Docking #region Event Region public event EventHandler ActiveContentChanged; + public event EventHandler ContentAdded; + public event EventHandler ContentRemoved; #endregion @@ -111,14 +113,17 @@ namespace DarkUI.Docking if (_contents.Contains(dockContent)) return; - if (dockContent.DockArea == DarkDockArea.None) - return; + if (dockContent.DockArea != dockGroup.DockArea) + throw new Exception($"Attempting to add '{dockContent.DockArea}' content to '{dockGroup.DockArea}' group."); dockContent.DockPanel = this; _contents.Add(dockContent); var region = _regions[dockContent.DockArea]; region.AddContent(dockContent, dockGroup); + + if (ContentAdded != null) + ContentAdded(this, new DockContentEventArgs(dockContent)); } public void RemoveContent(DarkDockContent dockContent) @@ -131,6 +136,14 @@ namespace DarkUI.Docking var region = _regions[dockContent.DockArea]; region.RemoveContent(dockContent); + + if (ContentRemoved != null) + ContentRemoved(this, new DockContentEventArgs(dockContent)); + } + + public bool ContainsContent(DarkDockContent dockContent) + { + return _contents.Contains(dockContent); } private void CreateRegions() diff --git a/Example/Forms/MainForm.cs b/Example/Forms/MainForm.cs index 690a1ea..c5ec856 100644 --- a/Example/Forms/MainForm.cs +++ b/Example/Forms/MainForm.cs @@ -2,6 +2,7 @@ using DarkUI.Forms; using DarkUI.Win32; using System; +using System.Collections.Generic; using System.Windows.Forms; namespace Example @@ -10,6 +11,8 @@ namespace Example { #region Field Region + private List _toolWindows = new List(); + private DockProject _dockProject; private DockProperties _dockProperties; private DockConsole _dockConsole; @@ -32,6 +35,9 @@ namespace Example // input before letting events pass through to the rest of the application. Application.AddMessageFilter(DockPanel.MessageFilter); + // Hook in all the UI events manually for clarity. + HookEvents(); + // Build the tool windows and add them to the dock panel _dockProject = new DockProject(); _dockProperties = new DockProperties(); @@ -39,26 +45,24 @@ namespace Example _dockLayers = new DockLayers(); _dockHistory = new DockHistory(); - DockPanel.AddContent(_dockProject); - DockPanel.AddContent(_dockProperties); - DockPanel.AddContent(_dockConsole); - DockPanel.AddContent(_dockLayers); - DockPanel.AddContent(_dockHistory, _dockLayers.DockGroup); + // Add the tool windows to a list + _toolWindows.Add(_dockProject); + _toolWindows.Add(_dockProperties); + _toolWindows.Add(_dockConsole); + _toolWindows.Add(_dockLayers); + _toolWindows.Add(_dockHistory); + + // Add the tool window list contents to the dock panel + foreach (var toolWindow in _toolWindows) + DockPanel.AddContent(toolWindow); + + // Check window menu items which are contained in the dock panel + BuildWindowMenu(); // Add dummy documents to the main document area of the dock panel DockPanel.AddContent(new DockDocument("Document 1")); DockPanel.AddContent(new DockDocument("Document 2")); DockPanel.AddContent(new DockDocument("Document 3")); - - // Show the tool windows as visible in the 'Window' menu - mnuProject.Checked = true; - mnuProperties.Checked = true; - mnuConsole.Checked = true; - mnuLayers.Checked = true; - mnuHistory.Checked = true; - - // Hook in all the UI events manually for clarity. - HookEvents(); } #endregion @@ -67,6 +71,9 @@ namespace Example private void HookEvents() { + DockPanel.ContentAdded += DockPanel_ContentAdded; + DockPanel.ContentRemoved += DockPanel_ContentRemoved; + mnuNewFile.Click += NewFile_Click; mnuClose.Click += Close_Click; @@ -83,24 +90,39 @@ namespace Example mnuAbout.Click += About_Click; } - private void ToggleToolWindow(DarkToolWindow toolWindow, ToolStripMenuItem menuItem) + private void ToggleToolWindow(DarkToolWindow toolWindow) { if (toolWindow.DockPanel == null) - { DockPanel.AddContent(toolWindow); - menuItem.Checked = true; - } else - { DockPanel.RemoveContent(toolWindow); - menuItem.Checked = false; - } + } + + private void BuildWindowMenu() + { + mnuProject.Checked = DockPanel.ContainsContent(_dockProject); + mnuProperties.Checked = DockPanel.ContainsContent(_dockProperties); + mnuConsole.Checked = DockPanel.ContainsContent(_dockConsole); + mnuLayers.Checked = DockPanel.Contains(_dockLayers); + mnuHistory.Checked = DockPanel.Contains(_dockHistory); } #endregion #region Event Handler Region + private void DockPanel_ContentAdded(object sender, DockContentEventArgs e) + { + if (_toolWindows.Contains(e.Content)) + BuildWindowMenu(); + } + + private void DockPanel_ContentRemoved(object sender, DockContentEventArgs e) + { + if (_toolWindows.Contains(e.Content)) + BuildWindowMenu(); + } + private void NewFile_Click(object sender, EventArgs e) { var newFile = new DockDocument("New document"); @@ -120,27 +142,27 @@ namespace Example private void Project_Click(object sender, EventArgs e) { - ToggleToolWindow(_dockProject, mnuProject); + ToggleToolWindow(_dockProject); } private void Properties_Click(object sender, EventArgs e) { - ToggleToolWindow(_dockProperties, mnuProperties); + ToggleToolWindow(_dockProperties); } private void Console_Click(object sender, EventArgs e) { - ToggleToolWindow(_dockConsole, mnuConsole); + ToggleToolWindow(_dockConsole); } private void Layers_Click(object sender, EventArgs e) { - ToggleToolWindow(_dockLayers, mnuLayers); + ToggleToolWindow(_dockLayers); } private void History_Click(object sender, EventArgs e) { - ToggleToolWindow(_dockHistory, mnuHistory); + ToggleToolWindow(_dockHistory); } private void About_Click(object sender, EventArgs e)