equalsIgnoreCase
[jalview.git] / src / jalview / io / JalviewFileChooser.java
1 \r
2 /*///////////////////////////////////////////////////////////////////\r
3 // This file was taken from java forum\r
4 // Re: JFileChooser functioning like normal Windows Apps FileChooser\r
5 // Author: ddanimal\r
6 // http://forum.java.sun.com/thread.jspa?forumID=57&threadID=327712\r
7 *///////////////////////////////////////////////////////////////////\r
8 \r
9 package jalview.io;\r
10 \r
11 import java.awt.*;\r
12 import java.awt.event.*;\r
13 import java.io.*;\r
14 import java.util.*;\r
15 \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
21 \r
22 public class JalviewFileChooser extends JFileChooser\r
23 {\r
24 \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
32 \r
33 \r
34   public JalviewFileChooser(String dir, String [] suffix, String [] desc, String selected)\r
35   {\r
36     super(dir);\r
37 \r
38     JalviewFileFilter chosen = null;\r
39     for(int i=0; i<suffix.length; i++)\r
40     {\r
41       JalviewFileFilter jvf = new JalviewFileFilter(suffix[i], desc[i]);\r
42       addChoosableFileFilter(jvf);\r
43       if(selected!=null && selected.equalsIgnoreCase(desc[i]))\r
44         chosen = jvf;\r
45     }\r
46     if(chosen!=null)\r
47       setFileFilter(chosen);\r
48     initColumns();\r
49   }\r
50 \r
51   public String getSelectedFormat()\r
52   {\r
53 \r
54     String format = getFileFilter().getDescription();\r
55 \r
56     if (format.toUpperCase().startsWith("JALVIEW"))\r
57       format = "Jalview";\r
58     else if (format.toUpperCase().startsWith("FASTA"))\r
59       format = "FASTA";\r
60     else if (format.toUpperCase().startsWith("MSF"))\r
61       format = "MSF";\r
62     else if (format.toUpperCase().startsWith("CLUSTAL"))\r
63       format = "CLUSTAL";\r
64     else if (format.toUpperCase().startsWith("BLC"))\r
65       format = "BLC";\r
66     else if (format.toUpperCase().startsWith("PIR"))\r
67       format = "PIR";\r
68     else if (format.toUpperCase().startsWith("PFAM"))\r
69       format = "PFAM";\r
70 \r
71     return format;\r
72   }\r
73   public JalviewFileChooser(String dir)\r
74   {\r
75     super(dir);\r
76     initColumns();\r
77   }\r
78 \r
79   public int showSaveDialog(Component parent) throws HeadlessException {\r
80       setDialogType(SAVE_DIALOG);\r
81       int ret = showDialog(parent, null);\r
82 \r
83       JalviewFileFilter jvf = (JalviewFileFilter)getFileFilter();\r
84       if( !jvf.accept( getSelectedFile() ) )\r
85       {\r
86         String withExtension = getSelectedFile()+"."+jvf.getAcceptableExtension();\r
87         setSelectedFile(new File(withExtension));\r
88       }\r
89 \r
90       if(ret == JalviewFileChooser.APPROVE_OPTION  &&  getSelectedFile().exists() )\r
91       {\r
92        int confirm =  JOptionPane.showConfirmDialog(parent,\r
93                                       "Overwrite existing file?",\r
94                                       "File exists",\r
95                                       JOptionPane.YES_NO_OPTION);\r
96        if(confirm!=JOptionPane.YES_OPTION)\r
97          ret = this.CANCEL_OPTION;\r
98       }\r
99       return ret;\r
100   }\r
101 \r
102 \r
103   void initColumns()\r
104   {\r
105     if (COLUMNS == null)\r
106     {\r
107         Locale l = getLocale();\r
108         COLUMNS = new String[]{\r
109         UIManager.getString("FileChooser.fileNameHeaderText",l),\r
110         UIManager.getString("FileChooser.fileSizeHeaderText",l),\r
111         UIManager.getString("FileChooser.fileTypeHeaderText",l),\r
112         UIManager.getString("FileChooser.fileDateHeaderText",l),\r
113         UIManager.getString("FileChooser.fileAttrHeaderText",l)\r
114       };\r
115     }\r
116   }\r
117 \r
118   /**************************************************************************\r
119    * Always create the local UI\r
120    * @param comp\r
121    *************************************************************************/\r
122   public final void setUI(ComponentUI comp)\r
123   {\r
124     super.setUI(new UI(this));\r
125   }\r
126 \r
127    /**************************************************************************\r
128     * Internal implementation of Metal LookAndFeel to create the table sorting\r
129     * ability.\r
130     *************************************************************************/\r
131    private final static class UI extends MetalFileChooserUI\r
132    {\r
133      private DirectoryModel model;\r
134 \r
135      /**************************************************************************\r
136       * Must be overridden to extend\r
137       * @param e\r
138       *************************************************************************/\r
139      public UI(JFileChooser e)\r
140      {\r
141        super(e);\r
142      }\r
143 \r
144      /**************************************************************************\r
145       * Overridden to create our own model\r
146       *************************************************************************/\r
147      protected final void createModel()\r
148      {\r
149        model = new DirectoryModel(getFileChooser());\r
150      }\r
151 \r
152      /**************************************************************************\r
153       * Overridden to get our own model\r
154       * @return\r
155       *************************************************************************/\r
156      public final BasicDirectoryModel getModel() {       return model;     }\r
157 \r
158      /**************************************************************************\r
159       * Calls the default method then adds a MouseListener to the JTable\r
160       * @param chooser\r
161       * @return\r
162       *************************************************************************/\r
163      protected final JPanel createDetailsView(JFileChooser chooser)\r
164      {\r
165        final JPanel panel = super.createDetailsView(chooser);\r
166 \r
167        //Since we can't access MetalFileChooserUI's private member detailsTable\r
168        //directly, we have to find it in the JPanel\r
169        final JTable tbl = findJTable(panel.getComponents());\r
170        if (tbl != null)\r
171        {\r
172          //Fix the columns so they can't be rearranged, if we don't do this\r
173          //we would need to keep track when each column is moved\r
174          tbl.getTableHeader().setReorderingAllowed(false);\r
175 \r
176          //Add a mouselistener to listen for clicks on column headers\r
177          tbl.getTableHeader().addMouseListener(new MouseAdapter(){\r
178            public void mouseClicked(MouseEvent e)\r
179            {\r
180              //Only process single clicks\r
181              if (e.getClickCount() > 1) return;\r
182              e.consume();\r
183              final int col = tbl.getTableHeader().columnAtPoint(e.getPoint());\r
184              if (col == COLUMN_FILENAME || col == COLUMN_FILESIZE ||\r
185                  col == COLUMN_FILEDATE)\r
186                model.sort(col,tbl);\r
187            }\r
188          });\r
189        }\r
190        return panel;\r
191      }\r
192 \r
193      /**************************************************************************\r
194       * Finds the JTable in the panel so we can add MouseListener\r
195       * @param comp\r
196       * @return\r
197       *************************************************************************/\r
198      private final static JTable findJTable(Component[] comp)\r
199      {\r
200        for (int i=0;i<comp.length;i++)\r
201        {\r
202          if (comp[i] instanceof JTable)\r
203          {\r
204            return (JTable)comp[i];\r
205          }\r
206          if (comp[i] instanceof Container)\r
207          {\r
208            JTable tbl = findJTable(((Container)comp[i]).getComponents());\r
209            if (tbl != null) return tbl;\r
210          }\r
211        }\r
212        return null;\r
213      }\r
214    }\r
215 \r
216   /***************************************************************************\r
217    * Implementation of BasicDirectoryModel that sorts the Files by column\r
218    **************************************************************************/\r
219   private final static class DirectoryModel extends BasicDirectoryModel\r
220    {\r
221      int col = 0;\r
222      boolean ascending;\r
223 \r
224      /**************************************************************************\r
225       * Must be overridden to extend BasicDirectoryModel\r
226       * @param chooser\r
227       *************************************************************************/\r
228      DirectoryModel(JFileChooser chooser)\r
229      {\r
230        super(chooser);\r
231      }\r
232 \r
233 \r
234      /**************************************************************************\r
235       * Supposedly this is not used anymore, hopefully not.  We implemented\r
236       * some basic attempt at sorting just in case\r
237       * @param a\r
238       * @param b\r
239       * @return\r
240       *************************************************************************/\r
241      protected final boolean lt(File a, File b)\r
242      {\r
243        System.out.println("LT called?");\r
244        boolean less = false;\r
245        switch (col)\r
246        {\r
247          case COLUMN_FILEDATE:\r
248            less = a.lastModified() > b.lastModified();\r
249            break;\r
250          case COLUMN_FILESIZE:\r
251            less = a.length() > b.length();\r
252            break;\r
253          default:\r
254            less = a.getName().compareToIgnoreCase(b.getName()) > 0;\r
255          break;\r
256        }\r
257        if (ascending) return less = !less;\r
258        return less;\r
259      }\r
260 \r
261      /**************************************************************************\r
262       * Resorts the JFileChooser table based on new column\r
263       * @param c\r
264       *************************************************************************/\r
265      protected final void sort(int c, JTable tbl)\r
266      {\r
267        //Set column and order\r
268        col = c;\r
269        ascending = !ascending;\r
270        String indicator = " (^)";\r
271        if (ascending)\r
272          indicator = " (v)";\r
273 \r
274        final JTableHeader th = tbl.getTableHeader();\r
275        final TableColumnModel tcm = th.getColumnModel();\r
276 \r
277        for (int i=0;i<JalviewFileChooser.COLUMN_COLCOUNT;i++)\r
278        {\r
279          final TableColumn tc = tcm.getColumn( i ); // the column to change\r
280          tc.setHeaderValue( COLUMNS[i] );\r
281        }\r
282 \r
283        final TableColumn tc = tcm.getColumn( col ); // the column to change\r
284        tc.setHeaderValue( COLUMNS[col] + indicator );\r
285 \r
286        th.repaint();\r
287 \r
288        //Requery the file listing\r
289        validateFileCache();\r
290      }\r
291 \r
292      /**************************************************************************\r
293       * Sorts the data based on current column setting\r
294       * @param data\r
295       *************************************************************************/\r
296      protected final void sort(Vector data)\r
297      {\r
298        switch (col)\r
299        {\r
300          case COLUMN_FILEDATE:\r
301            Collections.sort(data,new Comparator(){\r
302              public int compare(Object o1,Object o2)\r
303              {\r
304                int ret = 1;\r
305                final File a = (File)o1;\r
306                final File b = (File)o2;\r
307                if (a.lastModified() > b.lastModified())\r
308                  ret = -1;\r
309                else if (a.lastModified() == b.lastModified())\r
310                  ret = 0;\r
311 \r
312                if (ascending)\r
313                  ret *= -1;\r
314                return ret;\r
315              }\r
316 \r
317            });\r
318            break;\r
319          case COLUMN_FILESIZE:\r
320            Collections.sort(data,new Comparator(){\r
321              public int compare(Object o1,Object o2)\r
322              {\r
323                int ret = 1;\r
324                final File a = (File)o1;\r
325                final File b = (File)o2;\r
326                if (a.length() > b.length())\r
327                  ret = -1;\r
328                else if (a.length() == b.length())\r
329                  ret = 0;\r
330 \r
331                if (ascending)\r
332                  ret *= -1;\r
333                return ret;\r
334              }\r
335 \r
336            });\r
337            break;\r
338          case COLUMN_FILENAME:\r
339            Collections.sort(data,new Comparator(){\r
340              public int compare(Object o1,Object o2)\r
341              {\r
342                final File a = (File)o1;\r
343                final File b = (File)o2;\r
344                if (ascending)\r
345                  return a.getName().compareToIgnoreCase(b.getName());\r
346                else\r
347                  return -1 * a.getName().compareToIgnoreCase(b.getName());\r
348              }\r
349 \r
350            });\r
351            break;\r
352        }\r
353      }\r
354   }\r
355 }\r
356 \r