header updated
[jalview.git] / src / jalview / io / JalviewFileChooser.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  *\r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 \r
20 //////////////////////////////////////////////////////////////////\r
21 package jalview.io;\r
22 \r
23 import java.io.*;\r
24 import java.awt.*;\r
25 import javax.swing.*;\r
26 import java.awt.event.*;\r
27 import java.util.*;\r
28 \r
29 public class JalviewFileChooser\r
30     extends JFileChooser\r
31 {\r
32 \r
33   public JalviewFileChooser(String dir)\r
34   {\r
35     super(dir);\r
36     setAccessory(new RecentlyOpened());\r
37   }\r
38 \r
39   public JalviewFileChooser(String dir,\r
40                             String[] suffix,\r
41                             String[] desc,\r
42                             String selected,\r
43                             boolean selectAll)\r
44   {\r
45     super(dir);\r
46     init( suffix, desc, selected, selectAll);\r
47   }\r
48 \r
49   public JalviewFileChooser(String dir,\r
50                             String[] suffix,\r
51                             String[] desc,\r
52                             String selected)\r
53   {\r
54     super(dir);\r
55     init( suffix, desc, selected, true);\r
56   }\r
57 \r
58   void init(String[] suffix,\r
59             String[] desc,\r
60             String selected,\r
61             boolean selectAll)\r
62   {\r
63 \r
64     JalviewFileFilter chosen = null;\r
65 \r
66     //SelectAllFilter needs to be set first before adding further\r
67     //file filters to fix bug on Mac OSX\r
68     setAcceptAllFileFilterUsed(selectAll);\r
69 \r
70     for (int i = 0; i < suffix.length; i++)\r
71     {\r
72       JalviewFileFilter jvf = new JalviewFileFilter(suffix[i], desc[i]);\r
73       addChoosableFileFilter(jvf);\r
74 \r
75       if ( (selected != null) && selected.equalsIgnoreCase(desc[i]))\r
76       {\r
77         chosen = jvf;\r
78       }\r
79     }\r
80 \r
81     if (chosen != null)\r
82     {\r
83       setFileFilter(chosen);\r
84     }\r
85 \r
86     setAccessory(new RecentlyOpened());\r
87   }\r
88 \r
89 \r
90   public void setFileFilter(javax.swing.filechooser.FileFilter filter)\r
91   {\r
92     super.setFileFilter(filter);\r
93 \r
94 \r
95     try{\r
96       if(getUI() instanceof javax.swing.plaf.basic.BasicFileChooserUI)\r
97       {\r
98         final javax.swing.plaf.basic.BasicFileChooserUI ui = (javax.swing.plaf.\r
99             basic.BasicFileChooserUI) getUI();\r
100         final String name = ui.getFileName().trim();\r
101 \r
102         if ( (name == null) || (name.length() == 0))\r
103         {\r
104           return;\r
105         }\r
106 \r
107         EventQueue.invokeLater(new Thread()\r
108         {\r
109           public void run()\r
110           {\r
111             String currentName = ui.getFileName();\r
112             if ( (currentName == null) || (currentName.length() == 0))\r
113             {\r
114               ui.setFileName(name);\r
115             }\r
116           }\r
117         });\r
118       }\r
119     }catch(Exception ex)\r
120     {\r
121       ex.printStackTrace();\r
122       // Some platforms do not have BasicFileChooserUI\r
123     }\r
124   }\r
125 \r
126   public String getSelectedFormat()\r
127   {\r
128     if(getFileFilter()==null)\r
129     {\r
130       return null;\r
131     }\r
132 \r
133     String format = getFileFilter().getDescription();\r
134 \r
135     if (format.toUpperCase().startsWith("JALVIEW"))\r
136     {\r
137       format = "Jalview";\r
138     }\r
139     else if (format.toUpperCase().startsWith("FASTA"))\r
140     {\r
141       format = "FASTA";\r
142     }\r
143     else if (format.toUpperCase().startsWith("MSF"))\r
144     {\r
145       format = "MSF";\r
146     }\r
147     else if (format.toUpperCase().startsWith("CLUSTAL"))\r
148     {\r
149       format = "CLUSTAL";\r
150     }\r
151     else if (format.toUpperCase().startsWith("BLC"))\r
152     {\r
153       format = "BLC";\r
154     }\r
155     else if (format.toUpperCase().startsWith("PIR"))\r
156     {\r
157       format = "PIR";\r
158     }\r
159     else if (format.toUpperCase().startsWith("PFAM"))\r
160     {\r
161       format = "PFAM";\r
162     }\r
163 \r
164     return format;\r
165   }\r
166 \r
167   public int showSaveDialog(Component parent)\r
168       throws HeadlessException\r
169   {\r
170     this.setAccessory(null);\r
171 \r
172 \r
173     setDialogType(SAVE_DIALOG);\r
174 \r
175     int ret = showDialog(parent, "Save");\r
176 \r
177     if (getFileFilter() instanceof JalviewFileFilter)\r
178     {\r
179       JalviewFileFilter jvf = (JalviewFileFilter) getFileFilter();\r
180 \r
181       if (!jvf.accept(getSelectedFile()))\r
182       {\r
183         String withExtension = getSelectedFile() + "." +\r
184             jvf.getAcceptableExtension();\r
185         setSelectedFile(new File(withExtension));\r
186       }\r
187     }\r
188 \r
189     if ( (ret == JalviewFileChooser.APPROVE_OPTION) &&\r
190         getSelectedFile().exists())\r
191     {\r
192       int confirm = JOptionPane.showConfirmDialog(parent,\r
193                                                   "Overwrite existing file?",\r
194                                                   "File exists",\r
195                                                   JOptionPane.YES_NO_OPTION);\r
196 \r
197       if (confirm != JOptionPane.YES_OPTION)\r
198       {\r
199         ret = JalviewFileChooser.CANCEL_OPTION;\r
200       }\r
201     }\r
202 \r
203     return ret;\r
204   }\r
205 \r
206   void recentListSelectionChanged(String selection)\r
207   {\r
208     setSelectedFile(null);\r
209 \r
210     File file = new File(selection);\r
211     if (getFileFilter() instanceof JalviewFileFilter)\r
212     {\r
213       JalviewFileFilter jvf = (JalviewFileFilter)this.getFileFilter();\r
214 \r
215       if (!jvf.accept(file))\r
216       {\r
217         setFileFilter(getChoosableFileFilters()[0]);\r
218       }\r
219     }\r
220 \r
221      setSelectedFile( file );\r
222   }\r
223 \r
224   class RecentlyOpened extends JPanel\r
225   {\r
226     JList list;\r
227     public RecentlyOpened()\r
228     {\r
229       String historyItems = jalview.bin.Cache.getProperty("RECENT_FILE");\r
230       StringTokenizer st;\r
231       Vector recent = new Vector();\r
232 \r
233       if (historyItems != null)\r
234       {\r
235         st = new StringTokenizer(historyItems, "\t");\r
236 \r
237         while (st.hasMoreTokens())\r
238         {\r
239           recent.addElement(st.nextElement());\r
240         }\r
241       }\r
242 \r
243       list = new JList(recent);\r
244 \r
245       DefaultListCellRenderer dlcr = new DefaultListCellRenderer();\r
246       dlcr.setHorizontalAlignment(DefaultListCellRenderer.RIGHT);\r
247       list.setCellRenderer(dlcr);\r
248 \r
249 \r
250       list.addMouseListener(new MouseAdapter()\r
251           {\r
252             public void mousePressed(MouseEvent evt)\r
253             {\r
254               recentListSelectionChanged(list.getSelectedValue().toString());\r
255             }\r
256           });\r
257 \r
258       this.setBorder(new javax.swing.border.TitledBorder("Recently Opened"));\r
259 \r
260       final JScrollPane scroller = new JScrollPane(list);\r
261       scroller.setPreferredSize(new Dimension(130, 200));\r
262       this.add(scroller);\r
263 \r
264       javax.swing.SwingUtilities.invokeLater(new Runnable()\r
265       {\r
266         public void run()\r
267         {\r
268           scroller.getHorizontalScrollBar().setValue(\r
269               scroller.getHorizontalScrollBar().getMaximum());\r
270         }\r
271       });\r
272 \r
273 \r
274     }\r
275 \r
276   }\r
277 }\r
278 \r
279 \r
280 \r
281 \r
282 \r