KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > netbeans > bluej > BluejLogicalViewProvider


1 /*
2  * The contents of this file are subject to the terms of the Common Development
3  * and Distribution License (the License). You may not use this file except in
4  * compliance with the License.
5  *
6  * You can obtain a copy of the License at http://www.netbeans.org/cddl.html
7  * or http://www.netbeans.org/cddl.txt.
8  *
9  * When distributing Covered Code, include this CDDL Header Notice in each file
10  * and include the License file at http://www.netbeans.org/cddl.txt.
11  * If applicable, add the following below the CDDL Header, with the fields
12  * enclosed by brackets [] replaced by your own identifying information:
13  * "Portions Copyrighted [year] [name of copyright owner]"
14  *
15  * The Original Software is NetBeans. The Initial Developer of the Original
16  * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
17  * Microsystems, Inc. All Rights Reserved.
18  */

19
20 package org.netbeans.bluej;
21
22 import java.awt.Image JavaDoc;
23 import java.util.ArrayList JavaDoc;
24 import java.util.Arrays JavaDoc;
25 import java.util.Collection JavaDoc;
26 import java.util.Enumeration JavaDoc;
27 import java.util.List JavaDoc;
28 import javax.swing.event.ChangeEvent JavaDoc;
29 import javax.swing.event.ChangeListener JavaDoc;
30 import org.netbeans.api.java.source.ClasspathInfo;
31 import org.netbeans.api.java.source.SourceUtils;
32 import org.netbeans.api.project.FileOwnerQuery;
33 import org.netbeans.api.project.Project;
34 import org.netbeans.api.project.Sources;
35 import org.netbeans.api.queries.FileBuiltQuery;
36 import org.netbeans.bluej.nodes.BluejLogicalViewRootNode;
37 import org.netbeans.spi.java.project.support.ui.PackageView;
38 import org.netbeans.spi.project.ui.LogicalViewProvider;
39 import org.openide.filesystems.FileAttributeEvent;
40 import org.openide.filesystems.FileChangeListener;
41 import org.openide.filesystems.FileEvent;
42 import org.openide.filesystems.FileObject;
43 import org.openide.filesystems.FileRenameEvent;
44 import org.openide.filesystems.FileUtil;
45 import org.openide.loaders.DataFolder;
46 import org.openide.loaders.DataObject;
47 import org.openide.nodes.Children;
48 import org.openide.nodes.FilterNode;
49 import org.openide.nodes.Node;
50 import org.openide.util.Lookup;
51 import org.openide.util.RequestProcessor;
52 import org.openide.util.Utilities;
53 import org.openide.util.lookup.Lookups;
54
55 /**
56  * Support for creating logical views.
57  * @author Milos Kleint
58  */

