1 19 package org.netbeans.modules.ruby.railsprojects.ui; 20 21 22 import java.io.File ; 23 import java.io.IOException ; 24 import java.net.URL ; 25 import java.util.List ; 26 import java.util.ArrayList ; 27 import javax.swing.Action ; 28 import org.netbeans.api.project.FileOwnerQuery; 29 import org.netbeans.api.project.Project; 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.project.ProjectManager; 45 import org.netbeans.modules.ruby.spi.project.support.rake.RakeProjectHelper; 46 import org.netbeans.modules.ruby.spi.project.support.rake.EditableProperties; 47 import org.netbeans.modules.ruby.spi.project.support.rake.PropertyUtils; 48 import org.netbeans.modules.ruby.railsprojects.UpdateHelper; 49 import org.netbeans.modules.ruby.railsprojects.ui.customizer.RailsProjectProperties; 50 51 52 59 class ActionFilterNode extends FilterNode { 60 61 private static final int MODE_ROOT = 1; 62 private static final int MODE_PACKAGE = 2; 63 private static final int MODE_FILE = 3; 64 private static final int MODE_FILE_CONTENT = 4; 65 66 private final int mode; 67 private Action [] actionCache; 68 69 80 static ActionFilterNode create (Node original, UpdateHelper helper, String classPathId, String entryId) { 81 DataObject dobj = original.getLookup().lookup(DataObject.class); 82 assert dobj != null; 83 FileObject root = dobj.getPrimaryFile(); 84 Lookup lkp = new ProxyLookup (new Lookup[] {original.getLookup(), helper != null ? 89 Lookups.fixed(new Removable(helper, classPathId, entryId)) : Lookup.EMPTY}); 90 return new ActionFilterNode (original, helper == null ? MODE_PACKAGE : MODE_ROOT, root, lkp); 92 } 93 94 95 96 private ActionFilterNode (Node original, int mode, FileObject cpRoot, FileObject resource) { 97 this (original, mode, cpRoot, 98 new ProxyLookup(new Lookup[] {original.getLookup(),Lookup.EMPTY})); 99 } 100 101 private ActionFilterNode (Node original, int mode) { 102 super (original, new ActionFilterChildren (original, mode, null)); 103 this.mode = mode; 104 } 105 106 private ActionFilterNode (Node original, int mode, FileObject root, Lookup lkp) { 107 super (original, new ActionFilterChildren (original, mode,root),lkp); 108 this.mode = mode; 109 } 110 111 public Action [] getActions(boolean context) { 112 Action [] result = initActions(); 113 return result; 114 } 115 116 117 public Action getPreferredAction() { 118 if (mode == MODE_FILE) { 119 Action [] actions = initActions(); 120 if (actions.length > 0 && (actions[0] instanceof OpenAction || actions[0] instanceof EditAction )) { 121 return actions[0]; 122 } 123 } 124 return null; 125 } 126 127 private Action [] initActions () { 128 if (actionCache == null) { 129 List result = new ArrayList (2); 130 if (mode == MODE_FILE) { 131 Action [] superActions = super.getActions(false); 132 for (int i=0; i<superActions.length; i++) { 133 if (superActions[i] instanceof OpenAction || superActions[i] instanceof EditAction) { 134 result.add (superActions[i]); 135 } 136 } 137 result.add (SystemAction.get(ShowRDocAction.class)); 138 } 139 else if (mode == MODE_PACKAGE || mode == MODE_ROOT) { 140 result.add (SystemAction.get(ShowRDocAction.class)); 141 Action [] superActions = super.getActions(false); 142 for (int i=0; i<superActions.length; i++) { 143 if (superActions[i] instanceof FindAction) { 144 result.add (superActions[i]); 145 } 146 } 147 if (mode == MODE_ROOT) { 148 result.add (SystemAction.get(RemoveClassPathRootAction.class)); 149 } 150 } 151 actionCache = (Action []) result.toArray(new Action [result.size()]); 152 } 153 return actionCache; 154 } 155 156 private static class ActionFilterChildren extends FilterNode.Children { 157 158 private final int mode; 159 private final FileObject cpRoot; 160 161 ActionFilterChildren (Node original, int mode, FileObject cpRooot) { 162 super (original); 163 this.mode = mode; 164 this.cpRoot = cpRooot; 165 } 166 167 protected Node[] createNodes(Node n) { 168 switch (mode) { 169 case MODE_ROOT: 170 case MODE_PACKAGE: 171 DataObject dobj = n.getCookie(DataObject.class); 172 if (dobj == null) { 173 assert false : "DataNode without DataObject in Lookup"; return new Node[0]; 175 } 176 else if (dobj.getPrimaryFile().isFolder()) { 177 return new Node[] {new ActionFilterNode(n, MODE_PACKAGE, cpRoot, dobj.getPrimaryFile())}; 178 } 179 else { 180 return new Node[] {new ActionFilterNode(n, MODE_FILE, cpRoot, dobj.getPrimaryFile())}; 181 } 182 case MODE_FILE: 183 case MODE_FILE_CONTENT: 184 return new Node[] {new ActionFilterNode(n, MODE_FILE_CONTENT)}; 185 default: 186 assert false : "Unknown mode"; return new Node[0]; 188 } 189 } 190 } 191 192 private static class Removable implements RemoveClassPathRootAction.Removable { 193 194 private final UpdateHelper helper; 195 private final String classPathId; 196 private final String entryId; 197 198 Removable (UpdateHelper helper, String classPathId, String entryId) { 199 this.helper = helper; 200 this.classPathId = classPathId; 201 this.entryId = entryId; 202 } 203 204 205 public boolean canRemove () { 206 EditableProperties props = helper.getProperties(RakeProjectHelper.PROJECT_PROPERTIES_PATH); 208 return props.getProperty (classPathId) != null; 209 } 210 211 public void remove() { 212 ProjectManager.mutex().writeAccess ( new Runnable () { 213 public void run() { 214 EditableProperties props = helper.getProperties(RakeProjectHelper.PROJECT_PROPERTIES_PATH); 215 String cp = props.getProperty (classPathId); 216 if (cp != null) { 217 String [] entries = PropertyUtils.tokenizePath(cp); 218 List result = new ArrayList (); 219 for (int i=0; i<entries.length; i++) { 220 } 228 props.setProperty (classPathId, (String [])result.toArray(new String [result.size()])); 229 helper.putProperties(RakeProjectHelper.PROJECT_PROPERTIES_PATH,props); 230 Project project = FileOwnerQuery.getOwner(helper.getRakeProjectHelper().getProjectDirectory()); 231 assert project != null; 232 try { 233 ProjectManager.getDefault().saveProject(project); 234 } catch (IOException ioe) { 235 ErrorManager.getDefault().notify(ioe); 236 } 237 } 238 } 239 }); 240 } 241 } 242 } 243 | Popular Tags |