JAL-1780 more support for export setting for flatfile output
[jalview.git] / src / jalview / gui / AlignViewport.java
index 5e477c7..a6f7d41 100644 (file)
@@ -44,6 +44,7 @@ import java.awt.Font;
 import java.awt.Rectangle;
 import java.util.ArrayList;
 import java.util.Hashtable;
+import java.util.List;
 import java.util.Set;
 import java.util.Vector;
 
@@ -53,7 +54,9 @@ import javax.swing.JOptionPane;
 import jalview.analysis.AlignmentUtils;
 import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder;
 import jalview.analysis.NJTree;
+import jalview.api.AlignExportSettingI;
 import jalview.api.AlignViewportI;
+import jalview.api.FeatureRenderer;
 import jalview.api.ViewStyleI;
 import jalview.bin.Cache;
 import jalview.commands.CommandI;
@@ -83,7 +86,7 @@ import jalview.ws.params.AutoCalcSetting;
  * @version $Revision: 1.141 $
  */
 public class AlignViewport extends AlignmentViewport implements
-        SelectionSource, AlignViewportI, CommandListener
+        SelectionSource, CommandListener
 {
   Font font;
 
@@ -95,6 +98,12 @@ public class AlignViewport extends AlignmentViewport implements
 
   private Rectangle explodedGeometry;
 
+  private FeatureRenderer featureRenderer;
+
+  private boolean includeHiddenRegion = true;
+
+  private AlignExportSettingI exportSettings;
+
   String viewName;
 
   /*
@@ -243,7 +252,7 @@ public class AlignViewport extends AlignmentViewport implements
     showAutocalculatedAbove = Cache.getDefault(
             Preferences.SHOW_AUTOCALC_ABOVE, false);
     viewStyle.setScaleProteinAsCdna(Cache.getDefault(
-            Preferences.SCALE_PROTEIN_TO_CDNA, false));
+            Preferences.SCALE_PROTEIN_TO_CDNA, true));
   }
 
   void init()
@@ -656,35 +665,32 @@ public class AlignViewport extends AlignmentViewport implements
   /**
    * 
    * @param pdbEntries
-   * @return a series of SequenceI arrays, one for each PDBEntry, listing which
-   *         sequence in the alignment holds a reference to it
+   * @return an array of SequenceI arrays, one for each PDBEntry, listing which
+   *         sequences in the alignment hold a reference to it
    */
   public SequenceI[][] collateForPDB(PDBEntry[] pdbEntries)
   {
-    ArrayList<SequenceI[]> seqvectors = new ArrayList<SequenceI[]>();
+    List<SequenceI[]> seqvectors = new ArrayList<SequenceI[]>();
     for (PDBEntry pdb : pdbEntries)
     {
-      ArrayList<SequenceI> seqs = new ArrayList<SequenceI>();
-      for (int i = 0; i < alignment.getHeight(); i++)
+      List<SequenceI> seqs = new ArrayList<SequenceI>();
+      for (SequenceI sq : alignment.getSequences())
       {
-        Vector pdbs = alignment.getSequenceAt(i).getDatasetSequence()
-                .getPDBId();
+        Vector<PDBEntry> pdbs = sq
+                .getDatasetSequence().getPDBId();
         if (pdbs == null)
         {
           continue;
         }
-        SequenceI sq;
-        for (int p = 0; p < pdbs.size(); p++)
+        for (PDBEntry p1 : pdbs)
         {
-          PDBEntry p1 = (PDBEntry) pdbs.elementAt(p);
           if (p1.getId().equals(pdb.getId()))
           {
-            if (!seqs.contains(sq = alignment.getSequenceAt(i)))
+            if (!seqs.contains(sq))
             {
               seqs.add(sq);
+              continue;
             }
-
-            continue;
           }
         }
       }
@@ -798,16 +804,23 @@ public class AlignViewport extends AlignmentViewport implements
     // TODO: create undo object for this JAL-1101
 
     /*
-     * If one alignment is protein and one nucleotide, with at least one
-     * sequence name in common, offer to open a linked alignment.
+     * If any cDNA/protein mappings can be made between the alignments, offer to
+     * open a linked alignment with split frame option.
      */
-    if (AlignmentUtils.isMappable(al, getAlignment()))
+    if (Cache.getDefault(Preferences.ENABLE_SPLIT_FRAME, false))
     {
-      if (openLinkedAlignment(al, title))
+      if (AlignmentUtils.isMappable(al, getAlignment()))
       {
-        return;
+        if (openLinkedAlignment(al, title))
+        {
+          return;
+        }
       }
     }
+
+    /*
+     * No mappings, or offer declined - add sequences to this alignment
+     */
     // TODO: JAL-407 regardless of above - identical sequences (based on ID and
     // provenance) should share the same dataset sequence
 
@@ -815,19 +828,18 @@ public class AlignViewport extends AlignmentViewport implements
     {
       getAlignment().addSequence(al.getSequenceAt(i));
     }
-    // TODO this call was done by SequenceFetcher but not FileLoader or
-    // CutAndPasteTransfer. Is it needed?
-    // JBPComment: this repositions the view to show the new sequences
-    // JBPComment: so it is needed for UX
+
     setEndSeq(getAlignment().getHeight());
     firePropertyChange("alignment", null, getAlignment().getSequences());
   }
 
   /**
    * Show a dialog with the option to open and link (cDNA <-> protein) as a new
-   * alignment. Returns true if the new alignment was opened, false if not,
-   * because the user declined the offer.
+   * alignment, either as a standalone alignment or in a split frame. Returns
+   * true if the new alignment was opened, false if not, because the user
+   * declined the offer.
    * 
+   * @param al
    * @param title
    */
   protected boolean openLinkedAlignment(AlignmentI al, String title)
@@ -851,14 +863,6 @@ public class AlignViewport extends AlignmentViewport implements
     final boolean openInNewWindow = (response == 2);
 
     /*
-     * Create the AlignFrame first (which creates the new alignment's datasets),
-     * before attempting sequence mapping.
-     */
-    AlignFrame newAlignFrame = new AlignFrame(al, AlignFrame.DEFAULT_WIDTH,
-            AlignFrame.DEFAULT_HEIGHT);
-    newAlignFrame.setTitle(title);
-
-    /*
      * Identify protein and dna alignments. Make a copy of this one if opening
      * in a new split pane.
      */
@@ -867,6 +871,23 @@ public class AlignViewport extends AlignmentViewport implements
     AlignmentI protein = al.isNucleotide() ? thisAlignment : al;
     final AlignmentI cdna = al.isNucleotide() ? al : thisAlignment;
 
+    /*
+     * Map sequences. At least one should get mapped as we have already passed
+     * the test for 'mappability'. Any mappings made will be added to the
+     * protein alignment. Note creating dataset sequences on the new alignment
+     * is a pre-requisite for building mappings.
+     */
+    al.setDataset(null);
+    AlignmentUtils.mapProteinToCdna(protein, cdna);
+
+    /*
+     * Create the AlignFrame for the added alignment. Note this will include the
+     * cDNA consensus annotation if it is protein (because the alignment holds
+     * mappings to nucleotide)
+     */
+    AlignFrame newAlignFrame = new AlignFrame(al, AlignFrame.DEFAULT_WIDTH,
+            AlignFrame.DEFAULT_HEIGHT);
+    newAlignFrame.setTitle(title);
     newAlignFrame.statusBar.setText(MessageManager.formatMessage(
             "label.successfully_loaded_file", new Object[]
             { title }));
@@ -885,13 +906,6 @@ public class AlignViewport extends AlignmentViewport implements
               AlignFrame.DEFAULT_HEIGHT);
     }
 
