1:
37:
38: package ;
39:
40: import ;
41: import ;
42: import ;
43: import ;
44: import ;
45: import ;
46: import ;
47: import ;
48: import ;
49: import ;
50: import ;
51: import ;
52: import ;
53: import ;
54:
55:
56:
59: public class JFileChooser extends JComponent implements Accessible
60: {
61: private static final long serialVersionUID = 3162921138695327837L;
62:
63:
64: public static final int OPEN_DIALOG = 0;
65:
66:
67: public static final int SAVE_DIALOG = 1;
68:
69:
70: public static final int CUSTOM_DIALOG = 2;
71:
72:
73: public static final int CANCEL_OPTION = 1;
74:
75:
76: public static final int APPROVE_OPTION = 0;
77:
78:
79: public static final int ERROR_OPTION = -1;
80:
81:
82: public static final int FILES_ONLY = 0;
83:
84:
85: public static final int DIRECTORIES_ONLY = 1;
86:
87:
88: public static final int FILES_AND_DIRECTORIES = 2;
89:
90:
91: public static final String CANCEL_SELECTION = "CancelSelection";
92:
93:
94: public static final String APPROVE_SELECTION = "ApproveSelection";
95:
96:
97: public static final String APPROVE_BUTTON_TEXT_CHANGED_PROPERTY =
98: "ApproveButtonTextChangedProperty";
99:
100:
101: public static final String APPROVE_BUTTON_TOOL_TIP_TEXT_CHANGED_PROPERTY =
102: "ApproveButtonToolTipTextChangedProperty";
103:
104:
105: public static final String APPROVE_BUTTON_MNEMONIC_CHANGED_PROPERTY =
106: "ApproveButtonMnemonicChangedProperty";
107:
108:
109: public static final String CONTROL_BUTTONS_ARE_SHOWN_CHANGED_PROPERTY =
110: "ControlButtonsAreShownChangedProperty";
111:
112:
113: public static final String DIRECTORY_CHANGED_PROPERTY = "directoryChanged";
114:
115:
116: public static final String SELECTED_FILE_CHANGED_PROPERTY =
117: "SelectedFileChangedProperty";
118:
119:
120: public static final String SELECTED_FILES_CHANGED_PROPERTY =
121: "SelectedFilesChangedProperty";
122:
123:
124: public static final String MULTI_SELECTION_ENABLED_CHANGED_PROPERTY =
125: "MultiSelectionEnabledChangedProperty";
126:
127:
128: public static final String FILE_SYSTEM_VIEW_CHANGED_PROPERTY =
129: "FileSystemViewChanged";
130:
131:
132: public static final String FILE_VIEW_CHANGED_PROPERTY = "fileViewChanged";
133:
134:
135: public static final String FILE_HIDING_CHANGED_PROPERTY =
136: "FileHidingChanged";
137:
138:
139: public static final String FILE_FILTER_CHANGED_PROPERTY =
140: "fileFilterChanged";
141:
142:
143: public static final String FILE_SELECTION_MODE_CHANGED_PROPERTY =
144: "fileSelectionChanged";
145:
146:
147: public static final String ACCESSORY_CHANGED_PROPERTY =
148: "AccessoryChangedProperty";
149:
150:
151: public static final String ACCEPT_ALL_FILE_FILTER_USED_CHANGED_PROPERTY =
152: "acceptAllFileFilterUsedChanged";
153:
154:
155: public static final String DIALOG_TITLE_CHANGED_PROPERTY =
156: "DialogTitleChangedProperty";
157:
158:
159: public static final String DIALOG_TYPE_CHANGED_PROPERTY =
160: "DialogTypeChangedProperty";
161:
162:
163: public static final String CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY =
164: "ChoosableFileFilterChangedProperty";
165:
166:
167: protected AccessibleContext accessibleContext;
168:
169:
170: private FileSystemView fsv;
171:
172:
173: private JComponent accessory;
174:
175:
176: private int approveButtonMnemonic = 0;
177:
178:
179: private String approveButtonText;
180:
181:
182: private String approveButtonToolTipText;
183:
184:
185: private ArrayList choosableFilters = new ArrayList();
186:
187:
188: private boolean isAcceptAll = true;
189:
190:
191: private String dialogTitle;
192:
193:
194: private int dialogType = OPEN_DIALOG;
195:
196:
197: private int retval = ERROR_OPTION;
198:
199:
200: private boolean multiSelection = false;
201:
202:
203: private boolean fileHiding = true;
204:
205:
206: private int fileSelectionMode = FILES_AND_DIRECTORIES;
207:
208:
209: private FileView fv = null;
210:
211:
212: private boolean controlButtonsShown = true;
213:
214:
215: private File currentDir = null;
216:
217:
218: private FileFilter currentFilter = null;
219:
220:
221: private File[] selectedFiles;
222:
223:
224: private File selectedFile;
225:
226:
229: public JFileChooser()
230: {
231: setup(null);
232: setCurrentDirectory(null);
233: }
234:
235:
240: public JFileChooser(String currentDirectoryPath)
241: {
242: setup(null);
243: setCurrentDirectory(fsv.createFileObject(currentDirectoryPath));
244: }
245:
246:
254: public JFileChooser(String currentDirectoryPath, FileSystemView fsv)
255: {
256: setup(fsv);
257: setCurrentDirectory(fsv.createFileObject(currentDirectoryPath));
258: }
259:
260:
265: public JFileChooser(File currentDirectory)
266: {
267: setup(null);
268: setCurrentDirectory(currentDirectory);
269: }
270:
271:
276: public JFileChooser(FileSystemView fsv)
277: {
278: setup(fsv);
279: setCurrentDirectory(null);
280: }
281:
282:
288: public JFileChooser(File currentDirectory, FileSystemView fsv)
289: {
290: setup(fsv);
291: setCurrentDirectory(currentDirectory);
292: }
293:
294:
299: protected void setup(FileSystemView view)
300: {
301: if (view == null)
302: view = FileSystemView.getFileSystemView();
303: setFileSystemView(view);
304: updateUI();
305: }
306:
307:
312: public void setDragEnabled(boolean b)
313: {
314:
315: }
316:
317:
322: public boolean getDragEnabled()
323: {
324:
325: return false;
326: }
327:
328:
333: public File getSelectedFile()
334: {
335: return selectedFile;
336: }
337:
338:
343: public void setSelectedFile(File file)
344: {
345: if (selectedFile != file)
346: {
347: File old = selectedFile;
348: selectedFile = file;
349: firePropertyChange(SELECTED_FILE_CHANGED_PROPERTY, old, selectedFile);
350: }
351: }
352:
353:
358: public File[] getSelectedFiles()
359: {
360: if (selectedFiles != null)
361: return selectedFiles;
362: if (selectedFile != null)
363: return new File[] { selectedFile };
364: return null;
365: }
366:
367:
372: public void setSelectedFiles(File[] selectedFiles)
373: {
374: if (this.selectedFiles != selectedFiles)
375: {
376: File[] old = this.selectedFiles;
377: this.selectedFiles = selectedFiles;
378: firePropertyChange(SELECTED_FILES_CHANGED_PROPERTY, old, selectedFiles);
379: }
380:
381: if (selectedFiles != null)
382: setSelectedFile(selectedFiles[0]);
383: }
384:
385:
390: public File getCurrentDirectory()
391: {
392: return currentDir;
393: }
394:
395:
400: public void setCurrentDirectory(File dir)
401: {
402: if (currentDir != dir || dir == null)
403: {
404: if (dir == null)
405: dir = fsv.getDefaultDirectory();
406:
407: File old = currentDir;
408: currentDir = dir;
409: firePropertyChange(DIRECTORY_CHANGED_PROPERTY, old, currentDir);
410: }
411: }
412:
413:
416: public void changeToParentDirectory()
417: {
418: setCurrentDirectory(fsv.getParentDirectory(currentDir));
419: }
420:
421:
424: public void rescanCurrentDirectory()
425: {
426: getUI().rescanCurrentDirectory(this);
427: }
428:
429:
434: public void ensureFileIsVisible(File f)
435: {
436: getUI().ensureFileIsVisible(this, f);
437: }
438:
439:
448: public int showOpenDialog(Component parent) throws HeadlessException
449: {
450: JDialog d = createDialog(parent);
451:
452:
453: d.setTitle("Open");
454: setDialogType(OPEN_DIALOG);
455:
456: retval = ERROR_OPTION;
457:
458: d.pack();
459: d.show();
460: return retval;
461: }
462:
463:
472: public int showSaveDialog(Component parent) throws HeadlessException
473: {
474: JDialog d = createDialog(parent);
475: setDialogType(SAVE_DIALOG);
476:
477: retval = ERROR_OPTION;
478:
479: d.pack();
480: d.show();
481: return retval;
482: }
483:
484:
494: public int showDialog(Component parent, String approveButtonText)
495: throws HeadlessException
496: {
497: JDialog d = createDialog(parent);
498: setApproveButtonText(approveButtonText);
499: setDialogType(CUSTOM_DIALOG);
500:
501: retval = ERROR_OPTION;
502:
503: d.pack();
504: d.show();
505: return retval;
506: }
507:
508:
517: protected JDialog createDialog(Component parent) throws HeadlessException
518: {
519: Frame toUse = (Frame) SwingUtilities.getAncestorOfClass(Frame.class, parent);
520: if (toUse == null)
521: toUse = SwingUtilities.getOwnerFrame();
522:
523: JDialog dialog = new JDialog(toUse);
524: setSelectedFile(null);
525: dialog.getContentPane().add(this);
526: dialog.setModal(true);
527: dialog.invalidate();
528: dialog.repaint();
529:
530: return dialog;
531: }
532:
533:
538: public boolean getControlButtonsAreShown()
539: {
540: return controlButtonsShown;
541: }
542:
543:
548: public void setControlButtonsAreShown(boolean b)
549: {
550: if (controlButtonsShown != b)
551: {
552: controlButtonsShown = b;
553: firePropertyChange(CONTROL_BUTTONS_ARE_SHOWN_CHANGED_PROPERTY,
554: ! controlButtonsShown, controlButtonsShown);
555: }
556: }
557:
558:
563: public int getDialogType()
564: {
565: return dialogType;
566: }
567:
568:
573: public void setDialogType(int dialogType)
574: {
575: if (dialogType != OPEN_DIALOG && dialogType != SAVE_DIALOG
576: && dialogType != CUSTOM_DIALOG)
577: throw new IllegalArgumentException("Choose allowable dialogType.");
578:
579: if (this.dialogType != dialogType)
580: {
581: int old = this.dialogType;
582: this.dialogType = dialogType;
583: firePropertyChange(DIALOG_TYPE_CHANGED_PROPERTY, old, this.dialogType);
584: }
585: }
586:
587:
592: public void setDialogTitle(String dialogTitle)
593: {
594: if (this.dialogTitle != dialogTitle)
595: {
596: String old = this.dialogTitle;
597: this.dialogTitle = dialogTitle;
598: firePropertyChange(DIALOG_TITLE_CHANGED_PROPERTY, old, this.dialogTitle);
599: }
600: }
601:
602:
607: public String getDialogTitle()
608: {
609: return dialogTitle;
610: }
611:
612:
617: public void setApproveButtonToolTipText(String toolTipText)
618: {
619: if (approveButtonToolTipText != toolTipText)
620: {
621: String oldText = approveButtonToolTipText;
622: approveButtonToolTipText = toolTipText;
623: firePropertyChange(APPROVE_BUTTON_TOOL_TIP_TEXT_CHANGED_PROPERTY,
624: oldText, approveButtonToolTipText);
625: }
626: }
627:
628:
633: public String getApproveButtonToolTipText()
634: {
635: return approveButtonToolTipText;
636: }
637:
638:
643: public int getApproveButtonMnemonic()
644: {
645: return approveButtonMnemonic;
646: }
647:
648:
653: public void setApproveButtonMnemonic(int mnemonic)
654: {
655: if (approveButtonMnemonic != mnemonic)
656: {
657: int oldMnemonic = approveButtonMnemonic;
658: approveButtonMnemonic = mnemonic;
659: firePropertyChange(APPROVE_BUTTON_MNEMONIC_CHANGED_PROPERTY,
660: oldMnemonic, approveButtonMnemonic);
661: }
662: }
663:
664:
669: public void setApproveButtonMnemonic(char mnemonic)
670: {
671: setApproveButtonMnemonic((int) Character.toUpperCase(mnemonic));
672: }
673:
674:
679: public void setApproveButtonText(String approveButtonText)
680: {
681: if (this.approveButtonText != approveButtonText)
682: {
683: String oldText = this.approveButtonText;
684: this.approveButtonText = approveButtonText;
685: firePropertyChange(APPROVE_BUTTON_TEXT_CHANGED_PROPERTY, oldText,
686: this.approveButtonText);
687: }
688: }
689:
690:
695: public String getApproveButtonText()
696: {
697: return approveButtonText;
698: }
699:
700:
705: public FileFilter[] getChoosableFileFilters()
706: {
707: return (FileFilter[]) choosableFilters.toArray(new FileFilter[0]);
708: }
709:
710:
715: public void addChoosableFileFilter(FileFilter filter)
716: {
717: FileFilter[] old = getChoosableFileFilters();
718: choosableFilters.add(filter);
719: FileFilter[] newFilters = getChoosableFileFilters();
720: firePropertyChange(CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY, old, newFilters);
721: }
722:
723:
730: public boolean removeChoosableFileFilter(FileFilter f)
731: {
732: FileFilter[] old = getChoosableFileFilters();
733: if (! choosableFilters.remove(f))
734: return false;
735: FileFilter[] newFilters = getChoosableFileFilters();
736: firePropertyChange(CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY, old, newFilters);
737: return true;
738: }
739:
740:
743: public void resetChoosableFileFilters()
744: {
745: choosableFilters.clear();
746: choosableFilters.add(getUI().getAcceptAllFileFilter(this));
747: setFileFilter((FileFilter) choosableFilters.get(0));
748: }
749:
750:
755: public FileFilter getAcceptAllFileFilter()
756: {
757: return getUI().getAcceptAllFileFilter(this);
758: }
759:
760:
765: public boolean isAcceptAllFileFilterUsed()
766: {
767: return isAcceptAll;
768: }
769:
770:
775: public void setAcceptAllFileFilterUsed(boolean b)
776: {
777: if (isAcceptAll != b)
778: {
779: isAcceptAll = b;
780: firePropertyChange(ACCEPT_ALL_FILE_FILTER_USED_CHANGED_PROPERTY,
781: ! isAcceptAll, isAcceptAll);
782: }
783: }
784:
785:
790: public JComponent getAccessory()
791: {
792: return accessory;
793: }
794:
795:
800: public void setAccessory(JComponent newAccessory)
801: {
802: if (accessory != newAccessory)
803: {
804: JComponent old = accessory;
805: accessory = newAccessory;
806: firePropertyChange(ACCESSORY_CHANGED_PROPERTY, old, accessory);
807: }
808: }
809:
810:
815: public void setFileSelectionMode(int mode)
816: {
817: if (mode != FILES_ONLY && mode != DIRECTORIES_ONLY
818: && mode != FILES_AND_DIRECTORIES)
819: throw new IllegalArgumentException("Choose a correct file selection mode.");
820: if (fileSelectionMode != mode)
821: {
822: int old = fileSelectionMode;
823: fileSelectionMode = mode;
824: firePropertyChange(FILE_SELECTION_MODE_CHANGED_PROPERTY, old,
825: fileSelectionMode);
826: }
827: }
828:
829:
834: public int getFileSelectionMode()
835: {
836: return fileSelectionMode;
837: }
838:
839:
844: public boolean isFileSelectionEnabled()
845: {
846: return (fileSelectionMode == FILES_ONLY
847: || fileSelectionMode == FILES_AND_DIRECTORIES);
848: }
849:
850:
855: public boolean isDirectorySelectionEnabled()
856: {
857: return (fileSelectionMode == DIRECTORIES_ONLY
858: || fileSelectionMode == FILES_AND_DIRECTORIES);
859: }
860:
861:
866: public void setMultiSelectionEnabled(boolean b)
867: {
868: if (multiSelection != b)
869: {
870: multiSelection = b;
871: firePropertyChange(MULTI_SELECTION_ENABLED_CHANGED_PROPERTY,
872: ! multiSelection, multiSelection);
873: }
874: }
875:
876:
881: public boolean isMultiSelectionEnabled()
882: {
883: return multiSelection;
884: }
885:
886:
891: public boolean isFileHidingEnabled()
892: {
893: return fileHiding;
894: }
895:
896:
901: public void setFileHidingEnabled(boolean b)
902: {
903: if (fileHiding != b)
904: {
905: fileHiding = b;
906: firePropertyChange(FILE_HIDING_CHANGED_PROPERTY, ! fileHiding,
907: fileHiding);
908: }
909: }
910:
911:
916: public void setFileFilter(FileFilter filter)
917: {
918: if (currentFilter != filter)
919: {
920: FileFilter old = currentFilter;
921: currentFilter = filter;
922: firePropertyChange(FILE_FILTER_CHANGED_PROPERTY, old, currentFilter);
923: }
924: }
925:
926:
931: public FileFilter getFileFilter()
932: {
933: return currentFilter;
934: }
935:
936:
941: public void setFileView(FileView fileView)
942: {
943: if (fv != fileView)
944: {
945: FileView old = fv;
946: fv = fileView;
947: firePropertyChange(FILE_VIEW_CHANGED_PROPERTY, old, fv);
948: }
949: }
950:
951:
956: public FileView getFileView()
957: {
958: return fv;
959: }
960:
961:
966: private FileView getInternalFileView()
967: {
968: if (fv == null)
969: return getUI().getFileView(this);
970: return fv;
971: }
972:
973:
980: public String getName(File f)
981: {
982: return getInternalFileView().getName(f);
983: }
984:
985:
992: public String getDescription(File f)
993: {
994: return getInternalFileView().getDescription(f);
995: }
996:
997:
1004: public String getTypeDescription(File f)
1005: {
1006: return getInternalFileView().getTypeDescription(f);
1007: }
1008:
1009:
1016: public Icon getIcon(File f)
1017: {
1018: return getInternalFileView().getIcon(f);
1019: }
1020:
1021:
1028: public boolean isTraversable(File f)
1029: {
1030: return getFileSystemView().isTraversable(f).booleanValue();
1031: }
1032:
1033:
1040: public boolean accept(File f)
1041: {
1042: if (f == null)
1043: return false;
1044: return getFileFilter().accept(f);
1045: }
1046:
1047:
1052: public void setFileSystemView(FileSystemView fsv)
1053: {
1054: if (this.fsv != fsv)
1055: {
1056: FileSystemView old = this.fsv;
1057: this.fsv = fsv;
1058: firePropertyChange(FILE_SYSTEM_VIEW_CHANGED_PROPERTY, old, this.fsv);
1059: }
1060: }
1061:
1062:
1067: public FileSystemView getFileSystemView()
1068: {
1069: return fsv;
1070: }
1071:
1072:
1075: public void approveSelection()
1076: {
1077: retval = APPROVE_OPTION;
1078: fireActionPerformed(APPROVE_SELECTION);
1079: }
1080:
1081:
1084: public void cancelSelection()
1085: {
1086: retval = CANCEL_OPTION;
1087: fireActionPerformed(CANCEL_SELECTION);
1088: }
1089:
1090:
1095: public void addActionListener(ActionListener l)
1096: {
1097: listenerList.add(ActionListener.class, l);
1098: }
1099:
1100:
1105: public void removeActionListener(ActionListener l)
1106: {
1107: try
1108: {
1109: listenerList.remove(ActionListener.class, l);
1110: }
1111: catch (IllegalArgumentException e)
1112: {
1113: e.printStackTrace();
1114: }
1115: }
1116:
1117:
1122: public ActionListener[] getActionListeners()
1123: {
1124: return (ActionListener[]) getListeners(ActionListener.class);
1125: }
1126:
1127:
1132: protected void fireActionPerformed(String command)
1133: {
1134: ActionListener[] list = getActionListeners();
1135: ActionEvent event = new ActionEvent(this, ActionEvent.ACTION_PERFORMED,
1136: command);
1137:
1138: for (int i = 0; i < list.length; i++)
1139: list[i].actionPerformed(event);
1140: }
1141:
1142:
1145: public void updateUI()
1146: {
1147: setUI((FileChooserUI) UIManager.getUI(this));
1148: revalidate();
1149: }
1150:
1151:
1156: public String getUIClassID()
1157: {
1158: return "FileChooserUI";
1159: }
1160:
1161:
1166: public FileChooserUI getUI()
1167: {
1168: return (FileChooserUI) ui;
1169: }
1170:
1171:
1176: protected String paramString()
1177: {
1178: return "JFileChooser";
1179: }
1180:
1181:
1186: public AccessibleContext getAccessibleContext()
1187: {
1188: return null;
1189: }
1190: }