Merge branch 'Release_2_8_3_Branch' of https://source.jalview.org/git/jalview into...
[jalview.git] / src / jalview / gui / AlignViewport.java
index e4593a3..c59d201 100644 (file)
@@ -62,6 +62,7 @@ import jalview.datamodel.Alignment;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.ColumnSelection;
 import jalview.datamodel.PDBEntry;
+import jalview.datamodel.SearchResults;
 import jalview.datamodel.Sequence;
 import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
@@ -84,14 +85,6 @@ import jalview.ws.params.AutoCalcSetting;
 public class AlignViewport extends AlignmentViewport implements
         SelectionSource, AlignViewportI, CommandListener
 {
-  int startRes;
-
-  int endRes;
-
-  int startSeq;
-
-  int endSeq;
-
   Font font;
 
   NJTree currentTree = null;
@@ -221,6 +214,9 @@ public class AlignViewport extends AlignmentViewport implements
     init();
   }
 
+  /**
+   * Apply any settings saved in user preferences
+   */
   private void applyViewProperties()
   {
     antiAlias = Cache.getDefault("ANTI_ALIAS", false);
@@ -246,7 +242,8 @@ public class AlignViewport extends AlignmentViewport implements
             SequenceAnnotationOrder.NONE.name()));
     showAutocalculatedAbove = Cache.getDefault(
             Preferences.SHOW_AUTOCALC_ABOVE, false);
-
+    viewStyle.setScaleProteinAsCdna(Cache.getDefault(
+            Preferences.SCALE_PROTEIN_TO_CDNA, true));
   }
 
   void init()
@@ -362,112 +359,6 @@ public class AlignViewport extends AlignmentViewport implements
     return sq;
   }
 
-  /**
-   * DOCUMENT ME!
-   * 
-   * @return DOCUMENT ME!
-   */
-  public int getStartRes()
-  {
-    return startRes;
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
-   * @return DOCUMENT ME!
-   */
-  public int getEndRes()
-  {
-    return endRes;
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
-   * @return DOCUMENT ME!
-   */
-  public int getStartSeq()
-  {
-    return startSeq;
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param res
-   *          DOCUMENT ME!
-   */
-  public void setStartRes(int res)
-  {
-    this.startRes = res;
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param seq
-   *          DOCUMENT ME!
-   */
-  public void setStartSeq(int seq)
-  {
-    this.startSeq = seq;
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param res
-   *          DOCUMENT ME!
-   */
-  public void setEndRes(int res)
-  {
-    if (res > (alignment.getWidth() - 1))
-    {
-      // log.System.out.println(" Corrected res from " + res + " to maximum " +
-      // (alignment.getWidth()-1));
-      res = alignment.getWidth() - 1;
-    }
-
-    if (res < 0)
-    {
-      res = 0;
-    }
-
-    this.endRes = res;
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param seq
-   *          DOCUMENT ME!
-   */
-  public void setEndSeq(int seq)
-  {
-    if (seq > alignment.getHeight())
-    {
-      seq = alignment.getHeight();
-    }
-
-    if (seq < 0)
-    {
-      seq = 0;
-    }
-
-    this.endSeq = seq;
-  }
-
-  /**
-   * DOCUMENT ME!
-   * 
-   * @return DOCUMENT ME!
-   */
-  public int getEndSeq()
-  {
-    return endSeq;
-  }
-
   boolean validCharWidth;
 
   /**
@@ -665,21 +556,6 @@ public class AlignViewport extends AlignmentViewport implements
     return false;
   }
 
-  /**
-   * when set, view will scroll to show the highlighted position
-   */
-  public boolean followHighlight = true;
-
-  /**
-   * @return true if view should scroll to show the highlighted region of a
-   *         sequence
-   * @return
-   */
-  public boolean getFollowHighlight()
-  {
-    return followHighlight;
-  }
-
   public boolean followSelection = true;
 
   /**
@@ -922,16 +798,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
 
@@ -939,19 +822,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)
@@ -1126,4 +1008,26 @@ public class AlignViewport extends AlignmentViewport implements
   {
     this.gatherViewsHere = gatherViewsHere;
   }
+
+  /**
+   * If this viewport has a (Protein/cDNA) complement, then scroll the
+   * complementary alignment to match this one.
+   */
+  public void scrollComplementaryAlignment()
+  {
+    /*
+     * Populate a SearchResults object with the mapped location to scroll to. If
+     * there is no complement, or it is not following highlights, or no mapping
+     * is found, the result will be empty.
+     */
+    SearchResults sr = new SearchResults();
+    int seqOffset = findComplementScrollTarget(sr);
+    if (!sr.isEmpty())
+    {
+      // TODO would like next line without cast but needs more refactoring...
+      final AlignmentPanel complementPanel = ((AlignViewport) getCodingComplement()).getAlignPanel();
+      complementPanel.setFollowingComplementScroll(true);
+      complementPanel.scrollToCentre(sr, seqOffset);
+    }
+  }
 }