Clover icon

Coverage Report

  1. Project Clover database Thu Aug 13 2020 12:04:21 BST
  2. Package jalview.gui

File AnnotationExporter.java

 

Coverage histogram

../../img/srcFileCovDistChart0.png
56% of files have more coverage

Code metrics

22
121
18
1
442
288
33
0.27
6.72
18
1.83

Classes

Class Line # Actions
AnnotationExporter 59 121 33
0.00%
 

Contributing tests

No tests hitting this source file were found.

Source view

1    /*
2    * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3    * Copyright (C) $$Year-Rel$$ The Jalview Authors
4    *
5    * This file is part of Jalview.
6    *
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.
11    *
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.
16    *
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.
20    */
21    package jalview.gui;
22   
23    import jalview.api.FeatureRenderer;
24    import jalview.bin.Cache;
25    import jalview.datamodel.AlignmentAnnotation;
26    import jalview.datamodel.SequenceI;
27    import jalview.io.AnnotationFile;
28    import jalview.io.FeaturesFile;
29    import jalview.io.JalviewFileChooser;
30    import jalview.io.JalviewFileView;
31    import jalview.util.MessageManager;
32   
33    import java.awt.Color;
34    import java.awt.Dimension;
35    import java.awt.event.ActionEvent;
36    import java.awt.event.ActionListener;
37    import java.io.FileWriter;
38    import java.io.PrintWriter;
39   
40    import javax.swing.BoxLayout;
41    import javax.swing.ButtonGroup;
42    import javax.swing.JButton;
43    import javax.swing.JCheckBox;
44    import javax.swing.JInternalFrame;
45    import javax.swing.JLabel;
46    import javax.swing.JLayeredPane;
47    import javax.swing.JPanel;
48    import javax.swing.JRadioButton;
49    import javax.swing.SwingConstants;
50   
51    /**
52    *
53    * GUI dialog for exporting features or alignment annotations depending upon
54    * which method is called.
55    *
56    * @author AMW
57    *
58    */
 
