X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fio%2FJalviewFileChooser.java;h=5484d38e521ced4cb6d7d5cd03a2cdae7bb255e4;hb=4f24ef0848cf3c43ba0467f31fce1baa5c57aad5;hp=d44275ade541c2daeacc33638b6593cdad72ceb2;hpb=588042b69abf8e60bcc950b24c283933c7dd422f;p=jalview.git diff --git a/src/jalview/io/JalviewFileChooser.java b/src/jalview/io/JalviewFileChooser.java index d44275a..5484d38 100755 --- a/src/jalview/io/JalviewFileChooser.java +++ b/src/jalview/io/JalviewFileChooser.java @@ -1,405 +1,282 @@ /* -* Jalview - A Sequence Alignment Editor and Viewer -* Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle -* -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU General Public License -* as published by the Free Software Foundation; either version 2 -* of the License, or (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software -* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA -*/ -/*/////////////////////////////////////////////////////////////////// -// This file was taken from java forum -// Re: JFileChooser functioning like normal Windows Apps FileChooser -// Author: ddanimal -// http://forum.java.sun.com/thread.jspa?forumID=57&threadID=327712 -*/ + * Jalview - A Sequence Alignment Editor and Viewer + * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ ////////////////////////////////////////////////////////////////// package jalview.io; +import java.io.*; import java.awt.*; +import javax.swing.*; import java.awt.event.*; - -import java.io.*; - import java.util.*; -import javax.swing.*; -import javax.swing.plaf.*; -import javax.swing.plaf.basic.*; -import javax.swing.plaf.metal.*; -import javax.swing.table.*; +public class JalviewFileChooser + extends JFileChooser +{ + + public JalviewFileChooser(String dir) + { + super(dir); + setAccessory(new RecentlyOpened()); + } + + public JalviewFileChooser(String dir, + String[] suffix, + String[] desc, + String selected, + boolean selectAll) + { + super(dir); + init( suffix, desc, selected, selectAll); + } + + public JalviewFileChooser(String dir, + String[] suffix, + String[] desc, + String selected) + { + super(dir); + init( suffix, desc, selected, true); + } + + void init(String[] suffix, + String[] desc, + String selected, + boolean selectAll) + { + + JalviewFileFilter chosen = null; + + //SelectAllFilter needs to be set first before adding further + //file filters to fix bug on Mac OSX + setAcceptAllFileFilterUsed(selectAll); + + for (int i = 0; i < suffix.length; i++) + { + JalviewFileFilter jvf = new JalviewFileFilter(suffix[i], desc[i]); + addChoosableFileFilter(jvf); + + if ( (selected != null) && selected.equalsIgnoreCase(desc[i])) + { + chosen = jvf; + } + } + if (chosen != null) + { + setFileFilter(chosen); + } -public class JalviewFileChooser extends JFileChooser { - private static final int COLUMN_FILENAME = 0; - private static final int COLUMN_FILESIZE = 1; - private static final int COLUMN_FILETYPE = 2; - private static final int COLUMN_FILEDATE = 3; - private static final int COLUMN_FILEATTR = 4; - private static final int COLUMN_COLCOUNT = 5; - private static String[] COLUMNS = null; + setAccessory(new RecentlyOpened()); + } - public JalviewFileChooser(String dir, String[] suffix, String[] desc, - String selected) { - super(dir); - JalviewFileFilter chosen = null; + public void setFileFilter(javax.swing.filechooser.FileFilter filter) + { + super.setFileFilter(filter); - for (int i = 0; i < suffix.length; i++) { - JalviewFileFilter jvf = new JalviewFileFilter(suffix[i], desc[i]); - addChoosableFileFilter(jvf); - if ((selected != null) && selected.equalsIgnoreCase(desc[i])) { - chosen = jvf; - } - } + try{ + if(getUI() instanceof javax.swing.plaf.basic.BasicFileChooserUI) + { + final javax.swing.plaf.basic.BasicFileChooserUI ui = (javax.swing.plaf. + basic.BasicFileChooserUI) getUI(); + final String name = ui.getFileName().trim(); - if (chosen != null) { - setFileFilter(chosen); + if ( (name == null) || (name.length() == 0)) + { + return; } - initColumns(); + EventQueue.invokeLater(new Thread() + { + public void run() + { + String currentName = ui.getFileName(); + if ( (currentName == null) || (currentName.length() == 0)) + { + ui.setFileName(name); + } + } + }); + } + }catch(Exception ex) + { + ex.printStackTrace(); + // Some platforms do not have BasicFileChooserUI } + } - public JalviewFileChooser(String dir) { - super(dir); - initColumns(); + public String getSelectedFormat() + { + if(getFileFilter()==null) + { + return null; } - public String getSelectedFormat() { - String format = getFileFilter().getDescription(); - - if (format.toUpperCase().startsWith("JALVIEW")) { - format = "Jalview"; - } else if (format.toUpperCase().startsWith("FASTA")) { - format = "FASTA"; - } else if (format.toUpperCase().startsWith("MSF")) { - format = "MSF"; - } else if (format.toUpperCase().startsWith("CLUSTAL")) { - format = "CLUSTAL"; - } else if (format.toUpperCase().startsWith("BLC")) { - format = "BLC"; - } else if (format.toUpperCase().startsWith("PIR")) { - format = "PIR"; - } else if (format.toUpperCase().startsWith("PFAM")) { - format = "PFAM"; - } + String format = getFileFilter().getDescription(); - return format; + if (format.toUpperCase().startsWith("JALVIEW")) + { + format = "Jalview"; + } + else if (format.toUpperCase().startsWith("FASTA")) + { + format = "FASTA"; + } + else if (format.toUpperCase().startsWith("MSF")) + { + format = "MSF"; + } + else if (format.toUpperCase().startsWith("CLUSTAL")) + { + format = "CLUSTAL"; + } + else if (format.toUpperCase().startsWith("BLC")) + { + format = "BLC"; + } + else if (format.toUpperCase().startsWith("PIR")) + { + format = "PIR"; + } + else if (format.toUpperCase().startsWith("PFAM")) + { + format = "PFAM"; } - public int showSaveDialog(Component parent) throws HeadlessException { - setDialogType(SAVE_DIALOG); + return format; + } - int ret = showDialog(parent, null); + public int showSaveDialog(Component parent) + throws HeadlessException + { + this.setAccessory(null); - if (getFileFilter() instanceof JalviewFileFilter) { - JalviewFileFilter jvf = (JalviewFileFilter) getFileFilter(); - if (!jvf.accept(getSelectedFile())) { - String withExtension = getSelectedFile() + "." + - jvf.getAcceptableExtension(); - setSelectedFile(new File(withExtension)); - } - } + setDialogType(SAVE_DIALOG); - if ((ret == JalviewFileChooser.APPROVE_OPTION) && - getSelectedFile().exists()) { - int confirm = JOptionPane.showConfirmDialog(parent, - "Overwrite existing file?", "File exists", - JOptionPane.YES_NO_OPTION); + int ret = showDialog(parent, "Save"); - if (confirm != JOptionPane.YES_OPTION) { - ret = this.CANCEL_OPTION; - } - } + if (getFileFilter() instanceof JalviewFileFilter) + { + JalviewFileFilter jvf = (JalviewFileFilter) getFileFilter(); - return ret; + if (!jvf.accept(getSelectedFile())) + { + String withExtension = getSelectedFile() + "." + + jvf.getAcceptableExtension(); + setSelectedFile(new File(withExtension)); + } } - void initColumns() { - if (COLUMNS == null) { - Locale l = getLocale(); - COLUMNS = new String[] { - UIManager.getString("FileChooser.fileNameHeaderText", l), - UIManager.getString("FileChooser.fileSizeHeaderText", l), - UIManager.getString("FileChooser.fileTypeHeaderText", l), - UIManager.getString("FileChooser.fileDateHeaderText", l), - UIManager.getString("FileChooser.fileAttrHeaderText", l) - }; - } + if ( (ret == JalviewFileChooser.APPROVE_OPTION) && + getSelectedFile().exists()) + { + int confirm = JOptionPane.showConfirmDialog(parent, + "Overwrite existing file?", + "File exists", + JOptionPane.YES_NO_OPTION); + + if (confirm != JOptionPane.YES_OPTION) + { + ret = JalviewFileChooser.CANCEL_OPTION; + } } - /************************************************************************** - * Always create the local UI - * @param comp - *************************************************************************/ - public final void setUI(ComponentUI comp) { - super.setUI(new UI(this)); - } + return ret; + } - /************************************************************************** - * Internal implementation of Metal LookAndFeel to create the table sorting - * ability. - *************************************************************************/ - private final static class UI extends MetalFileChooserUI { - private DirectoryModel model; - - /************************************************************************** - * Must be overridden to extend - * @param e - *************************************************************************/ - public UI(JFileChooser e) { - super(e); - } + void recentListSelectionChanged(String selection) + { + setSelectedFile(null); - /************************************************************************** - * Overridden to create our own model - *************************************************************************/ - protected final void createModel() { - model = new DirectoryModel(getFileChooser()); - } + File file = new File(selection); + if (getFileFilter() instanceof JalviewFileFilter) + { + JalviewFileFilter jvf = (JalviewFileFilter)this.getFileFilter(); - /************************************************************************** - * Overridden to get our own model - * @return - *************************************************************************/ - public final BasicDirectoryModel getModel() { - return model; - } - - /************************************************************************** - * Calls the default method then adds a MouseListener to the JTable - * @param chooser - * @return - *************************************************************************/ - protected final JPanel createDetailsView(JFileChooser chooser) { - final JPanel panel = super.createDetailsView(chooser); - - //Since we can't access MetalFileChooserUI's private member detailsTable - //directly, we have to find it in the JPanel - final JTable tbl = findJTable(panel.getComponents()); - - if (tbl != null) { - //Fix the columns so they can't be rearranged, if we don't do this - //we would need to keep track when each column is moved - tbl.getTableHeader().setReorderingAllowed(false); - - //Add a mouselistener to listen for clicks on column headers - tbl.getTableHeader().addMouseListener(new MouseAdapter() { - public void mouseClicked(MouseEvent e) { - //Only process single clicks - if (e.getClickCount() > 1) { - return; - } - - e.consume(); - - final int col = tbl.getTableHeader().columnAtPoint(e.getPoint()); - - if ((col == COLUMN_FILENAME) || - (col == COLUMN_FILESIZE) || - (col == COLUMN_FILEDATE)) { - model.sort(col, tbl); - } - } - }); - } - - return panel; - } - - /************************************************************************** - * Finds the JTable in the panel so we can add MouseListener - * @param comp - * @return - *************************************************************************/ - private final static JTable findJTable(Component[] comp) { - for (int i = 0; i < comp.length; i++) { - if (comp[i] instanceof JTable) { - return (JTable) comp[i]; - } - - if (comp[i] instanceof Container) { - JTable tbl = findJTable(((Container) comp[i]).getComponents()); - - if (tbl != null) { - return tbl; - } - } - } - - return null; - } + if (!jvf.accept(file)) + { + setFileFilter(getChoosableFileFilters()[0]); + } } - /*************************************************************************** - * Implementation of BasicDirectoryModel that sorts the Files by column - **************************************************************************/ - private final static class DirectoryModel extends BasicDirectoryModel { - int col = 0; - boolean ascending; - - /************************************************************************** - * Must be overridden to extend BasicDirectoryModel - * @param chooser - *************************************************************************/ - DirectoryModel(JFileChooser chooser) { - super(chooser); + setSelectedFile( file ); + } + + class RecentlyOpened extends JPanel + { + JList list; + public RecentlyOpened() + { + String historyItems = jalview.bin.Cache.getProperty("RECENT_FILE"); + StringTokenizer st; + Vector recent = new Vector(); + + if (historyItems != null) + { + st = new StringTokenizer(historyItems, "\t"); + + while (st.hasMoreTokens()) + { + recent.addElement(st.nextElement()); } + } - /************************************************************************** - * Supposedly this is not used anymore, hopefully not. We implemented - * some basic attempt at sorting just in case - * @param a - * @param b - * @return - *************************************************************************/ - protected final boolean lt(File a, File b) { - System.out.println("DEBUG:LT called?"); - - boolean less = false; - - switch (col) { - case COLUMN_FILEDATE: - less = a.lastModified() > b.lastModified(); - - break; - - case COLUMN_FILESIZE: - less = a.length() > b.length(); + list = new JList(recent); - break; + DefaultListCellRenderer dlcr = new DefaultListCellRenderer(); + dlcr.setHorizontalAlignment(DefaultListCellRenderer.RIGHT); + list.setCellRenderer(dlcr); - default: - less = a.getName().compareToIgnoreCase(b.getName()) > 0; - break; + list.addMouseListener(new MouseAdapter() + { + public void mousePressed(MouseEvent evt) + { + recentListSelectionChanged(list.getSelectedValue().toString()); } + }); - if (ascending) { - return less = !less; - } + this.setBorder(new javax.swing.border.TitledBorder("Recently Opened")); - return less; - } + final JScrollPane scroller = new JScrollPane(list); + scroller.setPreferredSize(new Dimension(130, 200)); + this.add(scroller); - /************************************************************************** - * Resorts the JFileChooser table based on new column - * @param c - *************************************************************************/ - protected final void sort(int c, JTable tbl) { - //Set column and order - col = c; - ascending = !ascending; + javax.swing.SwingUtilities.invokeLater(new Runnable() + { + public void run() + { + scroller.getHorizontalScrollBar().setValue( + scroller.getHorizontalScrollBar().getMaximum()); + } + }); - String indicator = " (^)"; - if (ascending) { - indicator = " (v)"; - } + } - final JTableHeader th = tbl.getTableHeader(); - final TableColumnModel tcm = th.getColumnModel(); + } +} - for (int i = 0; i < JalviewFileChooser.COLUMN_COLCOUNT; i++) { - final TableColumn tc = tcm.getColumn(i); // the column to change - tc.setHeaderValue(COLUMNS[i]); - } - final TableColumn tc = tcm.getColumn(col); // the column to change - tc.setHeaderValue(COLUMNS[col] + indicator); - th.repaint(); - //Requery the file listing - validateFileCache(); - } - /************************************************************************** - * Sorts the data based on current column setting - * @param data - *************************************************************************/ - protected final void sort(Vector data) { - switch (col) { - case COLUMN_FILEDATE: - Collections.sort(data, - new Comparator() { - public int compare(Object o1, Object o2) { - int ret = 1; - final File a = (File) o1; - final File b = (File) o2; - - if (a.lastModified() > b.lastModified()) { - ret = -1; - } else if (a.lastModified() == b.lastModified()) { - ret = 0; - } - - if (ascending) { - ret *= -1; - } - - return ret; - } - }); - - - break; - - case COLUMN_FILESIZE: - Collections.sort(data, - new Comparator() { - public int compare(Object o1, Object o2) { - int ret = 1; - final File a = (File) o1; - final File b = (File) o2; - - if (a.length() > b.length()) { - ret = -1; - } else if (a.length() == b.length()) { - ret = 0; - } - - if (ascending) { - ret *= -1; - } - - return ret; - } - }); - - - break; - - case COLUMN_FILENAME: - Collections.sort(data, - new Comparator() { - public int compare(Object o1, Object o2) { - final File a = (File) o1; - final File b = (File) o2; - - if (ascending) { - return a.getName().compareToIgnoreCase(b.getName()); - } else { - return -1 * a.getName().compareToIgnoreCase(b.getName()); - } - } - }); - - - break; - } - } - } -}