1 |
|
|
2 |
|
|
3 |
|
|
4 |
|
|
5 |
|
|
6 |
|
|
7 |
|
|
8 |
|
|
9 |
|
|
10 |
|
|
11 |
|
|
12 |
|
|
13 |
|
|
14 |
|
|
15 |
|
|
16 |
|
|
17 |
|
|
18 |
|
|
19 |
|
|
20 |
|
|
21 |
|
|
22 |
|
package jalview.io; |
23 |
|
|
24 |
|
import jalview.bin.Cache; |
25 |
|
import jalview.gui.JvOptionPane; |
26 |
|
import jalview.util.MessageManager; |
27 |
|
import jalview.util.Platform; |
28 |
|
import jalview.util.dialogrunner.DialogRunnerI; |
29 |
|
import jalview.util.dialogrunner.Response; |
30 |
|
import jalview.util.dialogrunner.RunResponse; |
31 |
|
|
32 |
|
import java.awt.Component; |
33 |
|
import java.awt.Dimension; |
34 |
|
import java.awt.EventQueue; |
35 |
|
import java.awt.HeadlessException; |
36 |
|
import java.awt.event.MouseAdapter; |
37 |
|
import java.awt.event.MouseEvent; |
38 |
|
import java.beans.PropertyChangeEvent; |
39 |
|
import java.beans.PropertyChangeListener; |
40 |
|
import java.io.File; |
41 |
|
import java.util.ArrayList; |
42 |
|
import java.util.List; |
43 |
|
import java.util.StringTokenizer; |
44 |
|
import java.util.Vector; |
45 |
|
|
46 |
|
import javax.swing.DefaultListCellRenderer; |
47 |
|
import javax.swing.JFileChooser; |
48 |
|
import javax.swing.JList; |
49 |
|
import javax.swing.JPanel; |
50 |
|
import javax.swing.JScrollPane; |
51 |
|
import javax.swing.SpringLayout; |
52 |
|
import javax.swing.plaf.basic.BasicFileChooserUI; |
53 |
|
|
54 |
|
|
55 |
|
|
56 |
|
|
57 |
|
|
58 |
|
|
59 |
|
|
60 |
|
@author |
61 |
|
|
62 |
|
|
|
|
| 33.8% |
Uncovered Elements: 104 (157) |
Complexity: 44 |
Complexity Density: 0.45 |
|
63 |
|
public class JalviewFileChooser extends JFileChooser |
64 |
|
implements PropertyChangeListener, DialogRunnerI |
65 |
|
{ |
66 |
|
jalview.util.dialogrunner.DialogRunner<JalviewFileChooser> runner = new jalview.util.dialogrunner.DialogRunner<>( |
67 |
|
this); |
68 |
|
|
69 |
|
|
70 |
|
|
71 |
|
|
72 |
|
@param |
73 |
|
@param |
74 |
|
@return |
75 |
|
|
|
|
| 100% |
Uncovered Elements: 0 (9) |
Complexity: 2 |
Complexity Density: 0.29 |
|
76 |
11 |
public static JalviewFileChooser forRead(String directory,... |
77 |
|
String selected) |
78 |
|
{ |
79 |
11 |
List<String> extensions = new ArrayList<>(); |
80 |
11 |
List<String> descs = new ArrayList<>(); |
81 |
11 |
for (FileFormatI format : FileFormats.getInstance().getFormats()) |
82 |
|
{ |
83 |
209 |
if (format.isReadable()) |
84 |
|
{ |
85 |
187 |
extensions.add(format.getExtensions()); |
86 |
187 |
descs.add(format.getName()); |
87 |
|
} |
88 |
|
} |
89 |
11 |
return new JalviewFileChooser(directory, |
90 |
|
extensions.toArray(new String[extensions.size()]), |
91 |
|
descs.toArray(new String[descs.size()]), selected, true); |
92 |
|
} |
93 |
|
|
94 |
|
|
95 |
|
|
96 |
|
|
97 |
|
|
98 |
|
@param |
99 |
|
@param |
100 |
|
@return |
101 |
|
|
|
|
| 0% |
Uncovered Elements: 9 (9) |
Complexity: 2 |
Complexity Density: 0.29 |
|
102 |
0 |
public static JalviewFileChooser forWrite(String directory,... |
103 |
|
String selected) |
104 |
|
{ |
105 |
|
|
106 |
|
|
107 |
0 |
List<String> extensions = new ArrayList<>(); |
108 |
0 |
List<String> descs = new ArrayList<>(); |
109 |
0 |
for (FileFormatI format : FileFormats.getInstance().getFormats()) |
110 |
|
{ |
111 |
0 |
if (format.isWritable()) |
112 |
|
{ |
113 |
0 |
extensions.add(format.getExtensions()); |
114 |
0 |
descs.add(format.getName()); |
115 |
|
} |
116 |
|
} |
117 |
0 |
return new JalviewFileChooser(directory, |
118 |
|
extensions.toArray(new String[extensions.size()]), |
119 |
|
descs.toArray(new String[descs.size()]), selected, false); |
120 |
|
} |
121 |
|
|
|
|
| 0% |
Uncovered Elements: 2 (2) |
Complexity: 1 |
Complexity Density: 0.5 |
|
122 |
0 |
public JalviewFileChooser(String dir)... |
123 |
|
{ |
124 |
0 |
super(safePath(dir)); |
125 |
0 |
setAccessory(new RecentlyOpened()); |
126 |
|
} |
127 |
|
|
|
|
| 0% |
Uncovered Elements: 1 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
128 |
0 |
public JalviewFileChooser(String dir, String[] suffix, String[] desc,... |
129 |
|
String selected) |
130 |
|
{ |
131 |
0 |
this(dir, suffix, desc, selected, true); |
132 |
|
} |
133 |
|
|
134 |
|
|
135 |
|
|
136 |
|
|
137 |
|
@param |
138 |
|
@param |
139 |
|
|
|
|
| 0% |
Uncovered Elements: 1 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
140 |
0 |
public JalviewFileChooser(String extension, String desc)... |
141 |
|
{ |
142 |
0 |
this(Cache.getProperty("LAST_DIRECTORY"), new String[] { extension }, |
143 |
|
new String[] |
144 |
|
{ desc }, desc, true); |
145 |
|
} |
146 |
|
|
|
|
| 81.8% |
Uncovered Elements: 2 (11) |
Complexity: 3 |
Complexity Density: 0.43 |
|
147 |
11 |
JalviewFileChooser(String dir, String[] extensions, String[] descs,... |
148 |
|
String selected, boolean allFiles) |
149 |
|
{ |
150 |
11 |
super(safePath(dir)); |
151 |
11 |
if (extensions.length == descs.length) |
152 |
|
{ |
153 |
11 |
List<String[]> formats = new ArrayList<>(); |
154 |
198 |
for (int i = 0; i < extensions.length; i++) |
155 |
|
{ |
156 |
187 |
formats.add(new String[] { extensions[i], descs[i] }); |
157 |
|
} |
158 |
11 |
init(formats, selected, allFiles); |
159 |
|
} |
160 |
|
else |
161 |
|
{ |
162 |
0 |
System.err.println("JalviewFileChooser arguments mismatch: " |
163 |
|
+ extensions + ", " + descs); |
164 |
|
} |
165 |
|
} |
166 |
|
|
|
|
| 0% |
Uncovered Elements: 4 (4) |
Complexity: 2 |
Complexity Density: 0.5 |
|
167 |
0 |
@Override... |
168 |
|
public void propertyChange(PropertyChangeEvent evt) |
169 |
|
{ |
170 |
|
|
171 |
0 |
switch (evt.getPropertyName()) |
172 |
|
{ |
173 |
0 |
case "SelectedFile": |
174 |
0 |
runner.run(APPROVE_OPTION); |
175 |
0 |
break; |
176 |
|
} |
177 |
|
} |
178 |
|
|
|
|
| 80% |
Uncovered Elements: 2 (10) |
Complexity: 3 |
Complexity Density: 0.5 |
|
179 |
11 |
private static File safePath(String dir)... |
180 |
|
{ |
181 |
11 |
if (dir == null) |
182 |
|
{ |
183 |
4 |
return null; |
184 |
|
} |
185 |
|
|
186 |
7 |
File f = new File(dir); |
187 |
7 |
if (f.getName().indexOf(':') > -1) |
188 |
|
{ |
189 |
0 |
return null; |
190 |
|
} |
191 |
7 |
return f; |
192 |
|
} |
193 |
|
|
|
|
| 0% |
Uncovered Elements: 3 (3) |
Complexity: 1 |
Complexity Density: 0.33 |
|
194 |
0 |
public void openDialog(Component parent)... |
195 |
|
{ |
196 |
0 |
runner.resetResponses(); |
197 |
0 |
int value = showOpenDialog(this); |
198 |
|
|
199 |
|
|
200 |
|
|
201 |
|
{ |
202 |
0 |
runner.firstRun(value); |
203 |
|
} |
204 |
|
} |
205 |
|
|
206 |
|
|
207 |
|
|
208 |
|
@param |
209 |
|
|
210 |
|
@param |
211 |
|
@param |
212 |
|
|
213 |
|
|
|
|
| 92.9% |
Uncovered Elements: 1 (14) |
Complexity: 4 |
Complexity Density: 0.4 |
|
214 |
11 |
void init(List<String[]> formats, String selected, boolean allFiles)... |
215 |
|
{ |
216 |
|
|
217 |
11 |
JalviewFileFilter chosen = null; |
218 |
|
|
219 |
|
|
220 |
|
|
221 |
11 |
setAcceptAllFileFilterUsed(allFiles); |
222 |
|
|
223 |
11 |
for (String[] format : formats) |
224 |
|
{ |
225 |
187 |
JalviewFileFilter jvf = new JalviewFileFilter(format[0], format[1]); |
226 |
187 |
addChoosableFileFilter(jvf); |
227 |
187 |
if ((selected != null) && selected.equalsIgnoreCase(format[1])) |
228 |
|
{ |
229 |
11 |
chosen = jvf; |
230 |
|
} |
231 |
|
} |
232 |
|
|
233 |
11 |
if (chosen != null) |
234 |
|
{ |
235 |
11 |
setFileFilter(chosen); |
236 |
|
} |
237 |
|
|
238 |
11 |
setAccessory(new RecentlyOpened()); |
239 |
|
} |
240 |
|
|
|
|
| 69.2% |
Uncovered Elements: 4 (13) |
Complexity: 5 |
Complexity Density: 0.56 |
|
241 |
55 |
@Override... |
242 |
|
public void setFileFilter(javax.swing.filechooser.FileFilter filter) |
243 |
|
{ |
244 |
55 |
super.setFileFilter(filter); |
245 |
|
|
246 |
55 |
try |
247 |
|
{ |
248 |
55 |
if (getUI() instanceof BasicFileChooserUI) |
249 |
|
{ |
250 |
55 |
final BasicFileChooserUI fcui = (BasicFileChooserUI) getUI(); |
251 |
55 |
final String name = fcui.getFileName().trim(); |
252 |
|
|
253 |
55 |
if ((name == null) || (name.length() == 0)) |
254 |
|
{ |
255 |
55 |
return; |
256 |
|
} |
257 |
|
|
258 |
0 |
EventQueue.invokeLater(new Thread() |
259 |
|
{ |
|
|
| 0% |
Uncovered Elements: 5 (5) |
Complexity: 3 |
Complexity Density: 1 |
|
260 |
0 |
@Override... |
261 |
|
public void run() |
262 |
|
{ |
263 |
0 |
String currentName = fcui.getFileName(); |
264 |
0 |
if ((currentName == null) || (currentName.length() == 0)) |
265 |
|
{ |
266 |
0 |
fcui.setFileName(name); |
267 |
|
} |
268 |
|
} |
269 |
|
}); |
270 |
|
} |
271 |
|
} catch (Exception ex) |
272 |
|
{ |
273 |
0 |
ex.printStackTrace(); |
274 |
|
|
275 |
|
} |
276 |
|
} |
277 |
|
|
278 |
|
|
279 |
|
|
280 |
|
|
281 |
|
@return |
282 |
|
|
|
|
| 0% |
Uncovered Elements: 14 (14) |
Complexity: 4 |
Complexity Density: 0.4 |
|
283 |
0 |
public FileFormatI getSelectedFormat()... |
284 |
|
{ |
285 |
0 |
if (getFileFilter() == null) |
286 |
|
{ |
287 |
0 |
return null; |
288 |
|
} |
289 |
|
|
290 |
|
|
291 |
|
|
292 |
|
|
293 |
|
|
294 |
|
|
295 |
|
@see |
296 |
|
|
297 |
0 |
String format = getFileFilter().getDescription(); |
298 |
0 |
int parenPos = format.indexOf("("); |
299 |
0 |
if (parenPos > 0) |
300 |
|
{ |
301 |
0 |
format = format.substring(0, parenPos).trim(); |
302 |
0 |
try |
303 |
|
{ |
304 |
0 |
return FileFormats.getInstance().forName(format); |
305 |
|
} catch (IllegalArgumentException e) |
306 |
|
{ |
307 |
0 |
System.err.println("Unexpected format: " + format); |
308 |
|
} |
309 |
|
} |
310 |
0 |
return null; |
311 |
|
} |
312 |
|
|
313 |
|
Component saveparent; |
314 |
|
RunResponse overwriteCheck = new RunResponse( |
315 |
|
JalviewFileChooser.APPROVE_OPTION) |
316 |
|
{ |
|
|
| 0% |
Uncovered Elements: 18 (18) |
Complexity: 5 |
Complexity Density: 0.5 |
|
317 |
0 |
@Override... |
318 |
|
public void run() |
319 |
|
{ |
320 |
|
|
321 |
|
|
322 |
0 |
if (getFileFilter() instanceof JalviewFileFilter) |
323 |
|
{ |
324 |
0 |
JalviewFileFilter jvf = (JalviewFileFilter) getFileFilter(); |
325 |
|
|
326 |
0 |
if (!jvf.accept(getSelectedFile())) |
327 |
|
{ |
328 |
0 |
String withExtension = getSelectedFile() + "." |
329 |
|
+ jvf.getAcceptableExtension(); |
330 |
0 |
setSelectedFile(new File(withExtension)); |
331 |
|
} |
332 |
|
} |
333 |
|
|
334 |
0 |
returned = new Response(JalviewFileChooser.APPROVE_OPTION); |
335 |
|
|
336 |
|
|
337 |
|
|
338 |
|
|
339 |
|
|
340 |
|
|
341 |
|
{ |
342 |
0 |
if (getSelectedFile().exists()) |
343 |
|
{ |
344 |
|
|
345 |
|
|
346 |
|
|
347 |
0 |
int confirm = JvOptionPane.showConfirmDialog(saveparent, |
348 |
|
MessageManager.getString("label.overwrite_existing_file"), |
349 |
|
MessageManager.getString("label.file_already_exists"), |
350 |
|
JvOptionPane.YES_NO_OPTION); |
351 |
|
|
352 |
0 |
if (confirm != JvOptionPane.YES_OPTION) |
353 |
|
{ |
354 |
0 |
returned = new Response(JalviewFileChooser.CANCEL_OPTION); |
355 |
|
} |
356 |
|
} |
357 |
|
} |
358 |
|
}; |
359 |
|
}; |
360 |
|
|
|
|
| 0% |
Uncovered Elements: 11 (11) |
Complexity: 2 |
Complexity Density: 0.22 |
|
361 |
0 |
@Override... |
362 |
|
public int showSaveDialog(Component parent) throws HeadlessException |
363 |
|
{ |
364 |
0 |
this.setAccessory(null); |
365 |
|
|
366 |
|
|
367 |
|
|
368 |
|
|
369 |
0 |
if (!runner.isRegistered(overwriteCheck)) |
370 |
|
{ |
371 |
|
|
372 |
0 |
runner.firstResponse(overwriteCheck); |
373 |
|
} |
374 |
|
else |
375 |
|
{ |
376 |
|
|
377 |
0 |
runner.resetResponses(); |
378 |
|
} |
379 |
|
|
380 |
0 |
setDialogType(SAVE_DIALOG); |
381 |
0 |
saveparent = parent; |
382 |
|
|
383 |
0 |
int value = showDialog(parent, MessageManager.getString("action.save")); |
384 |
|
|
385 |
|
|
386 |
|
|
387 |
|
{ |
388 |
0 |
runner.firstRun(value); |
389 |
|
} |
390 |
0 |
return value; |
391 |
|
} |
392 |
|
|
|
|
| 0% |
Uncovered Elements: 14 (14) |
Complexity: 4 |
Complexity Density: 0.5 |
|
393 |
0 |
void recentListSelectionChanged(Object selection)... |
394 |
|
{ |
395 |
0 |
setSelectedFile(null); |
396 |
0 |
if (selection != null) |
397 |
|
{ |
398 |
0 |
File file = new File((String) selection); |
399 |
0 |
if (getFileFilter() instanceof JalviewFileFilter) |
400 |
|
{ |
401 |
0 |
JalviewFileFilter jvf = (JalviewFileFilter) this.getFileFilter(); |
402 |
|
|
403 |
0 |
if (!jvf.accept(file)) |
404 |
|
{ |
405 |
0 |
setFileFilter(getChoosableFileFilters()[0]); |
406 |
|
} |
407 |
|
} |
408 |
|
|
409 |
0 |
setSelectedFile(file); |
410 |
|
} |
411 |
|
} |
412 |
|
|
|
|
| 84.8% |
Uncovered Elements: 5 (33) |
Complexity: 6 |
Complexity Density: 0.25 |
|
413 |
|
class RecentlyOpened extends JPanel |
414 |
|
{ |
415 |
|
JList list; |
416 |
|
|
|
|
| 89.3% |
Uncovered Elements: 3 (28) |
Complexity: 4 |
Complexity Density: 0.18 |
|
417 |
11 |
public RecentlyOpened()... |
418 |
|
{ |
419 |
|
|
420 |
11 |
String historyItems = jalview.bin.Cache.getProperty("RECENT_FILE"); |
421 |
11 |
StringTokenizer st; |
422 |
11 |
Vector recent = new Vector(); |
423 |
|
|
424 |
11 |
if (historyItems != null) |
425 |
|
{ |
426 |
11 |
st = new StringTokenizer(historyItems, "\t"); |
427 |
|
|
428 |
36 |
while (st.hasMoreTokens()) |
429 |
|
{ |
430 |
25 |
recent.addElement(st.nextElement()); |
431 |
|
} |
432 |
|
} |
433 |
|
|
434 |
11 |
list = new JList(recent); |
435 |
|
|
436 |
11 |
DefaultListCellRenderer dlcr = new DefaultListCellRenderer(); |
437 |
11 |
dlcr.setHorizontalAlignment(DefaultListCellRenderer.RIGHT); |
438 |
11 |
list.setCellRenderer(dlcr); |
439 |
|
|
440 |
11 |
list.addMouseListener(new MouseAdapter() |
441 |
|
{ |
|
|
| 0% |
Uncovered Elements: 1 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
442 |
0 |
@Override... |
443 |
|
public void mousePressed(MouseEvent evt) |
444 |
|
{ |
445 |
0 |
recentListSelectionChanged(list.getSelectedValue()); |
446 |
|
} |
447 |
|
}); |
448 |
|
|
449 |
11 |
this.setBorder(new javax.swing.border.TitledBorder( |
450 |
|
MessageManager.getString("label.recently_opened"))); |
451 |
|
|
452 |
11 |
final JScrollPane scroller = new JScrollPane(list); |
453 |
|
|
454 |
11 |
SpringLayout layout = new SpringLayout(); |
455 |
11 |
layout.putConstraint(SpringLayout.WEST, scroller, 5, |
456 |
|
SpringLayout.WEST, this); |
457 |
11 |
layout.putConstraint(SpringLayout.NORTH, scroller, 5, |
458 |
|
SpringLayout.NORTH, this); |
459 |
|
|
460 |
11 |
if (new Platform().isAMac()) |
461 |
|
{ |
462 |
0 |
scroller.setPreferredSize(new Dimension(500, 100)); |
463 |
|
} |
464 |
|
else |
465 |
|
{ |
466 |
11 |
scroller.setPreferredSize(new Dimension(130, 200)); |
467 |
|
} |
468 |
|
|
469 |
11 |
this.add(scroller); |
470 |
|
|
471 |
11 |
javax.swing.SwingUtilities.invokeLater(new Runnable() |
472 |
|
{ |
|
|
| 100% |
Uncovered Elements: 0 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
473 |
11 |
@Override... |
474 |
|
public void run() |
475 |
|
{ |
476 |
11 |
scroller.getHorizontalScrollBar() |
477 |
|
.setValue(scroller.getHorizontalScrollBar().getMaximum()); |
478 |
|
} |
479 |
|
}); |
480 |
|
|
481 |
|
} |
482 |
|
|
483 |
|
} |
484 |
|
|
|
|
| 0% |
Uncovered Elements: 1 (1) |
Complexity: 1 |
Complexity Density: 1 |
|
485 |
0 |
@Override... |
486 |
|
public JalviewFileChooser response(RunResponse action) |
487 |
|
{ |
488 |
0 |
return runner.response(action); |
489 |
|
} |
490 |
|
|
491 |
|
} |