0:   //  ClassBrowser.cs
1:   //  Copyright (C) 2001 Mike Krueger
2:   //
3:   //  This program is free software; you can redistribute it and/or modify
4:   //  it under the terms of the GNU General Public License as published by
5:   //  the Free Software Foundation; either version 2 of the License, or
6:   //  (at your option) any later version.
7:   //
8:   //  This program is distributed in the hope that it will be useful,
9:   //  but WITHOUT ANY WARRANTY; without even the implied warranty of
10:   //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11:   //  GNU General Public License for more details.
12:   //
13:   //  You should have received a copy of the GNU General Public License
14:   //  along with this program; if not, write to the Free Software
15:   //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16:  
17:   using System;
18:   using System.IO;
19:   using System.ComponentModel;
20:   using System.Windows.Forms;
21:   using System.Drawing;
22:   using System.Collections;
23:   using System.Resources;
24:   using System.Xml;
25:   using System.Threading;
26:   using System.Text;
27:  
28:   using SharpDevelop.Tool.Data;
29:   using SharpDevelop.Tool.Function;
30:   using SharpDevelop.Internal.Project;
31:   using SharpDevelop.Internal.Parser;
32:   using SharpDevelop.Gui.Window;
33:  
34:   namespace SharpDevelop.Gui.Navigation {
35:       
36:       public class ClassBrowserNode : TreeNode
37:       {
38:           int line;
39:           string filename;
40:           
41:           public int Line {
42:               get {
43:                   return line;
44:               }
45:           }
46:           
47:           public string FileName {
48:               get {
49:                   return filename;
50:               }
51:           }
52:           
53:           public ClassBrowserNode(string nameint linestring filenamebase(name)
54:           {
55:               this.line     line;
56:               this.filename filename;
57:           }
58:       }
59:       
60:       /// <summary>
61:       /// This class is the project scout tree view
62:       /// </summary>
63:       public class ClassBrowser : TreeView
64:       {
65:           MainWindow mainwindow;
66:           
67:           void Insert(TreeNodeCollection nodesstring filenameClass c)
68:           {
69:               ClassBrowserNode cNode new ClassBrowserNode(c.Namec.Linefilename);
70:               
71:               cNode.SelectedImageIndex cNode.ImageIndex c.IsStruct ClassBrowserIcons.STRUCTINDEX : ClassBrowserIcons.CLASSINDEX;
72:               
73:               nodes.Add(cNode);
74:               
75:               ClassBrowserNode cbNode;
76:               foreach (ClassContent member in c.Members) {
77:                   if (member is Method) {
78:                       
79:                       System.Text.StringBuilder str new System.Text.StringBuilder(member.Name);
80:                       str.Append('(');
81:                       Method m = ((Method)member);
82:                       for (int 0< m.Parameters.Count; ++i) {
83:                           Parameter p = (Parameter)m.Parameters[i];
84:                           str.Append(p.type.Name);
85:                           if (< m.Parameters.Count) {
86:                               str.Append(", ");
87:                           }
88:                       }
89:                       str.Append(") :");
90:                       str.Append(m.Type.Name);
91:                       
92:                       cbNode new ClassBrowserNode(str.ToString(), member.Linefilename);
93:                       cbNode.SelectedImageIndex cbNode.ImageIndex ClassBrowserIcons.GetIcon(m);
94:                   else if (member is Property) {
95:                       System.Text.StringBuilder str new System.Text.StringBuilder(member.Name);
96:                       
97:                       str.Append(" : ");
98:                       str.Append(((Property)member).Type.Name);
99:                                  
100:                       cbNode new ClassBrowserNode(str.ToString(), member.Linefilename);
101:                       cbNode.SelectedImageIndex cbNode.ImageIndex ClassBrowserIcons.GetIcon((Property)member);
102:                   else if (member is Field) {
103:                       System.Text.StringBuilder str new System.Text.StringBuilder(member.Name);
104:                       
105:                       str.Append(" : ");
106:                       str.Append(((Field)member).Type.Name);
107:                       
108:                       cbNode new ClassBrowserNode(str.ToString(), member.Linefilename);
109:                       
110:                       cbNode.SelectedImageIndex cbNode.ImageIndex ClassBrowserIcons.GetIcon((Field)member);
111:                   else if (member is Event) {
112:                       System.Text.StringBuilder str new System.Text.StringBuilder(member.Name);
113:                       
114:                       str.Append(" : ");
115:                       str.Append(((Event)member).Type.Name);
116:                       
117:                       cbNode new ClassBrowserNode(str.ToString(), member.Linefilename);
118:                       cbNode.SelectedImageIndex cbNode.ImageIndex ClassBrowserIcons.GetIcon((Event)member);
119:                   else {
120:                       continue;
121:                   }
122:                   cNode.Nodes.Add(cbNode);
123:               }
124:           }
125:           
126:           void Insert(TreeNodeCollection nodesstring filenameInterface c)
127:           {
128:               ClassBrowserNode cNode new ClassBrowserNode(c.Namec.Linefilename);
129:               
130:               cNode.SelectedImageIndex cNode.ImageIndex ClassBrowserIcons.INTERFACEINDEX;
131:               
132:               nodes.Add(cNode);
133:               
134:               ClassBrowserNode cbNode;
135:               foreach (ClassContent member in c.Members) {
136:                   if (member is Method) {
137:                       System.Text.StringBuilder str new System.Text.StringBuilder(member.Name);
138:                       str.Append('(');
139:                       Method m = ((Method)member);
140:                       for (int 0< m.Parameters.Count; ++i) {
141:                           Parameter p = (Parameter)m.Parameters[i];
142:                           str.Append(p.type.Name);
143:                           if (< m.Parameters.Count) {
144:                               str.Append(", ");
145:                           }
146:                       }
147:                       str.Append(") :");
148:                       str.Append(m.Type.Name);
149:                       cbNode new ClassBrowserNode(str.ToString(), member.Linefilename);
150:                       cbNode.SelectedImageIndex cbNode.ImageIndex ClassBrowserIcons.CLASSINDEX;
151:                   else if (member is Property) {
152:                       System.Text.StringBuilder str new System.Text.StringBuilder(member.Name);
153:                       
154:                       str.Append(" : ");
155:                       str.Append(((Property)member).Type.Name);
156:                                  
157:                       cbNode new ClassBrowserNode(str.ToString(), member.Linefilename);
158:                       cbNode.SelectedImageIndex cbNode.ImageIndex ClassBrowserIcons.PROPERTYINDEX;
159:                   else if (member is Event) {
160:                       System.Text.StringBuilder str new System.Text.StringBuilder(member.Name);
161:                       
162:                       str.Append(" : ");
163:                       str.Append(((Event)member).Type.Name);
164:                       
165:                       cbNode new ClassBrowserNode(str.ToString(), member.Linefilename);
166:                       cbNode.SelectedImageIndex cbNode.ImageIndex ClassBrowserIcons.DELEGATEINDEX;
167:                   else {
168:                       continue;
169:                   }
170:                   cNode.Nodes.Add(cbNode);
171:               }
172:           }
173:           
174:           void Insert(TreeNodeCollection nodesstring filenameEnumeration c)
175:           {
176:               ClassBrowserNode cNode new ClassBrowserNode(c.Namec.Linefilename);
177:               
178:               cNode.SelectedImageIndex cNode.ImageIndex ClassBrowserIcons.ENUMINDEX;
179:               
180:               nodes.Add(cNode);
181:               ClassBrowserNode cbNode;
182:               
183:               foreach (string member in c.Members) {
184:                   cbNode new ClassBrowserNode(memberc.Linefilename);
185:                   cbNode.SelectedImageIndex cbNode.ImageIndex ClassBrowserIcons.LITERALINDEX;
186:                   cNode.Nodes.Add(cbNode);
187:               }
188:               
189:               
190:           }
191:           
192:           protected override void OnAfterSelect(TreeViewEventArgs e)
193:           {
194:               base.OnAfterSelect(e);
195:               TreeNode node e.Node;
196:               if (node is ClassBrowserNode) {
197:                   ClassBrowserNode cnode = (ClassBrowserNode)node;
198:                   
199:                   ContentWindow window mainwindow.OpenWindow(cnode.FileName);
200:                   window.TextArea.Caret.CaretPos new Point(0cnode.Line);
201:                   window.TextArea.CenterCaret();
202:               }
203:           }
204:           void DoPopulate()
205:           {
206:               BeginUpdate();
207:               Nodes.Clear();
208:               try {
209:                   Populate(parseCombineNodes);
210:               catch (Exception e) {
211:                   MessageBox.Show(e.ToString(), "Parse Error"MessageBoxButtons.OKMessageBoxIcon.Error);
212:               }
213:               EndUpdate();
214:           }
215:           
216:           Combine parseCombine;
217:           
218:           delegate void MyD();
219:           
220:           void StartPopulating()
221:           {
222:               Invoke(new MyD(DoPopulate));
223:           }
224:           
225:           bool handlecreated false;
226:           void MyHandleCreated(object senderEventArgs e)
227:           {
228:               Thread t new Thread(new ThreadStart(StartPopulating));
229:               t.Start();
230:               handlecreated true;
231:           }
232:           
233:           void StartParser()
234:           {
235:               ParseCombine(parseCombine);
236:           }
237:           
238:           public void Parse(Combine combine)
239:           {
240:               mainwindow.OpenTaskView.ClearTags();
241:               parseCombine combine;
242:               Thread t new Thread(new ThreadStart(StartParser));
243:               t.Start();
244:               
245:               if (handlecreated) {
246:                   MyHandleCreated(nullnull);
247:               else {
248:                   HandleCreated += new EventHandler(MyHandleCreated);
249:               }
250:           }
251:           
252:           public void ParseCombine(Combine combine)
253:           {
254:               foreach (CombineEntry entry in combine.Entries) {
255:                   if (entry is ProjectCombineEntry) {
256:                       ParseProject(((ProjectCombineEntry)entry).Project);
257:                   else 
258:                       ParseCombine(((CombineCombineEntry)entry).Combine);
259:                   }
260:               }
261:               mainwindow.OpenTaskView.Invoke(new MyD(mainwindow.OpenTaskView.ShowTags));
262:           }
263:           void ParseProject(IProject p)
264:           {
265:               if (p.ProjectType == "C#") {
266:                    foreach (FileInformation finfo in p.Files) {
267:                       if (finfo.BuildAction == BuildAction.Compile) {
268:                           Parser parser new Parser(finfo.Name);
269:                           parser.Lexer.Tags new string[] { "HACK""TODO""UNDONE""FIXME" };
270:                           CompilationUnit unit parser.Parse();
271:                           CompilationUnits[finfo.Name] = unit;
272:                           foreach (Tag tag in parser.Lexer.TagComments) {
273:                               string str tag.Comment.Trim();
274:                               if (str.StartsWith(":")) {
275:                                   str str.Substring(1).Trim();
276:                               }
277:                               mainwindow.OpenTaskView.AddTag(finfo.Nametag.Keystrp.BaseDirectorytag.Line);
278:                           }
279:                       }
280:                    }
281:               }
282:           }
283:           
284:           public void Populate(Combine combineTreeNodeCollection nodes)
285:           {
286:               TreeNode combineNode new TreeNode(combine.Name);
287:               combineNode.SelectedImageIndex combineNode.ImageIndex ClassBrowserIcons.COMBINEINDEX;
288:               foreach (CombineEntry entry in combine.Entries) {
289:                   if (entry is ProjectCombineEntry) {
290:                       Populate(((ProjectCombineEntry)entry).ProjectcombineNode.Nodes);
291:                   else 
292:                       Populate(((CombineCombineEntry)entry).CombinecombineNode.Nodes);
293:                   }
294:               }
295:               nodes.Add(combineNode);
296:               
297:           }
298:           
299:           TreeNode GetNodeFromCollectionTreeByName(TreeNodeCollection collectionstring name)
300:           {
301:               foreach (TreeNode node in collection) {
302:                   if (node.Text == name) {
303:                       return node;
304:                   }
305:               }
306:               return null;
307:           }
308:           
309:           public TreeNode GetPath(string directoryTreeNodeCollection rootbool create)
310:           {
311:               string[] treepath   directory.Split(new char[] { '.' });
312:               TreeNodeCollection curcollection root;
313:               TreeNode           curnode       null;
314:               
315:               foreach (string path in treepath) {
316:                   
317:                   if (path.Length == || path[0] == '.') {
318:                       continue;
319:                   }
320:                   
321:                   TreeNode node GetNodeFromCollectionTreeByName(curcollectionpath);
322:                   if (node == null) {
323:                       if (create) {
324:                           TreeNode newnode new TreeNode(path);
325:                           newnode.ImageIndex newnode.SelectedImageIndex ClassBrowserIcons.NAMESPACEINDEX;
326:                           
327:                           curcollection.Add(newnode);
328:                           curnode newnode;
329:                           curcollection curnode.Nodes;
330:                           continue;
331:                       else {
332:                           return null;
333:                       }
334:                   }