00001
import javax.swing.*;
00002
import java.io.*;
00003
import java.awt.*;
00004
import java.util.*;
00005
import java.awt.event.*;
00006
00007 public class FileChooser extends JFileChooser {
00008 public static class ExtensionFilter
00009
extends javax.swing.filechooser.FileFilter {
00010 String
extensions[];
00011 String
description;
00012 public ExtensionFilter(String name, String[] exts) {
00013
extensions = exts;
00014
00015 StringBuffer d =
new StringBuffer();
00016
if (name!=null) d.append(name).append(
" (");
00017
for (
int i=0; i<
extensions.length; i++) {
00018
if (i>0) d.append(
", ");
00019 d.append(
"*.").append(
extensions[i]);
00020 }
00021
if (name!=null) d.append(
")");
00022
description = d.toString();
00023 }
00024 public String
getDescription() {
00025
return description;
00026 }
00027 public boolean accept(File f) {
00028
if (f.isDirectory())
00029
return true;
00030 String s = f.getName().toLowerCase();
00031
for (
int i=0; i<
extensions.length; i++)
00032
if (s.endsWith(
"."+
extensions[i]))
return true;
00033
return false;
00034 }
00035 }
00036
00037 public static final int MODE_OPEN = 1;
00038 public static final int MODE_SAVE = 2;
00039 public static final int MODE_LOAD = 3;
00040
00041 public final Vector
encodings =
new Vector();
00042
00043 private final void initEncodings() {
00044
if (
encodings.size()>0)
return;
00045
encodings.add(
"UTF8");
00046
00047
encodings.add(
"ASCII");
00048
encodings.add(
"Big5");
00049
encodings.add(
"Big5_HKSCS");
00050
encodings.add(
"Cp037");
00051
encodings.add(
"Cp1006");
00052
encodings.add(
"Cp1025");
00053
encodings.add(
"Cp1026");
00054
encodings.add(
"Cp1097");
00055
encodings.add(
"Cp1098");
00056
encodings.add(
"Cp1112");
00057
encodings.add(
"Cp1122");
00058
encodings.add(
"Cp1123");
00059
encodings.add(
"Cp1124");
00060
encodings.add(
"Cp1250");
00061
encodings.add(
"Cp1251");
00062
encodings.add(
"Cp1252");
00063
encodings.add(
"Cp1253");
00064
encodings.add(
"Cp1254");
00065
encodings.add(
"Cp1255");
00066
encodings.add(
"Cp1256");
00067
encodings.add(
"Cp1257");
00068
encodings.add(
"Cp1258");
00069
encodings.add(
"Cp1381");
00070
encodings.add(
"Cp1383");
00071
encodings.add(
"Cp273");
00072
encodings.add(
"Cp277");
00073
encodings.add(
"Cp278");
00074
encodings.add(
"Cp280");
00075
encodings.add(
"Cp284");
00076
encodings.add(
"Cp285");
00077
encodings.add(
"Cp297");
00078
encodings.add(
"Cp33722");
00079
encodings.add(
"Cp420");
00080
encodings.add(
"Cp424");
00081
encodings.add(
"Cp437");
00082
encodings.add(
"Cp500");
00083
encodings.add(
"Cp737");
00084
encodings.add(
"Cp775");
00085
encodings.add(
"Cp838");
00086
encodings.add(
"Cp850");
00087
encodings.add(
"Cp852");
00088
encodings.add(
"Cp855");
00089
encodings.add(
"Cp856");
00090
encodings.add(
"Cp857");
00091
encodings.add(
"Cp860");
00092
encodings.add(
"Cp861");
00093
encodings.add(
"Cp862");
00094
encodings.add(
"Cp863");
00095
encodings.add(
"Cp864");
00096
encodings.add(
"Cp865");
00097
encodings.add(
"Cp866");
00098
encodings.add(
"Cp868");
00099
encodings.add(
"Cp869");
00100
encodings.add(
"Cp870");
00101
encodings.add(
"Cp871");
00102
encodings.add(
"Cp874");
00103
encodings.add(
"Cp875");
00104
encodings.add(
"Cp918");
00105
encodings.add(
"Cp921");
00106
encodings.add(
"Cp922");
00107
encodings.add(
"Cp930");
00108
encodings.add(
"Cp933");
00109
encodings.add(
"Cp935");
00110
encodings.add(
"Cp937");
00111
encodings.add(
"Cp939");
00112
encodings.add(
"Cp942");
00113
encodings.add(
"Cp942C");
00114
encodings.add(
"Cp943");
00115
encodings.add(
"Cp943C");
00116
encodings.add(
"Cp948");
00117
encodings.add(
"Cp949");
00118
encodings.add(
"Cp949C");
00119
encodings.add(
"Cp950");
00120
encodings.add(
"Cp964");
00121
encodings.add(
"Cp970");
00122
encodings.add(
"EUC_CN");
00123
encodings.add(
"EUC_JP");
00124
encodings.add(
"EUC_JP_LINUX");
00125
encodings.add(
"EUC_KR");
00126
encodings.add(
"EUC_TW");
00127
encodings.add(
"ISO2022JP");
00128
encodings.add(
"ISO8859_1");
00129
encodings.add(
"ISO8859_13");
00130
encodings.add(
"ISO8859_15_FDIS");
00131
encodings.add(
"ISO8859_2");
00132
encodings.add(
"ISO8859_3");
00133
encodings.add(
"ISO8859_4");
00134
encodings.add(
"ISO8859_5");
00135
encodings.add(
"ISO8859_6");
00136
encodings.add(
"ISO8859_7");
00137
encodings.add(
"ISO8859_8");
00138
encodings.add(
"ISO8859_9");
00139
encodings.add(
"JISAutoDetect");
00140
encodings.add(
"Johab");
00141
encodings.add(
"KOI8_R");
00142
encodings.add(
"MS874");
00143
encodings.add(
"MS932");
00144
encodings.add(
"MS949");
00145
encodings.add(
"SJIS");
00146
encodings.add(
"TIS620");
00147
encodings.add(
"Unicode");
00148
encodings.add(
"UnicodeBigUnmarked");
00149
encodings.add(
"UnicodeLittleUnmarked");
00150
encodings.add(
"UTF16");
00151 };
00152
00153 InternationalInput internationalInput;
00154 JCheckBox
optionInsert,
optionAsInput,
optionSaveSelection;
00155 JComboBox
optionEncoding;
00156 Box
optionEncodingBox;
00157 JPanel
optionPanel;
00158 String
lastEncoding = null;
00159 ExtensionFilter textFiles =
new ExtensionFilter
00160 (
"Text files",
new String[] {
"txt",
"tex" });
00161 ExtensionFilter configFiles =
new ExtensionFilter
00162 (
"Config files",
new String[] {
"inp",
"my",
"inp.gz",
"my.gz" });
00163
00164 public FileChooser(
InternationalInput ii) {
00165
internationalInput = ii;
00166
optionPanel =
new JPanel();
00167
00168
optionPanel.setLayout(
new BoxLayout(
optionPanel,BoxLayout.Y_AXIS));
00169 optionPanel.setBorder(BorderFactory.createTitledBorder(
"Options"));
00170 setAccessory(optionPanel);
00171
optionInsert =
new JCheckBox(
"Insert");
00172
optionInsert.setToolTipText(
"Inserts the file at the current cursor position");
00173
optionAsInput =
new JCheckBox(
"As input");
00174
optionAsInput.setToolTipText(
"Loads the file as if it had been typed in (uses the current input method)");
00175
optionSaveSelection =
new JCheckBox(
"Save selection");
00176
optionSaveSelection.setToolTipText(
"Saves the current selection (instead of the whole file)");
00177
00178
initEncodings();
00179
optionEncoding =
new JComboBox(
encodings);
00180
optionEncoding.setToolTipText(
"Encoding of the file");
00181
optionEncoding.setEditable(
true);
00182
lastEncoding = (String)
optionEncoding.getSelectedItem();
00183
optionEncoding.addItemListener(
new ItemListener() {
00184
public void itemStateChanged(ItemEvent ev) {
00185
if (ev.getStateChange() != ItemEvent.SELECTED)
return;
00186 String enc = (String)ev.getItem();
00187
try {
00188
new String(
new byte[]{},enc);
00189
lastEncoding = enc;
00190
int size =
encodings.size();
00191 String lcenc = enc.toLowerCase();
00192
boolean found =
false;
00193
for (
int i=0; i<size; i++) {
00194 String s = ((String)
encodings.elementAt(i)).
00195 toLowerCase();
00196
if (s.equals(lcenc)) {
00197 found =
true;
break; }
00198 }
00199
if (!found)
encodings.insertElementAt(enc,0);
00200 }
catch (UnsupportedEncodingException ex) {
00201 JOptionPane.showMessageDialog
00202 (
FileChooser.this,
00203
"Encoding "+enc+
" is not supported by Java",
00204
"Unsupported encoding",
00205 JOptionPane.ERROR_MESSAGE);
00206
optionEncoding.setSelectedItem(
lastEncoding);
00207
int size =
encodings.size();
00208 enc = enc.toLowerCase();
00209
for (
int i=0; i<size; i++) {
00210 String s = ((String)
encodings.elementAt(i)).toLowerCase();
00211
if (s.equals(enc)) {
00212
encodings.removeElementAt(i);
break; }
00213 }
00214 }
00215 }});
00216
00217
00218
00219
00220
00221
00222 Box box =
new Box(BoxLayout.X_AXIS);
00223 box.add(optionInsert); box.add(Box.createHorizontalGlue());
00224 optionPanel.add(box);
00225
00226 box =
new Box(BoxLayout.X_AXIS);
00227 box.add(optionAsInput); box.add(Box.createHorizontalGlue());
00228 optionPanel.add(box);
00229
00230 box =
new Box(BoxLayout.X_AXIS);
00231 box.add(optionSaveSelection); box.add(Box.createHorizontalGlue());
00232 optionPanel.add(box);
00233
00234 optionEncodingBox =
new Box(BoxLayout.Y_AXIS);
00235 box =
new Box(BoxLayout.X_AXIS);
00236 JLabel label =
new JLabel(
"Encoding:");
00237 label.addMouseListener(
new MouseListener() {
00238
public void mouseReleased(MouseEvent e) {};
00239
public void mouseEntered(MouseEvent e) {};
00240
public void mouseExited(MouseEvent e) {};
00241
public void mouseClicked(MouseEvent e) {};
00242
public void mousePressed(MouseEvent e) {
00243 optionEncoding.requestFocus();
00244 }});
00245 box.add(label); box.add(Box.createHorizontalGlue());
00246 optionEncodingBox.add(box);
00247
00248 box =
new Box(BoxLayout.X_AXIS);
00249 box.add(optionEncoding); box.add(Box.createHorizontalGlue());
00250 optionEncodingBox.add(box);
00251
00252 optionEncodingBox.add(Box.createVerticalGlue());
00253
00254 optionPanel.add(optionEncodingBox);
00255
00256 optionPanel.add(Box.createVerticalGlue());
00257 }
00258
00259 public int showOpenDialog(Component c) {
00260
throw new UnsupportedOperationException
00261 (
"Use showDialog(int) instead"); }
00262 public int showSaveDialog(Component c) {
00263
throw new UnsupportedOperationException
00264 (
"Use showDialog(int) instead"); }
00265 public int showDialog(Component c, String s) {
00266
throw new UnsupportedOperationException
00267 (
"Use showDialog(int) instead"); }
00268
00269 public int showDialog(
int mode) {
00270 String title = null;
00271 optionInsert.setVisible(
false);
00272 optionAsInput.setVisible(
false);
00273 optionSaveSelection.setVisible(
false);
00274 optionEncodingBox.setVisible(
false);
00275
00276 optionPanel.setVisible(
true);
00277 resetChoosableFileFilters();
00278 setAcceptAllFileFilterUsed(
true);
00279
00280
switch (mode) {
00281
case MODE_OPEN:
00282 title =
"Open";
00283 optionInsert.setVisible(
true);
00284 optionAsInput.setVisible(
true);
00285 optionEncodingBox.setVisible(
true);
00286
00287
00288
00289
break;
00290
case MODE_SAVE:
00291 title =
"Save";
00292 optionSaveSelection.setVisible(
true);
00293
00294
if (internationalInput.hasSelection()) {
00295 optionSaveSelection.setEnabled(
true);
00296 }
else {
00297 optionSaveSelection.setEnabled(
false);
00298 optionSaveSelection.setSelected(
false);
00299 }
00300 optionEncodingBox.setVisible(
true);
00301
00302
break;
00303
case MODE_LOAD:
00304 title =
"Load";
00305 optionPanel.setVisible(
false);
00306 setAcceptAllFileFilterUsed(
false);
00307
break;
00308
default:
00309
throw new IllegalArgumentException(
"Unknown mode "+mode);
00310 }
00311
00312
if (mode==MODE_LOAD)
00313 addChoosableFileFilter(configFiles);
00314
else
00315 addChoosableFileFilter(textFiles);
00316
00317
00318
00319
return super.showDialog(internationalInput,title);
00320 }
00321
00322 public boolean getOptionInsert() {
00323
return optionInsert.isSelected();
00324 }
00325 public boolean getOptionAsInput() {
00326
return optionAsInput.isSelected();
00327 }
00328 public boolean getOptionSaveSelection() {
00329
return optionSaveSelection.isSelected();
00330 }
00331 public String getEncoding() {
00332
return (String)optionEncoding.getSelectedItem();
00333 }
00334 }