diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserPad.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserPad.cs index 372ae73abe..f4bf5fb795 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserPad.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserPad.cs @@ -145,25 +145,36 @@ namespace ICSharpCode.SharpDevelop.Project projectBrowserPanel.Clear(); } - string lastFileName; + bool activeContentChangedEnqueued; void ActiveContentChanged(object sender, EventArgs e) { + // this event may occur several times quickly after another (e.g. when opening or closing multiple files) + // do the potentially expensive selection of the item in the tree view only once after the last change + if (!activeContentChangedEnqueued) { + activeContentChangedEnqueued = true; + WorkbenchSingleton.SafeThreadAsyncCall(ActiveContentChangedInvoked); + } + } + + void ActiveContentChangedInvoked() + { + activeContentChangedEnqueued = false; if (WorkbenchSingleton.Workbench.ActiveContent == this) { projectBrowserPanel.ProjectBrowserControl.PadActivated(); } else { - IViewContent content = WorkbenchSingleton.Workbench.ActiveViewContent; + // we don't use ActiveViewContent here as this is the ActiveContent change event handler + IViewContent content = WorkbenchSingleton.Workbench.ActiveContent as IViewContent; if (content == null) return; string fileName = content.PrimaryFileName; - if (fileName == null || lastFileName == fileName) { + if (fileName == null) { return; } if (!FileUtility.IsValidPath(fileName)) { return; } - lastFileName = fileName; projectBrowserPanel.SelectFile(fileName); } }