diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerViewContent.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerViewContent.cs index e89daaecb0..1292f5c7c7 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerViewContent.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerViewContent.cs @@ -347,17 +347,17 @@ namespace ICSharpCode.FormsDesigner { disposing = true; if (IsFormsDesignerVisible) { - Deselected(); + Deselecting(); } base.Dispose(); } - public override void Deselected() + public override void Deselecting() { // can happen if form designer is disposed and then deselected if (!IsFormsDesignerVisible) return; - LoggingService.Info("Deselected form designer, unloading..." + viewContent.TitleName); + LoggingService.Info("Deselecting form designer, unloading..." + viewContent.TitleName); PropertyPad.PropertyValueChanged -= PropertyValueChanged; propertyContainer.Clear(); IsFormsDesignerVisible = false; diff --git a/src/Main/Base/Project/Src/Gui/AbstractBaseViewContent.cs b/src/Main/Base/Project/Src/Gui/AbstractBaseViewContent.cs index de368d1cf5..45af29e452 100644 --- a/src/Main/Base/Project/Src/Gui/AbstractBaseViewContent.cs +++ b/src/Main/Base/Project/Src/Gui/AbstractBaseViewContent.cs @@ -55,6 +55,10 @@ namespace ICSharpCode.SharpDevelop.Gui public virtual void Deselected() { } + + public virtual void Deselecting() + { + } public virtual void RedrawContent() { diff --git a/src/Main/Base/Project/Src/Gui/IBaseViewContent.cs b/src/Main/Base/Project/Src/Gui/IBaseViewContent.cs index 5d471b5430..ae20de4306 100644 --- a/src/Main/Base/Project/Src/Gui/IBaseViewContent.cs +++ b/src/Main/Base/Project/Src/Gui/IBaseViewContent.cs @@ -50,6 +50,12 @@ namespace ICSharpCode.SharpDevelop.Gui /// tab. NOT when the windows is selected. /// void Selected(); + + /// + /// Is called just before the view content is deselected inside the window + /// tab before the other window is selected. NOT when the windows is deselected. + /// + void Deselecting(); /// /// Is called when the view content is deselected inside the window diff --git a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceWindow.cs b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceWindow.cs index 45bcf34bb0..0a508fbba3 100644 --- a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceWindow.cs +++ b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceWindow.cs @@ -136,7 +136,9 @@ namespace ICSharpCode.SharpDevelop.Gui viewTabControl = new TabControl(); viewTabControl.Alignment = TabAlignment.Bottom; viewTabControl.Dock = DockStyle.Fill; - viewTabControl.SelectedIndexChanged += new EventHandler(viewTabControlIndexChanged); + viewTabControl.Selected += viewTabControlSelected; + viewTabControl.Deselecting += viewTabControlDeselecting; + viewTabControl.Deselected += viewTabControlDeselected; } internal void InitControls() @@ -200,11 +202,6 @@ namespace ICSharpCode.SharpDevelop.Gui WorkbenchSingleton.SafeThreadAsyncCall(new MethodInvoker(this.RefreshSecondaryViewContents)); } - void LeaveTabPage(object sender, EventArgs e) - { - OnWindowDeselected(EventArgs.Empty); - } - public IViewContent ViewContent { get { return content; @@ -260,6 +257,9 @@ namespace ICSharpCode.SharpDevelop.Gui if (viewTabControl != null) { foreach (TabPage page in viewTabControl.TabPages) { + if (viewTabControl.SelectedTab == page && page.Tag is IBaseViewContent) { + ((IBaseViewContent)page.Tag).Deselecting(); + } page.Controls.Clear(); if (viewTabControl.SelectedTab == page && page.Tag is IBaseViewContent) { ((IBaseViewContent)page.Tag).Deselected(); @@ -319,28 +319,40 @@ namespace ICSharpCode.SharpDevelop.Gui return content.SecondaryViewContents[index - 1]; } - int oldIndex = 0; - void viewTabControlIndexChanged(object sender, EventArgs e) + void viewTabControlSelected(object sender, TabControlEventArgs e) { - if (oldIndex >= 0) { - IBaseViewContent secondaryViewContent = GetSubViewContent(oldIndex); + if (e.Action == TabControlAction.Selected && e.TabPageIndex >= 0) { + IBaseViewContent secondaryViewContent = GetSubViewContent(e.TabPageIndex); if (secondaryViewContent != null) { secondaryViewContent.Deselected(); - } - } - - if (viewTabControl.SelectedIndex >= 0) { - IBaseViewContent secondaryViewContent = GetSubViewContent(viewTabControl.SelectedIndex); - if (secondaryViewContent != null) { secondaryViewContent.SwitchedTo(); secondaryViewContent.Selected(); } } - oldIndex = viewTabControl.SelectedIndex; WorkbenchSingleton.Workbench.WorkbenchLayout.OnActiveWorkbenchWindowChanged(EventArgs.Empty); ActiveViewContent.Control.Focus(); } + void viewTabControlDeselecting(object sender, TabControlCancelEventArgs e) + { + if (e.Action == TabControlAction.Deselecting && e.TabPageIndex >= 0) { + IBaseViewContent secondaryViewContent = GetSubViewContent(e.TabPageIndex); + if (secondaryViewContent != null) { + secondaryViewContent.Deselecting(); + } + } + } + + void viewTabControlDeselected(object sender, TabControlEventArgs e) + { + if (e.Action == TabControlAction.Deselected && e.TabPageIndex >= 0) { + IBaseViewContent secondaryViewContent = GetSubViewContent(e.TabPageIndex); + if (secondaryViewContent != null) { + secondaryViewContent.Deselected(); + } + } + } + public virtual void RedrawContent() { if (viewTabControl != null) {