From 5efb3e05260298f15fe9694bf7d1e0d3b26e202e Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 16 Jun 2006 14:24:59 +0000 Subject: [PATCH] Fixed SD2-825: Drop file into project browser overwrites file without no warning git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1484 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Commands/FolderNodeCommands.cs | 30 ++++++++++++++----- .../ProjectBrowser/TreeNodes/DirectoryNode.cs | 14 +++++++++ .../Src/Gui/Workbench/DefaultWorkbench.cs | 9 +++--- .../Project/Src/Services/File/FileService.cs | 19 ++++++++++++ 4 files changed, 60 insertions(+), 12 deletions(-) diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/FolderNodeCommands.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/FolderNodeCommands.cs index 3d406d63c4..d7cf6e26b3 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/FolderNodeCommands.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/FolderNodeCommands.cs @@ -24,13 +24,32 @@ namespace ICSharpCode.SharpDevelop.Project.Commands { public class AddExistingItemsToProject : AbstractMenuCommand { - enum ReplaceExistingFile { + public enum ReplaceExistingFile { Yes = 0, YesToAll = 1, No = 2, Cancel = 3 } + public static ReplaceExistingFile ShowReplaceExistingFileDialog(string caption, string fileName, bool replacingMultiple) + { + if (caption == null) + caption = "${res:ProjectComponent.ContextMenu.AddExistingFiles.ReplaceExistingFile.Title}"; + string text = StringParser.Parse("${res:ProjectComponent.ContextMenu.AddExistingFiles.ReplaceExistingFile}", new string[,] {{"FileName", fileName}}); + if (replacingMultiple) { + return (ReplaceExistingFile) + MessageService.ShowCustomDialog(caption, text, + 0, 3, + "${res:Global.Yes}", + "${res:Global.YesToAll}", + "${res:Global.No}", + "${res:Global.CancelButtonText}"); + } else { + return MessageService.AskQuestion(text, caption) + ? ReplaceExistingFile.Yes : ReplaceExistingFile.No; + } + } + int GetFileFilterIndex(IProject project, string[] fileFilters) { if (project != null) { @@ -111,7 +130,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands string copiedFileName = Path.Combine(node.Directory, Path.GetFileName(fileName)); if (!FileUtility.IsEqualFileName(fileName, copiedFileName)) { File.Copy(fileName, copiedFileName, true); - } + } if (includeInProject) { FileNode fileNode; foreach (TreeNode childNode in node.AllNodes) { @@ -222,12 +241,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands foreach (KeyValuePair pair in fileNames) { copiedFileName = Path.Combine(node.Directory, Path.GetFileName(pair.Key)); if (!replaceAll && File.Exists(copiedFileName) && !FileUtility.IsEqualFileName(pair.Key, copiedFileName)) { - ReplaceExistingFile res = (ReplaceExistingFile)MessageService.ShowCustomDialog(fdiag.Title, "A file with the name '" + Path.GetFileName(pair.Key) + "' already exists. Do you want to replace it?", - 0, 3, - "${res:Global.Yes}", - "Yes to All", - "${res:Global.No}", - "${res:Global.CancelButtonText}"); + ReplaceExistingFile res = ShowReplaceExistingFileDialog(fdiag.Title, Path.GetFileName(pair.Key), true); if (res == ReplaceExistingFile.YesToAll) { replaceAll = true; } else if (res == ReplaceExistingFile.No) { diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs index dc5c3b4ef9..6af5b606a2 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs @@ -623,6 +623,17 @@ namespace ICSharpCode.SharpDevelop.Project string copiedFileName = Path.Combine(Directory, shortFileName); if (FileUtility.IsEqualFileName(fileName, copiedFileName)) return; + bool wasFileReplacement = false; + if (File.Exists(copiedFileName)) { + if (!FileService.FireFileReplacing(copiedFileName, false)) + return; + if (AddExistingItemsToProject.ShowReplaceExistingFileDialog(null, copiedFileName, false) == AddExistingItemsToProject.ReplaceExistingFile.Yes) { + wasFileReplacement = true; + } else { + // don't replace file + return; + } + } FileProjectItem newItem = AddExistingItemsToProject.CopyFile(fileName, this, true); IProject sourceProject = Solution.FindProjectContainingFile(fileName); @@ -659,6 +670,9 @@ namespace ICSharpCode.SharpDevelop.Project } FileService.RemoveFile(fileName, false); } + if (wasFileReplacement) { + FileService.FireFileReplaced(copiedFileName, false); + } } public void CopyFileHere(FileNode node, bool performMove) diff --git a/src/Main/Base/Project/Src/Gui/Workbench/DefaultWorkbench.cs b/src/Main/Base/Project/Src/Gui/Workbench/DefaultWorkbench.cs index acbab35bba..0886619a60 100644 --- a/src/Main/Base/Project/Src/Gui/Workbench/DefaultWorkbench.cs +++ b/src/Main/Base/Project/Src/Gui/Workbench/DefaultWorkbench.cs @@ -146,7 +146,8 @@ namespace ICSharpCode.SharpDevelop.Gui ProjectService.CurrentProjectChanged += new ProjectEventHandler(SetProjectTitle); - FileService.FileRemoved += CheckRemovedFile; + FileService.FileRemoved += CheckRemovedOrReplacedFile; + FileService.FileReplaced += CheckRemovedOrReplacedFile; FileService.FileRenamed += CheckRenamedFile; FileService.FileRemoved += FileService.RecentOpen.FileRemoved; @@ -365,7 +366,7 @@ namespace ICSharpCode.SharpDevelop.Gui } } - void CheckRemovedFile(object sender, FileEventArgs e) + void CheckRemovedOrReplacedFile(object sender, FileEventArgs e) { for (int i = 0; i < ViewContentCollection.Count;) { if (FileUtility.IsBaseDirectory(e.FileName, ViewContentCollection[i].FileName)) { @@ -380,8 +381,8 @@ namespace ICSharpCode.SharpDevelop.Gui { if (e.IsDirectory) { foreach (IViewContent content in ViewContentCollection) { - if (content.FileName != null && content.FileName.StartsWith(e.SourceFile)) { - content.FileName = e.TargetFile + content.FileName.Substring(e.SourceFile.Length); + if (content.FileName != null && FileUtility.IsBaseDirectory(e.SourceFile, content.FileName)) { + content.FileName = FileUtility.RenameBaseDirectory(content.FileName, e.SourceFile, e.TargetFile); } } } else { diff --git a/src/Main/Base/Project/Src/Services/File/FileService.cs b/src/Main/Base/Project/Src/Services/File/FileService.cs index 2cd1c9e5cb..d18e3a3902 100644 --- a/src/Main/Base/Project/Src/Services/File/FileService.cs +++ b/src/Main/Base/Project/Src/Services/File/FileService.cs @@ -258,10 +258,29 @@ namespace ICSharpCode.Core } } + public static bool FireFileReplacing(string fileName, bool isDirectory) + { + FileCancelEventArgs e = new FileCancelEventArgs(fileName, isDirectory); + if (FileReplacing != null) { + FileReplacing(null, e); + } + return !e.Cancel; + } + + public static void FireFileReplaced(string fileName, bool isDirectory) + { + if (FileReplaced != null) { + FileReplaced(null, new FileEventArgs(fileName, isDirectory)); + } + } + public static event EventHandler FileRenaming; public static event EventHandler FileRenamed; public static event EventHandler FileRemoving; public static event EventHandler FileRemoved; + + public static event EventHandler FileReplacing; + public static event EventHandler FileReplaced; } }