X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAnnotationExporter.java;h=894db79cd4e2ea8f88f21ec6c91bad7f2a504f80;hb=0de37d1a047209510bab82225109ae2a47931f79;hp=56c6e2de45b97e9c5443d6df60fa66acb88f9902;hpb=cb5d856b1304448cae13a333cbd9017f81520d90;p=jalview.git diff --git a/src/jalview/gui/AnnotationExporter.java b/src/jalview/gui/AnnotationExporter.java index 56c6e2d..894db79 100644 --- a/src/jalview/gui/AnnotationExporter.java +++ b/src/jalview/gui/AnnotationExporter.java @@ -1,32 +1,52 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1) - * Copyright (C) 2014 The Jalview Authors + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors * * This file is part of Jalview. * * Jalview is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. * * Jalview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with Jalview. If not, see . + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . * The Jalview Authors are detailed in the 'AUTHORS' file. */ package jalview.gui; -import java.util.*; -import java.util.List; - -import java.awt.*; -import java.awt.event.*; -import javax.swing.*; - -import jalview.datamodel.*; -import jalview.io.*; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.FileWriter; +import java.io.PrintWriter; +import java.util.Locale; + +import javax.swing.BoxLayout; +import javax.swing.ButtonGroup; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JInternalFrame; +import javax.swing.JLabel; +import javax.swing.JLayeredPane; +import javax.swing.JPanel; +import javax.swing.JRadioButton; +import javax.swing.SwingConstants; + +import jalview.api.FeatureRenderer; +import jalview.bin.Cache; +import jalview.datamodel.AlignmentAnnotation; +import jalview.datamodel.SequenceI; +import jalview.io.AnnotationFile; +import jalview.io.FeaturesFile; +import jalview.io.JalviewFileChooser; +import jalview.io.JalviewFileView; import jalview.util.MessageManager; /** @@ -39,20 +59,45 @@ import jalview.util.MessageManager; */ public class AnnotationExporter extends JPanel { - JInternalFrame frame; + private JInternalFrame frame; + + private AlignmentPanel ap; + + /* + * true if exporting features, false if exporting annotations + */ + private boolean exportFeatures = true; + + private AlignmentAnnotation[] annotations; - AlignmentPanel ap; + private boolean wholeView; - boolean features = true; + /* + * option to export linked (CDS/peptide) features when shown + * on the alignment, converted to this alignment's coordinates + */ + private JCheckBox includeLinkedFeatures; - AlignmentAnnotation[] annotations; + /* + * output format option shown for feature export + */ + JRadioButton GFFFormat = new JRadioButton(); - List sequenceGroups; + /* + * output format option shown for annotation export + */ + JRadioButton CSVFormat = new JRadioButton(); - Hashtable alignmentProperties; + private JPanel linkedFeaturesPanel; - public AnnotationExporter() + /** + * Constructor + * + * @param panel + */ + public AnnotationExporter(AlignmentPanel panel) { + this.ap = panel; try { jbInit(); @@ -62,82 +107,84 @@ public class AnnotationExporter extends JPanel } frame = new JInternalFrame(); + frame.setFrameIcon(null); frame.setContentPane(this); frame.setLayer(JLayeredPane.PALETTE_LAYER); - Desktop.addInternalFrame(frame, "", frame.getPreferredSize().width, - frame.getPreferredSize().height); + Dimension preferredSize = frame.getPreferredSize(); + Desktop.addInternalFrame(frame, "", true, preferredSize.width, + preferredSize.height, true, true); } - public void exportFeatures(AlignmentPanel ap) + /** + * Configures the dialog for options to export visible features. If from a + * split frame panel showing linked features, make the option to include these + * in the export visible. + */ + public void exportFeatures() { - this.ap = ap; - features = true; + exportFeatures = true; CSVFormat.setVisible(false); - frame.setTitle("Export Features"); + if (ap.av.isShowComplementFeatures()) + { + linkedFeaturesPanel.setVisible(true); + frame.pack(); + } + frame.setTitle(MessageManager.getString("label.export_features")); + } + + /** + * Configures the dialog for options to export all visible annotations + */ + public void exportAnnotations() + { + boolean showAnnotation = ap.av.isShowAnnotation(); + exportAnnotation(showAnnotation ? null + : ap.av.getAlignment().getAlignmentAnnotation(), true); + } + + /** + * Configures the dialog for options to export the given annotation row + * + * @param toExport + */ + public void exportAnnotation(AlignmentAnnotation toExport) + { + exportAnnotation(new AlignmentAnnotation[] { toExport }, false); } - public void exportAnnotations(AlignmentPanel ap, - AlignmentAnnotation[] annotations, List list, - Hashtable alProperties) + private void exportAnnotation(AlignmentAnnotation[] toExport, + boolean forWholeView) { - this.ap = ap; - features = false; + wholeView = forWholeView; + annotations = toExport; + exportFeatures = false; GFFFormat.setVisible(false); CSVFormat.setVisible(true); - this.annotations = annotations; - this.sequenceGroups = list; - this.alignmentProperties = alProperties; - frame.setTitle("Export Annotations"); + frame.setTitle(MessageManager.getString("label.export_annotations")); } - public void toFile_actionPerformed(ActionEvent e) + private void toFile_actionPerformed() { + // TODO: JAL-3048 JalviewFileChooser - Save option JalviewFileChooser chooser = new JalviewFileChooser( - jalview.bin.Cache.getProperty("LAST_DIRECTORY")); + Cache.getProperty("LAST_DIRECTORY")); chooser.setFileView(new JalviewFileView()); - chooser.setDialogTitle(features ? "Save Features to File" - : "Save Annotation to File"); + chooser.setDialogTitle(exportFeatures + ? MessageManager.getString("label.save_features_to_file") + : MessageManager.getString("label.save_annotation_to_file")); chooser.setToolTipText(MessageManager.getString("action.save")); int value = chooser.showSaveDialog(this); if (value == JalviewFileChooser.APPROVE_OPTION) { - String text = "No features found on alignment"; - if (features) - { - if (GFFFormat.isSelected()) - { - text = new FeaturesFile().printGFFFormat(ap.av.getAlignment() - .getDataset().getSequencesArray(), - getDisplayedFeatureCols(), true, ap.av.isShowNpFeats());// ap.av.featuresDisplayed//); - } - else - { - text = new FeaturesFile().printJalviewFormat(ap.av.getAlignment() - .getDataset().getSequencesArray(), - getDisplayedFeatureCols(), true, ap.av.isShowNpFeats()); // ap.av.featuresDisplayed); - } - } - else - { - if (CSVFormat.isSelected()) - { - text = new AnnotationFile().printCSVAnnotations(annotations); - } - else - { - text = new AnnotationFile().printAnnotations(annotations, - sequenceGroups, alignmentProperties); - } - } + String text = getText(); try { - java.io.PrintWriter out = new java.io.PrintWriter( - new java.io.FileWriter(chooser.getSelectedFile())); - + PrintWriter out = new PrintWriter( + new FileWriter(chooser.getSelectedFile())); out.print(text); out.close(); } catch (Exception ex) @@ -146,77 +193,109 @@ public class AnnotationExporter extends JPanel } } - close_actionPerformed(null); + close_actionPerformed(); } - public void toTextbox_actionPerformed(ActionEvent e) + /** + * Answers the text to output for either Features (in GFF or Jalview format) + * or Annotations (in CSV or Jalview format) + * + * @return + */ + private String getText() { - String text = "No features found on alignment"; - if (features) + return exportFeatures ? getFeaturesText() : getAnnotationsText(); + } + + /** + * Returns the text contents for output of annotations in either CSV or + * Jalview format + * + * @return + */ + private String getAnnotationsText() + { + String text; + if (CSVFormat.isSelected()) { - if (GFFFormat.isSelected()) - { - text = new FeaturesFile().printGFFFormat(ap.av.getAlignment() - .getDataset().getSequencesArray(), - getDisplayedFeatureCols(), true, ap.av.isShowNpFeats()); - } - else - { - text = new FeaturesFile().printJalviewFormat(ap.av.getAlignment() - .getDataset().getSequencesArray(), - getDisplayedFeatureCols(), true, ap.av.isShowNpFeats()); - } + text = new AnnotationFile().printCSVAnnotations(annotations); } - else if (!features) + else { - if (CSVFormat.isSelected()) + if (wholeView) { - text = new AnnotationFile().printCSVAnnotations(annotations); + text = new AnnotationFile().printAnnotationsForView(ap.av); } else { - text = new AnnotationFile().printAnnotations(annotations, - sequenceGroups, alignmentProperties); + text = new AnnotationFile().printAnnotations(annotations, null, + null); } } + return text; + } - CutAndPasteTransfer cap = new CutAndPasteTransfer(); - try + /** + * Returns the text contents for output of features in either GFF or Jalview + * format + * + * @return + */ + private String getFeaturesText() + { + String text; + SequenceI[] sequences = ap.av.getAlignment().getSequencesArray(); + boolean includeNonPositional = ap.av.isShowNPFeats(); + + FeaturesFile formatter = new FeaturesFile(); + final FeatureRenderer fr = ap.getFeatureRenderer(); + boolean includeComplement = includeLinkedFeatures.isSelected(); + + if (GFFFormat.isSelected()) { - cap.setText(text); - Desktop.addInternalFrame(cap, (features ? MessageManager.formatMessage("label.features_for_params", new String[]{ap.alignFrame.getTitle()}) - : MessageManager.formatMessage("label.annotations_for_params", new String[]{ap.alignFrame.getTitle()})), 600, 500); - } catch (OutOfMemoryError oom) + text = formatter.printGffFormat(sequences, fr, includeNonPositional, + includeComplement); + } + else { - new OOMWarning((features ? MessageManager.formatMessage("label.generating_features_for_params", new String[]{ap.alignFrame.getTitle()}) : MessageManager.formatMessage("label.generating_annotations_for_params", new String[]{ap.alignFrame.getTitle()})) - , oom); - cap.dispose(); + text = formatter.printJalviewFormat(sequences, fr, + includeNonPositional, includeComplement); } - - close_actionPerformed(null); + return text; } - private Hashtable getDisplayedFeatureCols() + private void toTextbox_actionPerformed() { - Hashtable fcols = new Hashtable(); - if (ap.av.featuresDisplayed == null) + CutAndPasteTransfer cap = new CutAndPasteTransfer(); + + try { - return fcols; - } - Enumeration en = ap.av.featuresDisplayed.keys(); - FeatureRenderer fr = ap.seqPanel.seqCanvas.getFeatureRenderer(); // consider - // higher - // level - // method ? - while (en.hasMoreElements()) + String text = getText(); + cap.setText(text); + Desktop.addInternalFrame(cap, (exportFeatures ? MessageManager + .formatMessage("label.features_for_params", new String[] + { ap.alignFrame.getTitle() }) + : MessageManager.formatMessage("label.annotations_for_params", + new String[] + { ap.alignFrame.getTitle() })), + 600, 500); + } catch (OutOfMemoryError oom) { - Object col = en.nextElement(); - fcols.put(col, fr.featureColours.get(col)); + new OOMWarning((exportFeatures ? MessageManager.formatMessage( + "label.generating_features_for_params", new String[] + { ap.alignFrame.getTitle() }) + : MessageManager.formatMessage( + "label.generating_annotations_for_params", + new String[] + { ap.alignFrame.getTitle() })), + oom); + cap.dispose(); } - return fcols; + + close_actionPerformed(); } - public void close_actionPerformed(ActionEvent e) + private void close_actionPerformed() { try { @@ -226,81 +305,137 @@ public class AnnotationExporter extends JPanel } } + /** + * Adds widgets to the panel + * + * @throws Exception + */ private void jbInit() throws Exception { - this.setLayout(new BorderLayout()); + this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + this.setBackground(Color.white); + + JPanel formatPanel = buildFormatOptionsPanel(); + JPanel linkedFeatures = buildLinkedFeaturesPanel(); + JPanel actionsPanel = buildActionsPanel(); + + this.add(formatPanel); + this.add(linkedFeatures); + this.add(actionsPanel); + } + + /** + * Builds a panel with a checkbox for the option to export linked + * (CDS/peptide) features. This is hidden by default, and only made visible if + * exporting features from a split frame panel which is configured to show + * linked features. + * + * @return + */ + private JPanel buildLinkedFeaturesPanel() + { + linkedFeaturesPanel = new JPanel(); + linkedFeaturesPanel.setOpaque(false); + + boolean nucleotide = ap.av.isNucleotide(); + String complement = nucleotide ? MessageManager + .getString("label.protein").toLowerCase(Locale.ROOT) : "CDS"; + JLabel label = new JLabel(MessageManager + .formatMessage("label.include_linked_features", complement)); + label.setHorizontalAlignment(SwingConstants.TRAILING); + String tooltip = MessageManager + .formatMessage("label.include_linked_tooltip", complement); + label.setToolTipText(JvSwingUtils.wrapTooltip(true, tooltip)); + + includeLinkedFeatures = new JCheckBox(); + linkedFeaturesPanel.add(label); + linkedFeaturesPanel.add(includeLinkedFeatures); + linkedFeaturesPanel.setVisible(false); + + return linkedFeaturesPanel; + } + + /** + * Builds the panel with to File or Textbox or Close actions + * + * @return + */ + JPanel buildActionsPanel() + { + JPanel actionsPanel = new JPanel(); + actionsPanel.setOpaque(false); - toFile.setText(MessageManager.getString("label.to_file")); + JButton toFile = new JButton(MessageManager.getString("label.to_file")); toFile.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { - toFile_actionPerformed(e); + toFile_actionPerformed(); } }); - toTextbox.setText(MessageManager.getString("label.to_textbox")); + JButton toTextbox = new JButton( + MessageManager.getString("label.to_textbox")); toTextbox.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { - toTextbox_actionPerformed(e); + toTextbox_actionPerformed(); } }); - close.setText(MessageManager.getString("action.close")); + JButton close = new JButton(MessageManager.getString("action.close")); close.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { - close_actionPerformed(e); + close_actionPerformed(); } }); + + actionsPanel.add(toFile); + actionsPanel.add(toTextbox); + actionsPanel.add(close); + + return actionsPanel; + } + + /** + * Builds the panel with options to output in Jalview, GFF or CSV format. GFF + * is only made visible when exporting features, CSV only when exporting + * annotation. + * + * @return + */ + JPanel buildFormatOptionsPanel() + { + JPanel formatPanel = new JPanel(); + // formatPanel.setBorder(BorderFactory.createEtchedBorder()); + formatPanel.setOpaque(false); + + JRadioButton jalviewFormat = new JRadioButton("Jalview"); jalviewFormat.setOpaque(false); jalviewFormat.setSelected(true); - jalviewFormat.setText("Jalview"); GFFFormat.setOpaque(false); GFFFormat.setText("GFF"); CSVFormat.setOpaque(false); CSVFormat.setText(MessageManager.getString("label.csv_spreadsheet")); - jLabel1.setHorizontalAlignment(SwingConstants.TRAILING); - jLabel1.setText(MessageManager.getString("action.format") + " "); - this.setBackground(Color.white); - jPanel3.setBorder(BorderFactory.createEtchedBorder()); - jPanel3.setOpaque(false); - jPanel1.setOpaque(false); - jPanel1.add(toFile); - jPanel1.add(toTextbox); - jPanel1.add(close); - jPanel3.add(jLabel1); - jPanel3.add(jalviewFormat); - jPanel3.add(GFFFormat); - jPanel3.add(CSVFormat); + + ButtonGroup buttonGroup = new ButtonGroup(); buttonGroup.add(jalviewFormat); buttonGroup.add(GFFFormat); buttonGroup.add(CSVFormat); - this.add(jPanel3, BorderLayout.CENTER); - this.add(jPanel1, BorderLayout.SOUTH); - } - - JPanel jPanel1 = new JPanel(); - - JButton toFile = new JButton(); - - JButton toTextbox = new JButton(); - JButton close = new JButton(); + JLabel format = new JLabel( + MessageManager.getString("action.format") + " "); + format.setHorizontalAlignment(SwingConstants.TRAILING); - ButtonGroup buttonGroup = new ButtonGroup(); - - JRadioButton jalviewFormat = new JRadioButton(); - - JRadioButton GFFFormat = new JRadioButton(); - - JRadioButton CSVFormat = new JRadioButton(); - - JLabel jLabel1 = new JLabel(); - - JPanel jPanel3 = new JPanel(); - - FlowLayout flowLayout1 = new FlowLayout(); + formatPanel.add(format); + formatPanel.add(jalviewFormat); + formatPanel.add(GFFFormat); + formatPanel.add(CSVFormat); + return formatPanel; + } }