Changeset 4366 for trunk/gli/src/org/greenstone/gatherer/file/FileNode.java
- Timestamp:
- 2003-05-27T15:57:37+12:00 (21 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/gli/src/org/greenstone/gatherer/file/FileNode.java
r4293 r4366 10 10 11 11 public class FileNode 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 12 implements MutableTreeNode { 13 14 static final private int FALSE = 0; 15 static final private int TRUE = 1; 16 static final private int UNKNOWN = 2; 17 18 private ArrayList children; 19 private boolean children_readonly = true; 20 private boolean readonly = true; 21 private File file; 22 private FileSystemModel model; 23 private int allows_children = UNKNOWN; 24 private MutableTreeNode parent; 25 private String title; 26 27 public FileNode(File file) { 28 ///ystem.err.println("New FileNode(" + file.getAbsolutePath() + ")"); 29 this.file = file; 30 } 31 32 public FileNode(File file, boolean readonly) { 33 this(file); 34 this.children_readonly = readonly; 35 this.readonly = readonly; 36 } 37 38 public FileNode(File file, FileSystemModel model) { 39 this(file); 40 this.model = model; 41 } 42 43 public FileNode(File file, FileSystemModel model, boolean readonly) { 44 this(file, readonly); 45 this.model = model; 46 } 47 48 public FileNode(File file, FileSystemModel model, String title) { 49 this(file, model); 50 this.title = title; 51 } 52 53 public FileNode(File file, String title) { 54 this(file); 55 this.title = title; 56 } 57 58 public FileNode(File file, String title, boolean readonly) { 59 this(file, readonly); 60 this.title = title; 61 } 62 63 public FileNode(File file, FileSystemModel model, String title, boolean readonly) { 64 this(file, model, readonly); 65 this.title = title; 66 } 67 68 /** The special 'dummy' root node, that is not based on a particular file, but instead holds several special directory mappings. */ 69 public FileNode(String title) { 70 this.children = new ArrayList(); 71 this.title = title; 72 } 73 74 /** Returns the children of the receiver as an Enumeration. */ 75 public Enumeration children() { 76 return new FileEnumeration(); 77 } 78 78 79 79 /** Compare two filenodes for equality. */ 80 80 public boolean equals(FileNode node) { 81 82 83 84 85 86 87 88 89 90 81 boolean result = false; 82 if(node != null) { 83 if(file != null) { 84 result = (file.equals(node.getFile())); 85 } 86 else { 87 result = toString().equals(node.toString()); 88 } 89 } 90 return result; 91 91 } 92 92 93 93 /** Returns true if the receiver allows children. We have to cache the result of this call to prevent unceasing missing disk messages being thrown if the removable media was, um, removed after directory mapped. */ 94 94 public boolean getAllowsChildren() { 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 95 if(readonly) { 96 if(allows_children == UNKNOWN) { 97 // If the file is non-null but doesn't exist (as is the case for removable media), return true anyway. 98 if(file != null) { 99 if(FileSystemView.getFileSystemView().isFileSystemRoot(file)) { 100 allows_children = TRUE; 101 } 102 else if(file.exists() && file.isDirectory()) { 103 allows_children = TRUE; 104 } 105 // Any mapped directories always allow children. 106 else if(getParent() != null && getParent().getParent() == null) { 107 allows_children = TRUE; 108 } 109 else { 110 allows_children = FALSE; 111 } 112 } 113 // Allows children is always true for dummy nodes. 114 else { 115 allows_children = TRUE; 116 } 117 } 118 return (allows_children == TRUE); 119 } 120 else { 121 return (file == null || file.isDirectory()); 122 } 123 123 } 124 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 125 /** Returns the child TreeNode at index childIndex. */ 126 public TreeNode getChildAt(int index) { 127 TreeNode result = null; 128 map(); 129 if(0 <= index && index < children.size()) { 130 result = (TreeNode) children.get(index); 131 } 132 else { 133 result = new DefaultMutableTreeNode("Error"); 134 } 135 return result; 136 } 137 138 /** Returns the number of children TreeNodes the receiver contains. */ 139 public int getChildCount() { 140 int size = 0; 141 // We don't automatically map if this is a system root, or we risk the 50,000 Disk not found error messages of death. 142 if(FileSystemView.getFileSystemView().isFileSystemRoot(file)) { 143 size = 1; // Size is always non-zero for a system root 144 } 145 else { 146 map(); 147 } 148 ///ystem.err.println(this + ".getChildCount() = " + children.size()); 149 if(children != null) { 150 size = children.size(); 151 } 152 return size; 153 } 154 155 public File getFile() { 156 return file; 157 } 158 159 /** Returns the index of node in the receivers children. */ 160 public int getIndex(TreeNode node) { 161 map(); 162 return children.indexOf(node); 163 } 164 165 /** Returns the parent TreeNode of the receiver. */ 166 public TreeNode getParent() { 167 return parent; 168 } 169 170 /** Retrieves the tree path from the root node to this node. */ 171 public TreeNode[] getPath() { 172 int count = 0; 173 TreeNode current = this; 174 while(current != null) { 175 count++; 176 current = current.getParent(); 177 } 178 TreeNode[] path = new TreeNode[count]; 179 current = this; 180 while(current != null) { 181 path[count - 1] = current; 182 count--; 183 current = current.getParent(); 184 } 185 return path; 186 } 187 188 public void insert(MutableTreeNode child) { 189 insert(child, children.size()); 190 } 191 192 /** Adds child to the receiver at index. */ 193 public void insert(MutableTreeNode child, int index) { 194 ///ystem.err.println("Insert " + child + " in " + this + " at index " + index); 195 //map(); 196 try { 197 children.add(index, child); 198 198 // Set parent and model. 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 199 FileNode new_child = (FileNode) child; 200 new_child.setModel(model); 201 new_child.setParent(this); 202 new_child.setReadOnly(readonly); 203 } 204 catch(Exception error) { 205 error.printStackTrace(); 206 } 207 } 208 209 /** Returns true if the receiver is a leaf. */ 210 public boolean isLeaf() { 211 return !getAllowsChildren(); 212 } 213 214 public boolean isReadOnly() { 215 return readonly; 216 } 217 218 public void map() { 219 // Only map if there are no children. 220 if(children == null && file != null && getAllowsChildren()) { 221 221 ///ystem.err.println("Map: " + this); 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 222 children = new ArrayList(); 223 File[] files = file.listFiles(); 224 if(files != null && files.length > 0) { 225 ArrayTools tools = new ArrayTools(); 226 // Apply the filters set in the model. 227 FileFilter[] filters = model.getFilters(); 228 for(int i = 0; filters != null && i < filters.length; i++) { 229 files = tools.filter(files, filters[i].filter, filters[i].exclude); 230 } 231 // Sort the remaining files. 232 tools.sort(files, true); 233 // Now add them to children. 234 for(int i = 0; i < files.length; i++) { 235 FileNode child = new FileNode(files[i], model, children_readonly); 236 child.setParent(this); 237 children.add(child); 238 } 239 } 240 model.nodeStructureChanged(this); 241 } 242 else { 243 ///ystem.err.println("Can't map: " + this + ". No file or doesn't allow children."); 244 } 245 } 246 247 /** Removes the child at index from the receiver. */ 248 public void remove(int index) { 249 if(0 <= index && index < children.size()) { 250 children.remove(index); 251 } 252 } 253 254 /** Removes node from the receiver. */ 255 public void remove(MutableTreeNode node){ 256 int index = getIndex(node); 257 if(index != -1) { 258 children.remove(index); 259 } 260 } 261 262 /** Removes the receiver from its parent. */ 263 public void removeFromParent() { 264 parent.remove(this); 265 parent = null; 266 } 267 268 public void setChildrenReadOnly(boolean children_readonly) { 269 this.children_readonly = children_readonly; 270 } 271 272 public void setFile(File file) { 273 this.file = file; 274 } 275 276 public void setModel(FileSystemModel model) { 277 this.model = model; 278 } 279 280 public void setParent(MutableTreeNode parent) { 281 this.parent = parent; 282 } 283 284 public void setReadOnly(boolean readonly) { 285 this.readonly = readonly; 286 } 287 288 /** Resets the user object of the receiver to object. */ 289 public void setUserObject(Object object) { 290 try { 291 file = (File) object; 292 title = null; 293 } 294 catch(Exception error) { 295 error.printStackTrace(); 296 } 297 } 298 299 public String toString() { 300 if(title == null) { 301 if(FileSystemView.getFileSystemView().isFileSystemRoot(file)) { 302 title = file.getAbsolutePath(); 303 } 304 else { 305 title = file.getName(); 306 } 307 } 308 return title; 309 } 310 311 /** Unmap this nodes children. */ 312 public void unmap() { 313 // You cannot unmap nodes that have no file basis. 314 if(file != null) { 315 315 ///ystem.err.println("Unmap: " + this); 316 317 318 316 children = null; 317 } 318 else { 319 319 ///ystem.err.println("No file for " + this + " - can't unmap."); 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 320 } 321 } 322 323 private class FileEnumeration 324 implements Enumeration { 325 private int index = 0; 326 /** Tests if this enumeration contains more elements. */ 327 public boolean hasMoreElements() { 328 return (index < children.size()); 329 } 330 /** Returns the next element of this enumeration if this enumeration object has at least one more element to provide. */ 331 public Object nextElement() { 332 Object result = null; 333 if(index < children.size()) { 334 result = children.get(index); 335 index++; 336 } 337 return result; 338 } 339 } 340 340 }
Note:
See TracChangeset
for help on using the changeset viewer.