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)
\r
37 JalviewFileFilter filter = new JalviewFileFilter(suffix, desc);
\r
38 this.setFileFilter(filter);
\r
42 public JalviewFileChooser(String dir)
\r
50 if (COLUMNS == null)
\r
52 Locale l = getLocale();
\r
53 COLUMNS = new String[]{
\r
54 UIManager.getString("FileChooser.fileNameHeaderText",l),
\r
55 UIManager.getString("FileChooser.fileSizeHeaderText",l),
\r
56 UIManager.getString("FileChooser.fileTypeHeaderText",l),
\r
57 UIManager.getString("FileChooser.fileDateHeaderText",l),
\r
58 UIManager.getString("FileChooser.fileAttrHeaderText",l)
\r
64 /**************************************************************************
\r
65 * Always create the local UI
\r
67 *************************************************************************/
\r
68 public final void setUI(ComponentUI comp)
\r
70 super.setUI(new UI(this));
\r
73 /**************************************************************************
\r
74 * Internal implementation of Metal LookAndFeel to create the table sorting
\r
76 *************************************************************************/
\r
77 private final static class UI extends MetalFileChooserUI
\r
79 private DirectoryModel model;
\r
81 /**************************************************************************
\r
82 * Must be overridden to extend
\r
84 *************************************************************************/
\r
85 public UI(JFileChooser e)
\r
90 /**************************************************************************
\r
91 * Overridden to create our own model
\r
92 *************************************************************************/
\r
93 protected final void createModel()
\r
95 model = new DirectoryModel(getFileChooser());
\r
98 /**************************************************************************
\r
99 * Overridden to get our own model
\r
101 *************************************************************************/
\r
102 public final BasicDirectoryModel getModel() { return model; }
\r
104 /**************************************************************************
\r
105 * Calls the default method then adds a MouseListener to the JTable
\r
108 *************************************************************************/
\r
109 protected final JPanel createDetailsView(JFileChooser chooser)
\r
111 final JPanel panel = super.createDetailsView(chooser);
\r
113 //Since we can't access MetalFileChooserUI's private member detailsTable
\r
114 //directly, we have to find it in the JPanel
\r
115 final JTable tbl = findJTable(panel.getComponents());
\r
118 //Fix the columns so they can't be rearranged, if we don't do this
\r
119 //we would need to keep track when each column is moved
\r
120 tbl.getTableHeader().setReorderingAllowed(false);
\r
122 //Add a mouselistener to listen for clicks on column headers
\r
123 tbl.getTableHeader().addMouseListener(new MouseAdapter(){
\r
124 public void mouseClicked(MouseEvent e)
\r
126 //Only process single clicks
\r
127 if (e.getClickCount() > 1) return;
\r
129 final int col = tbl.getTableHeader().columnAtPoint(e.getPoint());
\r
130 if (col == COLUMN_FILENAME || col == COLUMN_FILESIZE ||
\r
131 col == COLUMN_FILEDATE)
\r
132 model.sort(col,tbl);
\r
139 /**************************************************************************
\r
140 * Finds the JTable in the panel so we can add MouseListener
\r
143 *************************************************************************/
\r
144 private final static JTable findJTable(Component[] comp)
\r
146 for (int i=0;i<comp.length;i++)
\r
148 if (comp[i] instanceof JTable)
\r
150 return (JTable)comp[i];
\r
152 if (comp[i] instanceof Container)
\r
154 JTable tbl = findJTable(((Container)comp[i]).getComponents());
\r
155 if (tbl != null) return tbl;
\r
162 /***************************************************************************
\r
163 * Implementation of BasicDirectoryModel that sorts the Files by column
\r
164 **************************************************************************/
\r
165 private final static class DirectoryModel extends BasicDirectoryModel
\r
170 /**************************************************************************
\r
171 * Must be overridden to extend BasicDirectoryModel
\r
173 *************************************************************************/
\r
174 DirectoryModel(JFileChooser chooser)
\r
180 /**************************************************************************
\r
181 * Supposedly this is not used anymore, hopefully not. We implemented
\r
182 * some basic attempt at sorting just in case
\r
186 *************************************************************************/
\r
187 protected final boolean lt(File a, File b)
\r
189 System.out.println("LT called?");
\r
190 boolean less = false;
\r
193 case COLUMN_FILEDATE:
\r
194 less = a.lastModified() > b.lastModified();
\r
196 case COLUMN_FILESIZE:
\r
197 less = a.length() > b.length();
\r
200 less = a.getName().compareToIgnoreCase(b.getName()) > 0;
\r
203 if (ascending) return less = !less;
\r
207 /**************************************************************************
\r
208 * Resorts the JFileChooser table based on new column
\r
210 *************************************************************************/
\r
211 protected final void sort(int c, JTable tbl)
\r
213 //Set column and order
\r
215 ascending = !ascending;
\r
216 String indicator = " (^)";
\r
218 indicator = " (v)";
\r
220 final JTableHeader th = tbl.getTableHeader();
\r
221 final TableColumnModel tcm = th.getColumnModel();
\r
223 for (int i=0;i<JalviewFileChooser.COLUMN_COLCOUNT;i++)
\r
225 final TableColumn tc = tcm.getColumn( i ); // the column to change
\r
226 tc.setHeaderValue( COLUMNS[i] );
\r
229 final TableColumn tc = tcm.getColumn( col ); // the column to change
\r
230 tc.setHeaderValue( COLUMNS[col] + indicator );
\r
234 //Requery the file listing
\r
235 validateFileCache();
\r
238 /**************************************************************************
\r
239 * Sorts the data based on current column setting
\r
241 *************************************************************************/
\r
242 protected final void sort(Vector data)
\r
246 case COLUMN_FILEDATE:
\r
247 Collections.sort(data,new Comparator(){
\r
248 public int compare(Object o1,Object o2)
\r
251 final File a = (File)o1;
\r
252 final File b = (File)o2;
\r
253 if (a.lastModified() > b.lastModified())
\r
255 else if (a.lastModified() == b.lastModified())
\r
265 case COLUMN_FILESIZE:
\r
266 Collections.sort(data,new Comparator(){
\r
267 public int compare(Object o1,Object o2)
\r
270 final File a = (File)o1;
\r
271 final File b = (File)o2;
\r
272 if (a.length() > b.length())
\r
274 else if (a.length() == b.length())
\r
284 case COLUMN_FILENAME:
\r
285 Collections.sort(data,new Comparator(){
\r
286 public int compare(Object o1,Object o2)
\r
288 final File a = (File)o1;
\r
289 final File b = (File)o2;
\r
291 return a.getName().compareToIgnoreCase(b.getName());
\r
293 return -1 * a.getName().compareToIgnoreCase(b.getName());
\r