Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLluis Sanchez <lluis@novell.com>2010-04-09 16:10:04 +0400
committerLluis Sanchez <lluis@novell.com>2010-04-09 16:10:04 +0400
commit167e7b7eb69ccecbfedba602ab11cc81d9e68761 (patch)
tree3d0caf04b2e6e83b622aa2fca2c3e89a3cf80def /main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad
parentb3b29e6c33bea932d07f07d2fa7bc6344c361f57 (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')
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ShowAllFilesBuilderExtension.cs7
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SolutionFolderFileNodeBuilder.cs160
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SolutionFolderNodeBuilder.cs89
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SolutionNodeBuilder.cs68
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/SystemFileNodeBuilder.cs32
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)]