* Makefile.am:
[monodevelop.git] / extras / ValaBinding / ProjectPad / ProjectPackagesFolderNodeBuilder.cs
blob7b7d0504470b382e67feceadf99e444cba916ca5
1 //
2 // ProjectPackagesFolderNodeBuilder.cs: Node to control the packages in the project
3 //
4 // Authors:
5 // Marcos David Marin Amador <MarcosMarin@gmail.com>
6 //
7 // Copyright (C) 2007 Marcos David Marin Amador
8 //
9 //
10 // This source code is licenced under The MIT License:
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
19 //
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
22 //
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 using System;
33 using System.Collections;
35 using Mono.Addins;
37 using MonoDevelop.Components.Commands;
38 using MonoDevelop.Projects;
39 using MonoDevelop.Core.Gui;
40 using MonoDevelop.Ide.Gui.Pads;
41 using MonoDevelop.Ide.Gui.Pads.ProjectPad;
42 using MonoDevelop.Ide.Gui;
43 using MonoDevelop.Ide.Gui.Components;
45 namespace MonoDevelop.ValaBinding.ProjectPad
47 public class ProjectPackagesFolderNodeBuilder : TypeNodeBuilder
49 ProjectPackageEventHandler addedHandler;
50 ProjectPackageEventHandler removedHandler;
52 public override Type NodeDataType {
53 get { return typeof(ProjectPackageCollection); }
56 public override void OnNodeAdded (object dataObject)
58 ValaProject project = ((ProjectPackageCollection)dataObject).Project;
59 if (project == null) return;
60 project.PackageAddedToProject += addedHandler;
61 project.PackageRemovedFromProject += removedHandler;
64 public override void OnNodeRemoved (object dataObject)
66 ValaProject project = ((ProjectPackageCollection)dataObject).Project;
67 if (project == null) return;
68 project.PackageAddedToProject -= addedHandler;
69 project.PackageRemovedFromProject -= removedHandler;
72 public override Type CommandHandlerType {
73 get { return typeof(ProjectPackagesFolderNodeCommandHandler); }
76 protected override void Initialize ()
78 addedHandler = (ProjectPackageEventHandler)DispatchService.GuiDispatch (new ProjectPackageEventHandler (OnAddPackage));
79 removedHandler = (ProjectPackageEventHandler)DispatchService.GuiDispatch (new ProjectPackageEventHandler (OnRemovePackage));
82 public override string GetNodeName (ITreeNavigator thisNode, object dataObject)
84 return "Packages";
87 public override void BuildNode (ITreeBuilder treeBuilder, object dataObject, ref string label, ref Gdk.Pixbuf icon, ref Gdk.Pixbuf closedIcon)
89 label = "Packages";
90 icon = Context.GetIcon (Stock.OpenReferenceFolder);
91 closedIcon = Context.GetIcon (Stock.ClosedReferenceFolder);
94 public override bool HasChildNodes (ITreeBuilder builder, object dataObject)
96 return ((ProjectPackageCollection)dataObject).Count > 0;
99 public override void BuildChildNodes (ITreeBuilder treeBuilder, object dataObject)
101 ProjectPackageCollection packages = (ProjectPackageCollection)dataObject;
103 foreach (ProjectPackage p in packages)
104 treeBuilder.AddChild (p);
107 public override string ContextMenuAddinPath {
108 get { return "/MonoDevelop/ValaBinding/Views/ProjectBrowser/ContextMenu/PackagesFolderNode"; }
111 public override int CompareObjects (ITreeNavigator thisNode, ITreeNavigator otherNode)
113 return -1;
116 private void OnAddPackage (object sender, ProjectPackageEventArgs e)
118 ITreeBuilder builder = Context.GetTreeBuilder (e.Project.Packages);
119 if (builder != null)
120 builder.UpdateAll ();
123 private void OnRemovePackage (object sender, ProjectPackageEventArgs e)
125 ITreeBuilder builder = Context.GetTreeBuilder (e.Project.Packages);
126 if (builder != null)
127 builder.UpdateAll ();
131 public class ProjectPackagesFolderNodeCommandHandler : NodeCommandHandler
133 [CommandHandler (MonoDevelop.ValaBinding.ValaProjectCommands.AddPackage)]
134 public void AddPackageToProject ()
136 ValaProject project = (ValaProject)CurrentNode.GetParentDataItem (
137 typeof(ValaProject), false);
139 EditPackagesDialog dialog = new EditPackagesDialog (project);
140 dialog.Run ();
142 IdeApp.ProjectOperations.Save (project);
143 CurrentNode.Expanded = true;
146 // Currently only accepts packages and projects that compile into a static library
147 public override bool CanDropNode (object dataObject, DragOperation operation)
149 if (dataObject is ProjectPackage)
150 return true;
152 if (dataObject is ValaProject) {
153 ValaProject project = (ValaProject)dataObject;
155 if (((ProjectPackageCollection)CurrentNode.DataItem).Project.Equals (project))
156 return false;
158 ValaProjectConfiguration config = (ValaProjectConfiguration)project.GetConfiguration (IdeApp.Workspace.ActiveConfiguration);
160 if (config.CompileTarget != ValaBinding.CompileTarget.Bin)
161 return true;
164 return false;
167 public override DragOperation CanDragNode ()
169 return DragOperation.Copy | DragOperation.Move;
172 public override void OnNodeDrop (object dataObject, DragOperation operation)
174 if (dataObject is ProjectPackage) {
175 ProjectPackage package = (ProjectPackage)dataObject;
176 ITreeNavigator nav = CurrentNode;
178 ValaProject dest = nav.GetParentDataItem (typeof(ValaProject), true) as ValaProject;
179 nav.MoveToObject (dataObject);
180 ValaProject source = nav.GetParentDataItem (typeof(ValaProject), true) as ValaProject;
182 dest.Packages.Add (package);
183 IdeApp.ProjectOperations.Save (dest);
185 if (operation == DragOperation.Move) {
186 source.Packages.Remove (package);
187 IdeApp.ProjectOperations.Save (source);
189 } else if (dataObject is ValaProject) {
190 ValaProject draggedProject = (ValaProject)dataObject;
191 ValaProject destProject = (CurrentNode.DataItem as ProjectPackageCollection).Project;
193 draggedProject.WriteMDPkgPackage (IdeApp.Workspace.ActiveConfiguration);
195 ProjectPackage package = new ProjectPackage (draggedProject);
197 if (!destProject.Packages.Contains (package)) {
198 destProject.Packages.Add (package);
199 IdeApp.ProjectOperations.Save (destProject);