diff --git a/src/Main/Base/Project/Src/Project/AbstractProject.cs b/src/Main/Base/Project/Src/Project/AbstractProject.cs index 74b1e70504..d44e292bc3 100644 --- a/src/Main/Base/Project/Src/Project/AbstractProject.cs +++ b/src/Main/Base/Project/Src/Project/AbstractProject.cs @@ -362,6 +362,15 @@ namespace ICSharpCode.SharpDevelop.Project return FindFile(fileName) != null; } + Dictionary findFileCache; + + internal protected void ClearFindFileCache() + { + lock (SyncRoot) { + findFileCache = null; + } + } + /// /// Returns the project item for a specific file; or null if the file is not found in the project. /// This member is thread-safe. @@ -370,12 +379,21 @@ namespace ICSharpCode.SharpDevelop.Project public FileProjectItem FindFile(string fileName) { lock (SyncRoot) { - return Linq.Find(Linq.OfType(this.Items), - delegate(FileProjectItem item) { - return FileUtility.IsEqualFileName(item.FileName, fileName); - }); - // return this.Items.OfType().Find( - // item => FileUtility.IsEqualFileName(item.FileName, outputFileName)); + if (findFileCache == null) { + findFileCache = new Dictionary(StringComparer.InvariantCultureIgnoreCase); + foreach (ProjectItem item in this.Items) { + FileProjectItem fileItem = item as FileProjectItem; + if (fileItem != null) { + findFileCache[item.FileName] = fileItem; + } + } + } + try { + fileName = Path.GetFullPath(fileName); + } catch {} + FileProjectItem outputItem; + findFileCache.TryGetValue(fileName, out outputItem); + return outputItem; } } diff --git a/src/Main/Base/Project/Src/Project/Items/ProjectItem.cs b/src/Main/Base/Project/Src/Project/Items/ProjectItem.cs index 10a412b4d8..34554ee11a 100644 --- a/src/Main/Base/Project/Src/Project/Items/ProjectItem.cs +++ b/src/Main/Base/Project/Src/Project/Items/ProjectItem.cs @@ -95,6 +95,10 @@ namespace ICSharpCode.SharpDevelop.Project internal BuildItem BuildItem { get { return buildItem; } set { + if (project is AbstractProject) { + ((AbstractProject)project).ClearFindFileCache(); + } + if (value != null) { virtualMetadata = null; virtualItemType = default(ItemType); @@ -143,6 +147,10 @@ namespace ICSharpCode.SharpDevelop.Project } set { lock (SyncRoot) { + if (project is AbstractProject) { + ((AbstractProject)project).ClearFindFileCache(); + } + if (buildItem != null) buildItem.Include = MSBuildInternals.Escape(value); else @@ -371,6 +379,11 @@ namespace ICSharpCode.SharpDevelop.Project if (fileName == null) { lock (SyncRoot) { fileName = Path.Combine(project.Directory, this.Include); + try { + if (Path.IsPathRooted(fileName)) { + fileName = Path.GetFullPath(fileName); + } + } catch {} fileNameCache = fileName; } } diff --git a/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs b/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs index ef5940206d..00f6d437f3 100644 --- a/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs +++ b/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs @@ -713,6 +713,7 @@ namespace ICSharpCode.SharpDevelop.Project items.Add(CreateProjectItem(item)); } } + ClearFindFileCache(); } void IProjectItemListProvider.AddProjectItem(ProjectItem item) diff --git a/src/Main/ICSharpCode.SharpDevelop.Sda/Src/SharpDevelopHost.cs b/src/Main/ICSharpCode.SharpDevelop.Sda/Src/SharpDevelopHost.cs index 43e5261a99..ba3d8893b3 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Sda/Src/SharpDevelopHost.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Sda/Src/SharpDevelopHost.cs @@ -284,13 +284,13 @@ namespace ICSharpCode.SharpDevelop.Sda } /// - /// Event before the workbench has been unloaded. + /// Event before the workbench starts running. /// [SuppressMessage("Microsoft.Naming", "CA1713:EventsShouldNotHaveBeforeOrAfterPrefix")] public event EventHandler BeforeRunWorkbench; /// - /// Event after the workbench has been unloaded. Occurs on the thread + /// Event after the workbench has been unloaded. /// public event EventHandler WorkbenchClosed; diff --git a/src/Main/StartUp/Project/Dialogs/SplashScreen.cs b/src/Main/StartUp/Project/Dialogs/SplashScreen.cs index 6b33220428..c6e7400bf2 100644 --- a/src/Main/StartUp/Project/Dialogs/SplashScreen.cs +++ b/src/Main/StartUp/Project/Dialogs/SplashScreen.cs @@ -25,6 +25,9 @@ namespace ICSharpCode.SharpDevelop get { return splashScreen; } + set { + splashScreen = value; + } } public SplashScreenForm() diff --git a/src/Main/StartUp/Project/SharpDevelopMain.cs b/src/Main/StartUp/Project/SharpDevelopMain.cs index 3f05424e09..30b1f5a838 100644 --- a/src/Main/StartUp/Project/SharpDevelopMain.cs +++ b/src/Main/StartUp/Project/SharpDevelopMain.cs @@ -131,6 +131,7 @@ namespace ICSharpCode.SharpDevelop host.BeforeRunWorkbench += delegate { if (SplashScreenForm.SplashScreen != null) { SplashScreenForm.SplashScreen.BeginInvoke(new MethodInvoker(SplashScreenForm.SplashScreen.Dispose)); + SplashScreenForm.SplashScreen = null; } };