1 19 20 package org.netbeans.bluej; 21 22 import java.awt.Image ; 23 import java.util.ArrayList ; 24 import java.util.Arrays ; 25 import java.util.Collection ; 26 import java.util.Enumeration ; 27 import java.util.List ; 28 import javax.swing.event.ChangeEvent ; 29 import javax.swing.event.ChangeListener ; 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 59 public class BluejLogicalViewProvider implements LogicalViewProvider, org.netbeans.bluej.api.BluejLogicalViewProvider { 60 61 63 private final BluejProject project; 64 private List changeListeners; 65 66 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 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; } 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 l) { 106 if (this.changeListeners == null) { 107 this.changeListeners = new ArrayList (); 108 } 109 this.changeListeners.add(l); 110 } 111 112 public synchronized void removeChangeListener(ChangeListener l) { 113 if (this.changeListeners == null) { 114 return; 115 } 116 this.changeListeners.remove(l); 117 } 118 119 124 public void testBroken() { 125 ChangeListener [] _listeners; 126 synchronized (this) { 127 if (this.changeListeners == null) { 128 return; 129 } 130 _listeners = (ChangeListener []) this.changeListeners.toArray( 131 new ChangeListener [this.changeListeners.size()]); 132 } 133 ChangeEvent event = new ChangeEvent (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 return Lookups.fixed(new Object [] {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 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())) { String name = dobj.getPrimaryFile().getName(); 164 if (name.endsWith("Test")) { 165 name = name.substring(0, name.length() - "Test".length()); iconPath = "org/netbeans/bluej/resources/bluej-testclass-unattached.png"; } else { 174 iconPath = "org/netbeans/bluej/resources/bluej-class.png"; } 176 status = FileBuiltQuery.getStatus(dobj.getPrimaryFile()); 177 } 178 if ("readme.txt".equalsIgnoreCase(dobj.getPrimaryFile().getNameExt())) { iconPath = "org/netbeans/bluej/resources/readme.png"; } 181 } 182 183 } 184 185 public Image getIcon(int type) { 186 Image 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"), attached ? 8 : 3, attached ? 11 : 13); 192 } 193 if (hasMain()) { 194 retValue = Utilities.mergeImages(retValue, Utilities.loadImage("org/netbeans/bluej/resources/executable-badge.gif"), attached ? 44 : 41, attached ? 5 : 7); 196 } 197 } else { 198 retValue = super.getIcon(type); 199 } 200 retValue = retValue.getScaledInstance(-1, 32, Image.SCALE_DEFAULT); 203 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 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 247 FileObject fo = dobj.getPrimaryFile(); 248 if ("bluej.pkg".equals(fo.getNameExt()) || "build.xml".equals(fo.getNameExt()) || "bluej.pkh".equals(fo.getNameExt()) || ("+libs".equals(fo.getName()) && fo.isFolder()) || ".DS_Store".equals(fo.getNameExt()) || "ctxt".equals(fo.getExt()) || "class".equals(fo.getExt()) || (fo.isFolder() && fo.getFileObject("bluej.pkg") == null)) { return new Node[0]; 257 } 258 if (rootDir != null && rootDir.equals(fo)) { 259 if (listener == null) { 260 listener = new RootFileOobjectListener(this, orig, fo); 262 fo.addFileChangeListener(listener); 263 } 264 Enumeration en = ((DataFolder)dobj).children(); 265 Collection col = new ArrayList (); 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 RequestProcessor.getDefault().post(new Runnable () { 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 |