2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ 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.
23 import java.util.Locale;
25 import jalview.api.FeatureRenderer;
26 import jalview.bin.Cache;
27 import jalview.datamodel.AlignmentAnnotation;
28 import jalview.datamodel.SequenceI;
29 import jalview.io.AnnotationFile;
30 import jalview.io.FeaturesFile;
31 import jalview.io.JalviewFileChooser;
32 import jalview.io.JalviewFileView;
33 import jalview.util.MessageManager;
35 import java.awt.Color;
36 import java.awt.Dimension;
37 import java.awt.event.ActionEvent;
38 import java.awt.event.ActionListener;
39 import java.io.FileWriter;
40 import java.io.PrintWriter;
42 import javax.swing.BoxLayout;
43 import javax.swing.ButtonGroup;
44 import javax.swing.JButton;
45 import javax.swing.JCheckBox;
46 import javax.swing.JInternalFrame;
47 import javax.swing.JLabel;
48 import javax.swing.JLayeredPane;
49 import javax.swing.JPanel;
50 import javax.swing.JRadioButton;
51 import javax.swing.SwingConstants;
55 * GUI dialog for exporting features or alignment annotations depending upon
56 * which method is called.
61 public class AnnotationExporter extends JPanel
63 private JInternalFrame frame;
65 private AlignmentPanel ap;
68 * true if exporting features, false if exporting annotations
70 private boolean exportFeatures = true;
72 private AlignmentAnnotation[] annotations;
74 private boolean wholeView;
77 * option to export linked (CDS/peptide) features when shown
78 * on the alignment, converted to this alignment's coordinates
80 private JCheckBox includeLinkedFeatures;
83 * output format option shown for feature export
85 JRadioButton GFFFormat = new JRadioButton();
88 * output format option shown for annotation export
90 JRadioButton CSVFormat = new JRadioButton();
92 private JPanel linkedFeaturesPanel;
99 public AnnotationExporter(AlignmentPanel panel)
105 } catch (Exception ex)
107 ex.printStackTrace();
110 frame = new JInternalFrame();
111 frame.setContentPane(this);
112 frame.setLayer(JLayeredPane.PALETTE_LAYER);
113 Dimension preferredSize = frame.getPreferredSize();
114 Desktop.addInternalFrame(frame, "", true, preferredSize.width,
115 preferredSize.height, true, true);
119 * Configures the dialog for options to export visible features. If from a split
120 * frame panel showing linked features, make the option to include these in the
123 public void exportFeatures()
125 exportFeatures = true;
126 CSVFormat.setVisible(false);
127 if (ap.av.isShowComplementFeatures())
129 linkedFeaturesPanel.setVisible(true);
132 frame.setTitle(MessageManager.getString("label.export_features"));
136 * Configures the dialog for options to export all visible annotations
138 public void exportAnnotations()
140 boolean showAnnotation = ap.av.isShowAnnotation();
141 exportAnnotation(showAnnotation ? null
142 : ap.av.getAlignment().getAlignmentAnnotation(), true);
146 * Configures the dialog for options to export the given annotation row
150 public void exportAnnotation(AlignmentAnnotation toExport)
152 exportAnnotation(new AlignmentAnnotation[] { toExport }, false);
155 private void exportAnnotation(AlignmentAnnotation[] toExport,
156 boolean forWholeView)
158 wholeView = forWholeView;
159 annotations = toExport;
160 exportFeatures = false;
161 GFFFormat.setVisible(false);
162 CSVFormat.setVisible(true);
163 frame.setTitle(MessageManager.getString("label.export_annotations"));
166 private void toFile_actionPerformed()
168 // TODO: JAL-3048 JalviewFileChooser - Save option
169 JalviewFileChooser chooser = new JalviewFileChooser(
170 Cache.getProperty("LAST_DIRECTORY"));
172 chooser.setFileView(new JalviewFileView());
173 chooser.setDialogTitle(exportFeatures
174 ? MessageManager.getString("label.save_features_to_file")
175 : MessageManager.getString("label.save_annotation_to_file"));
176 chooser.setToolTipText(MessageManager.getString("action.save"));
178 int value = chooser.showSaveDialog(this);
180 if (value == JalviewFileChooser.APPROVE_OPTION)
182 String text = getText();
186 PrintWriter out = new PrintWriter(
187 new FileWriter(chooser.getSelectedFile()));
190 } catch (Exception ex)
192 ex.printStackTrace();
196 close_actionPerformed();
200 * Answers the text to output for either Features (in GFF or Jalview format) or
201 * Annotations (in CSV or Jalview format)
205 private String getText()
207 return exportFeatures ? getFeaturesText() : getAnnotationsText();
211 * Returns the text contents for output of annotations in either CSV or Jalview
216 private String getAnnotationsText()
219 if (CSVFormat.isSelected())
221 text = new AnnotationFile().printCSVAnnotations(annotations);
227 text = new AnnotationFile().printAnnotationsForView(ap.av);
231 text = new AnnotationFile().printAnnotations(annotations, null,
239 * Returns the text contents for output of features in either GFF or Jalview
244 private String getFeaturesText()
247 SequenceI[] sequences = ap.av.getAlignment().getSequencesArray();
248 boolean includeNonPositional = ap.av.isShowNPFeats();
250 FeaturesFile formatter = new FeaturesFile();
251 final FeatureRenderer fr = ap.getFeatureRenderer();
252 boolean includeComplement = includeLinkedFeatures.isSelected();
254 if (GFFFormat.isSelected())
256 text = formatter.printGffFormat(sequences, fr, includeNonPositional,
261 text = formatter.printJalviewFormat(sequences, fr,
262 includeNonPositional, includeComplement);
267 private void toTextbox_actionPerformed()
269 CutAndPasteTransfer cap = new CutAndPasteTransfer();
273 String text = getText();
275 Desktop.addInternalFrame(cap, (exportFeatures ? MessageManager
276 .formatMessage("label.features_for_params", new String[]
277 { ap.alignFrame.getTitle() })
278 : MessageManager.formatMessage("label.annotations_for_params",
280 { ap.alignFrame.getTitle() })),
282 } catch (OutOfMemoryError oom)
284 new OOMWarning((exportFeatures ? MessageManager.formatMessage(
285 "label.generating_features_for_params", new String[]
286 { ap.alignFrame.getTitle() })
287 : MessageManager.formatMessage(
288 "label.generating_annotations_for_params",
290 { ap.alignFrame.getTitle() })),
295 close_actionPerformed();
298 private void close_actionPerformed()
302 frame.setClosed(true);
303 } catch (java.beans.PropertyVetoException ex)
309 * Adds widgets to the panel
313 private void jbInit() throws Exception
315 this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
316 this.setBackground(Color.white);
318 JPanel formatPanel = buildFormatOptionsPanel();
319 JPanel linkedFeatures = buildLinkedFeaturesPanel();
320 JPanel actionsPanel = buildActionsPanel();
322 this.add(formatPanel);
323 this.add(linkedFeatures);
324 this.add(actionsPanel);
328 * Builds a panel with a checkbox for the option to export linked (CDS/peptide)
329 * features. This is hidden by default, and only made visible if exporting
330 * features from a split frame panel which is configured to show linked
335 private JPanel buildLinkedFeaturesPanel()
337 linkedFeaturesPanel = new JPanel();
338 linkedFeaturesPanel.setOpaque(false);
340 boolean nucleotide = ap.av.isNucleotide();
341 String complement = nucleotide
342 ? MessageManager.getString("label.protein").toLowerCase(Locale.ROOT)
344 JLabel label = new JLabel(
345 MessageManager.formatMessage("label.include_linked_features",
347 label.setHorizontalAlignment(SwingConstants.TRAILING);
348 String tooltip = MessageManager
349 .formatMessage("label.include_linked_tooltip", complement);
350 label.setToolTipText(
351 JvSwingUtils.wrapTooltip(true, tooltip));
353 includeLinkedFeatures = new JCheckBox();
354 linkedFeaturesPanel.add(label);
355 linkedFeaturesPanel.add(includeLinkedFeatures);
356 linkedFeaturesPanel.setVisible(false);
358 return linkedFeaturesPanel;
362 * Builds the panel with to File or Textbox or Close actions
366 JPanel buildActionsPanel()
368 JPanel actionsPanel = new JPanel();
369 actionsPanel.setOpaque(false);
371 JButton toFile = new JButton(MessageManager.getString("label.to_file"));
372 toFile.addActionListener(new ActionListener()
375 public void actionPerformed(ActionEvent e)
377 toFile_actionPerformed();
380 JButton toTextbox = new JButton(
381 MessageManager.getString("label.to_textbox"));
382 toTextbox.addActionListener(new ActionListener()
385 public void actionPerformed(ActionEvent e)
387 toTextbox_actionPerformed();
390 JButton close = new JButton(MessageManager.getString("action.close"));
391 close.addActionListener(new ActionListener()
394 public void actionPerformed(ActionEvent e)
396 close_actionPerformed();
400 actionsPanel.add(toFile);
401 actionsPanel.add(toTextbox);
402 actionsPanel.add(close);
408 * Builds the panel with options to output in Jalview, GFF or CSV format. GFF is
409 * only made visible when exporting features, CSV only when exporting
414 JPanel buildFormatOptionsPanel()
416 JPanel formatPanel = new JPanel();
417 // formatPanel.setBorder(BorderFactory.createEtchedBorder());
418 formatPanel.setOpaque(false);
420 JRadioButton jalviewFormat = new JRadioButton("Jalview");
421 jalviewFormat.setOpaque(false);
422 jalviewFormat.setSelected(true);
423 GFFFormat.setOpaque(false);
424 GFFFormat.setText("GFF");
425 CSVFormat.setOpaque(false);
426 CSVFormat.setText(MessageManager.getString("label.csv_spreadsheet"));
428 ButtonGroup buttonGroup = new ButtonGroup();
429 buttonGroup.add(jalviewFormat);
430 buttonGroup.add(GFFFormat);
431 buttonGroup.add(CSVFormat);
433 JLabel format = new JLabel(
434 MessageManager.getString("action.format") + " ");
435 format.setHorizontalAlignment(SwingConstants.TRAILING);
437 formatPanel.add(format);
438 formatPanel.add(jalviewFormat);
439 formatPanel.add(GFFFormat);
440 formatPanel.add(CSVFormat);