2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
3 * Copyright (C) 2014 The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
21 //////////////////////////////////////////////////////////////////
24 import jalview.util.MessageManager;
26 import java.awt.Component;
27 import java.awt.Dimension;
28 import java.awt.EventQueue;
29 import java.awt.HeadlessException;
30 import java.awt.event.MouseAdapter;
31 import java.awt.event.MouseEvent;
33 import java.util.StringTokenizer;
34 import java.util.Vector;
36 import javax.swing.DefaultListCellRenderer;
37 import javax.swing.JFileChooser;
38 import javax.swing.JList;
39 import javax.swing.JOptionPane;
40 import javax.swing.JPanel;
41 import javax.swing.JScrollPane;
42 import javax.swing.SpringLayout;
45 * Enhanced file chooser dialog box.
47 * NOTE: bug on Windows systems when filechooser opened on directory to view
48 * files with colons in title.
53 public class JalviewFileChooser extends JFileChooser
55 public JalviewFileChooser(String dir)
58 setAccessory(new RecentlyOpened());
61 private static File safePath(String dir)
68 File f = new File(dir);
69 if (f.getName().indexOf(':') > -1)
76 public JalviewFileChooser(String dir, String[] suffix, String[] desc,
77 String selected, boolean selectAll)
80 init(suffix, desc, selected, selectAll);
83 public JalviewFileChooser(String dir, String[] suffix, String[] desc,
87 init(suffix, desc, selected, true);
90 void init(String[] suffix, String[] desc, String selected,
94 JalviewFileFilter chosen = null;
96 // SelectAllFilter needs to be set first before adding further
97 // file filters to fix bug on Mac OSX
98 setAcceptAllFileFilterUsed(selectAll);
100 for (int i = 0; i < suffix.length; i++)
102 JalviewFileFilter jvf = new JalviewFileFilter(suffix[i], desc[i]);
103 addChoosableFileFilter(jvf);
104 if ((selected != null) && selected.equalsIgnoreCase(desc[i]))
112 setFileFilter(chosen);
115 setAccessory(new RecentlyOpened());
119 public void setFileFilter(javax.swing.filechooser.FileFilter filter)
121 super.setFileFilter(filter);
125 if (getUI() instanceof javax.swing.plaf.basic.BasicFileChooserUI)
127 final javax.swing.plaf.basic.BasicFileChooserUI ui = (javax.swing.plaf.basic.BasicFileChooserUI) getUI();
128 final String name = ui.getFileName().trim();
130 if ((name == null) || (name.length() == 0))
135 EventQueue.invokeLater(new Thread()
140 String currentName = ui.getFileName();
141 if ((currentName == null) || (currentName.length() == 0))
143 ui.setFileName(name);
148 } catch (Exception ex)
150 ex.printStackTrace();
151 // Some platforms do not have BasicFileChooserUI
155 public String getSelectedFormat()
157 if (getFileFilter() == null)
162 String format = getFileFilter().getDescription();
164 if (format.toUpperCase().startsWith("JALVIEW"))
168 else if (format.toUpperCase().startsWith("FASTA"))
172 else if (format.toUpperCase().startsWith("MSF"))
176 else if (format.toUpperCase().startsWith("CLUSTAL"))
180 else if (format.toUpperCase().startsWith("BLC"))
184 else if (format.toUpperCase().startsWith("PIR"))
188 else if (format.toUpperCase().startsWith("PFAM"))
192 else if (format.toUpperCase().startsWith(PhylipFile.FILE_DESC))
194 format = PhylipFile.FILE_DESC;
201 public int showSaveDialog(Component parent) throws HeadlessException
203 this.setAccessory(null);
205 setDialogType(SAVE_DIALOG);
207 int ret = showDialog(parent, MessageManager.getString("action.save"));
209 if (getFileFilter() instanceof JalviewFileFilter)
211 JalviewFileFilter jvf = (JalviewFileFilter) getFileFilter();
213 if (!jvf.accept(getSelectedFile()))
215 String withExtension = getSelectedFile() + "."
216 + jvf.getAcceptableExtension();
217 setSelectedFile(new File(withExtension));
220 // TODO: ENSURE THAT FILES SAVED WITH A ':' IN THE NAME ARE REFUSED AND THE
221 // USER PROMPTED FOR A NEW FILENAME
222 if ((ret == JalviewFileChooser.APPROVE_OPTION)
223 && getSelectedFile().exists())
225 int confirm = JOptionPane.showConfirmDialog(parent,
226 MessageManager.getString("label.overwrite_existing_file"), MessageManager.getString("label.file_already_exists"),
227 JOptionPane.YES_NO_OPTION);
229 if (confirm != JOptionPane.YES_OPTION)
231 ret = JalviewFileChooser.CANCEL_OPTION;
238 void recentListSelectionChanged(Object selection)
240 setSelectedFile(null);
241 if (selection != null)
243 File file = new File((String) selection);
244 if (getFileFilter() instanceof JalviewFileFilter)
246 JalviewFileFilter jvf = (JalviewFileFilter) this.getFileFilter();
248 if (!jvf.accept(file))
250 setFileFilter(getChoosableFileFilters()[0]);
254 setSelectedFile(file);
258 class RecentlyOpened extends JPanel
262 public RecentlyOpened()
265 String historyItems = jalview.bin.Cache.getProperty("RECENT_FILE");
267 Vector recent = new Vector();
269 if (historyItems != null)
271 st = new StringTokenizer(historyItems, "\t");
273 while (st.hasMoreTokens())
275 recent.addElement(st.nextElement());
279 list = new JList(recent);
281 DefaultListCellRenderer dlcr = new DefaultListCellRenderer();
282 dlcr.setHorizontalAlignment(DefaultListCellRenderer.RIGHT);
283 list.setCellRenderer(dlcr);
285 list.addMouseListener(new MouseAdapter()
288 public void mousePressed(MouseEvent evt)
290 recentListSelectionChanged(list.getSelectedValue());
294 this.setBorder(new javax.swing.border.TitledBorder(MessageManager.getString("label.recently_opened")));
296 final JScrollPane scroller = new JScrollPane(list);
298 SpringLayout layout = new SpringLayout();
299 layout.putConstraint(SpringLayout.WEST, scroller, 5,
300 SpringLayout.WEST, this);
301 layout.putConstraint(SpringLayout.NORTH, scroller, 5,
302 SpringLayout.NORTH, this);
304 // scroller.setPreferredSize(new Dimension(130, 200));
307 scroller.setPreferredSize(new Dimension(500, 100));
310 javax.swing.SwingUtilities.invokeLater(new Runnable()
315 scroller.getHorizontalScrollBar().setValue(
316 scroller.getHorizontalScrollBar().getMaximum());