From 5b7822936a7300be1525489a21129d8d97d1ac14 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 25 Feb 2006 16:02:27 +0000 Subject: [PATCH] Applied patch by John Simons: Closing an open file tab returns focus to the previously focused tab. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@1181 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../WinFormsUI/Docking/DockPane.cs | 81 +++++++++++++++---- .../WinFormsUI/Docking/Interfaces.cs | 4 +- .../Workbench/Layouts/SdiWorkspaceLayout.cs | 14 ++-- 3 files changed, 72 insertions(+), 27 deletions(-) diff --git a/src/Libraries/DockPanel_Src/WinFormsUI/Docking/DockPane.cs b/src/Libraries/DockPanel_Src/WinFormsUI/Docking/DockPane.cs index 7eb9492860..368efe5672 100644 --- a/src/Libraries/DockPanel_Src/WinFormsUI/Docking/DockPane.cs +++ b/src/Libraries/DockPanel_Src/WinFormsUI/Docking/DockPane.cs @@ -9,6 +9,7 @@ // ***************************************************************************** using System; +using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; @@ -174,6 +175,31 @@ namespace WeifenLuo.WinFormsUI base.Dispose(disposing); } + private class VisitedTabsCollection + { + List list = new List(); + public int Count { + get { + return list.Count; + } + } + public void PushOrMoveToEnd(IDockContent content) + { + for (int i = 0; i < list.Count; i++) { + if (list[i] == content || list[i].IsDisposed) { + list.RemoveAt(i--); + } + } + list.Add(content); + } + public IDockContent Pop() + { + IDockContent content = list[list.Count - 1]; + list.RemoveAt(list.Count - 1); + return content; + } + } + private VisitedTabsCollection m_visitedTabs = new VisitedTabsCollection(); private IDockContent m_activeContent = null; /// public virtual IDockContent ActiveContent @@ -202,6 +228,11 @@ namespace WeifenLuo.WinFormsUI m_activeContent = value; + if (m_activeContent != null && m_activeContent.DockHandler.DockState == DockState.Document) + { + m_visitedTabs.PushOrMoveToEnd(m_activeContent); + } + if (DockPanel.DocumentStyle == DocumentStyles.DockingMdi && DockState == DockState.Document) { if (m_activeContent != null) @@ -736,27 +767,43 @@ namespace WeifenLuo.WinFormsUI return; IDockContent prevVisible = null; - for (int i=Contents.IndexOf(ActiveContent)-1; i>=0; i--) - if (Contents[i].DockHandler.DockState == DockState) - { - prevVisible = Contents[i]; - break; - } - - IDockContent nextVisible = null; - for (int i=Contents.IndexOf(ActiveContent)+1; i 0) { - nextVisible = Contents[i]; - break; + prevVisible = m_visitedTabs.Pop(); + + if (prevVisible != null && !prevVisible.IsDisposed && prevVisible != ActiveContent) + break; } + } - if (prevVisible != null) + if (prevVisible != null) { ActiveContent = prevVisible; - else if (nextVisible != null) - ActiveContent = nextVisible; - else - ActiveContent = null; + } else { + for (int i=Contents.IndexOf(ActiveContent)-1; i>=0; i--) + if (Contents[i].DockHandler.DockState == DockState) + { + prevVisible = Contents[i]; + break; + } + + IDockContent nextVisible = null; + for (int i=Contents.IndexOf(ActiveContent)+1; i - public interface IDockContent + public interface IDockContent : IDisposable { /// DockContentHandler DockHandler { get; } + + bool IsDisposed { get; } } /// diff --git a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceLayout.cs b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceLayout.cs index 03608f0036..af520e1e91 100644 --- a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceLayout.cs +++ b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceLayout.cs @@ -57,19 +57,15 @@ namespace ICSharpCode.SharpDevelop.Gui } else { activeContent = dockPanel.ActiveContent ?? lastActiveContent; } + if (activeContent != null && activeContent.IsDisposed) + activeContent = null; + lastActiveContent = activeContent; - if (activeContent is IWorkbenchWindow) { - if ((activeContent as IWorkbenchWindow).IsDisposed) - return null; + if (activeContent is IWorkbenchWindow) return ((IWorkbenchWindow)activeContent).ActiveViewContent; - } - - if (activeContent is PadContentWrapper) { - if ((activeContent as PadContentWrapper).IsDisposed) - return null; + if (activeContent is PadContentWrapper) return ((PadContentWrapper)activeContent).PadContent; - } return activeContent; }