JAL-3438 spotless for 2.11.2.0
[jalview.git] / src / jalview / gui / AnnotationExporter.java
old mode 100755 (executable)
new mode 100644 (file)
index 8248647..1efd100
-/*\r
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6)\r
- * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle\r
- * \r
- * This file is part of Jalview.\r
- * \r
- * Jalview is free software: you can redistribute it and/or\r
- * modify it under the terms of the GNU General Public License \r
- * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\r
- * \r
- * Jalview is distributed in the hope that it will be useful, but \r
- * WITHOUT ANY WARRANTY; without even the implied warranty \r
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR \r
- * PURPOSE.  See the GNU General Public License for more details.\r
- * \r
- * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.\r
- */\r
-package jalview.gui;\r
-\r
-import java.util.*;\r
-\r
-import java.awt.*;\r
-import java.awt.event.*;\r
-import javax.swing.*;\r
-\r
-import jalview.datamodel.*;\r
-import jalview.io.*;\r
-\r
-/**\r
- * \r
- * GUI dialog for exporting features or alignment annotations depending upon\r
- * which method is called.\r
- * \r
- * @author AMW\r
- * \r
- */\r
-public class AnnotationExporter extends JPanel\r
-{\r
-  JInternalFrame frame;\r
-\r
-  AlignmentPanel ap;\r
-\r
-  boolean features = true;\r
-\r
-  AlignmentAnnotation[] annotations;\r
-\r
-  Vector sequenceGroups;\r
-\r
-  Hashtable alignmentProperties;\r
-\r
-  public AnnotationExporter()\r
-  {\r
-    try\r
-    {\r
-      jbInit();\r
-    } catch (Exception ex)\r
-    {\r
-      ex.printStackTrace();\r
-    }\r
-\r
-    frame = new JInternalFrame();\r
-    frame.setContentPane(this);\r
-    frame.setLayer(JLayeredPane.PALETTE_LAYER);\r
-    Desktop.addInternalFrame(frame, "", frame.getPreferredSize().width, frame.getPreferredSize().height);\r
-  }\r
-\r
-  public void exportFeatures(AlignmentPanel ap)\r
-  {\r
-    this.ap = ap;\r
-    features = true;\r
-    CSVFormat.setVisible(false);\r
-    frame.setTitle("Export Features");\r
-  }\r
-\r
-  public void exportAnnotations(AlignmentPanel ap,\r
-          AlignmentAnnotation[] annotations, Vector sequenceGroups,\r
-          Hashtable alProperties)\r
-  {\r
-    this.ap = ap;\r
-    features = false;\r
-    GFFFormat.setVisible(false);\r
-    CSVFormat.setVisible(true);\r
-    this.annotations = annotations;\r
-    this.sequenceGroups = sequenceGroups;\r
-    this.alignmentProperties = alProperties;\r
-    frame.setTitle("Export Annotations");\r
-  }\r
-\r
-  public void toFile_actionPerformed(ActionEvent e)\r
-  {\r
-    JalviewFileChooser chooser = new JalviewFileChooser(\r
-            jalview.bin.Cache.getProperty("LAST_DIRECTORY"));\r
-\r
-    chooser.setFileView(new JalviewFileView());\r
-    chooser.setDialogTitle(features ? "Save Features to File"\r
-            : "Save Annotation to File");\r
-    chooser.setToolTipText("Save");\r
-\r
-    int value = chooser.showSaveDialog(this);\r
-\r
-    if (value == JalviewFileChooser.APPROVE_OPTION)\r
-    {\r
-      String text = "No features found on alignment";\r
-      if (features)\r
-      {\r
-        if (GFFFormat.isSelected())\r
-        {\r
-          text = new FeaturesFile().printGFFFormat(ap.av.alignment\r
-                  .getDataset().getSequencesArray(),\r
-                  getDisplayedFeatureCols(), true, ap.av.isShowNpFeats());// ap.av.featuresDisplayed//);\r
-        }\r
-        else\r
-        {\r
-          text = new FeaturesFile().printJalviewFormat(ap.av.alignment\r
-                  .getDataset().getSequencesArray(),\r
-                  getDisplayedFeatureCols(), true, ap.av.isShowNpFeats()); // ap.av.featuresDisplayed);\r
-        }\r
-      }\r
-      else\r
-      {\r
-        if (CSVFormat.isSelected())\r
-        {\r
-          text = new AnnotationFile().printCSVAnnotations(annotations);\r
-        }\r
-        else\r
-        {\r
-          text = new AnnotationFile().printAnnotations(annotations,\r
-                  sequenceGroups, alignmentProperties);\r
-        }\r
-      }\r
-\r
-      try\r
-      {\r
-        java.io.PrintWriter out = new java.io.PrintWriter(\r
-                new java.io.FileWriter(chooser.getSelectedFile()));\r
-\r
-        out.print(text);\r
-        out.close();\r
-      } catch (Exception ex)\r
-      {\r
-        ex.printStackTrace();\r
-      }\r
-    }\r
-\r
-    close_actionPerformed(null);\r
-  }\r
-\r
-  public void toTextbox_actionPerformed(ActionEvent e)\r
-  {\r
-    String text = "No features found on alignment";\r
-    if (features)\r
-    {\r
-      if (GFFFormat.isSelected())\r
-      {\r
-        text = new FeaturesFile().printGFFFormat(ap.av.alignment\r
-                .getDataset().getSequencesArray(),\r
-                getDisplayedFeatureCols(), true, ap.av.isShowNpFeats());\r
-      }\r
-      else\r
-      {\r
-        text = new FeaturesFile().printJalviewFormat(ap.av.alignment\r
-                .getDataset().getSequencesArray(),\r
-                getDisplayedFeatureCols(), true, ap.av.isShowNpFeats());\r
-      }\r
-    }\r
-    else if (!features)\r
-    {\r
-      if (CSVFormat.isSelected())\r
-      {\r
-        text = new AnnotationFile().printCSVAnnotations(annotations);\r
-      }\r
-      else\r
-      {\r
-        text = new AnnotationFile().printAnnotations(annotations,\r
-                sequenceGroups, alignmentProperties);\r
-      }\r
-    }\r
-\r
-    CutAndPasteTransfer cap = new CutAndPasteTransfer();\r
-    try\r
-    {\r
-      cap.setText(text);\r
-      Desktop.addInternalFrame(cap, (features ? "Features for - "\r
-              : "Annotations for - ") + ap.alignFrame.getTitle(), 600, 500);\r
-    } catch (OutOfMemoryError oom)\r
-    {\r
-      new OOMWarning("generating "\r
-              + (features ? "Features for - " : "Annotations for - ")\r
-              + ap.alignFrame.getTitle(), oom);\r
-      cap.dispose();\r
-    }\r
-\r
-    close_actionPerformed(null);\r
-  }\r
-\r
-  private Hashtable getDisplayedFeatureCols()\r
-  {\r
-    Hashtable fcols = new Hashtable();\r
-    if (ap.av.featuresDisplayed == null)\r
-    {\r
-      return fcols;\r
-    }\r
-    Enumeration en = ap.av.featuresDisplayed.keys();\r
-    FeatureRenderer fr = ap.seqPanel.seqCanvas.getFeatureRenderer(); // consider\r
-                                                                     // higher\r
-                                                                     // level\r
-                                                                     // method ?\r
-    while (en.hasMoreElements())\r
-    {\r
-      Object col = en.nextElement();\r
-      fcols.put(col, fr.featureColours.get(col));\r
-    }\r
-    return fcols;\r
-  }\r
-\r
-  public void close_actionPerformed(ActionEvent e)\r
-  {\r
-    try\r
-    {\r
-      frame.setClosed(true);\r
-    } catch (java.beans.PropertyVetoException ex)\r
-    {\r
-    }\r
-  }\r
-\r
-  private void jbInit() throws Exception\r
-  {\r
-    this.setLayout(new BorderLayout());\r
-    \r
-    toFile.setText("to File");\r
-    toFile.addActionListener(new ActionListener()\r
-    {\r
-      public void actionPerformed(ActionEvent e)\r
-      {\r
-        toFile_actionPerformed(e);\r
-      }\r
-    });\r
-    toTextbox.setText("to Textbox");\r
-    toTextbox.addActionListener(new ActionListener()\r
-    {\r
-      public void actionPerformed(ActionEvent e)\r
-      {\r
-        toTextbox_actionPerformed(e);\r
-      }\r
-    });\r
-    close.setText("Close");\r
-    close.addActionListener(new ActionListener()\r
-    {\r
-      public void actionPerformed(ActionEvent e)\r
-      {\r
-        close_actionPerformed(e);\r
-      }\r
-    });\r
-    jalviewFormat.setOpaque(false);\r
-    jalviewFormat.setSelected(true);\r
-    jalviewFormat.setText("Jalview");\r
-    GFFFormat.setOpaque(false);\r
-    GFFFormat.setText("GFF");\r
-    CSVFormat.setOpaque(false);\r
-    CSVFormat.setText("CSV(Spreadsheet)");\r
-    jLabel1.setHorizontalAlignment(SwingConstants.TRAILING);\r
-    jLabel1.setText("Format: ");\r
-    this.setBackground(Color.white);\r
-    jPanel3.setBorder(BorderFactory.createEtchedBorder());\r
-    jPanel3.setOpaque(false);\r
-    jPanel1.setOpaque(false);\r
-    jPanel1.add(toFile);\r
-    jPanel1.add(toTextbox);\r
-    jPanel1.add(close);\r
-    jPanel3.add(jLabel1);\r
-    jPanel3.add(jalviewFormat);\r
-    jPanel3.add(GFFFormat);\r
-    jPanel3.add(CSVFormat);\r
-    buttonGroup.add(jalviewFormat);\r
-    buttonGroup.add(GFFFormat);\r
-    buttonGroup.add(CSVFormat);\r
-    this.add(jPanel3, BorderLayout.CENTER);\r
-    this.add(jPanel1, BorderLayout.SOUTH);\r
-  }\r
-\r
-  JPanel jPanel1 = new JPanel();\r
-\r
-  JButton toFile = new JButton();\r
-\r
-  JButton toTextbox = new JButton();\r
-\r
-  JButton close = new JButton();\r
-\r
-  ButtonGroup buttonGroup = new ButtonGroup();\r
-\r
-  JRadioButton jalviewFormat = new JRadioButton();\r
-\r
-  JRadioButton GFFFormat = new JRadioButton();\r
-\r
-  JRadioButton CSVFormat = new JRadioButton();\r
-\r
-  JLabel jLabel1 = new JLabel();\r
-\r
-  JPanel jPanel3 = new JPanel();\r
-\r
-  FlowLayout flowLayout1 = new FlowLayout();\r
-\r
-}\r
+/*
+ * 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.
+ *  
+ * 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 <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+package jalview.gui;
+
+import java.util.Locale;
+
+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;
+
+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 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;
+
+/**
+ * 
+ * GUI dialog for exporting features or alignment annotations depending upon
+ * which method is called.
+ * 
+ * @author AMW
+ * 
+ */
+public class AnnotationExporter extends JPanel
+{
+  private JInternalFrame frame;
+
+  private AlignmentPanel ap;
+
+  /*
+   * true if exporting features, false if exporting annotations
+   */
+  private boolean exportFeatures = true;
+
+  private AlignmentAnnotation[] annotations;
+
+  private boolean wholeView;
+
+  /*
+   * option to export linked (CDS/peptide) features when shown 
+   * on the alignment, converted to this alignment's coordinates
+   */
+  private JCheckBox includeLinkedFeatures;
+
+  /*
+   * output format option shown for feature export
+   */
+  JRadioButton GFFFormat = new JRadioButton();
+
+  /*
+   * output format option shown for annotation export
+   */
+  JRadioButton CSVFormat = new JRadioButton();
+
+  private JPanel linkedFeaturesPanel;
+
+  /**
+   * Constructor
+   * 
+   * @param panel
+   */
+  public AnnotationExporter(AlignmentPanel panel)
+  {
+    this.ap = panel;
+    try
+    {
+      jbInit();
+    } catch (Exception ex)
+    {
+      ex.printStackTrace();
+    }
+
+    frame = new JInternalFrame();
+    frame.setContentPane(this);
+    frame.setLayer(JLayeredPane.PALETTE_LAYER);
+    Dimension preferredSize = frame.getPreferredSize();
+    Desktop.addInternalFrame(frame, "", true, preferredSize.width,
+            preferredSize.height, true, true);
+  }
+
+  /**
+   * 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()
+  {
+    exportFeatures = true;
+    CSVFormat.setVisible(false);
+    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);
+  }
+
+  private void exportAnnotation(AlignmentAnnotation[] toExport,
+          boolean forWholeView)
+  {
+    wholeView = forWholeView;
+    annotations = toExport;
+    exportFeatures = false;
+    GFFFormat.setVisible(false);
+    CSVFormat.setVisible(true);
+    frame.setTitle(MessageManager.getString("label.export_annotations"));
+  }
+
+  private void toFile_actionPerformed()
+  {
+    // TODO: JAL-3048 JalviewFileChooser - Save option
+    JalviewFileChooser chooser = new JalviewFileChooser(
+            Cache.getProperty("LAST_DIRECTORY"));
+
+    chooser.setFileView(new JalviewFileView());
+    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 = getText();
+
+      try
+      {
+        PrintWriter out = new PrintWriter(
+                new FileWriter(chooser.getSelectedFile()));
+        out.print(text);
+        out.close();
+      } catch (Exception ex)
+      {
+        ex.printStackTrace();
+      }
+    }
+
+    close_actionPerformed();
+  }
+
+  /**
+   * Answers the text to output for either Features (in GFF or Jalview format)
+   * or Annotations (in CSV or Jalview format)
+   * 
+   * @return
+   */
+  private String getText()
+  {
+    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())
+    {
+      text = new AnnotationFile().printCSVAnnotations(annotations);
+    }
+    else
+    {
+      if (wholeView)
+      {
+        text = new AnnotationFile().printAnnotationsForView(ap.av);
+      }
+      else
+      {
+        text = new AnnotationFile().printAnnotations(annotations, null,
+                null);
+      }
+    }
+    return text;
+  }
+
+  /**
+   * 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())
+    {
+      text = formatter.printGffFormat(sequences, fr, includeNonPositional,
+              includeComplement);
+    }
+    else
+    {
+      text = formatter.printJalviewFormat(sequences, fr,
+              includeNonPositional, includeComplement);
+    }
+    return text;
+  }
+
+  private void toTextbox_actionPerformed()
+  {
+    CutAndPasteTransfer cap = new CutAndPasteTransfer();
+
+    try
+    {
+      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)
+    {
+      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();
+    }
+
+    close_actionPerformed();
+  }
+
+  private void close_actionPerformed()
+  {
+    try
+    {
+      frame.setClosed(true);
+    } catch (java.beans.PropertyVetoException ex)
+    {
+    }
+  }
+
+  /**
+   * Adds widgets to the panel
+   * 
+   * @throws Exception
+   */
+  private void jbInit() throws Exception
+  {
+    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);
+
+    JButton toFile = new JButton(MessageManager.getString("label.to_file"));
+    toFile.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        toFile_actionPerformed();
+      }
+    });
+    JButton toTextbox = new JButton(
+            MessageManager.getString("label.to_textbox"));
+    toTextbox.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        toTextbox_actionPerformed();
+      }
+    });
+    JButton close = new JButton(MessageManager.getString("action.close"));
+    close.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent 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);
+    GFFFormat.setOpaque(false);
+    GFFFormat.setText("GFF");
+    CSVFormat.setOpaque(false);
+    CSVFormat.setText(MessageManager.getString("label.csv_spreadsheet"));
+
+    ButtonGroup buttonGroup = new ButtonGroup();
+    buttonGroup.add(jalviewFormat);
+    buttonGroup.add(GFFFormat);
+    buttonGroup.add(CSVFormat);
+
+    JLabel format = new JLabel(
+            MessageManager.getString("action.format") + " ");
+    format.setHorizontalAlignment(SwingConstants.TRAILING);
+
+    formatPanel.add(format);
+    formatPanel.add(jalviewFormat);
+    formatPanel.add(GFFFormat);
+    formatPanel.add(CSVFormat);
+
+    return formatPanel;
+  }
+}