59    public class AnnotationExporter extends JPanel
60    {
61    private JInternalFrame frame;
62   
63    private AlignmentPanel ap;
64   
65    /*
66    * true if exporting features, false if exporting annotations
67    */
68    private boolean exportFeatures = true;
69   
70    private AlignmentAnnotation[] annotations;
71   
72    private boolean wholeView;
73   
74    /*
75    * option to export linked (CDS/peptide) features when shown
76    * on the alignment, converted to this alignment's coordinates
77    */
78    private JCheckBox includeLinkedFeatures;
79   
80    /*
81    * output format option shown for feature export
82    */
83    JRadioButton GFFFormat = new JRadioButton();
84   
85    /*
86    * output format option shown for annotation export
87    */
88    JRadioButton CSVFormat = new JRadioButton();
89   
90    private JPanel linkedFeaturesPanel;
91   
92    /**
93    * Constructor
94    *
95    * @param panel
96    */
 
97  0 toggle public AnnotationExporter(AlignmentPanel panel)
98    {
99  0 this.ap = panel;
100  0 try
101    {
102  0 jbInit();
103    } catch (Exception ex)
104    {
105  0 ex.printStackTrace();
106    }
107   
108  0 frame = new JInternalFrame();
109  0 frame.setContentPane(this);
110  0 frame.setLayer(JLayeredPane.PALETTE_LAYER);
111  0 Dimension preferredSize = frame.getPreferredSize();
112  0 Desktop.addInternalFrame(frame, "", true, preferredSize.width,
113    preferredSize.height, true, true);
114    }
115   
116    /**
117    * Configures the dialog for options to export visible features. If from a split
118    * frame panel showing linked features, make the option to include these in the
119    * export visible.
120    */
 
121  0 toggle public void exportFeatures()
122    {
123  0 exportFeatures = true;
124  0 CSVFormat.setVisible(false);
125  0 if (ap.av.isShowComplementFeatures())
126    {
127  0 linkedFeaturesPanel.setVisible(true);
128  0 frame.pack();
129    }
130  0 frame.setTitle(MessageManager.getString("label.export_features"));
131    }
132   
133    /**
134    * Configures the dialog for options to export all visible annotations
135    */
 
136  0 toggle public void exportAnnotations()
137    {
138  0 boolean showAnnotation = ap.av.isShowAnnotation();
139  0 exportAnnotation(showAnnotation ? null
140    : ap.av.getAlignment().getAlignmentAnnotation(), true);
141    }
142   
143    /**
144    * Configures the dialog for options to export the given annotation row
145    *
146    * @param toExport
147    */
 
148  0 toggle public void exportAnnotation(AlignmentAnnotation toExport)
149    {
150  0 exportAnnotation(new AlignmentAnnotation[] { toExport }, false);
151    }
152   
 
153  0 toggle private void exportAnnotation(AlignmentAnnotation[] toExport,
154    boolean forWholeView)
155    {
156  0 wholeView = forWholeView;
157  0 annotations = toExport;
158  0 exportFeatures = false;
159  0 GFFFormat.setVisible(false);
160  0 CSVFormat.setVisible(true);
161  0 frame.setTitle(MessageManager.getString("label.export_annotations"));
162    }
163   
 
164  0 toggle private void toFile_actionPerformed()
165    {
166    // TODO: JAL-3048 JalviewFileChooser - Save option
167  0 JalviewFileChooser chooser = new JalviewFileChooser(
168    Cache.getProperty("LAST_DIRECTORY"));
169   
170  0 chooser.setFileView(new JalviewFileView());
171  0 chooser.setDialogTitle(exportFeatures
172    ? MessageManager.getString("label.save_features_to_file")
173    : MessageManager.getString("label.save_annotation_to_file"));
174  0 chooser.setToolTipText(MessageManager.getString("action.save"));
175   
176  0 int value = chooser.showSaveDialog(this);
177   
178  0 if (value == JalviewFileChooser.APPROVE_OPTION)
179    {
180  0 String text = getText();
181   
182  0 try
183    {
184  0 PrintWriter out = new PrintWriter(
185    new FileWriter(chooser.getSelectedFile()));
186  0 out.print(text);
187  0 out.close();
188    } catch (Exception ex)
189    {
190  0 ex.printStackTrace();
191    }
192    }
193   
194  0 close_actionPerformed();
195    }
196   
197    /**
198    * Answers the text to output for either Features (in GFF or Jalview format) or
199    * Annotations (in CSV or Jalview format)
200    *
201    * @return
202    */
 
203  0 toggle private String getText()
204    {
205  0 return exportFeatures ? getFeaturesText() : getAnnotationsText();
206    }
207   
208    /**
209    * Returns the text contents for output of annotations in either CSV or Jalview
210    * format
211    *
212    * @return
213    */
 
214  0 toggle private String getAnnotationsText()
215    {
216  0 String text;
217  0 if (CSVFormat.isSelected())
218    {
219  0 text = new AnnotationFile().printCSVAnnotations(annotations);
220    }
221    else
222    {
223  0 if (wholeView)
224    {
225  0 text = new AnnotationFile().printAnnotationsForView(ap.av);
226    }
227    else
228    {
229  0 text = new AnnotationFile().printAnnotations(annotations, null,
230    null);
231    }
232    }
233  0 return text;
234    }
235   
236    /**
237    * Returns the text contents for output of features in either GFF or Jalview
238    * format
239    *
240    * @return
241    */
 
242  0 toggle private String getFeaturesText()
243    {
244  0 String text;
245  0 SequenceI[] sequences = ap.av.getAlignment().getSequencesArray();
246  0 boolean includeNonPositional = ap.av.isShowNPFeats();
247   
248  0 FeaturesFile formatter = new FeaturesFile();
249  0 final FeatureRenderer fr = ap.getFeatureRenderer();
250  0 boolean includeComplement = includeLinkedFeatures.isSelected();
251   
252  0 if (GFFFormat.isSelected())
253    {
254  0 text = formatter.printGffFormat(sequences, fr, includeNonPositional,
255    includeComplement);
256    }
257    else
258    {
259  0 text = formatter.printJalviewFormat(sequences, fr,
260    includeNonPositional, includeComplement);
261    }
262  0 return text;
263    }
264   
 
265  0 toggle private void toTextbox_actionPerformed()
266    {
267  0 CutAndPasteTransfer cap = new CutAndPasteTransfer();
268   
269  0 try
270    {
271  0 String text = getText();
272  0 cap.setText(text);
273  0 Desktop.addInternalFrame(cap, (exportFeatures ? MessageManager
274    .formatMessage("label.features_for_params", new String[]
275    { ap.alignFrame.getTitle() })
276    : MessageManager.formatMessage("label.annotations_for_params",
277    new String[]
278    { ap.alignFrame.getTitle() })),
279    600, 500);
280    } catch (OutOfMemoryError oom)
281    {
282  0 new OOMWarning((exportFeatures ? MessageManager.formatMessage(
283    "label.generating_features_for_params", new String[]
284    { ap.alignFrame.getTitle() })
285    : MessageManager.formatMessage(
286    "label.generating_annotations_for_params",
287    new String[]
288    { ap.alignFrame.getTitle() })),
289    oom);
290  0 cap.dispose();
291    }
292   
293  0 close_actionPerformed();
294    }
295   
 
296  0 toggle private void close_actionPerformed()
297    {
298  0 try
299    {
300  0 frame.setClosed(true);
301    } catch (java.beans.PropertyVetoException ex)
302    {
303    }
304    }
305   
306    /**
307    * Adds widgets to the panel
308    *
309    * @throws Exception
310    */
 
311  0 toggle private void jbInit() throws Exception
312    {
313  0 this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
314  0 this.setBackground(Color.white);
315   
316  0 JPanel formatPanel = buildFormatOptionsPanel();
317  0 JPanel linkedFeatures = buildLinkedFeaturesPanel();
318  0 JPanel actionsPanel = buildActionsPanel();
319   
320  0 this.add(formatPanel);
321  0 this.add(linkedFeatures);
322  0 this.add(actionsPanel);
323    }
324   
325    /**
326    * Builds a panel with a checkbox for the option to export linked (CDS/peptide)
327    * features. This is hidden by default, and only made visible if exporting
328    * features from a split frame panel which is configured to show linked
329    * features.
330    *
331    * @return
332    */
 
333  0 toggle private JPanel buildLinkedFeaturesPanel()
334    {
335  0 linkedFeaturesPanel = new JPanel();
336  0 linkedFeaturesPanel.setOpaque(false);
337   
338  0 boolean nucleotide = ap.av.isNucleotide();
339  0 String complement = nucleotide
340    ? MessageManager.getString("label.protein").toLowerCase()
341    : "CDS";
342  0 JLabel label = new JLabel(
343    MessageManager.formatMessage("label.include_linked_features",
344    complement));
345  0 label.setHorizontalAlignment(SwingConstants.TRAILING);
346  0 String tooltip = MessageManager
347    .formatMessage("label.include_linked_tooltip", complement);
348  0 label.setToolTipText(
349    JvSwingUtils.wrapTooltip(true, tooltip));
350   
351  0 includeLinkedFeatures = new JCheckBox();
352  0 linkedFeaturesPanel.add(label);
353  0 linkedFeaturesPanel.add(includeLinkedFeatures);
354  0 linkedFeaturesPanel.setVisible(false);
355   
356  0 return linkedFeaturesPanel;
357    }
358   
359    /**
360    * Builds the panel with to File or Textbox or Close actions
361    *
362    * @return
363    */
 
364  0 toggle JPanel buildActionsPanel()
365    {
366  0 JPanel actionsPanel = new JPanel();
367  0 actionsPanel.setOpaque(false);
368   
369  0 JButton toFile = new JButton(MessageManager.getString("label.to_file"));
370  0 toFile.addActionListener(new ActionListener()
371    {
 
372  0 toggle @Override
373    public void actionPerformed(ActionEvent e)
374    {
375  0 toFile_actionPerformed();
376    }
377    });
378  0 JButton toTextbox = new JButton(
379    MessageManager.getString("label.to_textbox"));
380  0 toTextbox.addActionListener(new ActionListener()
381    {
 
382  0 toggle @Override
383    public void actionPerformed(ActionEvent e)
384    {
385  0 toTextbox_actionPerformed();
386    }
387    });
388  0 JButton close = new JButton(MessageManager.getString("action.close"));
389  0 close.addActionListener(new ActionListener()
390    {
 
391  0 toggle @Override
392    public void actionPerformed(ActionEvent e)
393    {
394  0 close_actionPerformed();
395    }
396    });
397   
398  0 actionsPanel.add(toFile);
399  0 actionsPanel.add(toTextbox);
400  0 actionsPanel.add(close);
401   
402  0 return actionsPanel;
403    }
404   
405    /**
406    * Builds the panel with options to output in Jalview, GFF or CSV format. GFF is
407    * only made visible when exporting features, CSV only when exporting
408    * annotation.
409    *
410    * @return
411    */
 
412  0 toggle JPanel buildFormatOptionsPanel()
413    {
414  0 JPanel formatPanel = new JPanel();
415    // formatPanel.setBorder(BorderFactory.createEtchedBorder());
416  0 formatPanel.setOpaque(false);
417   
418  0 JRadioButton jalviewFormat = new JRadioButton("Jalview");
419  0 jalviewFormat.setOpaque(false);
420  0 jalviewFormat.setSelected(true);
421  0 GFFFormat.setOpaque(false);
422  0 GFFFormat.setText("GFF");
423  0 CSVFormat.setOpaque(false);
424  0 CSVFormat.setText(MessageManager.getString("label.csv_spreadsheet"));
425   
426  0 ButtonGroup buttonGroup = new ButtonGroup();
427  0 buttonGroup.add(jalviewFormat);
428  0 buttonGroup.add(GFFFormat);
429  0 buttonGroup.add(CSVFormat);
430   
431  0 JLabel format = new JLabel(
432    MessageManager.getString("action.format") + " ");
433  0 format.setHorizontalAlignment(SwingConstants.TRAILING);
434   
435  0 formatPanel.add(format);
436  0 formatPanel.add(jalviewFormat);
437  0 formatPanel.add(GFFFormat);
438  0 formatPanel.add(CSVFormat);
439   
440  0 return formatPanel;
441    }
442    }