1 19 package org.netbeans.modules.j2ee.clientproject.ui; 20 21 22 import java.net.URL ; 23 import java.util.List ; 24 import java.util.ArrayList ; 25 import java.util.Iterator ; 26 import javax.swing.Action ; 27 import org.netbeans.api.project.FileOwnerQuery; 28 import org.netbeans.api.project.Project; 29 import org.netbeans.modules.j2ee.clientproject.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.spi.project.support.ant.AntProjectHelper; 46 import org.netbeans.spi.project.support.ant.EditableProperties; 47 import org.netbeans.modules.j2ee.clientproject.UpdateHelper; 48 import org.netbeans.modules.j2ee.clientproject.ui.customizer.AppClientProjectProperties; 49 import org.netbeans.spi.project.support.ant.PropertyEvaluator; 50 import org.netbeans.spi.project.support.ant.ReferenceHelper; 51 52 53 60 class ActionFilterNode extends FilterNode { 61 62 private static final int MODE_ROOT = 1; 63 private static final int MODE_PACKAGE = 2; 64 private static final int MODE_FILE = 3; 65 private static final int MODE_FILE_CONTENT = 4; 66 67 private final int mode; 68 private Action [] actionCache; 69 70 81 static ActionFilterNode create (Node original, UpdateHelper helper, PropertyEvaluator eval, ReferenceHelper refHelper, 82 String classPathId, String entryId, String includedLibrariesElement) { 83 DataObject dobj = (DataObject) original.getLookup().lookup(DataObject.class); 84 assert dobj != null; 85 FileObject root = dobj.getPrimaryFile(); 86 Lookup lkp = new ProxyLookup (new Lookup[] {original.getLookup(), helper == null ? 87 Lookups.singleton (new JavadocProvider(root,root)) : 88 Lookups.fixed (new Object [] {new Removable (helper, eval, refHelper, classPathId, entryId, includedLibrariesElement), 89 new JavadocProvider(root,root)})}); 90 return new ActionFilterNode (original, helper == null ? MODE_PACKAGE : MODE_ROOT, root, lkp); 91 } 92 93 94 95 private ActionFilterNode (Node original, int mode, FileObject cpRoot, FileObject resource) { 96 this (original, mode, cpRoot, 97 new ProxyLookup(new Lookup[] {original.getLookup(),Lookups.singleton(new JavadocProvider(cpRoot,resource))})); 98 } 99 100 private ActionFilterNode (Node original, int mode) { 101 super (original, new ActionFilterChildren (original, mode, null)); 102 this.mode = mode; 103 } 104 105 private ActionFilterNode (Node original, int mode, FileObject root, Lookup lkp) { 106 super (original, new ActionFilterChildren (original, mode,root),lkp); 107 this.mode = mode; 108 } 109 110 public Action [] getActions(boolean context) { 111 Action [] result = initActions(); 112 return result; 113 } 114 115 116 public Action getPreferredAction() { 117 if (mode == MODE_FILE) { 118 Action [] actions = initActions(); 119 if (actions.length > 0 && (actions[0] instanceof OpenAction || actions[0] instanceof EditAction )) { 120 return actions[0]; 121 } 122 } 123 return null; 124 } 125 126 private Action [] initActions () { 127 if (actionCache == null) { 128 List <Action > result = new ArrayList <Action >(2); 129 if (mode == MODE_FILE) { 130 Action [] superActions = super.getActions(false); 131 for (int i=0; i<superActions.length; i++) { 132 if (superActions[i] instanceof OpenAction || superActions[i] instanceof EditAction) { 133 result.add (superActions[i]); 134 } 135 } 136 result.add (SystemAction.get(ShowJavadocAction.class)); 137 } 138 else if (mode == MODE_PACKAGE || mode == MODE_ROOT) { 139 result.add (SystemAction.get(ShowJavadocAction.class)); 140 Action [] superActions = super.getActions(false); 141 for (int i=0; i<superActions.length; i++) { 142 if (superActions[i] instanceof FindAction) { 143 result.add (superActions[i]); 144 } 145 } 146 if (mode == MODE_ROOT) { 147 result.add (SystemAction.get(RemoveClassPathRootAction.class)); 148 } 149 } 150 actionCache = (Action []) result.toArray(new Action [result.size()]); 151 } 152 return actionCache; 153 } 154 155 private static class ActionFilterChildren extends Children { 156 157 private final int mode; 158 private final FileObject cpRoot; 159 160 ActionFilterChildren (Node original, int mode, FileObject cpRooot) { 161 super (original); 162 this.mode = mode; 163 this.cpRoot = cpRooot; 164 } 165 166 protected Node[] createNodes(Node n) { 167 switch (mode) { 168 case MODE_ROOT: 169 case MODE_PACKAGE: 170 DataObject dobj = (DataObject) n.getCookie(org.openide.loaders.DataObject.class); 171 if (dobj == null) { 172 assert false : "DataNode without DataObject in Lookup"; return new Node[0]; 174 } 175 else if (dobj.getPrimaryFile().isFolder()) { 176 return new Node[] {new ActionFilterNode (n, MODE_PACKAGE,cpRoot,dobj.getPrimaryFile())}; 177 } 178 else { 179 return new Node[] {new ActionFilterNode (n, MODE_FILE,cpRoot,dobj.getPrimaryFile())}; 180 } 181 case MODE_FILE: 182 case MODE_FILE_CONTENT: 183 return new Node[] {new ActionFilterNode (n, MODE_FILE_CONTENT)}; 184 default: 185 assert false : "Unknown mode"; return new Node[0]; 187 } 188 } 189 } 190 191 private static class JavadocProvider implements ShowJavadocAction.JavadocProvider { 192 193 private final FileObject cpRoot; 194 private final FileObject resource; 195 196 JavadocProvider (FileObject cpRoot, FileObject resource) { 197 this.cpRoot = cpRoot; 198 this.resource = resource; 199 } 200 201 public boolean hasJavadoc() { 202 try { 203 return resource != null && JavadocForBinaryQuery.findJavadoc(cpRoot.getURL()).getRoots().length>0; 204 } catch (FileStateInvalidException fsi) { 205 return false; 206 } 207 } 208 209 public void showJavadoc() { 210 try { 211 String relativeName = FileUtil.getRelativePath(cpRoot,resource); 212 URL [] urls = JavadocForBinaryQuery.findJavadoc(cpRoot.getURL()).getRoots(); 213 URL pageURL; 214 if (relativeName.length()==0) { 215 pageURL = ShowJavadocAction.findJavadoc ("overview-summary.html",urls); if (pageURL == null) { 217 pageURL = ShowJavadocAction.findJavadoc ("index.html",urls); } 219 } 220 else if (resource.isFolder()) { 221 pageURL = ShowJavadocAction.findJavadoc ("package-summary.html",urls); } 224 else { 225 String javadocFileName = relativeName.substring(0,relativeName.lastIndexOf('.'))+".html"; pageURL = ShowJavadocAction.findJavadoc (javadocFileName,urls); 227 } 228 ShowJavadocAction.showJavaDoc(pageURL,relativeName.replace('/','.')); } catch (FileStateInvalidException fsi) { 230 ErrorManager.getDefault().notify (fsi); 231 } 232 } 233 } 234 235 private static class Removable implements RemoveClassPathRootAction.Removable { 236 237 private final UpdateHelper helper; 238 private final PropertyEvaluator eval; 239 private final ReferenceHelper refHelper; 240 private final String classPathId; 241 private final String entryId; 242 private final String includedLibrariesElement; 243 private final ClassPathSupport cs; 244 245 Removable (UpdateHelper helper, PropertyEvaluator eval, ReferenceHelper refHelper, String classPathId, String entryId, String includedLibrariesElement) { 246 this.helper = helper; 247 this.eval = eval; 248 this.refHelper = refHelper; 249 this.classPathId = classPathId; 250 this.includedLibrariesElement = includedLibrariesElement; 251 this.entryId = entryId; 252 253 this.cs = new ClassPathSupport( eval, refHelper, helper.getAntProjectHelper(), 254 AppClientProjectProperties.WELL_KNOWN_PATHS, 255 AppClientProjectProperties.LIBRARY_PREFIX, 256 AppClientProjectProperties.LIBRARY_SUFFIX, 257 AppClientProjectProperties.ANT_ARTIFACT_PREFIX ); 258 } 259 260 261 public boolean canRemove () { 262 EditableProperties props = helper.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH); 264 return props.getProperty (classPathId) != null; 265 } 266 267 public Project remove() { 268 271 274 boolean removed = false; 275 EditableProperties props = helper.getProperties (AntProjectHelper.PROJECT_PROPERTIES_PATH); 276 String raw = props.getProperty (classPathId); 277 List <ClassPathSupport.Item> resources = cs.itemsList( raw, includedLibrariesElement ); 278 for (Iterator <ClassPathSupport.Item> i = resources.iterator(); i.hasNext();) { 279 ClassPathSupport.Item item = i.next(); 280 if (entryId.equals(ClassPathSupport.getAntPropertyName(item.getReference()))) { 281 i.remove(); 282 removed = true; 283 } 284 } 285 if (removed) { 286 String [] itemRefs = cs.encodeToStrings(resources.iterator(), includedLibrariesElement); 287 props = helper.getProperties (AntProjectHelper.PROJECT_PROPERTIES_PATH); props.setProperty(classPathId, itemRefs); 289 helper.putProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH, props); 290 291 EditableProperties privateProps = helper.getProperties(AntProjectHelper.PRIVATE_PROPERTIES_PATH); 293 List <ClassPathSupport.Item> l = new ArrayList <ClassPathSupport.Item>(); 294 l.addAll(resources); 295 AppClientProjectProperties.storeLibrariesLocations(l.iterator(), privateProps); 296 helper.putProperties(AntProjectHelper.PRIVATE_PROPERTIES_PATH, privateProps); 297 298 return FileOwnerQuery.getOwner(helper.getAntProjectHelper().getProjectDirectory()); 299 } else { 300 return null; 301 } 302 } 303 } 304 } 305 | Popular Tags |