diff --git a/AddIns/ICSharpCode.SharpDevelop.addin b/AddIns/ICSharpCode.SharpDevelop.addin index 6f3e6a1971..76aed7b736 100644 --- a/AddIns/ICSharpCode.SharpDevelop.addin +++ b/AddIns/ICSharpCode.SharpDevelop.addin @@ -2043,7 +2043,9 @@ <Class id="EqualsCodeGenerator" class="ICSharpCode.SharpDevelop.DefaultEditor.Commands.EqualsCodeGenerator"/> </Path> - <!-- + <Path name = "/SharpDevelop/Workbench/DependentFileExtensions"> - </Path>--> + <String id = "FormsDesignerGeneratedCode" text=".Designer${Extension}"/> + <String id = "FormsDesignerResources" text=".resx"/> + </Path> </AddIn> diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/DefaultFileNodeCommands.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/DefaultFileNodeCommands.cs index 123308c3a8..b716d42e96 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/DefaultFileNodeCommands.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/DefaultFileNodeCommands.cs @@ -52,6 +52,14 @@ namespace ICSharpCode.SharpDevelop.Project.Commands { void ExcludeFileNode(FileNode fileNode) { + List<FileNode> dependentNodes = new List<FileNode>(); + foreach (TreeNode subNode in fileNode.Nodes) { + // exclude dependent files + if (subNode is FileNode) + dependentNodes.Add((FileNode)subNode); + } + dependentNodes.ForEach(ExcludeFileNode); + ProjectService.RemoveProjectItem(fileNode.Project, fileNode.ProjectItem); fileNode.ProjectItem = null; fileNode.FileNodeStatus = FileNodeStatus.None; 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 975a16030e..dad10bffe3 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 @@ -121,6 +121,18 @@ namespace ICSharpCode.SharpDevelop.Project.Commands return null; } + public static IEnumerable<string> FindAdditionalFiles(string fileName) + { + List<string> list = new List<string>(); + StringParser.Properties["Extension"] = Path.GetExtension(fileName); + string prefix = Path.Combine(Path.GetDirectoryName(fileName), Path.GetFileNameWithoutExtension(fileName)); + foreach (string ext in AddInTree.BuildItems("/SharpDevelop/Workbench/DependentFileExtensions", null, true)) { + if (File.Exists(prefix + ext)) + list.Add(prefix + ext); + } + return list; + } + public override void Run() { TreeNode selectedNode = ProjectBrowserPad.Instance.ProjectBrowserControl.SelectedNode; @@ -145,35 +157,63 @@ namespace ICSharpCode.SharpDevelop.Project.Commands fdiag.Title = StringParser.Parse("${res:ProjectComponent.ContextMenu.AddExistingFiles}"); if (fdiag.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm) == DialogResult.OK) { - string copiedFileName = Path.Combine(node.Directory, Path.GetFileName(fdiag.FileNames[0])); - if (!FileUtility.IsEqualFileName(fdiag.FileNames[0], copiedFileName)) { + List<KeyValuePair<string, string>> fileNames = new List<KeyValuePair<string, string>>(fdiag.FileNames.Length); + foreach (string fileName in fdiag.FileNames) { + fileNames.Add(new KeyValuePair<string, string>(fileName, "")); + } + bool addedDependentFiles = false; + foreach (string fileName in fdiag.FileNames) { + foreach (string additionalFile in FindAdditionalFiles(fileName)) { + if (!fileNames.Exists(delegate(KeyValuePair<string, string> pair) { + return FileUtility.IsEqualFileName(pair.Key, additionalFile); + })) + { + addedDependentFiles = true; + fileNames.Add(new KeyValuePair<string, string>(additionalFile, Path.GetFileName(fileName))); + } + } + } + + + + string copiedFileName = Path.Combine(node.Directory, Path.GetFileName(fileNames[0].Key)); + if (!FileUtility.IsEqualFileName(fileNames[0].Key, copiedFileName)) { int res = MessageService.ShowCustomDialog(fdiag.Title, "${res:ProjectComponent.ContextMenu.AddExistingFiles.Question}", 0, 2, "${res:ProjectComponent.ContextMenu.AddExistingFiles.Copy}", "${res:ProjectComponent.ContextMenu.AddExistingFiles.Link}", "${res:Global.CancelButtonText}"); if (res == 1) { - foreach (string fileName in fdiag.FileNames) { + foreach (KeyValuePair<string, string> pair in fileNames) { + string fileName = pair.Key; string relFileName = FileUtility.GetRelativePath(node.Project.Directory, fileName); FileNode fileNode = new FileNode(fileName, FileNodeStatus.InProject); FileProjectItem fileProjectItem = new FileProjectItem(node.Project, IncludeFileInProject.GetDefaultItemType(node.Project, fileName)); fileProjectItem.Include = relFileName; fileProjectItem.Properties.Set("Link", Path.Combine(node.RelativePath, Path.GetFileName(fileName))); + fileProjectItem.DependentUpon = pair.Value; fileNode.ProjectItem = fileProjectItem; fileNode.AddTo(node); ProjectService.AddProjectItem(node.Project, fileProjectItem); } node.Project.Save(); + if (addedDependentFiles) + node.RecreateSubNodes(); return; } if (res == 2) { return; } } - foreach (string fileName in fdiag.FileNames) { - CopyFile(fileName, node, true); + foreach (KeyValuePair<string, string> pair in fileNames) { + FileProjectItem item = CopyFile(pair.Key, node, true); + if (item != null) { + item.DependentUpon = pair.Value; + } } node.Project.Save(); + if (addedDependentFiles) + node.RecreateSubNodes(); } } } 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 7764cf5cdf..20533abafb 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 @@ -494,7 +494,7 @@ namespace ICSharpCode.SharpDevelop.Project } this.directory = newPath; - ProjectService.SaveSolution(); + Project.Save(); } } public override object AcceptVisitor(ProjectBrowserTreeNodeVisitor visitor, object data) diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/FileNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/FileNode.cs index 778193c9be..e86c19dac5 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/FileNode.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/FileNode.cs @@ -199,18 +199,17 @@ namespace ICSharpCode.SharpDevelop.Project { if (FileNodeStatus == FileNodeStatus.Missing) { FileService.RemoveFile(FileName, false); - ProjectService.SaveSolution(); + Project.Save(); } else { if (Nodes.Count > 0) { if (MessageService.AskQuestion(GetQuestionText("${res:ProjectComponent.ContextMenu.DeleteWithDependentFiles.Question}"))) { DeleteChildNodes(); FileService.RemoveFile(FileName, false); - ProjectService.SaveSolution(); + Project.Save(); } - } - else if (MessageService.AskQuestion(GetQuestionText("${res:ProjectComponent.ContextMenu.Delete.Question}"))) { + } else if (MessageService.AskQuestion(GetQuestionText("${res:ProjectComponent.ContextMenu.Delete.Question}"))) { FileService.RemoveFile(FileName, false); - ProjectService.SaveSolution(); + Project.Save(); } } } diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionFolderNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionFolderNode.cs index b43b88a3c9..c691ccf2af 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionFolderNode.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionFolderNode.cs @@ -80,7 +80,7 @@ namespace ICSharpCode.SharpDevelop.Project return; } Text = folder.Location = folder.Name = newName; - ProjectService.SaveSolution(); + solution.Save(); } public void AddItem(string fileName) @@ -123,7 +123,7 @@ namespace ICSharpCode.SharpDevelop.Project public override void Delete() { ProjectService.RemoveSolutionFolder(folder.IdGuid); - ProjectService.SaveSolution(); + solution.Save(); } public override bool EnableCopy { diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionItemNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionItemNode.cs index 1aca72e91b..c1ea4f88f1 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionItemNode.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/SolutionItemNode.cs @@ -128,7 +128,7 @@ namespace ICSharpCode.SharpDevelop.Project string newFileName = Path.Combine(Path.GetDirectoryName(this.FileName), newName); FileService.RenameFile(this.FileName, newFileName, false); - ProjectService.SaveSolution(); + solution.Save(); } public override object AcceptVisitor(ProjectBrowserTreeNodeVisitor visitor, object data) {