59 public class BluejLogicalViewProvider implements LogicalViewProvider, org.netbeans.bluej.api.BluejLogicalViewProvider {
60     
61 // private static final RequestProcessor BROKEN_LINKS_RP = new RequestProcessor("BluejPhysicalViewProvider.BROKEN_LINKS_RP"); // NOI18N
62

63     private final BluejProject project;
64     private List JavaDoc changeListeners;
65
66     // Web service client
67
// private static final Object KEY_SERVICE_REFS = "serviceRefs"; // NOI18N
68

69     public BluejLogicalViewProvider(BluejProject project) {
70         this.project = project;
71         assert project != null;
72     }
73     
74     public Node createLogicalView() {
75         return new BluejLogicalViewRootNode(createLookup(project));
76     }
77     
78     public Node findPath(Node root, Object JavaDoc target) {
79         Project project = (Project) root.getLookup().lookup(Project.class);
80         if (project == null) {
81             return null;
82         }
83         
84         if (target instanceof FileObject) {
85             FileObject fo = (FileObject) target;
86             Project owner = FileOwnerQuery.getOwner(fo);
87             if (!project.equals(owner)) {
88                 return null; // Don't waste time if project does not own the fo
89
}
90             
91             Node[] nodes = root.getChildren().getNodes(true);
92             for (int i = 0; i < nodes.length; i++) {
93                 Node result = PackageView.findPath(nodes[i], target);
94                 if (result != null) {
95                     return result;
96                 }
97             }
98         }
99         
100         return null;
101     }
102     
103     
104     
105     public synchronized void addChangeListener(ChangeListener JavaDoc l) {
106         if (this.changeListeners == null) {
107             this.changeListeners = new ArrayList JavaDoc();
108         }
109         this.changeListeners.add(l);
110     }
111     
112     public synchronized void removeChangeListener(ChangeListener JavaDoc l) {
113         if (this.changeListeners == null) {
114             return;
115         }
116         this.changeListeners.remove(l);
117     }
118     
119     /**
120      * Used by J2SEProjectCustomizer to mark the project as broken when it warns user
121      * about project's broken references and advices him to use BrokenLinksAction to correct it.
122      *
123      */

124     public void testBroken() {
125         ChangeListener JavaDoc[] _listeners;
126         synchronized (this) {
127             if (this.changeListeners == null) {
128                 return;
129             }
130             _listeners = (ChangeListener JavaDoc[]) this.changeListeners.toArray(
131                     new ChangeListener JavaDoc[this.changeListeners.size()]);
132         }
133         ChangeEvent JavaDoc event = new ChangeEvent JavaDoc(this);
134         for (int i=0; i < _listeners.length; i++) {
135             _listeners[i].stateChanged(event);
136         }
137     }
138     
139     private static Lookup createLookup( Project project ) {
140         DataFolder rootFolder = DataFolder.findFolder(project.getProjectDirectory());
141         // XXX Remove root folder after FindAction rewrite
142
return Lookups.fixed(new Object JavaDoc[] {project, rootFolder});
143     }
144
145     public Node getBigIconRootNode() {
146         return new BigIconFilterNode(createLogicalView());
147     }
148     
149     private static class BigIconFilterNode extends FilterNode {
150         private String JavaDoc iconPath = null;
151         private FileBuiltQuery.Status status = null;
152         private boolean attached = false;
153     
154         BigIconFilterNode(Node original) {
155             this(original, new BigIconFilterChilden(original));
156             
157         }
158         BigIconFilterNode(Node original, org.openide.nodes.Children children) {
159             super(original, children);
160             DataObject dobj = (DataObject)original.getLookup().lookup(DataObject.class);
161             if (dobj != null) {
162                 if ("java".equalsIgnoreCase(dobj.getPrimaryFile().getExt())) { //NOI18N
163
String JavaDoc name = dobj.getPrimaryFile().getName();
164                     if (name.endsWith("Test")) {
165                         name = name.substring(0, name.length() - "Test".length()); //NOI18N
166
//#77306 - remove the icon padding..
167
// if (dobj.getPrimaryFile().getParent().getFileObject(name, "java") != null) { //NOI18N
168
// iconPath = "org/netbeans/bluej/resources/bluej-testclass.png"; //NOI18N
169
// attached = true;
170
// } else {
171
iconPath = "org/netbeans/bluej/resources/bluej-testclass-unattached.png"; //NOI18N
172
// }
173
} else {
174                         iconPath = "org/netbeans/bluej/resources/bluej-class.png"; //NOI18N
175
}
176                     status = FileBuiltQuery.getStatus(dobj.getPrimaryFile());
177                 }
178                 if ("readme.txt".equalsIgnoreCase(dobj.getPrimaryFile().getNameExt())) { //NOI18N
179
iconPath = "org/netbeans/bluej/resources/readme.png"; //NOI18N
180
}
181             }
182             
183         }
184
185         public Image JavaDoc getIcon(int type) {
186             Image JavaDoc retValue;
187             if (iconPath != null) {
188                 retValue = Utilities.loadImage(iconPath);
189                 if (status != null && !status.isBuilt()) {
190                     retValue = Utilities.mergeImages(retValue, Utilities.loadImage("org/netbeans/bluej/resources/compiled.png"), //NOI18N
191
attached ? 8 : 3, attached ? 11 : 13);
192                 }
193                 if (hasMain()) {
194                     retValue = Utilities.mergeImages(retValue, Utilities.loadImage("org/netbeans/bluej/resources/executable-badge.gif"), //NOI18N
195
attached ? 44 : 41, attached ? 5 : 7);
196                 }
197             } else {
198                 retValue = super.getIcon(type);
199             }
200 // if (type == BeanInfo.ICON_COLOR_32x32 && retValue.getHeight(null) == 16) {
201
// System.out.println("scaling");
202
retValue = retValue.getScaledInstance(-1, 32, Image.SCALE_DEFAULT);
203 // }
204
return retValue;
205         }
206         
207         private boolean hasMain() {
208             DataObject dobj = (DataObject)getLookup().lookup(DataObject.class);
209             if (dobj != null) {
210                 FileObject fo = dobj.getPrimaryFile();
211                 if(!fo.isValid()) {
212                     return false;
213                 }
214                 Project prj = FileOwnerQuery.getOwner(fo);
215                 String JavaDoc path = FileUtil.getRelativePath(prj.getProjectDirectory(), fo);
216                 path = path.replace('/', '.').replace('\\', '.');
217                 path = path.substring(0, path.length() - (fo.getExt().length() + 1));
218                 return SourceUtils.isMainClass(path, ClasspathInfo.create(fo));
219             }
220             return false;
221         }
222         
223         
224     }
225     
226     private static class BigIconFilterChilden extends FilterNode.Children {
227         FileObject rootDir;
228         private RootFileOobjectListener listener = null;
229         BigIconFilterChilden(Node orig) {
230             super(orig);
231             DataObject dobj = (DataObject)orig.getLookup().lookup(DataObject.class);
232             if (dobj != null) {
233                 Project prj = FileOwnerQuery.getOwner(dobj.getPrimaryFile());
234                 if (prj != null) {
235                     rootDir = prj.getProjectDirectory();
236                 }
237             }
238         }
239
240         protected Node[] createNodes(Node object) {
241             Node orig = (Node)object;
242             DataObject dobj = (DataObject)orig.getLookup().lookup(DataObject.class);
243             if (dobj != null) {
244                 // this has to be copied from the logicalviewrootnode, because
245
// we need to construct the children from the root package directly from DataObjects..
246

247                 FileObject fo = dobj.getPrimaryFile();
248                 if ("bluej.pkg".equals(fo.getNameExt()) || //NOI18N
249
"build.xml".equals(fo.getNameExt()) || //NOI18N
250
"bluej.pkh".equals(fo.getNameExt()) || //NOI18N
251
("+libs".equals(fo.getName()) && fo.isFolder()) || //NOI18N
252
".DS_Store".equals(fo.getNameExt()) || //NOI18N
253
"ctxt".equals(fo.getExt()) || //NOI18N
254
"class".equals(fo.getExt()) || //NOI18N
255
(fo.isFolder() && fo.getFileObject("bluej.pkg") == null)) { //NOI18N
256
return new Node[0];
257                 }
258                 if (rootDir != null && rootDir.equals(fo)) {
259                     if (listener == null) {
260                         //add just once..
261
listener = new RootFileOobjectListener(this, orig, fo);
262                         fo.addFileChangeListener(listener);
263                     }
264                     Enumeration JavaDoc en = ((DataFolder)dobj).children();
265                     Collection JavaDoc col = new ArrayList JavaDoc();
266                     while (en.hasMoreElements()) {
267                         DataObject d2 = (DataObject)en.nextElement();
268                         if (d2.getPrimaryFile().isData()) {
269                             col.addAll(Arrays.asList(createNodes(d2.getNodeDelegate().cloneNode())));
270                         }
271                     }
272                     return (Node[])col.toArray(new Node[col.size()]);
273                 }
274                 return new Node[] {new BigIconFilterNode(orig, fo.isData() ? Children.LEAF : new BigIconFilterChilden(orig))};
275             }
276             return new Node[0];
277         }
278         
279         public void doRefresh(Node original) {
280             refreshKey(original);
281         }
282         
283     private static class RootFileOobjectListener implements FileChangeListener {
284
285         private BigIconFilterChilden children;
286
287         private Node node;
288
289         private FileObject fileObject;
290         
291         RootFileOobjectListener(BigIconFilterChilden childs, Node nd, FileObject fo) {
292             children = childs;
293             node = nd;
294             fileObject = fo;
295         }
296         
297         public void fileAttributeChanged(FileAttributeEvent fileAttributeEvent) {
298         }
299         public void fileChanged(FileEvent fileEvent) {
300             //#75991 not posting it results in ugly assertions/exceptions from mdr.
301
RequestProcessor.getDefault().post(new Runnable JavaDoc() {
302                 public void run() {
303                     children.doRefresh(node);
304                 }
305             });
306         }
307         public void fileDataCreated(FileEvent fileEvent) {
308             children.doRefresh(node);
309         }
310         public void fileDeleted(FileEvent fileEvent) {
311             children.doRefresh(node);
312         }
313         public void fileFolderCreated(FileEvent fileEvent) {
314             children.doRefresh(node);
315         }
316         public void fileRenamed(FileRenameEvent fileRenameEvent) {
317             children.doRefresh(node);
318         }
319         
320     }
321         
322     }
323 }
Popular Tags