- /**************************************************************************\r
- * Internal implementation of Metal LookAndFeel to create the table sorting\r
- * ability.\r
- *************************************************************************/\r
- private final static class UI extends MetalFileChooserUI\r
- {\r
- private DirectoryModel model;\r
-\r
- /**************************************************************************\r
- * Must be overridden to extend\r
- * @param e\r
- *************************************************************************/\r
- public UI(JFileChooser e)\r
- {\r
- super(e);\r
- }\r
-\r
- /**************************************************************************\r
- * Overridden to create our own model\r
- *************************************************************************/\r
- protected final void createModel()\r
- {\r
- model = new DirectoryModel(getFileChooser());\r
- }\r
-\r
- /**************************************************************************\r
- * Overridden to get our own model\r
- * @return\r
- *************************************************************************/\r
- public final BasicDirectoryModel getModel() { return model; }\r
-\r
- /**************************************************************************\r
- * Calls the default method then adds a MouseListener to the JTable\r
- * @param chooser\r
- * @return\r
- *************************************************************************/\r
- protected final JPanel createDetailsView(JFileChooser chooser)\r
- {\r
- final JPanel panel = super.createDetailsView(chooser);\r
-\r
- //Since we can't access MetalFileChooserUI's private member detailsTable\r
- //directly, we have to find it in the JPanel\r
- final JTable tbl = findJTable(panel.getComponents());\r
- if (tbl != null)\r
- {\r
- //Fix the columns so they can't be rearranged, if we don't do this\r
- //we would need to keep track when each column is moved\r
- tbl.getTableHeader().setReorderingAllowed(false);\r
-\r
- //Add a mouselistener to listen for clicks on column headers\r
- tbl.getTableHeader().addMouseListener(new MouseAdapter(){\r
- public void mouseClicked(MouseEvent e)\r
- {\r
- //Only process single clicks\r
- if (e.getClickCount() > 1) return;\r
- e.consume();\r
- final int col = tbl.getTableHeader().columnAtPoint(e.getPoint());\r
- if (col == COLUMN_FILENAME || col == COLUMN_FILESIZE ||\r
- col == COLUMN_FILEDATE)\r
- model.sort(col,tbl);\r
- }\r
- });\r
- }\r
- return panel;\r
- }\r
-\r
- /**************************************************************************\r
- * Finds the JTable in the panel so we can add MouseListener\r
- * @param comp\r
- * @return\r
- *************************************************************************/\r
- private final static JTable findJTable(Component[] comp)\r
- {\r
- for (int i=0;i<comp.length;i++)\r
- {\r
- if (comp[i] instanceof JTable)\r
- {\r
- return (JTable)comp[i];\r
- }\r
- if (comp[i] instanceof Container)\r
- {\r
- JTable tbl = findJTable(((Container)comp[i]).getComponents());\r
- if (tbl != null) return tbl;\r
- }\r
- }\r
- return null;\r
- }\r
- }\r
-\r
- /***************************************************************************\r
- * Implementation of BasicDirectoryModel that sorts the Files by column\r
- **************************************************************************/\r
- private final static class DirectoryModel extends BasicDirectoryModel\r
- {\r
- int col = 0;\r
- boolean ascending;\r
-\r
- /**************************************************************************\r
- * Must be overridden to extend BasicDirectoryModel\r
- * @param chooser\r
- *************************************************************************/\r
- DirectoryModel(JFileChooser chooser)\r
- {\r
- super(chooser);\r
- }\r
-\r
-\r
- /**************************************************************************\r
- * Supposedly this is not used anymore, hopefully not. We implemented\r
- * some basic attempt at sorting just in case\r
- * @param a\r
- * @param b\r
- * @return\r
- *************************************************************************/\r
- protected final boolean lt(File a, File b)\r
- {\r
- System.out.println("LT called?");\r
- boolean less = false;\r
- switch (col)\r
- {\r
- case COLUMN_FILEDATE:\r
- less = a.lastModified() > b.lastModified();\r
- break;\r
- case COLUMN_FILESIZE:\r
- less = a.length() > b.length();\r
- break;\r
- default:\r
- less = a.getName().compareToIgnoreCase(b.getName()) > 0;\r
- break;\r
- }\r
- if (ascending) return less = !less;\r
- return less;\r
- }\r
-\r
- /**************************************************************************\r
- * Resorts the JFileChooser table based on new column\r
- * @param c\r
- *************************************************************************/\r
- protected final void sort(int c, JTable tbl)\r
- {\r
- //Set column and order\r
- col = c;\r
- ascending = !ascending;\r
- String indicator = " (^)";\r
- if (ascending)\r
- indicator = " (v)";\r
-\r
- final JTableHeader th = tbl.getTableHeader();\r
- final TableColumnModel tcm = th.getColumnModel();\r
-\r
- for (int i=0;i<JalviewFileChooser.COLUMN_COLCOUNT;i++)\r
- {\r
- final TableColumn tc = tcm.getColumn( i ); // the column to change\r
- tc.setHeaderValue( COLUMNS[i] );\r
- }\r
-\r
- final TableColumn tc = tcm.getColumn( col ); // the column to change\r
- tc.setHeaderValue( COLUMNS[col] + indicator );\r
-\r
- th.repaint();\r
-\r
- //Requery the file listing\r
- validateFileCache();\r
- }\r
-\r
- /**************************************************************************\r
- * Sorts the data based on current column setting\r
- * @param data\r
- *************************************************************************/\r
- protected final void sort(Vector data)\r
- {\r
- switch (col)\r
- {\r
- case COLUMN_FILEDATE:\r
- Collections.sort(data,new Comparator(){\r
- public int compare(Object o1,Object o2)\r
- {\r
- int ret = 1;\r
- final File a = (File)o1;\r
- final File b = (File)o2;\r
- if (a.lastModified() > b.lastModified())\r
- ret = -1;\r
- else if (a.lastModified() == b.lastModified())\r
- ret = 0;\r
-\r
- if (ascending)\r
- ret *= -1;\r
- return ret;\r
- }\r
-\r
- });\r
- break;\r
- case COLUMN_FILESIZE:\r
- Collections.sort(data,new Comparator(){\r
- public int compare(Object o1,Object o2)\r
- {\r
- int ret = 1;\r
- final File a = (File)o1;\r
- final File b = (File)o2;\r
- if (a.length() > b.length())\r
- ret = -1;\r
- else if (a.length() == b.length())\r
- ret = 0;\r
-\r
- if (ascending)\r
- ret *= -1;\r
- return ret;\r
- }\r
-\r
- });\r
- break;\r
- case COLUMN_FILENAME:\r
- Collections.sort(data,new Comparator(){\r
- public int compare(Object o1,Object o2)\r
- {\r
- final File a = (File)o1;\r
- final File b = (File)o2;\r
- if (ascending)\r
- return a.getName().compareToIgnoreCase(b.getName());\r
- else\r
- return -1 * a.getName().compareToIgnoreCase(b.getName());\r
- }\r
-\r
- });\r
- break;\r
- }\r
- }\r