JAL-4366 provide options for updating (or not) the linked alignment or existing align...
[jalview.git] / src / jalview / gui / AlignViewport.java
index fea74db..91dded1 100644 (file)
@@ -22,6 +22,7 @@ package jalview.gui;
 
 import java.awt.Container;
 import java.awt.Dimension;
+import java.awt.FlowLayout;
 import java.awt.Font;
 import java.awt.FontMetrics;
 import java.awt.Rectangle;
@@ -745,6 +746,11 @@ public class AlignViewport extends AlignmentViewport
    */
   public void addFile(File file, FileFormatI format)
   {
+    addFile(file, format, true);
+  }
+
+  public void addFile(File file, FileFormatI format, boolean async)
+  {
     DataSourceType protocol = AppletFormatAdapter.checkProtocol(file);
 
     if (format == null)
@@ -769,7 +775,8 @@ public class AlignViewport extends AlignmentViewport
       }
     }
 
-    new FileLoader().LoadFile(this, file, DataSourceType.FILE, format);
+    new FileLoader().LoadFile(this, file, DataSourceType.FILE, format,
+            async);
   }
 
   public void addFile(File file)
@@ -789,8 +796,13 @@ public class AlignViewport extends AlignmentViewport
   protected void openLinkedAlignment(AlignmentI al, String title)
   {
     String[] options = new String[] { MessageManager.getString("action.no"),
-        MessageManager.getString("label.split_window"),
-        MessageManager.getString("label.new_window"), };
+        MessageManager.getString("label.split_window")
+                + "(update new alignment)",
+        MessageManager.getString("label.new_window"),
+        MessageManager.getString(
+                "label.split_window") + "(update this alignment)",
+        MessageManager.getString(
+                "label.split_window") + "(leave both unchanged)" };
     final String question = JvSwingUtils.wrapTooltip(true,
             MessageManager.getString("label.open_split_window?"));
     final AlignViewport us = this;
@@ -803,22 +815,34 @@ public class AlignViewport extends AlignmentViewport
     JvOptionPane dialog = JvOptionPane.newOptionDialog(Desktop.desktop)
             .setResponseHandler(0, () -> {
               addDataToAlignment(al);
-              return null;
             }).setResponseHandler(1, () -> {
-              us.openLinkedAlignmentAs(al, title, true);
-              return null;
+              us.openLinkedAlignmentAs(al, title, true, 1);
             }).setResponseHandler(2, () -> {
-              us.openLinkedAlignmentAs(al, title, false);
-              return null;
+              us.openLinkedAlignmentAs(al, title, false, 1);
+            }).setResponseHandler(3, () -> {
+              us.openLinkedAlignmentAs(al, title, true, 2);
+            }).setResponseHandler(4, () -> {
+              us.openLinkedAlignmentAs(al, title, true, 0);
             });
+    dialog.setLayout(new FlowLayout(FlowLayout.CENTER));
+    dialog.setPreferredSize(new Dimension(350,300));
     dialog.showDialog(question,
             MessageManager.getString("label.open_split_window"),
             JvOptionPane.DEFAULT_OPTION, JvOptionPane.PLAIN_MESSAGE, null,
             options, options[0]);
   }
 
-  protected void openLinkedAlignmentAs(AlignmentI al, String title,
-          boolean newWindowOrSplitPane)
+  /**
+   * link given alignment to the alignment in this viewport and open
+   * @param al - alignment containing sequences to link to this alignment
+   * @param title
+   * @param newWindowOrSplitPane
+   * @param alignAs TODO
+   * @param alignAs - 0 - don't modify either alignment, 1 - align al according to us, 2- align us according to al
+   * @return alignFrame holding al
+   */
+  protected AlignFrame openLinkedAlignmentAs(AlignmentI al, String title,
+          boolean newWindowOrSplitPane, int alignAs)
   {
     /*
      * Identify protein and dna alignments. Make a copy of this one if opening
@@ -827,18 +851,39 @@ public class AlignViewport extends AlignmentViewport
     AlignmentI thisAlignment = newWindowOrSplitPane
             ? new Alignment(getAlignment())
             : getAlignment();
-    AlignmentI protein = al.isNucleotide() ? thisAlignment : al;
-    final AlignmentI cdna = al.isNucleotide() ? al : thisAlignment;
+    
+    
+    if (!al.isNucleotide() && !thisAlignment.isNucleotide())
+    {
+      // link AA to 3di or other kind of 'alternative' 1:1 mapping alignment
+      if (al.getDataset()==null)
+      {
+        al.setDataset(thisAlignment.getDataset());
+      }
+      AlignmentUtils.map3diPeptideToProteinAligment(thisAlignment,al);
+      if (thisAlignment.getCodonFrames().isEmpty()) {thisAlignment.getCodonFrames().addAll(al.getCodonFrames()); }
+      else {al.getCodonFrames().addAll(thisAlignment.getCodonFrames()); };
 
-    /*
-     * 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.mapProteinAlignmentToCdna(protein, cdna);
 
+    }
+    else
+    {
+      // shouldn't we be merging dataset here ?
+      // always create dataset for imported alignment before doing anything else..
+        al.setDataset(null);
+        // link CODON triplets to Protein
+      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.
+       */
+      AlignmentUtils.mapProteinAlignmentToCdna(protein, cdna);
+    }
+    
     /*
      * Create the AlignFrame for the added alignment. If it is protein, mappings
      * are registered with StructureSelectionManager as a side-effect.
@@ -872,9 +917,15 @@ public class AlignViewport extends AlignmentViewport
 
     if (newWindowOrSplitPane)
     {
-      al.alignAs(thisAlignment);
-      protein = openSplitFrame(newAlignFrame, thisAlignment);
+      if (alignAs==1) {
+        al.alignAs(thisAlignment);
+      }
+      if (alignAs==2) {
+        thisAlignment.alignAs(al);
+      }
+      AlignmentI mapped = openSplitFrame(newAlignFrame, thisAlignment);
     }
+    return newAlignFrame;
   }
 
   /**
@@ -994,7 +1045,7 @@ public class AlignViewport extends AlignmentViewport
    */
   protected boolean noReferencesTo(AlignedCodonFrame acf)
   {
-    AlignFrame[] frames = Desktop.getAlignFrames();
+    AlignFrame[] frames = Desktop.getDesktopAlignFrames();
     if (frames == null)
     {
       return true;
@@ -1155,4 +1206,5 @@ public class AlignViewport extends AlignmentViewport
   {
     this.viewName = viewName;
   }
+
 }