2 // ProjectPackagesFolderNodeBuilder.cs: Node to control the packages in the project
5 // Marcos David Marin Amador <MarcosMarin@gmail.com>
7 // Copyright (C) 2007 Marcos David Marin Amador
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:
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
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.
33 using System
.Collections
;
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
)
87 public override void BuildNode (ITreeBuilder treeBuilder
, object dataObject
, ref string label
, ref Gdk
.Pixbuf icon
, ref Gdk
.Pixbuf closedIcon
)
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
)
116 private void OnAddPackage (object sender
, ProjectPackageEventArgs e
)
118 ITreeBuilder builder
= Context
.GetTreeBuilder (e
.Project
.Packages
);
120 builder
.UpdateAll ();
123 private void OnRemovePackage (object sender
, ProjectPackageEventArgs e
)
125 ITreeBuilder builder
= Context
.GetTreeBuilder (e
.Project
.Packages
);
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
);
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
)
152 if (dataObject
is ValaProject
) {
153 ValaProject project
= (ValaProject
)dataObject
;
155 if (((ProjectPackageCollection
)CurrentNode
.DataItem
).Project
.Equals (project
))
158 ValaProjectConfiguration config
= (ValaProjectConfiguration
)project
.GetConfiguration (IdeApp
.Workspace
.ActiveConfiguration
);
160 if (config
.CompileTarget
!= ValaBinding
.CompileTarget
.Bin
)
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
);