JAL-2089 patch broken merge to master for Release 2.10.0b1
[jalview.git] / src / jalview / appletgui / AlignViewport.java
index 7400122..e5178cb 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
- * 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.
  * 
  */
 package jalview.appletgui;
 
-import java.util.*;
-
-import java.awt.*;
-
-import jalview.analysis.*;
+import jalview.analysis.NJTree;
 import jalview.api.AlignViewportI;
-import jalview.bin.*;
-import jalview.datamodel.*;
-import jalview.schemes.*;
+import jalview.api.FeatureSettingsModelI;
+import jalview.bin.JalviewLite;
+import jalview.commands.CommandI;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.SearchResults;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceGroup;
+import jalview.datamodel.SequenceI;
+import jalview.schemes.ColourSchemeProperty;
+import jalview.schemes.UserColourScheme;
+import jalview.structure.CommandListener;
 import jalview.structure.SelectionSource;
+import jalview.structure.StructureSelectionManager;
 import jalview.structure.VamsasSource;
 import jalview.viewmodel.AlignmentViewport;
 
+import java.awt.Font;
+
 public class AlignViewport extends AlignmentViewport implements
-        AlignViewportI, SelectionSource, VamsasSource
+        SelectionSource, VamsasSource, CommandListener
 {
-  int startRes;
-
-  int endRes;
-
-  int startSeq;
-
-  int endSeq;
-
   boolean cursorMode = false;
 
-  boolean showJVSuffix = true;
-
-  boolean showText = true;
-
-  boolean showColourText = false;
-
-  boolean showBoxes = true;
-
-  boolean wrapAlignment = false;
-
-  boolean renderGaps = true;
-
-  boolean showSequenceFeatures = false;
-
-  boolean showAnnotation = true;
-
-  boolean upperCasebold = false;
-
-  int charHeight;
-
-  int charWidth;
-
-  int wrappedWidth;
-
   Font font = new Font("SansSerif", Font.PLAIN, 10);
 
   boolean validCharWidth = true;
 
-  int threshold;
-
-  int increment;
-
   NJTree currentTree = null;
 
-  boolean scaleAboveWrapped = true;
-
-  boolean scaleLeftWrapped = true;
-
-  boolean scaleRightWrapped = true;
-
-  // The following vector holds the features which are
-  // currently visible, in the correct order or rendering
-  public Hashtable featuresDisplayed;
-
-  boolean showHiddenMarkers = true;
-
   public jalview.bin.JalviewLite applet;
 
   boolean MAC = false;
 
-  Stack historyList = new Stack();
-
-  Stack redoList = new Stack();
+  private AnnotationColumnChooser annotationColumnSelectionState;
 
+  @Override
   public void finalize()
   {
     applet = null;
@@ -110,9 +69,10 @@ public class AlignViewport extends AlignmentViewport implements
 
   public AlignViewport(AlignmentI al, JalviewLite applet)
   {
+    super();
     calculator = new jalview.workers.AlignCalcManager();
     this.applet = applet;
-    setAlignment(al);
+    alignment = al;
     // we always pad gaps
     this.setPadGaps(true);
     this.startRes = 0;
@@ -138,7 +98,7 @@ public class AlignViewport extends AlignmentViewport implements
                           + widthScale + "). Ignoring.");
           widthScale = 1;
         }
-        if (applet.debug)
+        if (JalviewLite.debug)
         {
           System.err
                   .println("Alignment character width scaling factor is now "
@@ -161,7 +121,7 @@ public class AlignViewport extends AlignmentViewport implements
                           + heightScale + "). Ignoring.");
           heightScale = 1;
         }
-        if (applet.debug)
+        if (JalviewLite.debug)
         {
           System.err
                   .println("Alignment character height scaling factor is now "
@@ -175,10 +135,11 @@ public class AlignViewport extends AlignmentViewport implements
 
     if (applet != null)
     {
-      showJVSuffix = applet.getDefaultParameter("showFullId", showJVSuffix);
+      setShowJVSuffix(applet.getDefaultParameter("showFullId",
+              getShowJVSuffix()));
 
-      showAnnotation = applet.getDefaultParameter("showAnnotation",
-              showAnnotation);
+      setShowAnnotation(applet.getDefaultParameter("showAnnotation",
+              isShowAnnotation()));
 
       showConservation = applet.getDefaultParameter("showConservation",
               showConservation);
@@ -188,22 +149,25 @@ public class AlignViewport extends AlignmentViewport implements
       showConsensus = applet.getDefaultParameter("showConsensus",
               showConsensus);
 
-      showUnconserved = applet.getDefaultParameter("showUnconserved",
-              showUnconserved);
+      setShowUnconserved(applet.getDefaultParameter("showUnconserved",
+              getShowUnconserved()));
+
+      setScaleProteinAsCdna(applet.getDefaultParameter(
+              "scaleProteinAsCdna", isScaleProteinAsCdna()));
 
       String param = applet.getParameter("upperCase");
       if (param != null)
       {
         if (param.equalsIgnoreCase("bold"))
         {
-          upperCasebold = true;
+          setUpperCasebold(true);
         }
       }
       sortByTree = applet.getDefaultParameter("sortByTree", sortByTree);
 
-      followHighlight = applet.getDefaultParameter("automaticScrolling",
-              followHighlight);
-      followSelection = followHighlight;
+      setFollowHighlight(applet.getDefaultParameter("automaticScrolling",
+              isFollowHighlight()));
+      followSelection = isFollowHighlight();
 
       showSequenceLogo = applet.getDefaultParameter("showSequenceLogo",
               showSequenceLogo);
@@ -225,8 +189,13 @@ public class AlignViewport extends AlignmentViewport implements
 
     if (applet != null)
     {
-      String colour = applet.getParameter("defaultColour");
-
+      String colour = al.isNucleotide() ? applet
+              .getParameter("defaultColourNuc") : applet
+              .getParameter("defaultColourProt");
+      if (colour == null)
+      {
+        colour = applet.getParameter("defaultColour");
+      }
       if (colour == null)
       {
         colour = applet.getParameter("userDefinedColour");
@@ -256,16 +225,6 @@ public class AlignViewport extends AlignmentViewport implements
 
   }
 
-  public void showSequenceFeatures(boolean b)
-  {
-    showSequenceFeatures = b;
-  }
-
-  public boolean getShowSequenceFeatures()
-  {
-    return showSequenceFeatures;
-  }
-
   /**
    * get the consensus sequence as displayed under the PID consensus annotation
    * row.
@@ -282,7 +241,7 @@ public class AlignViewport extends AlignmentViewport implements
     {
       return null;
     }
-    StringBuffer seqs = new StringBuffer();
+    StringBuilder seqs = new StringBuilder(consensus.annotations.length);
     for (int i = 0; i < consensus.annotations.length; i++)
     {
       if (consensus.annotations[i] != null)
@@ -303,64 +262,6 @@ public class AlignViewport extends AlignmentViewport implements
     return sq;
   }
 
-  public int getStartRes()
-  {
-    return startRes;
-  }
-
-  public int getEndRes()
-  {
-    return endRes;
-  }
-
-  public int getStartSeq()
-  {
-    return startSeq;
-  }
-
-  public void setStartRes(int res)
-  {
-    this.startRes = res;
-  }
-
-  public void setStartSeq(int seq)
-  {
-    this.startSeq = seq;
-  }
-
-  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;
-  }
-
-  public void setEndSeq(int seq)
-  {
-    if (seq > alignment.getHeight())
-    {
-      seq = alignment.getHeight();
-    }
-    if (seq < 0)
-    {
-      seq = 0;
-    }
-    this.endSeq = seq;
-  }
-
-  public int getEndSeq()
-  {
-    return endSeq;
-  }
-
   java.awt.Frame nullFrame;
 
   protected FeatureSettings featureSettings = null;
@@ -378,13 +279,13 @@ public class AlignViewport extends AlignmentViewport implements
 
     java.awt.FontMetrics fm = nullFrame.getGraphics().getFontMetrics(font);
     setCharHeight((int) (heightScale * fm.getHeight()));
-    charWidth = (int) (widthScale * fm.charWidth('M'));
+    setCharWidth((int) (widthScale * fm.charWidth('M')));
 
-    if (upperCasebold)
+    if (isUpperCasebold())
     {
       Font f2 = new Font(f.getName(), Font.BOLD, f.getSize());
       fm = nullFrame.getGraphics().getFontMetrics(f2);
-      charWidth = (int) (widthScale * (fm.stringWidth("MMMMMMMMMMM") / 10));
+      setCharWidth((int) (widthScale * (fm.stringWidth("MMMMMMMMMMM") / 10)));
     }
   }
 
@@ -393,99 +294,6 @@ public class AlignViewport extends AlignmentViewport implements
     return font;
   }
 
-  public int getCharWidth()
-  {
-    return charWidth;
-  }
-
-  public void setCharHeight(int h)
-  {
-    this.charHeight = h;
-  }
-
-  public int getCharHeight()
-  {
-    return charHeight;
-  }
-
-  public void setWrappedWidth(int w)
-  {
-    this.wrappedWidth = w;
-  }
-
-  public int getwrappedWidth()
-  {
-    return wrappedWidth;
-  }
-
-  public AlignmentI getAlignment()
-  {
-    return alignment;
-  }
-
-  public void setAlignment(AlignmentI align)
-  {
-    this.alignment = align;
-  }
-
-  public void setWrapAlignment(boolean state)
-  {
-    wrapAlignment = state;
-  }
-
-  public void setShowText(boolean state)
-  {
-    showText = state;
-  }
-
-  public void setRenderGaps(boolean state)
-  {
-    renderGaps = state;
-  }
-
-  public boolean getColourText()
-  {
-    return showColourText;
-  }
-
-  public void setColourText(boolean state)
-  {
-    showColourText = state;
-  }
-
-  public void setShowBoxes(boolean state)
-  {
-    showBoxes = state;
-  }
-
-  public boolean getWrapAlignment()
-  {
-    return wrapAlignment;
-  }
-
-  public boolean getShowText()
-  {
-    return showText;
-  }
-
-  public boolean getShowBoxes()
-  {
-    return showBoxes;
-  }
-
-  public char getGapCharacter()
-  {
-    return getAlignment().getGapCharacter();
-  }
-
-  public void setGapCharacter(char gap)
-  {
-    if (getAlignment() != null)
-    {
-      getAlignment().setGapCharacter(gap);
-    }
-  }
-
   public void resetSeqLimits(int height)
   {
     setEndSeq(height / getCharHeight());
@@ -501,167 +309,151 @@ public class AlignViewport extends AlignmentViewport implements
     return currentTree;
   }
 
-  public boolean getShowJVSuffix()
-  {
-    return showJVSuffix;
-  }
+  boolean centreColumnLabels;
 
-  public void setShowJVSuffix(boolean b)
+  public boolean getCentreColumnLabels()
   {
-    showJVSuffix = b;
+    return centreColumnLabels;
   }
 
-  public boolean getShowAnnotation()
+  public boolean followSelection = true;
+
+  /**
+   * @return true if view selection should always follow the selections
+   *         broadcast by other selection sources
+   */
+  public boolean getFollowSelection()
   {
-    return showAnnotation;
+    return followSelection;
   }
 
-  public void setShowAnnotation(boolean b)
+  @Override
+  public void sendSelection()
   {
-    showAnnotation = b;
+    getStructureSelectionManager().sendSelection(
+            new SequenceGroup(getSelectionGroup()),
+            new ColumnSelection(getColumnSelection()), this);
   }
 
-  public boolean getScaleAboveWrapped()
+  /**
+   * Returns an instance of the StructureSelectionManager scoped to this applet
+   * instance.
+   * 
+   * @return
+   */
+  @Override
+  public StructureSelectionManager getStructureSelectionManager()
   {
-    return scaleAboveWrapped;
+    return jalview.structure.StructureSelectionManager
+            .getStructureSelectionManager(applet);
   }
 
-  public boolean getScaleLeftWrapped()
+  @Override
+  public boolean isNormaliseSequenceLogo()
   {
-    return scaleLeftWrapped;
+    return normaliseSequenceLogo;
   }
 
-  public boolean getScaleRightWrapped()
+  public void setNormaliseSequenceLogo(boolean state)
   {
-    return scaleRightWrapped;
+    normaliseSequenceLogo = state;
   }
 
-  public void setScaleAboveWrapped(boolean b)
+  /**
+   * 
+   * @return true if alignment characters should be displayed
+   */
+  @Override
+  public boolean isValidCharWidth()
   {
-    scaleAboveWrapped = b;
+    return validCharWidth;
   }
 
-  public void setScaleLeftWrapped(boolean b)
+  public AnnotationColumnChooser getAnnotationColumnSelectionState()
   {
-    scaleLeftWrapped = b;
+    return annotationColumnSelectionState;
   }
 
-  public void setScaleRightWrapped(boolean b)
+  public void setAnnotationColumnSelectionState(
+          AnnotationColumnChooser annotationColumnSelectionState)
   {
-    scaleRightWrapped = b;
+    this.annotationColumnSelectionState = annotationColumnSelectionState;
   }
 
-  public void setIgnoreGapsConsensus(boolean b)
-  {
-    ignoreGapsInConsensusCalculation = b;
-    updateConsensus(null);
-    if (globalColourScheme != null)
+  @Override
+  public void mirrorCommand(CommandI command, boolean undo,
+          StructureSelectionManager ssm, VamsasSource source)
+  {
+    // TODO refactor so this can be pulled up to superclass or controller
+    /*
+     * Do nothing unless we are a 'complement' of the source. May replace this
+     * with direct calls not via SSM.
+     */
+    if (source instanceof AlignViewportI
+            && ((AlignViewportI) source).getCodingComplement() == this)
     {
-      globalColourScheme.setThreshold(globalColourScheme.getThreshold(),
-              ignoreGapsInConsensusCalculation);
-
+      // ok to continue;
+    }
+    else
+    {
+      return;
     }
-  }
-
-  public boolean getShowHiddenMarkers()
-  {
-    return showHiddenMarkers;
-  }
-
-  public void setShowHiddenMarkers(boolean show)
-  {
-    showHiddenMarkers = show;
-  }
-
-  boolean centreColumnLabels;
-
-  public boolean getCentreColumnLabels()
-  {
-    return centreColumnLabels;
-  }
-
-  public boolean followHighlight = true;
-
-  public boolean getFollowHighlight()
-  {
-    return followHighlight;
-  }
 
-  public boolean followSelection = true;
+    CommandI mappedCommand = ssm.mapCommand(command, undo, getAlignment(),
+            getGapCharacter());
+    if (mappedCommand != null)
+    {
+      mappedCommand.doCommand(null);
+      firePropertyChange("alignment", null, getAlignment().getSequences());
 
-  /**
-   * @return true if view selection should always follow the selections
-   *         broadcast by other selection sources
-   */
-  public boolean getFollowSelection()
-  {
-    return followSelection;
+      // ap.scalePanelHolder.repaint();
+      // ap.repaint();
+    }
   }
 
-  public void sendSelection()
+  @Override
+  public VamsasSource getVamsasSource()
   {
-    jalview.structure.StructureSelectionManager
-            .getStructureSelectionManager(applet).sendSelection(
-                    new SequenceGroup(getSelectionGroup()),
-                    new ColumnSelection(getColumnSelection()), this);
+    return this;
   }
 
   /**
-   * synthesize a column selection if none exists so it covers the given
-   * selection group. if wholewidth is false, no column selection is made if the
-   * selection group covers the whole alignment width.
-   * 
-   * @param sg
-   * @param wholewidth
+   * If this viewport has a (Protein/cDNA) complement, then scroll the
+   * complementary alignment to match this one.
    */
-  public void expandColSelection(SequenceGroup sg, boolean wholewidth)
+  public void scrollComplementaryAlignment(AlignmentPanel complementPanel)
   {
-    int sgs, sge;
-    if (sg != null
-            && (sgs = sg.getStartRes()) >= 0
-            && sg.getStartRes() <= (sge = sg.getEndRes())
-            && (colSel == null || colSel.getSelected() == null || colSel
-                    .getSelected().size() == 0))
+    if (complementPanel == null)
     {
-      if (!wholewidth && alignment.getWidth() == (1 + sge - sgs))
-      {
-        // do nothing
-        return;
-      }
-      if (colSel == null)
-      {
-        colSel = new ColumnSelection();
-      }
-      for (int cspos = sg.getStartRes(); cspos <= sg.getEndRes(); cspos++)
-      {
-        colSel.addElement(cspos);
-      }
+      return;
     }
-  }
 
-  @Override
-  public boolean hasHiddenColumns()
-  {
-    return hasHiddenColumns;
-  }
-
-  public boolean isNormaliseSequenceLogo()
-  {
-    return normaliseSequenceLogo;
-  }
-
-  public void setNormaliseSequenceLogo(boolean state)
-  {
-    normaliseSequenceLogo = state;
+    /*
+     * 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())
+    {
+      complementPanel.setFollowingComplementScroll(true);
+      complementPanel.scrollToCentre(sr, seqOffset);
+    }
   }
 
   /**
+   * Applies the supplied feature settings descriptor to currently known
+   * features. This supports an 'initial configuration' of feature colouring
+   * based on a preset or user favourite. This may then be modified in the usual
+   * way using the Feature Settings dialogue.
    * 
-   * @return true if alignment characters should be displayed
+   * @param featureSettings
    */
-  public boolean isValidCharWidth()
+  @Override
+  public void applyFeaturesStyle(FeatureSettingsModelI featureSettings)
   {
-    return validCharWidth;
+    // TODO implement for applet
   }
 
 }