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:
69: public class JFileChooser extends JComponent implements Accessible
70: {
71: private static final long serialVersionUID = 3162921138695327837L;
72:
73:
74: public static final int OPEN_DIALOG = 0;
75:
76:
77: public static final int SAVE_DIALOG = 1;
78:
79:
80: public static final int CUSTOM_DIALOG = 2;
81:
82:
83: public static final int CANCEL_OPTION = 1;
84:
85:
86: public static final int APPROVE_OPTION = 0;
87:
88:
89: public static final int ERROR_OPTION = -1;
90:
91:
92: public static final int FILES_ONLY = 0;
93:
94:
95: public static final int DIRECTORIES_ONLY = 1;
96:
97:
98: public static final int FILES_AND_DIRECTORIES = 2;
99:
100:
101: public static final String CANCEL_SELECTION = "CancelSelection";
102:
103:
104: public static final String APPROVE_SELECTION = "ApproveSelection";
105:
106:
107: public static final String APPROVE_BUTTON_TEXT_CHANGED_PROPERTY =
108: "ApproveButtonTextChangedProperty";
109:
110:
111: public static final String APPROVE_BUTTON_TOOL_TIP_TEXT_CHANGED_PROPERTY =
112: "ApproveButtonToolTipTextChangedProperty";
113:
114:
115: public static final String APPROVE_BUTTON_MNEMONIC_CHANGED_PROPERTY =
116: "ApproveButtonMnemonicChangedProperty";
117:
118:
119: public static final String CONTROL_BUTTONS_ARE_SHOWN_CHANGED_PROPERTY =
120: "ControlButtonsAreShownChangedProperty";
121:
122:
123: public static final String DIRECTORY_CHANGED_PROPERTY = "directoryChanged";
124:
125:
126: public static final String SELECTED_FILE_CHANGED_PROPERTY =
127: "SelectedFileChangedProperty";
128:
129:
130: public static final String SELECTED_FILES_CHANGED_PROPERTY =
131: "SelectedFilesChangedProperty";
132:
133:
134: public static final String MULTI_SELECTION_ENABLED_CHANGED_PROPERTY =
135: "MultiSelectionEnabledChangedProperty";
136:
137:
138: public static final String FILE_SYSTEM_VIEW_CHANGED_PROPERTY =
139: "FileSystemViewChanged";
140:
141:
142: public static final String FILE_VIEW_CHANGED_PROPERTY = "fileViewChanged";
143:
144:
145: public static final String FILE_HIDING_CHANGED_PROPERTY =
146: "FileHidingChanged";
147:
148:
149: public static final String FILE_FILTER_CHANGED_PROPERTY =
150: "fileFilterChanged";
151:
152:
153: public static final String FILE_SELECTION_MODE_CHANGED_PROPERTY =
154: "fileSelectionChanged";
155:
156:
157: public static final String ACCESSORY_CHANGED_PROPERTY =
158: "AccessoryChangedProperty";
159:
160:
161: public static final String ACCEPT_ALL_FILE_FILTER_USED_CHANGED_PROPERTY =
162: "acceptAllFileFilterUsedChanged";
163:
164:
165: public static final String DIALOG_TITLE_CHANGED_PROPERTY =
166: "DialogTitleChangedProperty";
167:
168:
169: public static final String DIALOG_TYPE_CHANGED_PROPERTY =
170: "DialogTypeChangedProperty";
171:
172:
173: public static final String CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY =
174: "ChoosableFileFilterChangedProperty";
175:
176:
177: protected AccessibleContext accessibleContext;
178:
179:
180: private FileSystemView fsv;
181:
182:
183: private JComponent accessory;
184:
185:
186: private int approveButtonMnemonic = 0;
187:
188:
189: private String approveButtonText;
190:
191:
192: private String approveButtonToolTipText;
193:
194:
195: private ArrayList choosableFilters = new ArrayList();
196:
197:
198: private boolean isAcceptAll = true;
199:
200:
201: private String dialogTitle;
202:
203:
204: private int dialogType = OPEN_DIALOG;
205:
206:
207: private int retval = ERROR_OPTION;
208:
209:
210: private boolean multiSelection = false;
211:
212:
213: private boolean fileHiding = true;
214:
215:
216: private int fileSelectionMode = FILES_AND_DIRECTORIES;
217:
218:
219: private FileView fv = null;
220:
221:
222: private boolean controlButtonsShown = true;
223:
224:
225: private File currentDir = null;
226:
227:
228: private FileFilter currentFilter = null;
229:
230:
231: private File[] selectedFiles;
232:
233:
234: private File selectedFile;
235:
236:
239: public JFileChooser()
240: {
241: setup(null);
242: setCurrentDirectory(null);
243: }
244:
245:
250: public JFileChooser(String currentDirectoryPath)
251: {
252: setup(null);
253: setCurrentDirectory(fsv.createFileObject(currentDirectoryPath));
254: }
255:
256:
264: public JFileChooser(String currentDirectoryPath, FileSystemView fsv)
265: {
266: setup(fsv);
267: setCurrentDirectory(fsv.createFileObject(currentDirectoryPath));
268: }
269:
270:
275: public JFileChooser(File currentDirectory)
276: {
277: setup(null);
278: setCurrentDirectory(currentDirectory);
279: }
280:
281:
286: public JFileChooser(FileSystemView fsv)
287: {
288: setup(fsv);
289: setCurrentDirectory(null);
290: }
291:
292:
298: public JFileChooser(File currentDirectory, FileSystemView fsv)
299: {
300: setup(fsv);
301: setCurrentDirectory(currentDirectory);
302: }
303:
304:
309: protected void setup(FileSystemView view)
310: {
311: if (view == null)
312: view = FileSystemView.getFileSystemView();
313: setFileSystemView(view);
314: updateUI();
315: }
316:
317:
322: public void setDragEnabled(boolean b)
323: {
324:
325: }
326:
327:
332: public boolean getDragEnabled()
333: {
334:
335: return false;
336: }
337:
338:
343: public File getSelectedFile()
344: {
345: return selectedFile;
346: }
347:
348:
353: public void setSelectedFile(File file)
354: {
355: if (selectedFile != file)
356: {
357: File old = selectedFile;
358: selectedFile = file;
359: firePropertyChange(SELECTED_FILE_CHANGED_PROPERTY, old, selectedFile);
360: }
361: }
362:
363:
368: public File[] getSelectedFiles()
369: {
370: if (selectedFiles != null)
371: return selectedFiles;
372: if (selectedFile != null)
373: return new File[] { selectedFile };
374: return null;
375: }
376:
377:
382: public void setSelectedFiles(File[] selectedFiles)
383: {
384: if (this.selectedFiles != selectedFiles)
385: {
386: File[] old = this.selectedFiles;
387: this.selectedFiles = selectedFiles;
388: firePropertyChange(SELECTED_FILES_CHANGED_PROPERTY, old, selectedFiles);
389: }
390:
391: if (selectedFiles != null)
392: setSelectedFile(selectedFiles[0]);
393: }
394:
395:
400: public File getCurrentDirectory()
401: {
402: return currentDir;
403: }
404:
405:
410: public void setCurrentDirectory(File dir)
411: {
412: if (currentDir != dir || dir == null)
413: {
414: if (dir == null)
415: dir = fsv.getDefaultDirectory();
416:
417: File old = currentDir;
418: currentDir = dir;
419: firePropertyChange(DIRECTORY_CHANGED_PROPERTY, old, currentDir);
420: }
421: }
422:
423:
426: public void changeToParentDirectory()
427: {
428: if (fsv.getParentDirectory(currentDir) != null)
429: setCurrentDirectory(fsv.getParentDirectory(currentDir));
430: }
431:
432:
435: public void rescanCurrentDirectory()
436: {
437: getUI().rescanCurrentDirectory(this);
438: }
439:
440:
445: public void ensureFileIsVisible(File f)
446: {
447: getUI().ensureFileIsVisible(this, f);
448: }
449:
450:
459: public int showOpenDialog(Component parent) throws HeadlessException
460: {
461: JDialog d = createDialog(parent);
462:
463:
464: d.setTitle("Open");
465: setDialogType(OPEN_DIALOG);
466:
467: retval = ERROR_OPTION;
468:
469: d.pack();
470: d.show();
471: return retval;
472: }
473:
474:
483: public int showSaveDialog(Component parent) throws HeadlessException
484: {
485: JDialog d = createDialog(parent);
486: setDialogType(SAVE_DIALOG);
487:
488: retval = ERROR_OPTION;
489:
490: d.pack();
491: d.show();
492: return retval;
493: }
494:
495:
505: public int showDialog(Component parent, String approveButtonText)
506: throws HeadlessException
507: {
508: JDialog d = createDialog(parent);
509: setApproveButtonText(approveButtonText);
510: setDialogType(CUSTOM_DIALOG);
511:
512: retval = ERROR_OPTION;
513:
514: d.pack();
515: d.show();
516: return retval;
517: }
518:
519:
528: protected JDialog createDialog(Component parent) throws HeadlessException
529: {
530: Frame toUse = (Frame) SwingUtilities.getAncestorOfClass(Frame.class, parent);
531: if (toUse == null)
532: toUse = SwingUtilities.getOwnerFrame();
533:
534: JDialog dialog = new JDialog(toUse);
535: setSelectedFile(null);
536: dialog.getContentPane().add(this);
537: dialog.setModal(true);
538: dialog.invalidate();
539: dialog.repaint();
540:
541: return dialog;
542: }
543:
544:
549: public boolean getControlButtonsAreShown()
550: {
551: return controlButtonsShown;
552: }
553:
554:
559: public void setControlButtonsAreShown(boolean b)
560: {
561: if (controlButtonsShown != b)
562: {
563: controlButtonsShown = b;
564: firePropertyChange(CONTROL_BUTTONS_ARE_SHOWN_CHANGED_PROPERTY,
565: ! controlButtonsShown, controlButtonsShown);
566: }
567: }
568:
569:
574: public int getDialogType()
575: {
576: return dialogType;
577: }
578:
579:
584: public void setDialogType(int dialogType)
585: {
586: if (dialogType != OPEN_DIALOG && dialogType != SAVE_DIALOG
587: && dialogType != CUSTOM_DIALOG)
588: throw new IllegalArgumentException("Choose allowable dialogType.");
589:
590: if (this.dialogType != dialogType)
591: {
592: int old = this.dialogType;
593: this.dialogType = dialogType;
594: firePropertyChange(DIALOG_TYPE_CHANGED_PROPERTY, old, this.dialogType);
595: }
596: }
597:
598:
603: public void setDialogTitle(String dialogTitle)
604: {
605: if (this.dialogTitle != dialogTitle)
606: {
607: String old = this.dialogTitle;
608: this.dialogTitle = dialogTitle;
609: firePropertyChange(DIALOG_TITLE_CHANGED_PROPERTY, old, this.dialogTitle);
610: }
611: }
612:
613:
618: public String getDialogTitle()
619: {
620: return dialogTitle;
621: }
622:
623:
628: public void setApproveButtonToolTipText(String toolTipText)
629: {
630: if (approveButtonToolTipText != toolTipText)
631: {
632: String oldText = approveButtonToolTipText;
633: approveButtonToolTipText = toolTipText;
634: firePropertyChange(APPROVE_BUTTON_TOOL_TIP_TEXT_CHANGED_PROPERTY,
635: oldText, approveButtonToolTipText);
636: }
637: }
638:
639:
644: public String getApproveButtonToolTipText()
645: {
646: return approveButtonToolTipText;
647: }
648:
649:
654: public int getApproveButtonMnemonic()
655: {
656: return approveButtonMnemonic;
657: }
658:
659:
664: public void setApproveButtonMnemonic(int mnemonic)
665: {
666: if (approveButtonMnemonic != mnemonic)
667: {
668: int oldMnemonic = approveButtonMnemonic;
669: approveButtonMnemonic = mnemonic;
670: firePropertyChange(APPROVE_BUTTON_MNEMONIC_CHANGED_PROPERTY,
671: oldMnemonic, approveButtonMnemonic);
672: }
673: }
674:
675:
680: public void setApproveButtonMnemonic(char mnemonic)
681: {
682: setApproveButtonMnemonic((int) Character.toUpperCase(mnemonic));
683: }
684:
685:
690: public void setApproveButtonText(String approveButtonText)
691: {
692: if (this.approveButtonText != approveButtonText)
693: {
694: String oldText = this.approveButtonText;
695: this.approveButtonText = approveButtonText;
696: firePropertyChange(APPROVE_BUTTON_TEXT_CHANGED_PROPERTY, oldText,
697: this.approveButtonText);
698: }
699: }
700:
701:
706: public String getApproveButtonText()
707: {
708: return approveButtonText;
709: }
710:
711:
716: public FileFilter[] getChoosableFileFilters()
717: {
718: return (FileFilter[]) choosableFilters.toArray(new FileFilter[0]);
719: }
720:
721:
726: public void addChoosableFileFilter(FileFilter filter)
727: {
728: FileFilter[] old = getChoosableFileFilters();
729: choosableFilters.add(filter);
730: FileFilter[] newFilters = getChoosableFileFilters();
731: firePropertyChange(CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY, old, newFilters);
732: }
733:
734:
741: public boolean removeChoosableFileFilter(FileFilter f)
742: {
743: FileFilter[] old = getChoosableFileFilters();
744: if (! choosableFilters.remove(f))
745: return false;
746: FileFilter[] newFilters = getChoosableFileFilters();
747: firePropertyChange(CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY, old, newFilters);
748: return true;
749: }
750:
751:
754: public void resetChoosableFileFilters()
755: {
756: choosableFilters.clear();
757: choosableFilters.add(getUI().getAcceptAllFileFilter(this));
758: setFileFilter((FileFilter) choosableFilters.get(0));
759: }
760:
761:
766: public FileFilter getAcceptAllFileFilter()
767: {
768: return getUI().getAcceptAllFileFilter(this);
769: }
770:
771:
776: public boolean isAcceptAllFileFilterUsed()
777: {
778: return isAcceptAll;
779: }
780:
781:
786: public void setAcceptAllFileFilterUsed(boolean b)
787: {
788: if (isAcceptAll != b)
789: {
790: isAcceptAll = b;
791: firePropertyChange(ACCEPT_ALL_FILE_FILTER_USED_CHANGED_PROPERTY,
792: ! isAcceptAll, isAcceptAll);
793: }
794: }
795:
796:
801: public JComponent getAccessory()
802: {
803: return accessory;
804: }
805:
806:
811: public void setAccessory(JComponent newAccessory)
812: {
813: if (accessory != newAccessory)
814: {
815: JComponent old = accessory;
816: accessory = newAccessory;
817: firePropertyChange(ACCESSORY_CHANGED_PROPERTY, old, accessory);
818: }
819: }
820:
821:
826: public void setFileSelectionMode(int mode)
827: {
828: if (mode != FILES_ONLY && mode != DIRECTORIES_ONLY
829: && mode != FILES_AND_DIRECTORIES)
830: throw new IllegalArgumentException("Choose a correct file selection mode.");
831: if (fileSelectionMode != mode)
832: {
833: int old = fileSelectionMode;
834: fileSelectionMode = mode;
835: firePropertyChange(FILE_SELECTION_MODE_CHANGED_PROPERTY, old,
836: fileSelectionMode);
837: }
838: }
839:
840:
845: public int getFileSelectionMode()
846: {
847: return fileSelectionMode;
848: }
849:
850:
855: public boolean isFileSelectionEnabled()
856: {
857: return (fileSelectionMode == FILES_ONLY
858: || fileSelectionMode == FILES_AND_DIRECTORIES);
859: }
860:
861:
866: public boolean isDirectorySelectionEnabled()
867: {
868: return (fileSelectionMode == DIRECTORIES_ONLY
869: || fileSelectionMode == FILES_AND_DIRECTORIES);
870: }
871:
872:
877: public void setMultiSelectionEnabled(boolean b)
878: {
879: if (multiSelection != b)
880: {
881: multiSelection = b;
882: firePropertyChange(MULTI_SELECTION_ENABLED_CHANGED_PROPERTY,
883: ! multiSelection, multiSelection);
884: }
885: }
886:
887:
892: public boolean isMultiSelectionEnabled()
893: {
894: return multiSelection;
895: }
896:
897:
902: public boolean isFileHidingEnabled()
903: {
904: return fileHiding;
905: }
906:
907:
912: public void setFileHidingEnabled(boolean b)
913: {
914: if (fileHiding != b)
915: {
916: fileHiding = b;
917: firePropertyChange(FILE_HIDING_CHANGED_PROPERTY, ! fileHiding,
918: fileHiding);
919: }
920: }
921:
922:
927: public void setFileFilter(FileFilter filter)
928: {
929: if (currentFilter != filter)
930: {
931: FileFilter old = currentFilter;
932: currentFilter = filter;
933: firePropertyChange(FILE_FILTER_CHANGED_PROPERTY, old, currentFilter);
934: }
935: }
936:
937:
942: public FileFilter getFileFilter()
943: {
944: return currentFilter;
945: }
946:
947:
952: public void setFileView(FileView fileView)
953: {
954: if (fv != fileView)
955: {
956: FileView old = fv;
957: fv = fileView;
958: firePropertyChange(FILE_VIEW_CHANGED_PROPERTY, old, fv);
959: }
960: }
961:
962:
967: public FileView getFileView()
968: {
969: return fv;
970: }
971:
972:
977: private FileView getInternalFileView()
978: {
979: if (fv == null)
980: return getUI().getFileView(this);
981: return fv;
982: }
983:
984:
991: public String getName(File f)
992: {
993: return getInternalFileView().getName(f);
994: }
995:
996:
1003: public String getDescription(File f)
1004: {
1005: return getInternalFileView().getDescription(f);
1006: }
1007:
1008:
1015: public String getTypeDescription(File f)
1016: {
1017: return getInternalFileView().getTypeDescription(f);
1018: }
1019:
1020:
1027: public Icon getIcon(File f)
1028: {
1029: return getInternalFileView().getIcon(f);
1030: }
1031:
1032:
1039: public boolean isTraversable(File f)
1040: {
1041: return getFileSystemView().isTraversable(f).booleanValue();
1042: }
1043:
1044:
1051: public boolean accept(File f)
1052: {
1053: if (f == null)
1054: return false;
1055: return getFileFilter().accept(f);
1056: }
1057:
1058:
1063: public void setFileSystemView(FileSystemView fsv)
1064: {
1065: if (this.fsv != fsv)
1066: {
1067: FileSystemView old = this.fsv;
1068: this.fsv = fsv;
1069: firePropertyChange(FILE_SYSTEM_VIEW_CHANGED_PROPERTY, old, this.fsv);
1070: }
1071: }
1072:
1073:
1078: public FileSystemView getFileSystemView()
1079: {
1080: return fsv;
1081: }
1082:
1083:
1086: public void approveSelection()
1087: {
1088: retval = APPROVE_OPTION;
1089: fireActionPerformed(APPROVE_SELECTION);
1090: }
1091:
1092:
1095: public void cancelSelection()
1096: {
1097: retval = CANCEL_OPTION;
1098: fireActionPerformed(CANCEL_SELECTION);
1099: }
1100:
1101:
1106: public void addActionListener(ActionListener l)
1107: {
1108: listenerList.add(ActionListener.class, l);
1109: }
1110:
1111:
1116: public void removeActionListener(ActionListener l)
1117: {
1118: try
1119: {
1120: listenerList.remove(ActionListener.class, l);
1121: }
1122: catch (IllegalArgumentException e)
1123: {
1124: e.printStackTrace();
1125: }
1126: }
1127:
1128:
1133: public ActionListener[] getActionListeners()
1134: {
1135: return (ActionListener[]) getListeners(ActionListener.class);
1136: }
1137:
1138:
1143: protected void fireActionPerformed(String command)
1144: {
1145: ActionListener[] list = getActionListeners();
1146: ActionEvent event = new ActionEvent(this, ActionEvent.ACTION_PERFORMED,
1147: command);
1148:
1149: for (int i = 0; i < list.length; i++)
1150: list[i].actionPerformed(event);
1151: }
1152:
1153:
1156: public void updateUI()
1157: {
1158: setUI((FileChooserUI) UIManager.getUI(this));
1159: revalidate();
1160: }
1161:
1162:
1167: public String getUIClassID()
1168: {
1169: return "FileChooserUI";
1170: }
1171:
1172:
1177: public FileChooserUI getUI()
1178: {
1179: return (FileChooserUI) ui;
1180: }
1181:
1182:
1187: protected String paramString()
1188: {
1189: return "JFileChooser";
1190: }
1191:
1192:
1197: public AccessibleContext getAccessibleContext()
1198: {
1199: return null;
1200: }
1201: }