1 19 20 package org.netbeans.modules.java.j2seproject.ui; 21 22 import java.io.IOException ; 23 import java.net.URL ; 24 import java.util.List ; 25 import java.util.ArrayList ; 26 import javax.swing.Action ; 27 import org.netbeans.api.project.FileOwnerQuery; 28 import org.netbeans.api.project.Project; 29 import org.netbeans.modules.java.j2seproject.classpath.ClassPathSupport; 30 import org.openide.ErrorManager; 31 import org.openide.actions.EditAction; 32 import org.openide.actions.FindAction; 33 import org.openide.loaders.DataObject; 34 import org.openide.actions.OpenAction; 35 import org.openide.filesystems.FileObject; 36 import org.openide.filesystems.FileStateInvalidException; 37 import org.openide.filesystems.FileUtil; 38 import org.openide.nodes.FilterNode; 39 import org.openide.nodes.Node; 40 import org.openide.util.Lookup; 41 import org.openide.util.actions.SystemAction; 42 import org.openide.util.lookup.Lookups; 43 import org.openide.util.lookup.ProxyLookup; 44 import org.netbeans.api.java.queries.JavadocForBinaryQuery; 45 import org.netbeans.api.project.ProjectManager; 46 import org.netbeans.spi.project.support.ant.AntProjectHelper; 47 import org.netbeans.spi.project.support.ant.EditableProperties; 48 import org.netbeans.spi.project.support.ant.PropertyUtils; 49 import org.netbeans.modules.java.j2seproject.UpdateHelper; 50 51 58 class ActionFilterNode extends FilterNode { 59 60 private static final int MODE_ROOT = 1; 61 private static final int MODE_PACKAGE = 2; 62 private static final int MODE_FILE = 3; 63 private static final int MODE_FILE_CONTENT = 4; 64 65 private final int mode; 66 private Action [] actionCache; 67 68 79 static ActionFilterNode create (Node original, UpdateHelper helper, String classPathId, String entryId) { 80 DataObject dobj = original.getLookup().lookup(DataObject.class); 81 assert dobj != null; 82 FileObject root = dobj.getPrimaryFile(); 83 Lookup lkp = new ProxyLookup (new Lookup[] {original.getLookup(), helper == null ? 84 Lookups.singleton (new JavadocProvider(root,root)) : 85 Lookups.fixed(new Removable(helper, classPathId, entryId), 86 new JavadocProvider(root,root))}); 87 return new ActionFilterNode (original, helper == null ? MODE_PACKAGE : MODE_ROOT, root, lkp); 88 } 89 90 91 92 private ActionFilterNode (Node original, int mode, FileObject cpRoot, FileObject resource) { 93 this (original, mode, cpRoot, 94 new ProxyLookup(new Lookup[] {original.getLookup(),Lookups.singleton(new JavadocProvider(cpRoot,resource))})); 95 } 96 97 private ActionFilterNode (Node original, int mode) { 98 super(original, original.isLeaf() ? Children.LEAF : new ActionFilterChildren(original, mode, null)); 99 this.mode = mode; 100 } 101 102 private ActionFilterNode (Node original, int mode, FileObject root, Lookup lkp) { 103 super(original, original.isLeaf() ? Children.LEAF : new ActionFilterChildren(original, mode, root), lkp); 104 this.mode = mode; 105 } 106 107 public Action [] getActions(boolean context) { 108 Action [] result = initActions(); 109 return result; 110 } 111 112 113 public Action getPreferredAction() { 114 if (mode == MODE_FILE) { 115 Action [] actions = initActions(); 116 if (actions.length > 0 && (actions[0] instanceof OpenAction || actions[0] instanceof EditAction )) { 117 return actions[0]; 118 } 119 } 120 return null; 121 } 122 123 private Action [] initActions () { 124 if (actionCache == null) { 125 List result = new ArrayList (2); 126 if (mode == MODE_FILE) { 127 Action [] superActions = super.getActions(false); 128 for (int i=0; i<superActions.length; i++) { 129 if (superActions[i] instanceof OpenAction || superActions[i] instanceof EditAction) { 130 result.add (superActions[i]); 131 } 132 } 133 result.add (SystemAction.get(ShowJavadocAction.class)); 134 } 135 else if (mode == MODE_PACKAGE || mode == MODE_ROOT) { 136 result.add (SystemAction.get(ShowJavadocAction.class)); 137 Action [] superActions = super.getActions(false); 138 for (int i=0; i<superActions.length; i++) { 139 if (superActions[i] instanceof FindAction) { 140 result.add (superActions[i]); 141 } 142 } 143 if (mode == MODE_ROOT) { 144 result.add (SystemAction.get(RemoveClassPathRootAction.class)); 145 } 146 } 147 actionCache = (Action []) result.toArray(new Action [result.size()]); 148 } 149 return actionCache; 150 } 151 152 private static class ActionFilterChildren extends FilterNode.Children { 153 154 private final int mode; 155 private final FileObject cpRoot; 156 157 ActionFilterChildren (Node original, int mode, FileObject cpRooot) { 158 super (original); 159 this.mode = mode; 160 this.cpRoot = cpRooot; 161 } 162 163 protected Node[] createNodes(Node n) { 164 switch (mode) { 165 case MODE_ROOT: 166 case MODE_PACKAGE: 167 DataObject dobj = n.getCookie(DataObject.class); 168 if (dobj == null) { 169 assert false : "DataNode without DataObject in Lookup"; return new Node[0]; 171 } 172 else if (dobj.getPrimaryFile().isFolder()) { 173 return new Node[] {new ActionFilterNode(n, MODE_PACKAGE, cpRoot, dobj.getPrimaryFile())}; 174 } 175 else { 176 return new Node[] {new ActionFilterNode(n, MODE_FILE, cpRoot, dobj.getPrimaryFile())}; 177 } 178 case MODE_FILE: 179 case MODE_FILE_CONTENT: 180 return new Node[] {new ActionFilterNode(n, MODE_FILE_CONTENT)}; 181 default: 182 assert false : "Unknown mode"; return new Node[0]; 184 } 185 } 186 } 187 188 private static class JavadocProvider implements ShowJavadocAction.JavadocProvider { 189 190 private final FileObject cpRoot; 191 private final FileObject resource; 192 193 JavadocProvider (FileObject cpRoot, FileObject resource) { 194 this.cpRoot = cpRoot; 195 this.resource = resource; 196 } 197 198 public boolean hasJavadoc() { 199 try { 200 return resource != null && JavadocForBinaryQuery.findJavadoc(cpRoot.getURL()).getRoots().length>0; 201 } catch (FileStateInvalidException fsi) { 202 return false; 203 } 204 } 205 206 public void showJavadoc() { 207 try { 208 String relativeName = FileUtil.getRelativePath(cpRoot,resource); 209 URL [] urls = JavadocForBinaryQuery.findJavadoc(cpRoot.getURL()).getRoots(); 210 URL pageURL; 211 if (relativeName.length()==0) { 212 pageURL = ShowJavadocAction.findJavadoc ("overview-summary.html",urls); if (pageURL == null) { 214 pageURL = ShowJavadocAction.findJavadoc ("index.html",urls); } 216 } 217 else if (resource.isFolder()) { 218 pageURL = ShowJavadocAction.findJavadoc ("package-summary.html",urls); } 221 else { 222 String javadocFileName = relativeName.substring(0,relativeName.lastIndexOf('.'))+".html"; pageURL = ShowJavadocAction.findJavadoc (javadocFileName,urls); 224 } 225 ShowJavadocAction.showJavaDoc(pageURL,relativeName.replace('/','.')); } catch (FileStateInvalidException fsi) { 227 ErrorManager.getDefault().notify (fsi); 228 } 229 } 230 } 231 232 private static class Removable implements RemoveClassPathRootAction.Removable { 233 234 private final UpdateHelper helper; 235 private final String classPathId; 236 private final String entryId; 237 238 Removable (UpdateHelper helper, String classPathId, String entryId) { 239 this.helper = helper; 240 this.classPathId = classPathId; 241 this.entryId = entryId; 242 } 243 244 245 public boolean canRemove () { 246 EditableProperties props = helper.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH); 248 return props.getProperty (classPathId) != null; 249 } 250 251 public void remove() { 252 ProjectManager.mutex().writeAccess ( new Runnable () { 253 public void run() { 254 EditableProperties props = helper.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH); 255 String cp = props.getProperty (classPathId); 256 if (cp != null) { 257 String [] entries = PropertyUtils.tokenizePath(cp); 258 List result = new ArrayList (); 259 for (int i=0; i<entries.length; i++) { 260 if (!entryId.equals(ClassPathSupport.getAntPropertyName(entries[i]))) { 261 int size = result.size(); 262 if (size>0) { 263 result.set (size-1,(String )result.get(size-1) + ':'); } 265 result.add (entries[i]); 266 } 267 } 268 props.setProperty (classPathId, (String [])result.toArray(new String [result.size()])); 269 helper.putProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH,props); 270 Project project = FileOwnerQuery.getOwner(helper.getAntProjectHelper().getProjectDirectory()); 271 assert project != null; 272 try { 273 ProjectManager.getDefault().saveProject(project); 274 } catch (IOException ioe) { 275 ErrorManager.getDefault().notify(ioe); 276 } 277 } 278 } 279 }); 280 } 281 } 282 } 283 | Popular Tags |