2
// CombineNodeBuilder.cs
7
// Copyright (C) 2005 Novell, Inc (http://www.novell.com)
9
// Permission is hereby granted, free of charge, to any person obtaining
10
// a copy of this software and associated documentation files (the
11
// "Software"), to deal in the Software without restriction, including
12
// without limitation the rights to use, copy, modify, merge, publish,
13
// distribute, sublicense, and/or sell copies of the Software, and to
14
// permit persons to whom the Software is furnished to do so, subject to
15
// the following conditions:
17
// The above copyright notice and this permission notice shall be
18
// included in all copies or substantial portions of the Software.
20
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30
using System.Collections;
32
using MonoDevelop.Projects;
33
using MonoDevelop.Core;
34
using MonoDevelop.Core.Collections;
35
using MonoDevelop.Ide.Commands;
36
using MonoDevelop.Ide.Gui;
37
using MonoDevelop.Core.Gui;
38
using MonoDevelop.Components.Commands;
39
using MonoDevelop.Ide.Gui.Search;
40
using MonoDevelop.Ide.Gui.Components;
42
namespace MonoDevelop.Ide.Gui.Pads.ProjectPad
44
public class SolutionFolderNodeBuilder: TypeNodeBuilder
46
SolutionItemRenamedEventHandler combineNameChanged;
48
public SolutionFolderNodeBuilder ()
50
combineNameChanged = (SolutionItemRenamedEventHandler) DispatchService.GuiDispatch (new SolutionItemRenamedEventHandler (OnCombineRenamed));
53
public override Type NodeDataType {
54
get { return typeof(SolutionFolder); }
57
public override Type CommandHandlerType {
58
get { return typeof(CombineNodeCommandHandler); }
61
public override string GetNodeName (ITreeNavigator thisNode, object dataObject)
63
return ((SolutionFolder)dataObject).Name;
66
public override void GetNodeAttributes (ITreeNavigator treeNavigator, object dataObject, ref NodeAttributes attributes)
68
attributes |= NodeAttributes.AllowRename;
71
public override string ContextMenuAddinPath {
72
get { return "/MonoDevelop/Ide/ContextMenu/ProjectPad/SolutionFolder"; }
75
public override void BuildNode (ITreeBuilder treeBuilder, object dataObject, ref string label, ref Gdk.Pixbuf icon, ref Gdk.Pixbuf closedIcon)
77
SolutionFolder combine = dataObject as SolutionFolder;
79
icon = Context.GetIcon (Stock.SolutionFolderOpen);
80
closedIcon = Context.GetIcon (Stock.SolutionFolderClosed);
83
public override void BuildChildNodes (ITreeBuilder ctx, object dataObject)
85
SolutionFolder combine = (SolutionFolder) dataObject;
86
foreach (SolutionItem entry in combine.Items)
90
public override bool HasChildNodes (ITreeBuilder builder, object dataObject)
92
return ((SolutionFolder) dataObject).Items.Count > 0;
95
public override object GetParentObject (object dataObject)
97
SolutionItem sf = (SolutionItem) dataObject;
98
return sf.ParentFolder.IsRoot ? (object) sf.ParentSolution : (object) sf.ParentFolder;
101
public override int CompareObjects (ITreeNavigator thisNode, ITreeNavigator otherNode)
103
if (otherNode.DataItem is SolutionFolder)
109
public override void OnNodeAdded (object dataObject)
111
SolutionFolder combine = (SolutionFolder) dataObject;
112
combine.NameChanged += combineNameChanged;
115
public override void OnNodeRemoved (object dataObject)
117
SolutionFolder combine = (SolutionFolder) dataObject;
118
combine.NameChanged -= combineNameChanged;
121
void OnCombineRenamed (object sender, SolutionItemRenamedEventArgs e)
123
ITreeBuilder tb = Context.GetTreeBuilder (e.SolutionItem);
124
if (tb != null) tb.Update ();
128
public class CombineNodeCommandHandler: NodeCommandHandler
130
public override void RenameItem (string newName)
132
if (newName.IndexOfAny (new char [] { '\'', '(', ')', '"', '{', '}', '|' } ) != -1) {
133
MessageService.ShowError (GettextCatalog.GetString ("Solution name may not contain any of the following characters: {0}", "', (, ), \", {, }, |"));
137
SolutionFolder folder = (SolutionFolder) CurrentNode.DataItem;
138
folder.Name = newName;
139
IdeApp.Workspace.Save();
142
public override DragOperation CanDragNode ()
144
return DragOperation.Move;
147
public override bool CanDropNode (object dataObject, DragOperation operation)
149
SolutionItem it = dataObject as SolutionItem;
150
return it != null && operation == DragOperation.Move;
153
public override void OnNodeDrop (object dataObject, DragOperation operation)
155
SolutionFolder folder = (SolutionFolder) CurrentNode.DataItem;
156
SolutionItem it = (SolutionItem) dataObject;
157
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))
160
it.ParentFolder.Items.Remove (it);
161
folder.Items.Add (it);
162
IdeApp.ProjectOperations.Save (folder.ParentSolution);
165
public override void ActivateMultipleItems ()
167
SolutionFolder folder = CurrentNode.DataItem as SolutionFolder;
168
IdeApp.ProjectOperations.ShowOptions (folder);
171
public override void DeleteItem ()
173
SolutionFolder folder = CurrentNode.DataItem as SolutionFolder;
174
SolutionFolder parent = folder.ParentFolder;
175
if (parent == null) return;
177
bool yes = MessageService.Confirm (GettextCatalog.GetString ("Do you really want to remove the folder '{0}' from '{1}'?", folder.Name, parent.Name), AlertButton.Remove);
179
Solution sol = folder.ParentSolution;
180
parent.Items.Remove (folder);
182
IdeApp.ProjectOperations.Save (sol);
186
[CommandHandler (ProjectCommands.AddNewProject)]
187
public void AddNewProjectToCombine()
189
SolutionFolder folder = (SolutionFolder) CurrentNode.DataItem;
190
SolutionItem ce = IdeApp.ProjectOperations.CreateProject (folder);
191
if (ce == null) return;
192
Tree.AddNodeInsertCallback (ce, new TreeNodeCallback (OnEntryInserted));
193
CurrentNode.Expanded = true;
196
[CommandHandler (ProjectCommands.AddProject)]
197
public void AddProjectToCombine()
199
SolutionFolder folder = (SolutionFolder) CurrentNode.DataItem;
200
SolutionItem ce = IdeApp.ProjectOperations.AddSolutionItem (folder);
201
if (ce == null) return;
202
Tree.AddNodeInsertCallback (ce, new TreeNodeCallback (OnEntryInserted));
203
CurrentNode.Expanded = true;
206
[CommandHandler (ProjectCommands.AddSolutionFolder)]
207
public void AddFolder()
209
SolutionFolder folder = (SolutionFolder) CurrentNode.DataItem;
210
SolutionFolder ce = new SolutionFolder ();
211
ce.Name = GettextCatalog.GetString ("New Folder");
212
folder.Items.Add (ce);
213
Tree.AddNodeInsertCallback (ce, OnFolderInserted);
214
CurrentNode.Expanded = true;
217
[CommandHandler (ProjectCommands.Reload)]
218
[AllowMultiSelection]
219
public void OnReload ()
221
using (IProgressMonitor m = IdeApp.Workbench.ProgressMonitors.GetLoadProgressMonitor (true)) {
222
m.BeginTask (null, CurrentNodes.Length);
223
foreach (ITreeNavigator node in CurrentNodes) {
224
SolutionFolder folder = (SolutionFolder) node.DataItem;
225
folder.ParentFolder.ReloadItem (m, folder);
232
[CommandUpdateHandler (ProjectCommands.Reload)]
233
public void OnUpdateReload (CommandInfo info)
235
foreach (ITreeNavigator node in CurrentNodes) {
236
SolutionFolder folder = (SolutionFolder) node.DataItem;
237
if (folder.ParentFolder == null || !folder.NeedsReload) {
238
info.Visible = false;
244
[CommandHandler (FileCommands.OpenContainingFolder)]
245
[AllowMultiSelection]
246
public void OpenContainingFolder ()
248
Set<string> paths = new Set<string> ();
249
foreach (ITreeNavigator node in CurrentNodes) {
250
SolutionFolder folder = (SolutionFolder) node.DataItem;
251
if (paths.Add (folder.BaseDirectory))
252
System.Diagnostics.Process.Start ("file://" + folder.BaseDirectory);
256
[CommandHandler (SearchCommands.FindInFiles)]
257
public void OnFindInFiles ()
259
SolutionFolder folder = (SolutionFolder) CurrentNode.DataItem;
260
SearchReplaceInFilesManager.ShowFindDialog (folder.BaseDirectory);
263
void OnEntryInserted (ITreeNavigator nav)
269
void OnFolderInserted (ITreeNavigator nav)
273
Tree.StartLabelEdit ();