Browse Source

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
shortcuts
Daniel Grunwald 19 years ago
parent
commit
5efb3e0526
  1. 30
      src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/FolderNodeCommands.cs
  2. 14
      src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs
  3. 9
      src/Main/Base/Project/Src/Gui/Workbench/DefaultWorkbench.cs
  4. 19
      src/Main/Base/Project/Src/Services/File/FileService.cs

30
src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/FolderNodeCommands.cs

@ -24,13 +24,32 @@ namespace ICSharpCode.SharpDevelop.Project.Commands @@ -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 @@ -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 @@ -222,12 +241,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
foreach (KeyValuePair<string, string> 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) {

14
src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs

@ -623,6 +623,17 @@ namespace ICSharpCode.SharpDevelop.Project @@ -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 @@ -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)

9
src/Main/Base/Project/Src/Gui/Workbench/DefaultWorkbench.cs

@ -146,7 +146,8 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -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 @@ -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 @@ -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 {

19
src/Main/Base/Project/Src/Services/File/FileService.cs

@ -258,10 +258,29 @@ namespace ICSharpCode.Core @@ -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<FileRenamingEventArgs> FileRenaming;
public static event EventHandler<FileRenameEventArgs> FileRenamed;
public static event EventHandler<FileCancelEventArgs> FileRemoving;
public static event EventHandler<FileEventArgs> FileRemoved;
public static event EventHandler<FileCancelEventArgs> FileReplacing;
public static event EventHandler<FileEventArgs> FileReplaced;
}
}

Loading…
Cancel
Save