From 18699759d9d51b5f6aa7719f0d5c127fa7cc6aca Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 28 Feb 2009 21:07:20 +0000 Subject: [PATCH] Handle errors when writing new class diagram (fixes forum-9024: Read only class diagram file causing System.UnauthorizedAccessException) git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3828 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../ClassDiagramAddin.csproj | 4 ++- .../Src/ShowClassDiagramCommand.cs | 27 ++++++++++++------- .../Commands/SolutionNodeCommands.cs | 4 +++ .../ProjectBrowser/ProjectBrowserControl.cs | 5 +++- .../Src/Services/FileUtility/FileUtility.cs | 2 +- 5 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/AddIns/DisplayBindings/ClassDiagram/ClassDiagramAddin/ClassDiagramAddin.csproj b/src/AddIns/DisplayBindings/ClassDiagram/ClassDiagramAddin/ClassDiagramAddin.csproj index ca83006201..f71a1fdea6 100644 --- a/src/AddIns/DisplayBindings/ClassDiagram/ClassDiagramAddin/ClassDiagramAddin.csproj +++ b/src/AddIns/DisplayBindings/ClassDiagram/ClassDiagramAddin/ClassDiagramAddin.csproj @@ -1,4 +1,4 @@ - + Library ClassDiagramAddin @@ -11,6 +11,8 @@ False 4 false + C:\Users\Daniel\AppData\Roaming\ICSharpCode/SharpDevelop3.0\Settings.SourceAnalysis + v2.0 obj\Debug\ diff --git a/src/AddIns/DisplayBindings/ClassDiagram/ClassDiagramAddin/Src/ShowClassDiagramCommand.cs b/src/AddIns/DisplayBindings/ClassDiagram/ClassDiagramAddin/Src/ShowClassDiagramCommand.cs index fd3f192d87..2aa0237ac0 100644 --- a/src/AddIns/DisplayBindings/ClassDiagram/ClassDiagramAddin/Src/ShowClassDiagramCommand.cs +++ b/src/AddIns/DisplayBindings/ClassDiagram/ClassDiagramAddin/Src/ShowClassDiagramCommand.cs @@ -11,12 +11,12 @@ using System.IO; using System.Windows.Forms; using ClassDiagram; - using ICSharpCode.Core; using ICSharpCode.SharpDevelop; -using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Commands; using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.SharpDevelop.Project; +using System.Xml; namespace ClassDiagramAddin { @@ -50,15 +50,24 @@ namespace ClassDiagramAddin } classcanvas.AutoArrange(); - classcanvas.WriteToXml().Save(filename); - FileProjectItem fpi = new FileProjectItem(p, ItemType.Content); - fpi.FileName = filename; - ProjectService.AddProjectItem(p, fpi); - ProjectBrowserPad.Instance.ProjectBrowserControl.RefreshView(); - p.Save(); - FileService.OpenFile(filename); + XmlDocument xmlDocument = classcanvas.WriteToXml(); + FileUtility.ObservedSave( + newFileName => SaveAndOpenNewClassDiagram(p, newFileName, xmlDocument), + filename, FileErrorPolicy.ProvideAlternative + ); } } + + void SaveAndOpenNewClassDiagram(IProject p, string filename, XmlDocument xmlDocument) + { + xmlDocument.Save(filename); + FileProjectItem fpi = new FileProjectItem(p, ItemType.Content); + fpi.FileName = filename; + ProjectService.AddProjectItem(p, fpi); + ProjectBrowserPad.Instance.ProjectBrowserControl.RefreshView(); + p.Save(); + FileService.OpenFile(filename); + } } } diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/SolutionNodeCommands.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/SolutionNodeCommands.cs index dfb26c6380..0ef870a9b5 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/SolutionNodeCommands.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/SolutionNodeCommands.cs @@ -68,11 +68,15 @@ namespace ICSharpCode.SharpDevelop.Project.Commands { public static void AddProject(ISolutionFolderNode solutionFolderNode, string fileName) { + if (solutionFolderNode == null) + throw new ArgumentNullException("solutionFolderNode"); AddProject(solutionFolderNode, LanguageBindingService.LoadProject(solutionFolderNode.Solution, fileName, Path.GetFileNameWithoutExtension(fileName))); } public static void AddProject(ISolutionFolderNode solutionFolderNode, IProject newProject) { + if (solutionFolderNode == null) + throw new ArgumentNullException("solutionFolderNode"); if (newProject != null) { newProject.Location = FileUtility.GetRelativePath(solutionFolderNode.Solution.Directory, newProject.FileName); ProjectService.AddProject(solutionFolderNode, newProject); diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserControl.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserControl.cs index 9a5225277c..8c826367d0 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserControl.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserControl.cs @@ -65,7 +65,10 @@ namespace ICSharpCode.SharpDevelop.Project public AbstractProjectBrowserTreeNode RootNode { get { - return treeView.Nodes[0] as AbstractProjectBrowserTreeNode; + if (treeView.Nodes.Count > 0) + return treeView.Nodes[0] as AbstractProjectBrowserTreeNode; + else + return null; } } diff --git a/src/Main/Core/Project/Src/Services/FileUtility/FileUtility.cs b/src/Main/Core/Project/Src/Services/FileUtility/FileUtility.cs index 1eeb475145..d0c5401868 100644 --- a/src/Main/Core/Project/Src/Services/FileUtility/FileUtility.cs +++ b/src/Main/Core/Project/Src/Services/FileUtility/FileUtility.cs @@ -552,7 +552,7 @@ namespace ICSharpCode.Core ServiceManager.MessageService.InformSaveError(fileName, message, "${res:FileUtilityService.ErrorWhileSaving}", e); break; case FileErrorPolicy.ProvideAlternative: - ChooseSaveErrorResult r = ServiceManager.MessageService.ChooseSaveError(fileName, message, "${res:FileUtilityService.ErrorWhileSaving}", e, false); + ChooseSaveErrorResult r = ServiceManager.MessageService.ChooseSaveError(fileName, message, "${res:FileUtilityService.ErrorWhileSaving}", e, true); if (r.IsRetry) { return ObservedSave(saveFileAs, fileName, message, policy); } else if (r.IsIgnore) {