139
140
141 public BasicFileChooserUI(JFileChooser b) {
142 }
143
144 public void installUI(JComponent c) {
145 accessoryPanel = new JPanel(new BorderLayout());
146 filechooser = (JFileChooser) c;
147
148 createModel();
149
150 clearIconCache();
151
152 installDefaults(filechooser);
153 installComponents(filechooser);
154 installListeners(filechooser);
155 filechooser.applyComponentOrientation(filechooser.getComponentOrientation());
156 }
157
158 public void uninstallUI(JComponent c) {
159 uninstallListeners((JFileChooser) filechooser);
160 uninstallComponents((JFileChooser) filechooser);
161 uninstallDefaults((JFileChooser) filechooser);
162
163 if(accessoryPanel != null) {
164 accessoryPanel.removeAll();
165 }
166
167 accessoryPanel = null;
168 getFileChooser().removeAll();
169
170 handler = null;
171 }
172
173 public void installComponents(JFileChooser fc) {
174 }
175
176 public void uninstallComponents(JFileChooser fc) {
177 }
178
179 protected void installListeners(JFileChooser fc) {
180 propertyChangeListener = createPropertyChangeListener(fc);
181 if(propertyChangeListener != null) {
477 if(!evt.getValueIsAdjusting()) {
478 JFileChooser chooser = getFileChooser();
479 FileSystemView fsv = chooser.getFileSystemView();
480 JList list = (JList)evt.getSource();
481
482 int fsm = chooser.getFileSelectionMode();
483 boolean useSetDirectory = usesSingleFilePane &&
484 (fsm == JFileChooser.FILES_ONLY);
485
486 if (chooser.isMultiSelectionEnabled()) {
487 File[] files = null;
488 Object[] objects = list.getSelectedValues();
489 if (objects != null) {
490 if (objects.length == 1
491 && ((File)objects[0]).isDirectory()
492 && chooser.isTraversable(((File)objects[0]))
493 && (useSetDirectory || !fsv.isFileSystem(((File)objects[0])))) {
494 setDirectorySelected(true);
495 setDirectory(((File)objects[0]));
496 } else {
497 ArrayList fList = new ArrayList(objects.length);
498 for (int i = 0; i < objects.length; i++) {
499 File f = (File)objects[i];
500 boolean isDir = f.isDirectory();
501 if ((chooser.isFileSelectionEnabled() && !isDir)
502 || (chooser.isDirectorySelectionEnabled()
503 && fsv.isFileSystem(f)
504 && isDir)) {
505 fList.add(f);
506 }
507 }
508 if (fList.size() > 0) {
509 files = (File[])fList.toArray(new File[fList.size()]);
510 }
511 setDirectorySelected(false);
512 }
513 }
514 chooser.setSelectedFiles(files);
515 } else {
516 File file = (File)list.getSelectedValue();
517 if (file != null
518 && file.isDirectory()
519 && chooser.isTraversable(file)
520 && (useSetDirectory || !fsv.isFileSystem(file))) {
521
522 setDirectorySelected(true);
523 setDirectory(file);
524 if (usesSingleFilePane) {
525 chooser.setSelectedFile(null);
526 }
527 } else {
528 setDirectorySelected(false);
529 if (file != null) {
815 if (filename == null || filename.equals("")) {
816 // no file selected, multiple selection off, therefore cancel the approve action
817 resetGlobFilter();
818 return;
819 }
820
821 File selectedFile = null;
822 File[] selectedFiles = null;
823
824 if (filename != null && !filename.equals("")) {
825 // Unix: Resolve '~' to user's home directory
826 if (File.separatorChar == '/') {
827 if (filename.startsWith("~/")) {
828 filename = System.getProperty("user.home") + filename.substring(1);
829 } else if (filename.equals("~")) {
830 filename = System.getProperty("user.home");
831 }
832 }
833
834 if (chooser.isMultiSelectionEnabled() && filename.startsWith("\"")) {
835 ArrayList fList = new ArrayList();
836
837 filename = filename.substring(1);
838 if (filename.endsWith("\"")) {
839 filename = filename.substring(0, filename.length()-1);
840 }
841 File[] children = null;
842 int childIndex = 0;
843 do {
844 String str;
845 int i = filename.indexOf("\" \"");
846 if (i > 0) {
847 str = filename.substring(0, i);
848 filename = filename.substring(i+3);
849 } else {
850 str = filename;
851 filename = "";
852 }
853 File file = fs.createFileObject(str);
854 if (!file.isAbsolute()) {
855 if (children == null) {
856 children = fs.getFiles(dir, false);
857 Arrays.sort(children);
858 }
859 for (int k = 0; k < children.length; k++) {
860 int l = (childIndex + k) % children.length;
861 if (children[l].getName().equals(str)) {
862 file = children[l];
863 childIndex = l + 1;
864 break;
865 }
866 }
867 }
868 fList.add(file);
869 } while (filename.length() > 0);
870 if (fList.size() > 0) {
871 selectedFiles = (File[])fList.toArray(new File[fList.size()]);
872 }
873 resetGlobFilter();
874 } else {
875 selectedFile = fs.createFileObject(filename);
876 if(!selectedFile.isAbsolute()) {
877 selectedFile = fs.getChild(dir, filename);
878 }
879 // check for wildcard pattern
880 FileFilter currentFilter = chooser.getFileFilter();
881 if (!selectedFile.exists() && isGlobPattern(filename)) {
882 changeDirectory(selectedFile.getParentFile());
883 if (globFilter == null) {
884 globFilter = new GlobFilter();
885 }
886 try {
887 globFilter.setPattern(selectedFile.getName());
888 if (!(currentFilter instanceof GlobFilter)) {
889 actualFileFilter = currentFilter;
890 }
891 chooser.setFileFilter(null);
1175 }
1176
1177
1178 public String getDescription(File f) {
1179 return f.getName();
1180 }
1181
1182 public String getTypeDescription(File f) {
1183 String type = getFileChooser().getFileSystemView().getSystemTypeDescription(f);
1184 if (type == null) {
1185 if (f.isDirectory()) {
1186 type = directoryDescriptionText;
1187 } else {
1188 type = fileDescriptionText;
1189 }
1190 }
1191 return type;
1192 }
1193
1194 public Icon getCachedIcon(File f) {
1195 return (Icon) iconCache.get(f);
1196 }
1197
1198 public void cacheIcon(File f, Icon i) {
1199 if(f == null || i == null) {
1200 return;
1201 }
1202 iconCache.put(f, i);
1203 }
1204
1205 public Icon getIcon(File f) {
1206 Icon icon = getCachedIcon(f);
1207 if(icon != null) {
1208 return icon;
1209 }
1210 icon = fileIcon;
1211 if (f != null) {
1212 FileSystemView fsv = getFileChooser().getFileSystemView();
1213
1214 if (fsv.isFloppyDrive(f)) {
1215 icon = floppyDriveIcon;
1258 values = ((JList)c).getSelectedValues();
1259 } else if (c instanceof JTable) {
1260 JTable table = (JTable)c;
1261 int[] rows = table.getSelectedRows();
1262 if (rows != null) {
1263 values = new Object[rows.length];
1264 for (int i=0; i<rows.length; i++) {
1265 values[i] = table.getValueAt(rows[i], 0);
1266 }
1267 }
1268 }
1269 if (values == null || values.length == 0) {
1270 return null;
1271 }
1272
1273 StringBuffer plainBuf = new StringBuffer();
1274 StringBuffer htmlBuf = new StringBuffer();
1275
1276 htmlBuf.append("<html>\n<body>\n<ul>\n");
1277
1278 for (int i = 0; i < values.length; i++) {
1279 Object obj = values[i];
1280 String val = ((obj == null) ? "" : obj.toString());
1281 plainBuf.append(val + "\n");
1282 htmlBuf.append(" <li>" + val + "\n");
1283 }
1284
1285 // remove the last newline
1286 plainBuf.deleteCharAt(plainBuf.length() - 1);
1287 htmlBuf.append("</ul>\n</body>\n</html>");
1288
1289 return new FileTransferable(plainBuf.toString(), htmlBuf.toString(), values);
1290 }
1291
1292 public int getSourceActions(JComponent c) {
1293 return COPY;
1294 }
1295
1296 static class FileTransferable extends BasicTransferable {
1297
1298 Object[] fileData;
1299
1300 FileTransferable(String plainData, String htmlData, Object[] fileData) {
1301 super(plainData, htmlData);
1302 this.fileData = fileData;
1303 }
1304
1305 /**
1306 * Best format of the file chooser is DataFlavor.javaFileListFlavor.
1307 */
1308 protected DataFlavor[] getRicherFlavors() {
1309 DataFlavor[] flavors = new DataFlavor[1];
1310 flavors[0] = DataFlavor.javaFileListFlavor;
1311 return flavors;
1312 }
1313
1314 /**
1315 * The only richer format supported is the file list flavor
1316 */
1317 protected Object getRicherData(DataFlavor flavor) {
1318 if (DataFlavor.javaFileListFlavor.equals(flavor)) {
1319 ArrayList files = new ArrayList();
1320 for (int i = 0; i < fileData.length; i++) {
1321 files.add(fileData[i]);
1322 }
1323 return files;
1324 }
1325 return null;
1326 }
1327
1328 }
1329 }
1330 }
|
139
140
141 public BasicFileChooserUI(JFileChooser b) {
142 }
143
144 public void installUI(JComponent c) {
145 accessoryPanel = new JPanel(new BorderLayout());
146 filechooser = (JFileChooser) c;
147
148 createModel();
149
150 clearIconCache();
151
152 installDefaults(filechooser);
153 installComponents(filechooser);
154 installListeners(filechooser);
155 filechooser.applyComponentOrientation(filechooser.getComponentOrientation());
156 }
157
158 public void uninstallUI(JComponent c) {
159 uninstallListeners(filechooser);
160 uninstallComponents(filechooser);
161 uninstallDefaults(filechooser);
162
163 if(accessoryPanel != null) {
164 accessoryPanel.removeAll();
165 }
166
167 accessoryPanel = null;
168 getFileChooser().removeAll();
169
170 handler = null;
171 }
172
173 public void installComponents(JFileChooser fc) {
174 }
175
176 public void uninstallComponents(JFileChooser fc) {
177 }
178
179 protected void installListeners(JFileChooser fc) {
180 propertyChangeListener = createPropertyChangeListener(fc);
181 if(propertyChangeListener != null) {
477 if(!evt.getValueIsAdjusting()) {
478 JFileChooser chooser = getFileChooser();
479 FileSystemView fsv = chooser.getFileSystemView();
480 JList list = (JList)evt.getSource();
481
482 int fsm = chooser.getFileSelectionMode();
483 boolean useSetDirectory = usesSingleFilePane &&
484 (fsm == JFileChooser.FILES_ONLY);
485
486 if (chooser.isMultiSelectionEnabled()) {
487 File[] files = null;
488 Object[] objects = list.getSelectedValues();
489 if (objects != null) {
490 if (objects.length == 1
491 && ((File)objects[0]).isDirectory()
492 && chooser.isTraversable(((File)objects[0]))
493 && (useSetDirectory || !fsv.isFileSystem(((File)objects[0])))) {
494 setDirectorySelected(true);
495 setDirectory(((File)objects[0]));
496 } else {
497 ArrayList<File> fList = new ArrayList<File>(objects.length);
498 for (Object object : objects) {
499 File f = (File) object;
500 boolean isDir = f.isDirectory();
501 if ((chooser.isFileSelectionEnabled() && !isDir)
502 || (chooser.isDirectorySelectionEnabled()
503 && fsv.isFileSystem(f)
504 && isDir)) {
505 fList.add(f);
506 }
507 }
508 if (fList.size() > 0) {
509 files = fList.toArray(new File[fList.size()]);
510 }
511 setDirectorySelected(false);
512 }
513 }
514 chooser.setSelectedFiles(files);
515 } else {
516 File file = (File)list.getSelectedValue();
517 if (file != null
518 && file.isDirectory()
519 && chooser.isTraversable(file)
520 && (useSetDirectory || !fsv.isFileSystem(file))) {
521
522 setDirectorySelected(true);
523 setDirectory(file);
524 if (usesSingleFilePane) {
525 chooser.setSelectedFile(null);
526 }
527 } else {
528 setDirectorySelected(false);
529 if (file != null) {
815 if (filename == null || filename.equals("")) {
816 // no file selected, multiple selection off, therefore cancel the approve action
817 resetGlobFilter();
818 return;
819 }
820
821 File selectedFile = null;
822 File[] selectedFiles = null;
823
824 if (filename != null && !filename.equals("")) {
825 // Unix: Resolve '~' to user's home directory
826 if (File.separatorChar == '/') {
827 if (filename.startsWith("~/")) {
828 filename = System.getProperty("user.home") + filename.substring(1);
829 } else if (filename.equals("~")) {
830 filename = System.getProperty("user.home");
831 }
832 }
833
834 if (chooser.isMultiSelectionEnabled() && filename.startsWith("\"")) {
835 ArrayList<File> fList = new ArrayList<File>();
836
837 filename = filename.substring(1);
838 if (filename.endsWith("\"")) {
839 filename = filename.substring(0, filename.length()-1);
840 }
841 File[] children = null;
842 int childIndex = 0;
843 do {
844 String str;
845 int i = filename.indexOf("\" \"");
846 if (i > 0) {
847 str = filename.substring(0, i);
848 filename = filename.substring(i+3);
849 } else {
850 str = filename;
851 filename = "";
852 }
853 File file = fs.createFileObject(str);
854 if (!file.isAbsolute()) {
855 if (children == null) {
856 children = fs.getFiles(dir, false);
857 Arrays.sort(children);
858 }
859 for (int k = 0; k < children.length; k++) {
860 int l = (childIndex + k) % children.length;
861 if (children[l].getName().equals(str)) {
862 file = children[l];
863 childIndex = l + 1;
864 break;
865 }
866 }
867 }
868 fList.add(file);
869 } while (filename.length() > 0);
870 if (fList.size() > 0) {
871 selectedFiles = fList.toArray(new File[fList.size()]);
872 }
873 resetGlobFilter();
874 } else {
875 selectedFile = fs.createFileObject(filename);
876 if(!selectedFile.isAbsolute()) {
877 selectedFile = fs.getChild(dir, filename);
878 }
879 // check for wildcard pattern
880 FileFilter currentFilter = chooser.getFileFilter();
881 if (!selectedFile.exists() && isGlobPattern(filename)) {
882 changeDirectory(selectedFile.getParentFile());
883 if (globFilter == null) {
884 globFilter = new GlobFilter();
885 }
886 try {
887 globFilter.setPattern(selectedFile.getName());
888 if (!(currentFilter instanceof GlobFilter)) {
889 actualFileFilter = currentFilter;
890 }
891 chooser.setFileFilter(null);
1175 }
1176
1177
1178 public String getDescription(File f) {
1179 return f.getName();
1180 }
1181
1182 public String getTypeDescription(File f) {
1183 String type = getFileChooser().getFileSystemView().getSystemTypeDescription(f);
1184 if (type == null) {
1185 if (f.isDirectory()) {
1186 type = directoryDescriptionText;
1187 } else {
1188 type = fileDescriptionText;
1189 }
1190 }
1191 return type;
1192 }
1193
1194 public Icon getCachedIcon(File f) {
1195 return iconCache.get(f);
1196 }
1197
1198 public void cacheIcon(File f, Icon i) {
1199 if(f == null || i == null) {
1200 return;
1201 }
1202 iconCache.put(f, i);
1203 }
1204
1205 public Icon getIcon(File f) {
1206 Icon icon = getCachedIcon(f);
1207 if(icon != null) {
1208 return icon;
1209 }
1210 icon = fileIcon;
1211 if (f != null) {
1212 FileSystemView fsv = getFileChooser().getFileSystemView();
1213
1214 if (fsv.isFloppyDrive(f)) {
1215 icon = floppyDriveIcon;
1258 values = ((JList)c).getSelectedValues();
1259 } else if (c instanceof JTable) {
1260 JTable table = (JTable)c;
1261 int[] rows = table.getSelectedRows();
1262 if (rows != null) {
1263 values = new Object[rows.length];
1264 for (int i=0; i<rows.length; i++) {
1265 values[i] = table.getValueAt(rows[i], 0);
1266 }
1267 }
1268 }
1269 if (values == null || values.length == 0) {
1270 return null;
1271 }
1272
1273 StringBuffer plainBuf = new StringBuffer();
1274 StringBuffer htmlBuf = new StringBuffer();
1275
1276 htmlBuf.append("<html>\n<body>\n<ul>\n");
1277
1278 for (Object obj : values) {
1279 String val = ((obj == null) ? "" : obj.toString());
1280 plainBuf.append(val + "\n");
1281 htmlBuf.append(" <li>" + val + "\n");
1282 }
1283
1284 // remove the last newline
1285 plainBuf.deleteCharAt(plainBuf.length() - 1);
1286 htmlBuf.append("</ul>\n</body>\n</html>");
1287
1288 return new FileTransferable(plainBuf.toString(), htmlBuf.toString(), values);
1289 }
1290
1291 public int getSourceActions(JComponent c) {
1292 return COPY;
1293 }
1294
1295 static class FileTransferable extends BasicTransferable {
1296
1297 Object[] fileData;
1298
1299 FileTransferable(String plainData, String htmlData, Object[] fileData) {
1300 super(plainData, htmlData);
1301 this.fileData = fileData;
1302 }
1303
1304 /**
1305 * Best format of the file chooser is DataFlavor.javaFileListFlavor.
1306 */
1307 protected DataFlavor[] getRicherFlavors() {
1308 DataFlavor[] flavors = new DataFlavor[1];
1309 flavors[0] = DataFlavor.javaFileListFlavor;
1310 return flavors;
1311 }
1312
1313 /**
1314 * The only richer format supported is the file list flavor
1315 */
1316 protected Object getRicherData(DataFlavor flavor) {
1317 if (DataFlavor.javaFileListFlavor.equals(flavor)) {
1318 ArrayList<Object> files = new ArrayList<Object>();
1319 for (Object file : this.fileData) {
1320 files.add(file);
1321 }
1322 return files;
1323 }
1324 return null;
1325 }
1326
1327 }
1328 }
1329 }
|