diff options
author | Lluis Sanchez <lluis@novell.com> | 2010-04-09 16:10:04 +0400 |
---|---|---|
committer | Lluis Sanchez <lluis@novell.com> | 2010-04-09 16:10:04 +0400 |
commit | 167e7b7eb69ccecbfedba602ab11cc81d9e68761 (patch) | |
tree | 3d0caf04b2e6e83b622aa2fca2c3e89a3cf80def /main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad | |
parent | b3b29e6c33bea932d07f07d2fa7bc6344c361f57 (diff) |
* Makefile.am:
* MonoDevelop.Ide.csproj:
* MonoDevelop.Ide.addin.xml:
* MonoDevelop.Ide/ProjectOperations.cs:
* MonoDevelop.Ide.Gui.Pads.ProjectPad/SolutionNodeBuilder.cs:
* MonoDevelop.Ide.Gui.Pads.ProjectPad/SystemFileNodeBuilder.cs:
* MonoDevelop.Ide.Gui.Pads.ProjectPad/SolutionFolderNodeBuilder.cs:
* MonoDevelop.Ide.Gui.Pads.ProjectPad/ShowAllFilesBuilderExtension.cs:
* MonoDevelop.Ide.Gui.Pads.ProjectPad/SolutionFolderFileNodeBuilder.cs:
Add support for adding files to solution folders.
* MonoDevelop.Ide/MessageService.cs:
* MonoDevelop.Ide.Gui.Dialogs/AlertDialog.cs: Introduced the
MessageDescription hierarchy of classes, which allow setting all
message dialog settings in an object. It also adds support for the
Apply to All option and other custom options.
* MonoDevelop.Ide.Gui.Components/TreeBuilder.cs:
* MonoDevelop.Ide.Gui.Components/ExtensibleTreeView.cs:
* MonoDevelop.Ide.Gui.Components/TransactedTreeBuilder.cs: While in a
transaction, make sure the OnNodeAdded event is fired when the node
is added, not when the transaction is committed.
svn path=/trunk/monodevelop/; revision=155135
Diffstat (limited to 'main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad')
5 files changed, 332 insertions, 24 deletions
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ShowAllFilesBuilderExtension.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ShowAllFilesBuilderExtension.cs index bb17bb9f5a..d09c158dcd 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ShowAllFilesBuilderExtension.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ShowAllFilesBuilderExtension.cs @@ -135,9 +135,14 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad if (builder.Options ["ShowAllFiles"] && Directory.Exists (path)) { Project project = (Project) builder.GetParentDataItem (typeof(Project), true); + SolutionFolderFileCollection folderFiles = null; + if (dataObject is Solution) + folderFiles = ((Solution)dataObject).RootFolder.Files; + else if (dataObject is SolutionFolder) + folderFiles = ((SolutionFolder)dataObject).Files; foreach (string file in Directory.GetFiles (path)) { - if (project == null || project.Files.GetFile (file) == null) + if ((project == null || project.Files.GetFile (file) == null) && (folderFiles == null || !folderFiles.Contains (file))) builder.AddChild (new SystemFile (file, project)); } diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SolutionFolderFileNodeBuilder.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SolutionFolderFileNodeBuilder.cs new file mode 100644 index 0000000000..5b54961b3b --- /dev/null +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SolutionFolderFileNodeBuilder.cs @@ -0,0 +1,160 @@ +// +// SolutionFolderFileNodeBuilder.cs +// +// Author: +// Lluis Sanchez Gual <lluis@novell.com> +// +// Copyright (c) 2010 Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +using System; +using MonoDevelop.Projects; +using MonoDevelop.Ide.Gui.Components; +using MonoDevelop.Core; +using MonoDevelop.Components.Commands; +using MonoDevelop.Ide.Commands; +using MonoDevelop.Components; + +namespace MonoDevelop.Ide.Gui.Pads.ProjectPad +{ + public class SolutionFolderFileNodeBuilder: TypeNodeBuilder + { + public override Type NodeDataType { + get { + return typeof(SolutionFolderFileNode); + } + } + + public override Type CommandHandlerType { + get { return typeof(SolutionFolderFileNodeCommandHandler); } + } + + public override string GetNodeName (ITreeNavigator thisNode, object dataObject) + { + return ((SolutionFolderFileNode)dataObject).FileName; + } + + public override void BuildNode (ITreeBuilder treeBuilder, object dataObject, ref string label, ref Gdk.Pixbuf icon, ref Gdk.Pixbuf closedIcon) + { + SolutionFolderFileNode file = (SolutionFolderFileNode) dataObject; + label = file.FileName.FileName; + if (!System.IO.File.Exists (file.FileName)) + label = "<span foreground='red'>" + label + "</span>"; + icon = DesktopService.GetPixbufForFile (file.FileName, Gtk.IconSize.Menu); + } + + public override object GetParentObject (object dataObject) + { + SolutionFolderFileNode file = (SolutionFolderFileNode) dataObject; + if (file.Parent.IsRoot) + return file.Parent.ParentSolution; + else + return file.Parent; + } + + public override int CompareObjects (ITreeNavigator thisNode, ITreeNavigator otherNode) + { + if (otherNode.DataItem is SolutionFolderFileNode) + return DefaultSort; + else + return -1; + } + } + + class SolutionFolderFileNodeCommandHandler: NodeCommandHandler + { + public override void DeleteMultipleItems () + { + QuestionMessage msg = new QuestionMessage (); + msg.SecondaryText = GettextCatalog.GetString ("The Delete option permanently removes the file from your hard disk. Click Remove from Solution if you only want to remove it from your current solution."); + AlertButton removeFromSolution = new AlertButton (GettextCatalog.GetString ("_Remove from Solution"), Gtk.Stock.Remove); + msg.Buttons.Add (AlertButton.Delete); + msg.Buttons.Add (AlertButton.Cancel); + msg.Buttons.Add (removeFromSolution); + msg.AllowApplyToAll = true; + + foreach (ITreeNavigator nav in CurrentNodes) { + SolutionFolderFileNode file = (SolutionFolderFileNode) nav.DataItem; + if (file.Parent.IsRoot) + msg.Text = GettextCatalog.GetString ("Are you sure you want to remove the file {0} from the solution folder {1}?", file.FileName.FileName, file.Parent.Name); + else + msg.Text = GettextCatalog.GetString ("Are you sure you want to remove the file {0} from the solution {1}?", file.FileName.FileName, file.Parent.ParentSolution.Name); + AlertButton result = MessageService.AskQuestion (msg); + if (result == AlertButton.Cancel) + return; + + file.Parent.Files.Remove (file.FileName); + + if (result == AlertButton.Delete) { + FileService.DeleteFile (file.FileName); + } + } + } + + public override void ActivateItem () + { + SolutionFolderFileNode file = (SolutionFolderFileNode) CurrentNode.DataItem; + IdeApp.Workbench.OpenDocument (file.FileName); + } + + public override DragOperation CanDragNode () + { + return DragOperation.Copy | DragOperation.Move; + } + } + + public class SolutionFolderFileNode: IFileItem + { + FilePath file; + SolutionFolder parent; + + public SolutionFolderFileNode (FilePath file, SolutionFolder parent) + { + this.file = file; + this.parent = parent; + } + + public FilePath FileName { + get { return this.file; } + set { this.file = value; } + } + + public SolutionFolder Parent { + get { return this.parent; } + set { this.parent = value; } + } + + public override bool Equals (object obj) + { + SolutionFolderFileNode other = obj as SolutionFolderFileNode; + if (other == null) + return false; + return file == other.file && parent == other.parent; + } + + public override int GetHashCode () + { + unchecked { + return file.GetHashCode () + parent.GetHashCode (); + } + } + } +} + diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SolutionFolderNodeBuilder.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SolutionFolderNodeBuilder.cs index 18de3241f0..acf9669257 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SolutionFolderNodeBuilder.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SolutionFolderNodeBuilder.cs @@ -36,6 +36,7 @@ using MonoDevelop.Ide.Commands; using MonoDevelop.Ide.Gui; using MonoDevelop.Components.Commands; using MonoDevelop.Ide.Gui.Components; +using MonoDevelop.Components; namespace MonoDevelop.Ide.Gui.Pads.ProjectPad { @@ -44,12 +45,16 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad SolutionItemRenamedEventHandler combineNameChanged; SolutionItemChangeEventHandler combineEntryAdded; SolutionItemChangeEventHandler combineEntryRemoved; + EventHandler<SolutionItemFileEventArgs> fileAdded; + EventHandler<SolutionItemFileEventArgs> fileRemoved; public SolutionFolderNodeBuilder () { combineNameChanged = (SolutionItemRenamedEventHandler) DispatchService.GuiDispatch (new SolutionItemRenamedEventHandler (OnCombineRenamed)); combineEntryAdded = (SolutionItemChangeEventHandler) DispatchService.GuiDispatch (new SolutionItemChangeEventHandler (OnEntryAdded)); combineEntryRemoved = (SolutionItemChangeEventHandler) DispatchService.GuiDispatch (new SolutionItemChangeEventHandler (OnEntryRemoved)); + fileAdded = (EventHandler<SolutionItemFileEventArgs>) DispatchService.GuiDispatch (new EventHandler<SolutionItemFileEventArgs> (OnFileAdded)); + fileRemoved = (EventHandler<SolutionItemFileEventArgs>) DispatchService.GuiDispatch (new EventHandler<SolutionItemFileEventArgs> (OnFileRemoved)); } public override Type NodeDataType { @@ -80,14 +85,17 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad public override void BuildChildNodes (ITreeBuilder ctx, object dataObject) { - SolutionFolder combine = (SolutionFolder) dataObject; - foreach (SolutionItem entry in combine.Items) + SolutionFolder folder = (SolutionFolder) dataObject; + foreach (SolutionItem entry in folder.Items) ctx.AddChild (entry); + foreach (FilePath file in folder.Files) + ctx.AddChild (new SolutionFolderFileNode (file, folder)); } public override bool HasChildNodes (ITreeBuilder builder, object dataObject) { - return ((SolutionFolder) dataObject).Items.Count > 0; + SolutionFolder sf = (SolutionFolder) dataObject; + return sf.Items.Count > 0 || sf.Files.Count > 0; } public override object GetParentObject (object dataObject) @@ -110,6 +118,8 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad folder.NameChanged += combineNameChanged; folder.ItemAdded += combineEntryAdded; folder.ItemRemoved += combineEntryRemoved; + folder.SolutionItemFileAdded += fileAdded; + folder.SolutionItemFileRemoved += fileRemoved; } public override void OnNodeRemoved (object dataObject) @@ -118,6 +128,8 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad folder.NameChanged -= combineNameChanged; folder.ItemAdded -= combineEntryAdded; folder.ItemRemoved -= combineEntryRemoved; + folder.SolutionItemFileAdded -= fileAdded; + folder.SolutionItemFileRemoved -= fileRemoved; } void OnCombineRenamed (object sender, SolutionItemRenamedEventArgs e) @@ -141,6 +153,25 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad if (tb != null) tb.Remove (); } + + void OnFileAdded (object s, SolutionItemFileEventArgs args) + { + SolutionFolder folder = (SolutionFolder) s; + ITreeBuilder tb = Context.GetTreeBuilder (folder); + if (tb != null) { + tb.AddChild (new SolutionFolderFileNode (args.File, folder)); + } + } + + void OnFileRemoved (object s, SolutionItemFileEventArgs args) + { + SolutionFolder folder = (SolutionFolder) s; + ITreeBuilder tb = Context.GetTreeBuilder (folder); + if (tb != null) { + if (tb.MoveToChild (args.File, typeof(SolutionFolderFileNode))) + tb.Remove (); + } + } } public class CombineNodeCommandHandler: NodeCommandHandler @@ -164,6 +195,8 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad public override bool CanDropNode (object dataObject, DragOperation operation) { + if (dataObject is IFileItem) + return true; SolutionItem it = dataObject as SolutionItem; return it != null && operation == DragOperation.Move; } @@ -171,13 +204,29 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad public override void OnNodeDrop (object dataObject, DragOperation operation) { SolutionFolder folder = (SolutionFolder) CurrentNode.DataItem; - SolutionItem it = (SolutionItem) dataObject; - if (!MessageService.Confirm (GettextCatalog.GetString ("Are you sure you want to move the item '{0}' to the solution folder '{1}'?", it.Name, folder.Name), AlertButton.Move)) - return; - - // If the items belongs to another folder, it will be automatically removed from it - folder.Items.Add (it); - IdeApp.ProjectOperations.Save (folder.ParentSolution); + if (dataObject is SolutionItem) { + SolutionItem it = (SolutionItem) dataObject; + if (!MessageService.Confirm (GettextCatalog.GetString ("Are you sure you want to move the item '{0}' to the solution folder '{1}'?", it.Name, folder.Name), AlertButton.Move)) + return; + + // If the items belongs to another folder, it will be automatically removed from it + folder.Items.Add (it); + } + else { + DropFile (folder, (IFileItem) dataObject, operation); + } + + IdeApp.ProjectOperations.Save (folder.ParentSolution); + } + + internal static void DropFile (SolutionFolder folder, IFileItem fileItem, DragOperation operation) + { + FilePath dest = folder.BaseDirectory.Combine (fileItem.FileName.FileName); + if (operation == DragOperation.Copy) + FileService.CopyFile (fileItem.FileName, dest); + else + FileService.MoveFile (fileItem.FileName, dest); + folder.Files.Add (dest); } public override void ActivateMultipleItems () @@ -259,6 +308,26 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad } } +/* [CommandHandler (ProjectCommands.AddNewFiles)] + protected void OnAddNewFiles () + { + SolutionFolder folder = (SolutionFolder) CurrentNode.DataItem; + if (IdeApp.ProjectOperations.CreateProjectFile (null, folder.BaseDirectory)) { + IdeApp.ProjectOperations.Save (folder.ParentSolution); + CurrentNode.Expanded = true; + } + }*/ + + [CommandHandler (ProjectCommands.AddFiles)] + protected void OnAddFiles () + { + SolutionFolder folder = (SolutionFolder) CurrentNode.DataItem; + if (IdeApp.ProjectOperations.AddFilesToSolutionFolder (folder)) { + CurrentNode.Expanded = true; + IdeApp.ProjectOperations.Save (folder.ParentSolution); + } + } + void OnEntryInserted (ITreeNavigator nav) { nav.Selected = true; diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SolutionNodeBuilder.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SolutionNodeBuilder.cs index 03752725b1..49df0a61ce 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SolutionNodeBuilder.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SolutionNodeBuilder.cs @@ -46,6 +46,8 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad SolutionItemChangeEventHandler combineEntryRemoved; EventHandler<WorkspaceItemRenamedEventArgs> combineNameChanged; EventHandler startupChanged; + EventHandler<SolutionItemFileEventArgs> fileAdded; + EventHandler<SolutionItemFileEventArgs> fileRemoved; public SolutionNodeBuilder () { @@ -54,6 +56,8 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad combineEntryRemoved = (SolutionItemChangeEventHandler) DispatchService.GuiDispatch (new SolutionItemChangeEventHandler (OnEntryRemoved)); combineNameChanged = (EventHandler<WorkspaceItemRenamedEventArgs>) DispatchService.GuiDispatch (new EventHandler<WorkspaceItemRenamedEventArgs> (OnCombineRenamed)); startupChanged = (EventHandler) DispatchService.GuiDispatch (new EventHandler (OnStartupChanged)); + fileAdded = (EventHandler<SolutionItemFileEventArgs>) DispatchService.GuiDispatch (new EventHandler<SolutionItemFileEventArgs> (OnFileAdded)); + fileRemoved = (EventHandler<SolutionItemFileEventArgs>) DispatchService.GuiDispatch (new EventHandler<SolutionItemFileEventArgs> (OnFileRemoved)); IdeApp.Workspace.ItemAddedToSolution += globalItemAddedRemoved; IdeApp.Workspace.ItemRemovedFromSolution += globalItemAddedRemoved; @@ -113,11 +117,14 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad Solution solution = (Solution) dataObject; foreach (SolutionItem entry in solution.RootFolder.Items) ctx.AddChild (entry); + foreach (FilePath file in solution.RootFolder.Files) + ctx.AddChild (new SolutionFolderFileNode (file, solution.RootFolder)); } public override bool HasChildNodes (ITreeBuilder builder, object dataObject) { - return ((Solution) dataObject).RootFolder.Items.Count > 0; + Solution sol = (Solution) dataObject; + return sol.RootFolder.Items.Count > 0 || sol.RootFolder.Files.Count > 0; } public override object GetParentObject (object dataObject) @@ -132,6 +139,8 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad solution.StartupItemChanged += startupChanged; solution.RootFolder.ItemAdded += combineEntryAdded; solution.RootFolder.ItemRemoved += combineEntryRemoved; + solution.RootFolder.SolutionItemFileAdded += fileAdded; + solution.RootFolder.SolutionItemFileRemoved += fileRemoved; } public override void OnNodeRemoved (object dataObject) @@ -141,6 +150,8 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad solution.StartupItemChanged -= startupChanged; solution.RootFolder.ItemAdded -= combineEntryAdded; solution.RootFolder.ItemRemoved -= combineEntryRemoved; + solution.RootFolder.SolutionItemFileAdded -= fileAdded; + solution.RootFolder.SolutionItemFileRemoved -= fileRemoved; } void OnStartupChanged (object sender, EventArgs args) @@ -180,6 +191,24 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad ITreeBuilder tb = Context.GetTreeBuilder (e.Item); if (tb != null) tb.Update (); } + + void OnFileAdded (object s, SolutionItemFileEventArgs args) + { + SolutionFolder folder = (SolutionFolder) s; + ITreeBuilder tb = Context.GetTreeBuilder (folder.ParentSolution); + if (tb != null) + tb.AddChild (new SolutionFolderFileNode (args.File, folder)); + } + + void OnFileRemoved (object s, SolutionItemFileEventArgs args) + { + SolutionFolder folder = (SolutionFolder) s; + ITreeBuilder tb = Context.GetTreeBuilder (folder.ParentSolution); + if (tb != null) { + if (tb.MoveToChild (args.File, typeof(SolutionFolderFileNode))) + tb.Remove (); + } + } } public class SolutionNodeCommandHandler: NodeCommandHandler @@ -197,18 +226,23 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad public override bool CanDropNode (object dataObject, DragOperation operation) { - return dataObject is SolutionItem; + return (dataObject is SolutionItem) || (dataObject is IFileItem); } public override void OnNodeDrop (object dataObject, DragOperation operation) { Solution sol = CurrentNode.DataItem as Solution; - SolutionItem it = (SolutionItem) dataObject; - if (!MessageService.Confirm (GettextCatalog.GetString ("Are you sure you want to move the item '{0}' to the root node of the solution?", it.Name), AlertButton.Move)) - return; - - // If the items belongs to another folder, it will be automatically removed from it - sol.RootFolder.Items.Add (it); + if (dataObject is SolutionItem) { + SolutionItem it = (SolutionItem) dataObject; + if (!MessageService.Confirm (GettextCatalog.GetString ("Are you sure you want to move the item '{0}' to the root node of the solution?", it.Name), AlertButton.Move)) + return; + + // If the items belongs to another folder, it will be automatically removed from it + sol.RootFolder.Items.Add (it); + } + else { + CombineNodeCommandHandler.DropFile (sol.RootFolder, (IFileItem) dataObject, operation); + } IdeApp.ProjectOperations.Save (sol); } @@ -301,6 +335,24 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad } } +/* [CommandHandler (ProjectCommands.AddNewFiles)] + protected void OnAddNewFiles () + { + Solution sol = (Solution) CurrentNode.DataItem; + if (IdeApp.ProjectOperations.CreateProjectFile (null, sol.BaseDirectory)) { + IdeApp.ProjectOperations.Save (sol); + CurrentNode.Expanded = true; + } + }*/ + + [CommandHandler (ProjectCommands.AddFiles)] + protected void OnAddFiles () + { + Solution sol = (Solution) CurrentNode.DataItem; + if (IdeApp.ProjectOperations.AddFilesToSolutionFolder (sol.RootFolder)) + IdeApp.ProjectOperations.Save (sol); + } + void OnEntryInserted (ITreeNavigator nav) { nav.Selected = true; diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SystemFileNodeBuilder.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SystemFileNodeBuilder.cs index 992f700115..f51063d2d1 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SystemFileNodeBuilder.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SystemFileNodeBuilder.cs @@ -142,21 +142,43 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad public void IncludeFileToProject () { Set<SolutionEntityItem> projects = new Set<SolutionEntityItem> (); + Set<Solution> solutions = new Set<Solution> (); foreach (ITreeNavigator node in CurrentNodes) { - Project project = node.GetParentDataItem (typeof(Project), true) as Project; SystemFile file = (SystemFile) node.DataItem; - - project.AddFile (file.Path); - projects.Add (project); + Project project = node.GetParentDataItem (typeof(Project), true) as Project; + if (project != null) { + project.AddFile (file.Path); + projects.Add (project); + } + else { + SolutionFolder folder = node.GetParentDataItem (typeof(SolutionFolder), true) as SolutionFolder; + if (folder != null) { + folder.Files.Add (file.Path); + solutions.Add (folder.ParentSolution); + } + else { + Solution sol = node.GetParentDataItem (typeof(Solution), true) as Solution; + sol.RootFolder.Files.Add (file.Path); + solutions.Add (sol); + } + } } IdeApp.ProjectOperations.Save (projects); + foreach (Solution sol in solutions) + IdeApp.ProjectOperations.Save (sol); } [CommandUpdateHandler (ProjectCommands.IncludeToProject)] public void UpdateIncludeFileToProject (CommandInfo info) { Project project = CurrentNode.GetParentDataItem (typeof(Project), true) as Project; - info.Visible = project != null; + if (project != null) + return; + if (CurrentNode.GetParentDataItem (typeof(Solution), true) != null) { + info.Text = GettextCatalog.GetString ("Include to Solution"); + return; + } + info.Visible = false; } [CommandHandler (ViewCommands.OpenWithList)] |