1:   //  ProjectBrowserCommands.cs
2:   //  Copyright (C) 2002 Mike Krueger
3:   //
4:   //  This program is free software; you can redistribute it and/or modify
5:   //  it under the terms of the GNU General Public License as published by
6:   //  the Free Software Foundation; either version 2 of the License, or
7:   //  (at your option) any later version.
8:   //
9:   //  This program is distributed in the hope that it will be useful,
10:   //  but WITHOUT ANY WARRANTY; without even the implied warranty of
11:   //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12:   //  GNU General Public License for more details.
13:   //
14:   //  You should have received a copy of the GNU General Public License
15:   //  along with this program; if not, write to the Free Software
16:   //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17:  
18:   using System;
19:   using System.IO;
20:   using System.Threading;
21:   using System.Drawing;
22:   using System.Drawing.Printing;
23:   using System.Collections;
24:   using System.ComponentModel;
25:   using System.Windows.Forms;
26:   using System.Diagnostics;
27:  
28:   using Core.AddIns;
29:   using Core.Util;
30:   using Core.Properties;
31:   using Core.Gui;
32:   using Core.Gui.Creators;
33:  
34:   using SharpDevelop.Gui;
35:   using SharpDevelop.Gui.Components;
36:   using SharpDevelop.Internal.Project;
37:   using SharpDevelop.Gui.Dialogs;
38:   using SharpDevelop.Gui.Navigation.ProjectBrowser;
39:  
40:   namespace SharpDevelop.Base.Commands.ProjectBrowser {
41:       
42:       public class AddReferenceToProject : AbstractMenuCommand
43:       {
44:           public override void Run()
45:           {
46:               ProjectBrowserView browser = (ProjectBrowserView)Owner;
47:               
48:               ProjectBrowserNode node = (ProjectBrowserNode)browser.SelectedNode;
49:               if (node == null) {
50:                   return;
51:               }
52:               
53:               OpenFileDialog fdiag  new OpenFileDialog();
54:               fdiag.AddExtension    true;
55:               fdiag.Filter          "Assemblies|*.dll;*.exe|All files (*.*)|*.*";
56:               fdiag.Multiselect     true;
57:               fdiag.CheckFileExists true;
58:               
59:               if (fdiag.ShowDialog() == DialogResult.OK) {
60:                   IProject project node.Project;
61:                   foreach (string file in fdiag.FileNames) {
62:                       node.Nodes.Add(new ProjectBrowserNode(projectProjectNodeType.Referencefile));
63:                       WorkbenchSingleton.Workbench.ProjectManager.AddReferencetoProject(projectfile);
64:                   }
65:                   WorkbenchSingleton.Workbench.ProjectManager.SaveCombine();
66:               }
67:           }
68:       }
69:  
70:       public class AddResourceToProject : AbstractMenuCommand
71:       {
72:           public override void Run()
73:           {
74:               ProjectBrowserView browser = (ProjectBrowserView)Owner;
75:               ProjectBrowserNode node = (ProjectBrowserNode)browser.SelectedNode;
76:               if (node == null) {
77:                   return;
78:               }
79:               
80:               OpenFileDialog fdiag  new OpenFileDialog();
81:               fdiag.AddExtension    true;
82:               fdiag.Filter          "Resource files|*.resources;*.resx|All files (*.*)|*.*";
83:               fdiag.Multiselect     true;
84:               fdiag.CheckFileExists true;
85:               
86:               if (fdiag.ShowDialog() == DialogResult.OK) {
87:                   IProject project node.Project;
88:                   foreach (string file in fdiag.FileNames) {
89:                       node.Nodes.Add(new ProjectBrowserNode(projectProjectNodeType.ResourceFilefile));
90:                       WorkbenchSingleton.Workbench.ProjectManager.AddFiletoProject(projectfileBuildAction.EmbedAsResource);
91:                   }
92:                   WorkbenchSingleton.Workbench.ProjectManager.SaveCombine();
93:               }
94:           }
95:       }
96:       
97:       public class NewFileEvent : AbstractMenuCommand
98:       {
99:           ProjectBrowserNode SearchFolder(ProjectBrowserNode node)
100:           {
101:               while (node != null && 
102:                      node.ProjectNodeType != ProjectNodeType.Folder && 
103:                      node.ProjectNodeType != ProjectNodeType.Project) {
104:                   
105:                   node = (ProjectBrowserNode)node.Parent;
106:               
107:                      }
108:               return node;
109:           }
110:           
111:           public override void Run()
112:           {
113:               ProjectBrowserView browser = (ProjectBrowserView)Owner;
114:               ProjectBrowserNode node SearchFolder((ProjectBrowserNode)browser.SelectedNode);
115:               if (node == null) {
116:                   return;
117:               }
118:               
119:               NewFileDialog nfd new NewFileDialog();
120:               if (nfd.ShowDialog() == DialogResult.OK) {
121:                   IWorkbenchWindow window WorkbenchSingleton.Workbench.ActiveWorkbenchWindow;
122:                   
123:                   ProjectBrowserNode newfile null;
124:                   
125:                   string fileName null;
126:                   int count 1;
127:                   
128:                   string baseName  Path.GetFileNameWithoutExtension(window.WindowContent.UntitledName);
129:                   string extension Path.GetExtension(window.WindowContent.UntitledName);
130:                   
131:                   do {
132:                       fileName node.FileName  Path.DirectorySeparatorChar baseName count.ToString() + extension;
133:                       ++count;
134:                   while (node.Project.IsFileInProject(fileName) || File.Exists(fileName));
135:                   window.WindowContent.SaveFile(fileName);
136:                   newfile new ProjectBrowserNode(node.ProjectProjectNodeType.TextFilePath.GetFileName(fileName));
137:                   newfile.BuildAction BuildAction.Compile;
138:                   node.Nodes.Add(newfile);
139:                   
140:                   node.Project.Files.Add(new FileInformation(fileNameBuildAction.Compile));
141:                   
142:                   newfile.EnsureVisible();
143:                   browser.LabelEdit true;
144:                   newfile.BeginEdit();
145:                   WorkbenchSingleton.Workbench.ProjectManager.SaveCombine();
146:               }
147:           }
148:       }
149:       
150:       public class AddFilesToProject : AbstractMenuCommand
151:       {        
152:           ProjectBrowserView browser;
153:           public override void Run()
154:           {
155:               browser = (ProjectBrowserView)Owner;
156:               ProjectBrowserNode node = (ProjectBrowserNode)browser.SelectedNode;
157:               if (node == null) {
158:                   return;
159:               }
160:               
161:               OpenFileDialog fdiag  new OpenFileDialog();
162:               fdiag.AddExtension    true;
163:               string filter String.Join("|", (string[])(AddInTreeSingleton.AddInTree.GetTreeNode("/SharpDevelop/Workbench/FileFilter").BuildChildItems(this)).ToArray(typeof(string)));
164:               fdiag.Filter          filter;
165:               fdiag.Multiselect     true;
166:               fdiag.CheckFileExists true;
167:               
168:               if (fdiag.ShowDialog() == DialogResult.OK) {
169:                   int ret new SharpMessageBox("Move or copy"
170:                                                 "Move or copy file ?"
171:                                                 "&Move"
172:                                                 "&Copy"
173:                                                 GlobalResources.GetString("Global.CancelButtonText")
174:                                                 ).ShowMessageBox();
175:                   if (ret == || ret == -1) {
176:                       return;
177:                   }
178:                   foreach (string file in fdiag.FileNames) {
179:                       browser.MoveCopyFile(filenoderet == 0);
180:                   }
181:               }
182:               fdiag.Dispose();
183:           }
184:       }
185:       
186:       
187:       public class NewFolderEvent : AbstractMenuCommand
188:       {
189:           ProjectBrowserNode SearchFolder(ProjectBrowserNode node)
190:           {
191:               while (node != null && 
192:                      node.ProjectNodeType != ProjectNodeType.Folder && 
193:                      node.ProjectNodeType != ProjectNodeType.Project) {
194:                   
195:                   node = (ProjectBrowserNode)node.Parent;
196:               }
197:               return node;
198:           }
199:           
200:           public override void Run()
201:           {
202:               ProjectBrowserView browser = (ProjectBrowserView)Owner;
203:               
204:               ProjectBrowserNode node SearchFolder((ProjectBrowserNode)browser.SelectedNode);
205:               if (node == null) {
206:                   return;
207:               }
208:               
209:               ProjectBrowserNode newfolder new ProjectBrowserNode(node.ProjectProjectNodeType.FolderGlobalResources.GetString("ProjectComponent.NewFolderString"));
210:               node.Nodes.Add(newfolder);
211:               Directory.CreateDirectory(newfolder.FileName);
212:               node.Project.Directories.Add(newfolder.FileName);
213:               
214:               newfolder.EnsureVisible();
215:               browser.LabelEdit true;
216:               newfolder.BeginEdit();
217:           }
218:       }
219:       
220:       public class RemoveEntryEvent : AbstractMenuCommand
221:       {
222:           public override void Run()
223:           {
224:               ProjectBrowserView browser = (ProjectBrowserView)Owner;
225:               ProjectBrowserNode node = (ProjectBrowserNode)browser.SelectedNode;
226:               if (node.IsEditing) { // TODO : throw remove key to the browser component.
227:                   return;
228:               }
229:               
230:               if (node != null && 
231:                   node.ProjectNodeType != ProjectNodeType.NonEditable     && 
232:                   node.ProjectNodeType != ProjectNodeType.ReferenceFolder &&
233:                   node.ProjectNodeType != ProjectNodeType.ResourceFolder) {
234:                   
235:                   string filename node.FileName;
236:                   int    ret;
237:                   
238:                   switch (node.ProjectNodeType) {
239:                       case ProjectNodeType.Combine: // remove combine from combine
240:                           break;
241:                       
242:                       case ProjectNodeType.Project: // remove project from combine
243:                           
244:                           ret new SharpMessageBox(filename
245:                                                         "Remove project from combine ?"
246:                                                         "&Remove"
247:                                                         GlobalResources.GetString("Global.CancelButtonText")
248:                                                         ).ShowMessageBox();
249:                           if (ret == || ret == -1) {
250:                               return;
251:                           }
252:                                   
253:                           ProjectBrowserNode cmbNode = ((ProjectBrowserNode)browser.SelectedNode).CombineNode;
254:                           Combine cmb node.Combine;
255:                           IProject prj node.Project;
256:                           CombineEntry removeEntry null;
257:                           
258:                           // remove combineentry
259:                           foreach (CombineEntry entry in cmb.Entries) {
260:                               if (entry is ProjectCombineEntry) {
261:                                   if (((ProjectCombineEntry)entry).Project == prj) {
262:                                       removeEntry entry;
263:                                       break;
264:                                   }
265:                               }
266:                           }
267:                           Debug.Assert(removeEntry != null);
268:                           cmb.Entries.Remove(removeEntry);
269:                           
270:                           // remove execute definition
271:                           CombineExecuteDefinition removeExDef null;
272:                           foreach (CombineExecuteDefinition exDef in cmb.CombineExecuteDefinitions) {
273:                               if (exDef.Entry == removeEntry) {
274:                                   removeExDef exDef;
275:                               }
276:                           }
277:                           Debug.Assert(removeExDef != null);
278:                           cmb.CombineExecuteDefinitions.Remove(removeExDef);
279:                           
280:                           // remove configuration
281:                           
282:                           foreach (DictionaryEntry dentry in cmb.Configurations) {
283:                               ((CombineConfiguration)dentry.Value).RemoveEntry(removeEntry);
284:                           }
285:                           
286:                           node.Parent.Nodes.Remove(node);
287:                           cmbNode.UpdateCombineName();
288:                           break;
289:                       case ProjectNodeType.Reference: // remove file from project
290:                       case ProjectNodeType.TextFile:
291:                       case ProjectNodeType.ResourceFile:
292:                       case ProjectNodeType.Folder:
293:                           ret new SharpMessageBox(filename
294:                                                         GlobalResources.GetString("ProjectComponent.DeleteRemoveQuestion"), 
295:                                                         "&Remove"
296:                                                         "&Delete"
297:                                                         GlobalResources.GetString("Global.CancelButtonText")
298:                                                         ).ShowMessageBox();
299:                           if (ret == || ret == -1) {
300:                               return;
301:                           }
302:                           
303:                           node.Parent.Nodes.Remove(node);
304:                           
305:                           if (ret == 0) {
306:                               WorkbenchSingleton.Workbench.FileManager.RemoveFileFromProject(filename);
307:                           }
308:                           
309:                           if (ret == 1) { // delete file OR director
310:                               WorkbenchSingleton.Workbench.FileManager.RemoveFile(filename);
311:                           }
312:                           break;
313:                   }
314:                   
315:                   // save changes
316:                   WorkbenchSingleton.Workbench.ProjectManager.SaveCombine();
317:               }
318:           }
319:       }
320:       
321:       public class RenameEntryEvent : AbstractMenuCommand
322:       {
323:           public override void Run()
324:           {
325:               ProjectBrowserView browser = (ProjectBrowserView)Owner;
326:               ProjectBrowserNode node = (ProjectBrowserNode)browser.SelectedNode;
327:               browser.LabelEdit true;
328:               node.BeginEdit();
329:           }
330:       }
331:       
332:       public class OpenFileEvent : AbstractMenuCommand
333:       {
334:           public override void Run()
335:           {
336:               ProjectBrowserView browser = (ProjectBrowserView)Owner;
337:               ProjectBrowserNode node = (ProjectBrowserNode)browser.SelectedNode;
338:               if (node != null) {
339:                   if (node.ProjectNodeType != ProjectNodeType.NonEditable     &&
340:                       node.ProjectNodeType != ProjectNodeType.Project         &&
341:                       node.ProjectNodeType != ProjectNodeType.Folder          &&
342:                       node.ProjectNodeType != ProjectNodeType.ReferenceFolder &&
343:                       node.ProjectNodeType != ProjectNodeType.Combine         &&
344:                       node.ProjectNodeType != ProjectNodeType.ResourceFolder) {
345: