Recently loaded files, urls, append sequences to Alignment
[jalview.git] / src / jalview / io / JalviewFileChooser.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2005 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, String[] suffix, String[] desc,\r
40                             String selected)\r
41   {\r
42     super(dir);\r
43 \r
44     JalviewFileFilter chosen = null;\r
45 \r
46     for (int i = 0; i < suffix.length; i++)\r
47     {\r
48       JalviewFileFilter jvf = new JalviewFileFilter(suffix[i], desc[i]);\r
49       addChoosableFileFilter(jvf);\r
50 \r
51       if ( (selected != null) && selected.equalsIgnoreCase(desc[i]))\r
52       {\r
53         chosen = jvf;\r
54       }\r
55     }\r
56 \r
57     if (chosen != null)\r
58     {\r
59       setFileFilter(chosen);\r
60     }\r
61     setAccessory(new RecentlyOpened());\r
62   }\r
63 \r
64 \r
65   public void setFileFilter(javax.swing.filechooser.FileFilter filter)\r
66   {\r
67     super.setFileFilter(filter);\r
68 \r
69     try{\r
70       if(getUI() instanceof javax.swing.plaf.basic.BasicFileChooserUI)\r
71       {\r
72         final javax.swing.plaf.basic.BasicFileChooserUI ui = (javax.swing.plaf.\r
73             basic.BasicFileChooserUI) getUI();\r
74         final String name = ui.getFileName().trim();\r
75 \r
76         if ( (name == null) || (name.length() == 0))\r
77         {\r
78           return;\r
79         }\r
80 \r
81         EventQueue.invokeLater(new Thread()\r
82         {\r
83           public void run()\r
84           {\r
85             String currentName = ui.getFileName();\r
86             if ( (currentName == null) || (currentName.length() == 0))\r
87             {\r
88               ui.setFileName(name);\r
89             }\r
90           }\r
91         });\r
92       }\r
93     }catch(Exception ex)\r
94     {\r
95       // Some platforms do not have BasicFileChooserUI\r
96     }\r
97   }\r
98 \r
99   public String getSelectedFormat()\r
100   {\r
101     if(getFileFilter()==null)\r
102     {\r
103       return null;\r
104     }\r
105 \r
106     String format = getFileFilter().getDescription();\r
107 \r
108     if (format.toUpperCase().startsWith("JALVIEW"))\r
109     {\r
110       format = "Jalview";\r
111     }\r
112     else if (format.toUpperCase().startsWith("FASTA"))\r
113     {\r
114       format = "FASTA";\r
115     }\r
116     else if (format.toUpperCase().startsWith("MSF"))\r
117     {\r
118       format = "MSF";\r
119     }\r
120     else if (format.toUpperCase().startsWith("CLUSTAL"))\r
121     {\r
122       format = "CLUSTAL";\r
123     }\r
124     else if (format.toUpperCase().startsWith("BLC"))\r
125     {\r
126       format = "BLC";\r
127     }\r
128     else if (format.toUpperCase().startsWith("PIR"))\r
129     {\r
130       format = "PIR";\r
131     }\r
132     else if (format.toUpperCase().startsWith("PFAM"))\r
133     {\r
134       format = "PFAM";\r
135     }\r
136 \r
137     return format;\r
138   }\r
139 \r
140   public int showSaveDialog(Component parent)\r
141       throws HeadlessException\r
142   {\r
143     this.setAccessory(null);\r
144 \r
145     setDialogType(SAVE_DIALOG);\r
146 \r
147     int ret = showDialog(parent, null);\r
148 \r
149     if (getFileFilter() instanceof JalviewFileFilter)\r
150     {\r
151       JalviewFileFilter jvf = (JalviewFileFilter) getFileFilter();\r
152 \r
153       if (!jvf.accept(getSelectedFile()))\r
154       {\r
155         String withExtension = getSelectedFile() + "." +\r
156             jvf.getAcceptableExtension();\r
157         setSelectedFile(new File(withExtension));\r
158       }\r
159     }\r
160 \r
161     if ( (ret == JalviewFileChooser.APPROVE_OPTION) &&\r
162         getSelectedFile().exists())\r
163     {\r
164       int confirm = JOptionPane.showConfirmDialog(parent,\r
165                                                   "Overwrite existing file?",\r
166                                                   "File exists",\r
167                                                   JOptionPane.YES_NO_OPTION);\r
168 \r
169       if (confirm != JOptionPane.YES_OPTION)\r
170       {\r
171         ret = JalviewFileChooser.CANCEL_OPTION;\r
172       }\r
173     }\r
174 \r
175     return ret;\r
176   }\r
177 \r
178   void recentListSelectionChanged(String selection)\r
179   {\r
180     setSelectedFile(null);\r
181 \r
182     File file = new File(selection);\r
183     if (getFileFilter() instanceof JalviewFileFilter)\r
184     {\r
185       JalviewFileFilter jvf = (JalviewFileFilter)this.getFileFilter();\r
186 \r
187       if (!jvf.accept(file))\r
188       {\r
189         setFileFilter(getChoosableFileFilters()[0]);\r
190       }\r
191     }\r
192 \r
193      setSelectedFile( file );\r
194   }\r
195 \r
196   class RecentlyOpened extends JPanel\r
197   {\r
198     JList list;\r
199     public RecentlyOpened()\r
200     {\r
201       String historyItems = jalview.bin.Cache.getProperty("RECENT_FILE");\r
202       StringTokenizer st;\r
203       Vector recent = new Vector();\r
204 \r
205       if (historyItems != null)\r
206       {\r
207         st = new StringTokenizer(historyItems, "\t");\r
208 \r
209         while (st.hasMoreTokens())\r
210         {\r
211           recent.addElement(st.nextElement());\r
212         }\r
213       }\r
214 \r
215       list = new JList(recent);\r
216       list.addMouseListener(new MouseAdapter()\r
217           {\r
218             public void mousePressed(MouseEvent evt)\r
219             {\r
220               recentListSelectionChanged(list.getSelectedValue().toString());\r
221             }\r
222           });\r
223 \r
224       this.setBorder(new javax.swing.border.TitledBorder("Recently Opened"));\r
225 \r
226       JScrollPane scroller = new JScrollPane(list);\r
227       scroller.setPreferredSize(new Dimension(250, 200));\r
228       this.add(scroller);\r
229       scroller.getHorizontalScrollBar()\r
230           .setValue(scroller.getHorizontalScrollBar().getMaximum()\r
231           );\r
232 \r
233     }\r
234 \r
235   }\r
236 }\r
237 \r
238 \r
239 \r
240 \r
241 \r