2 /*///////////////////////////////////////////////////////////////////
\r
3 // This file was taken from java forum
\r
4 // Re: JFileChooser functioning like normal Windows Apps FileChooser
\r
6 // http://forum.java.sun.com/thread.jspa?forumID=57&threadID=327712
\r
7 *///////////////////////////////////////////////////////////////////
\r
12 import java.awt.event.*;
\r
16 import javax.swing.*;
\r
17 import javax.swing.plaf.*;
\r
18 import javax.swing.plaf.basic.*;
\r
19 import javax.swing.plaf.metal.*;
\r
20 import javax.swing.table.*;
\r
22 public class JalviewFileChooser extends JFileChooser
\r
25 private static final int COLUMN_FILENAME = 0;
\r
26 private static final int COLUMN_FILESIZE = 1;
\r
27 private static final int COLUMN_FILETYPE = 2;
\r
28 private static final int COLUMN_FILEDATE = 3;
\r
29 private static final int COLUMN_FILEATTR = 4;
\r
30 private static final int COLUMN_COLCOUNT = 5;
\r
31 private static String[] COLUMNS = null;
\r
34 public JalviewFileChooser(String dir, String [] suffix, String [] desc, String selected)
\r
38 JalviewFileFilter chosen = null;
\r
39 for(int i=0; i<suffix.length; i++)
\r
41 JalviewFileFilter jvf = new JalviewFileFilter(suffix[i], desc[i]);
\r
42 addChoosableFileFilter(jvf);
\r
43 if(selected!=null && selected.equalsIgnoreCase(desc[i]))
\r
47 setFileFilter(chosen);
\r
51 public String getSelectedFormat()
\r
54 String format = getFileFilter().getDescription();
\r
56 if (format.toUpperCase().startsWith("JALVIEW"))
\r
58 else if (format.toUpperCase().startsWith("FASTA"))
\r
60 else if (format.toUpperCase().startsWith("MSF"))
\r
62 else if (format.toUpperCase().startsWith("CLUSTAL"))
\r
64 else if (format.toUpperCase().startsWith("BLC"))
\r
66 else if (format.toUpperCase().startsWith("PIR"))
\r
68 else if (format.toUpperCase().startsWith("PFAM"))
\r
73 public JalviewFileChooser(String dir)
\r
79 public int showSaveDialog(Component parent) throws HeadlessException {
\r
80 setDialogType(SAVE_DIALOG);
\r
81 int ret = showDialog(parent, null);
\r
83 if(getFileFilter() instanceof JalviewFileFilter)
\r
85 JalviewFileFilter jvf = (JalviewFileFilter) getFileFilter();
\r
86 if (!jvf.accept(getSelectedFile()))
\r
88 String withExtension = getSelectedFile() + "." + jvf.getAcceptableExtension();
\r
89 setSelectedFile(new File(withExtension));
\r
93 if(ret == JalviewFileChooser.APPROVE_OPTION && getSelectedFile().exists() )
\r
95 int confirm = JOptionPane.showConfirmDialog(parent,
\r
96 "Overwrite existing file?",
\r
98 JOptionPane.YES_NO_OPTION);
\r
99 if(confirm!=JOptionPane.YES_OPTION)
\r
100 ret = this.CANCEL_OPTION;
\r
108 if (COLUMNS == null)
\r
110 Locale l = getLocale();
\r
111 COLUMNS = new String[]{
\r
112 UIManager.getString("FileChooser.fileNameHeaderText",l),
\r
113 UIManager.getString("FileChooser.fileSizeHeaderText",l),
\r
114 UIManager.getString("FileChooser.fileTypeHeaderText",l),
\r
115 UIManager.getString("FileChooser.fileDateHeaderText",l),
\r
116 UIManager.getString("FileChooser.fileAttrHeaderText",l)
\r
121 /**************************************************************************
\r
122 * Always create the local UI
\r
124 *************************************************************************/
\r
125 public final void setUI(ComponentUI comp)
\r
127 super.setUI(new UI(this));
\r
130 /**************************************************************************
\r
131 * Internal implementation of Metal LookAndFeel to create the table sorting
\r
133 *************************************************************************/
\r
134 private final static class UI extends MetalFileChooserUI
\r
136 private DirectoryModel model;
\r
138 /**************************************************************************
\r
139 * Must be overridden to extend
\r
141 *************************************************************************/
\r
142 public UI(JFileChooser e)
\r
147 /**************************************************************************
\r
148 * Overridden to create our own model
\r
149 *************************************************************************/
\r
150 protected final void createModel()
\r
152 model = new DirectoryModel(getFileChooser());
\r
155 /**************************************************************************
\r
156 * Overridden to get our own model
\r
158 *************************************************************************/
\r
159 public final BasicDirectoryModel getModel() { return model; }
\r
161 /**************************************************************************
\r
162 * Calls the default method then adds a MouseListener to the JTable
\r
165 *************************************************************************/
\r
166 protected final JPanel createDetailsView(JFileChooser chooser)
\r
168 final JPanel panel = super.createDetailsView(chooser);
\r
170 //Since we can't access MetalFileChooserUI's private member detailsTable
\r
171 //directly, we have to find it in the JPanel
\r
172 final JTable tbl = findJTable(panel.getComponents());
\r
175 //Fix the columns so they can't be rearranged, if we don't do this
\r
176 //we would need to keep track when each column is moved
\r
177 tbl.getTableHeader().setReorderingAllowed(false);
\r
179 //Add a mouselistener to listen for clicks on column headers
\r
180 tbl.getTableHeader().addMouseListener(new MouseAdapter(){
\r
181 public void mouseClicked(MouseEvent e)
\r
183 //Only process single clicks
\r
184 if (e.getClickCount() > 1) return;
\r
186 final int col = tbl.getTableHeader().columnAtPoint(e.getPoint());
\r
187 if (col == COLUMN_FILENAME || col == COLUMN_FILESIZE ||
\r
188 col == COLUMN_FILEDATE)
\r
189 model.sort(col,tbl);
\r
196 /**************************************************************************
\r
197 * Finds the JTable in the panel so we can add MouseListener
\r
200 *************************************************************************/
\r
201 private final static JTable findJTable(Component[] comp)
\r
203 for (int i=0;i<comp.length;i++)
\r
205 if (comp[i] instanceof JTable)
\r
207 return (JTable)comp[i];
\r
209 if (comp[i] instanceof Container)
\r
211 JTable tbl = findJTable(((Container)comp[i]).getComponents());
\r
212 if (tbl != null) return tbl;
\r
219 /***************************************************************************
\r
220 * Implementation of BasicDirectoryModel that sorts the Files by column
\r
221 **************************************************************************/
\r
222 private final static class DirectoryModel extends BasicDirectoryModel
\r
227 /**************************************************************************
\r
228 * Must be overridden to extend BasicDirectoryModel
\r
230 *************************************************************************/
\r
231 DirectoryModel(JFileChooser chooser)
\r
237 /**************************************************************************
\r
238 * Supposedly this is not used anymore, hopefully not. We implemented
\r
239 * some basic attempt at sorting just in case
\r
243 *************************************************************************/
\r
244 protected final boolean lt(File a, File b)
\r
246 System.out.println("DEBUG:LT called?");
\r
247 boolean less = false;
\r
250 case COLUMN_FILEDATE:
\r
251 less = a.lastModified() > b.lastModified();
\r
253 case COLUMN_FILESIZE:
\r
254 less = a.length() > b.length();
\r
257 less = a.getName().compareToIgnoreCase(b.getName()) > 0;
\r
260 if (ascending) return less = !less;
\r
264 /**************************************************************************
\r
265 * Resorts the JFileChooser table based on new column
\r
267 *************************************************************************/
\r
268 protected final void sort(int c, JTable tbl)
\r
270 //Set column and order
\r
272 ascending = !ascending;
\r
273 String indicator = " (^)";
\r
275 indicator = " (v)";
\r
277 final JTableHeader th = tbl.getTableHeader();
\r
278 final TableColumnModel tcm = th.getColumnModel();
\r
280 for (int i=0;i<JalviewFileChooser.COLUMN_COLCOUNT;i++)
\r
282 final TableColumn tc = tcm.getColumn( i ); // the column to change
\r
283 tc.setHeaderValue( COLUMNS[i] );
\r
286 final TableColumn tc = tcm.getColumn( col ); // the column to change
\r
287 tc.setHeaderValue( COLUMNS[col] + indicator );
\r
291 //Requery the file listing
\r
292 validateFileCache();
\r
295 /**************************************************************************
\r
296 * Sorts the data based on current column setting
\r
298 *************************************************************************/
\r
299 protected final void sort(Vector data)
\r
303 case COLUMN_FILEDATE:
\r
304 Collections.sort(data,new Comparator(){
\r
305 public int compare(Object o1,Object o2)
\r
308 final File a = (File)o1;
\r
309 final File b = (File)o2;
\r
310 if (a.lastModified() > b.lastModified())
\r
312 else if (a.lastModified() == b.lastModified())
\r
322 case COLUMN_FILESIZE:
\r
323 Collections.sort(data,new Comparator(){
\r
324 public int compare(Object o1,Object o2)
\r
327 final File a = (File)o1;
\r
328 final File b = (File)o2;
\r
329 if (a.length() > b.length())
\r
331 else if (a.length() == b.length())
\r
341 case COLUMN_FILENAME:
\r
342 Collections.sort(data,new Comparator(){
\r
343 public int compare(Object o1,Object o2)
\r
345 final File a = (File)o1;
\r
346 final File b = (File)o2;
\r
348 return a.getName().compareToIgnoreCase(b.getName());
\r
350 return -1 * a.getName().compareToIgnoreCase(b.getName());
\r