1 6 21 22 package de.schlichtherle.io.swing; 23 24 import de.schlichtherle.io.*; 25 import de.schlichtherle.io.File; 26 27 import java.io.*; 28 import java.text.*; 29 import java.util.*; 30 31 import javax.swing.*; 32 33 44 public class FileSystemView extends AbstractFileSystemView { 72 73 private static final String CLASS_NAME 74 = "de/schlichtherle/io/swing/FileSystemView".replace('/', '.'); private static final ResourceBundle resources 76 = ResourceBundle.getBundle(CLASS_NAME); 77 78 private static FileSystemView defaultView = new FileSystemView( 79 javax.swing.filechooser.FileSystemView.getFileSystemView(), 80 null); 81 82 public final static javax.swing.filechooser.FileSystemView getFileSystemView() { 83 return getFileSystemView(null); 84 } 85 86 public final static javax.swing.filechooser.FileSystemView getFileSystemView( 87 ArchiveDetector archiveDetector) { 88 return archiveDetector != null 89 ? new FileSystemView( 90 javax.swing.filechooser.FileSystemView.getFileSystemView(), 91 archiveDetector) 92 : defaultView; 93 } 94 95 96 private ArchiveDetector archiveDetector; 97 98 private FileSystemView( 99 javax.swing.filechooser.FileSystemView delegate, 100 ArchiveDetector archiveDetector) { 101 super(delegate); 102 this.archiveDetector = archiveDetector; 103 } 104 105 112 public ArchiveDetector getArchiveDetector() { 113 return archiveDetector != null 114 ? archiveDetector 115 : File.getDefaultArchiveDetector(); 116 } 117 118 126 public void setArchiveDetector(ArchiveDetector archiveDetector) { 127 this.archiveDetector = archiveDetector; 128 } 129 130 133 protected File wrap(final java.io.File file) { 134 if (file == null) 135 return null; 136 else if (file instanceof File) 137 return (File) file; 138 else 139 return getArchiveDetector().createFile(file); 140 } 141 142 145 protected java.io.File unwrap(final java.io.File file) { 146 if (file instanceof File) 147 return ((File) file).getDelegate(); 148 else 149 return file; 150 } 151 152 156 public java.io.File createFileObject(final java.io.File file) { 157 if (file == null) 158 return null; 159 final File wFile = wrap(file); 160 return wFile.isArchive() || wFile.isEntry() 161 ? wFile 162 : unwrap(file); 163 } 164 165 169 public boolean isRoot(java.io.File file) { 170 return super.isRoot(unwrap(file)); 171 } 172 173 public Boolean isTraversable(java.io.File file) { 174 final File wFile = wrap(file); 175 final Boolean traversable = FileView.traversable(wFile); 176 if (traversable != null) 177 return traversable; 178 return super.isTraversable(unwrap(file)); 179 } 180 181 public String getSystemDisplayName(java.io.File file) { 182 final File wFile = wrap(file); 183 if (wFile.isArchive() || wFile.isEntry()) 184 return wFile.getName(); 185 return super.getSystemDisplayName(unwrap(file)); 186 } 187 188 public String getSystemTypeDescription(java.io.File file) { 189 final File wFile = wrap(file); 190 final String typeDescription = FileView.typeDescription(wFile); 191 if (typeDescription != null) 192 return typeDescription; 193 return super.getSystemTypeDescription(unwrap(file)); 194 } 195 196 public Icon getSystemIcon(java.io.File file) { 197 final File wFile = wrap(file); 198 final Icon icon = FileView.closedIcon(wFile); 199 if (icon != null) 200 return icon; 201 return super.getSystemIcon(unwrap(file)); 202 } 203 204 public boolean isParent(java.io.File folder, java.io.File file) { 205 return super.isParent(wrap(folder), wrap(file)) 206 || super.isParent(unwrap(folder), unwrap(file)); 207 } 208 209 public java.io.File getChild(java.io.File parent, String child) { 210 final File wParent = wrap(parent); 211 if (wParent.isArchive() || wParent.isEntry()) 212 return createFileObject(super.getChild(wParent, child)); 213 return createFileObject(super.getChild(unwrap(parent), child)); 214 } 215 216 public boolean isFileSystem(java.io.File file) { 217 return super.isFileSystem(unwrap(file)); 218 } 219 220 public java.io.File createNewFolder(final java.io.File parent) 221 throws IOException { 222 final File wParent = wrap(parent); 223 if (wParent.isArchive() || wParent.isEntry()) { 224 File folder = getArchiveDetector().createFile( 225 wParent, 226 UIManager.getString(File.separatorChar == '\\' 227 ? "FileChooser.win32.newFolder" 228 : "FileChooser.other.newFolder")); 229 230 for (int i = 2; !folder.mkdirs(); i++) { 231 if (i > 100) 232 throw new IOException(wParent + ": Could not create new directory entry!"); 233 folder = getArchiveDetector().createFile( 234 wParent, 235 MessageFormat.format( 236 UIManager.getString(File.separatorChar == '\\' 237 ? "FileChooser.win32.newFolder.subsequent" 238 : "FileChooser.other.newFolder.subsequent"), 239 new Object [] { new Integer (i) })); 240 } 241 242 return folder; 243 } 244 return createFileObject(super.createNewFolder(unwrap(parent))); 245 } 246 247 public boolean isHiddenFile(java.io.File file) { 248 return super.isHiddenFile(unwrap(file)); 249 } 250 251 public boolean isFileSystemRoot(java.io.File file) { 252 return super.isFileSystemRoot(unwrap(file)); 253 } 254 255 public boolean isDrive(java.io.File file) { 256 return super.isDrive(unwrap(file)); 257 } 258 259 public boolean isFloppyDrive(java.io.File file) { 260 return super.isFloppyDrive(unwrap(file)); 261 } 262 263 public boolean isComputerNode(java.io.File file) { 264 return super.isComputerNode(unwrap(file)); 265 } 266 267 271 public java.io.File createFileObject(java.io.File dir, String str) { 272 return createFileObject(super.createFileObject(dir, str)); 273 } 274 275 279 public java.io.File createFileObject(String str) { 280 return createFileObject(super.createFileObject(str)); 281 } 282 283 public java.io.File [] getFiles( 284 final java.io.File dir, 285 final boolean useFileHiding) { 286 final File smartDir = wrap(dir); 287 if (smartDir.isArchive() || smartDir.isEntry()) { 288 return smartDir.listFiles(new FileFilter() { 290 public boolean accept(java.io.File file) { 291 return !useFileHiding || !isHiddenFile(file); 292 } 293 }); 294 } else { 295 final java.io.File files[] = super.getFiles(unwrap(dir), useFileHiding); 296 for (int i = files.length; --i >= 0; ) 297 files[i] = createFileObject(files[i]); 298 299 return files; 300 } 301 } 302 303 public java.io.File getParentDirectory(java.io.File file) { 304 final File wFile = wrap(file); 305 if (wFile.isEntry()) 306 return createFileObject(wFile.getParentFile()); 307 return createFileObject(super.getParentDirectory(unwrap(file))); 308 } 309 310 317 } 318 | Popular Tags |