-    /*
-     * Map sequences. At least one should get mapped as we have already passed
-     * the test for 'mappability'. Any mappings made will be added to the
-     * protein alignment.
-     */
-    AlignmentUtils.mapProteinToCdna(protein, cdna);
-
     try
     {
       newAlignFrame.setMaximum(jalview.bin.Cache.getDefault(
@@ -933,7 +947,9 @@ public class AlignViewport extends AlignmentViewport implements
           AlignmentI complement, Set<AlignedCodonFrame> mappings)
   {
     /*
-     * Open in split pane. DNA sequence above, protein below.
+     * Make a new frame with a copy of the alignment we are adding to. If this
+     * is protein, the new frame will have a cDNA consensus annotation row
+     * added.
      */
     AlignFrame copyMe = new AlignFrame(complement,
             AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);
@@ -951,6 +967,10 @@ public class AlignViewport extends AlignmentViewport implements
     proteinFrame.setVisible(true);
     String linkedTitle = MessageManager
             .getString("label.linked_view_title");
+
+    /*
+     * Open in split pane. DNA sequence above, protein below.
+     */
     JInternalFrame splitFrame = new SplitFrame(cdnaFrame, proteinFrame);
     Desktop.addInternalFrame(splitFrame, linkedTitle, -1, -1);
 
@@ -1024,4 +1044,26 @@ public class AlignViewport extends AlignmentViewport implements
       complementPanel.scrollToCentre(sr, seqOffset);
     }
   }
+
+  @Override
+  public FeatureRenderer getFeatureRenderer()
+  {
+    return featureRenderer;
+  }
+
+  @Override
+  public void setFeatureRenderer(FeatureRenderer featureRenderer)
+  {
+    this.featureRenderer = featureRenderer;
+  }
+
+  public AlignExportSettingI getExportSettings()
+  {
+    return exportSettings;
+  }
+
+  public void setExportSettings(AlignExportSettingI exportSettings)
+  {
+    this.exportSettings = exportSettings;
+  }
 }