Merge develop to Release_2_8_3_Branch
[jalview.git] / src / jalview / appletgui / AlignViewport.java
index ab9a25d..2d38008 100644 (file)
@@ -1,39 +1,46 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)
- * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle
+ * 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.
- * 
+ * 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/>.
+ * 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.appletgui;
 
-import java.util.*;
-
-import java.awt.*;
+import java.awt.Font;
 
-import jalview.analysis.*;
-import jalview.api.AlignCalcManagerI;
+import jalview.analysis.NJTree;
 import jalview.api.AlignViewportI;
-import jalview.bin.*;
-import jalview.datamodel.*;
-import jalview.schemes.*;
+import jalview.bin.JalviewLite;
+import jalview.commands.CommandI;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.ColumnSelection;
+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 jalview.workers.ConservationThread;
-import jalview.workers.ConsensusThread;
 
-public class AlignViewport extends AlignmentViewport implements AlignViewportI, SelectionSource, VamsasSource 
+public class AlignViewport extends AlignmentViewport implements
+        AlignViewportI, SelectionSource, VamsasSource, CommandListener
 {
   int startRes;
 
@@ -45,87 +52,32 @@ public class AlignViewport extends AlignmentViewport implements AlignViewportI,
 
   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 showConservation = true;
-
-  boolean showQuality = true;
-
-  boolean showConsensus = true;
-
-  boolean upperCasebold = false;
-
-  boolean colourAppliesToAllGroups = true;
-
-  boolean conservationColourSelected = false;
-
-  boolean abovePIDThreshold = 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;
 
-  Hashtable sequenceColours;
-
   boolean MAC = false;
 
-  Stack historyList = new Stack();
+  private AnnotationColumnChooser annotationColumnSelectionState;
 
-  Stack redoList = new Stack();
-    
-  public void finalize() {
-    applet=null;
-    quality=null;
-    alignment=null;
-    colSel=null;
+  public void finalize()
+  {
+    applet = null;
+    quality = null;
+    alignment = null;
+    colSel = null;
   }
 
   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;
@@ -188,41 +140,53 @@ public class AlignViewport extends AlignmentViewport implements AlignViewportI,
 
     if (applet != null)
     {
-      showJVSuffix = applet.getDefaultParameter("showFullId", showJVSuffix);
+      setShowJVSuffix(applet.getDefaultParameter("showFullId",
+              getShowJVSuffix()));
+
+      setShowAnnotation(applet.getDefaultParameter("showAnnotation",
+              isShowAnnotation()));
+
+      showConservation = applet.getDefaultParameter("showConservation",
+              showConservation);
 
-      showAnnotation = applet.getDefaultParameter("showAnnotation", showAnnotation);
-      
-      showConservation = applet.getDefaultParameter("showConservation", showConservation);
-      
       showQuality = applet.getDefaultParameter("showQuality", showQuality);
 
-      showConsensus = applet.getDefaultParameter("showConsensus", showConsensus);
+      showConsensus = applet.getDefaultParameter("showConsensus",
+              showConsensus);
 
-      showUnconserved = applet.getDefaultParameter("showUnconserved", showUnconserved);
+      setShowUnconserved(applet.getDefaultParameter("showUnconserved",
+              getShowUnconserved()));
 
       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);
+      followHighlight = applet.getDefaultParameter("automaticScrolling",
+              followHighlight);
       followSelection = followHighlight;
 
-      showSequenceLogo = applet.getDefaultParameter("showSequenceLogo", showSequenceLogo);
+      showSequenceLogo = applet.getDefaultParameter("showSequenceLogo",
+              showSequenceLogo);
+
+      normaliseSequenceLogo = applet.getDefaultParameter(
+              "normaliseSequenceLogo", applet.getDefaultParameter(
+                      "normaliseLogo", normaliseSequenceLogo));
+
+      showGroupConsensus = applet.getDefaultParameter("showGroupConsensus",
+              showGroupConsensus);
+
+      showGroupConservation = applet.getDefaultParameter(
+              "showGroupConservation", showGroupConservation);
 
-      normaliseSequenceLogo = applet.getDefaultParameter("normaliseSequenceLogo", normaliseSequenceLogo);
+      showConsensusHistogram = applet.getDefaultParameter(
+              "showConsensusHistogram", showConsensusHistogram);
 
-      showGroupConsensus = applet.getDefaultParameter("showGroupConsensus", showGroupConsensus);
-      
-      showGroupConservation = applet.getDefaultParameter("showGroupConservation", showGroupConservation);
-        
-      showConsensusHistogram = applet.getDefaultParameter("showConsensusHistogram", showConsensusHistogram);
-      
     }
 
     if (applet != null)
@@ -254,58 +218,10 @@ public class AlignViewport extends AlignmentViewport implements AlignViewportI,
                 .getParameter("userDefinedColour"));
       }
     }
-    if (hconsensus == null)
-    {
-      if (!alignment.isNucleotide())
-      {
-        conservation = new AlignmentAnnotation("Conservation",
-                "Conservation of total alignment less than " + getConsPercGaps()
-                        + "% gaps", new Annotation[1], 0f, 11f,
-                AlignmentAnnotation.BAR_GRAPH);
-        conservation.hasText = true;
-        conservation.autoCalculated = true;
-
-        if (showConservation)
-        {
-          alignment.addAnnotation(conservation);
-        }
+    initAutoAnnotation();
 
-        if (showQuality)
-        {
-          quality = new AlignmentAnnotation("Quality",
-                  "Alignment Quality based on Blosum62 scores",
-                  new Annotation[1], 0f, 11f, AlignmentAnnotation.BAR_GRAPH);
-          quality.hasText = true;
-          quality.autoCalculated = true;
-
-          alignment.addAnnotation(quality);
-        }
-      }
-
-      consensus = new AlignmentAnnotation("Consensus", "PID",
-              new Annotation[1], 0f, 100f, AlignmentAnnotation.BAR_GRAPH);
-      consensus.hasText = true;
-      consensus.autoCalculated = true;
-
-      if (showConsensus)
-      {
-        alignment.addAnnotation(consensus);
-      }
-    }
-
-  }
-
-  public void showSequenceFeatures(boolean b)
-  {
-    showSequenceFeatures = b;
-  }
-
-  public boolean getShowSequenceFeatures()
-  {
-    return showSequenceFeatures;
   }
 
-
   /**
    * get the consensus sequence as displayed under the PID consensus annotation
    * row.
@@ -322,7 +238,7 @@ public class AlignViewport extends AlignmentViewport implements AlignViewportI,
     {
       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)
@@ -343,26 +259,6 @@ public class AlignViewport extends AlignmentViewport implements AlignViewportI,
     return sq;
   }
 
-  public boolean getConservationSelected()
-  {
-    return conservationColourSelected;
-  }
-
-  public void setConservationSelected(boolean b)
-  {
-    conservationColourSelected = b;
-  }
-
-  public boolean getAbovePIDThreshold()
-  {
-    return abovePIDThreshold;
-  }
-
-  public void setAbovePIDThreshold(boolean b)
-  {
-    abovePIDThreshold = b;
-  }
-
   public int getStartRes()
   {
     return startRes;
@@ -438,13 +334,13 @@ public class AlignViewport extends AlignmentViewport implements AlignViewportI,
 
     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)));
     }
   }
 
@@ -453,118 +349,6 @@ public class AlignViewport extends AlignmentViewport implements AlignViewportI,
     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 setThreshold(int thresh)
-  {
-    threshold = thresh;
-  }
-
-  public int getThreshold()
-  {
-    return threshold;
-  }
-
-  public void setIncrement(int inc)
-  {
-    increment = inc;
-  }
-
-  public int getIncrement()
-  {
-    return increment;
-  }
 
   public void resetSeqLimits(int height)
   {
@@ -581,120 +365,6 @@ public class AlignViewport extends AlignmentViewport implements AlignViewportI,
     return currentTree;
   }
 
-  public void setColourAppliesToAllGroups(boolean b)
-  {
-    colourAppliesToAllGroups = b;
-  }
-
-  public boolean getColourAppliesToAllGroups()
-  {
-    return colourAppliesToAllGroups;
-  }
-
-  public boolean getShowJVSuffix()
-  {
-    return showJVSuffix;
-  }
-
-  public void setShowJVSuffix(boolean b)
-  {
-    showJVSuffix = b;
-  }
-
-  public boolean getShowAnnotation()
-  {
-    return showAnnotation;
-  }
-
-  public void setShowAnnotation(boolean b)
-  {
-    showAnnotation = b;
-  }
-
-  public boolean getScaleAboveWrapped()
-  {
-    return scaleAboveWrapped;
-  }
-
-  public boolean getScaleLeftWrapped()
-  {
-    return scaleLeftWrapped;
-  }
-
-  public boolean getScaleRightWrapped()
-  {
-    return scaleRightWrapped;
-  }
-
-  public void setScaleAboveWrapped(boolean b)
-  {
-    scaleAboveWrapped = b;
-  }
-
-  public void setScaleLeftWrapped(boolean b)
-  {
-    scaleLeftWrapped = b;
-  }
-
-  public void setScaleRightWrapped(boolean b)
-  {
-    scaleRightWrapped = b;
-  }
-
-  public void setIgnoreGapsConsensus(boolean b)
-  {
-    ignoreGapsInConsensusCalculation = b;
-    updateConsensus(null);
-    if (globalColourScheme != null)
-    {
-      globalColourScheme.setThreshold(globalColourScheme.getThreshold(),
-              ignoreGapsInConsensusCalculation);
-
-    }
-  }
-
-
-
-
-  public boolean getShowHiddenMarkers()
-  {
-    return showHiddenMarkers;
-  }
-
-  public void setShowHiddenMarkers(boolean show)
-  {
-    showHiddenMarkers = show;
-  }
-
-  public Color getSequenceColour(SequenceI seq)
-  {
-    if (sequenceColours == null || !sequenceColours.containsKey(seq))
-    {
-      return Color.white;
-    }
-    else
-    {
-      return (Color) sequenceColours.get(seq);
-    }
-  }
-
-  public void setSequenceColour(SequenceI seq, Color col)
-  {
-    if (sequenceColours == null)
-    {
-      sequenceColours = new Hashtable();
-    }
-
-    if (col == null)
-    {
-      sequenceColours.remove(seq);
-    }
-    else
-    {
-      sequenceColours.put(seq, col);
-    }
-  }
 
   boolean centreColumnLabels;
 
@@ -703,23 +373,6 @@ public class AlignViewport extends AlignmentViewport implements AlignViewportI,
     return centreColumnLabels;
   }
 
-  public void updateSequenceIdColours()
-  {
-    Vector groups = alignment.getGroups();
-    for (int ig = 0, igSize = groups.size(); ig < igSize; ig++)
-    {
-      SequenceGroup sg = (SequenceGroup) groups.elementAt(ig);
-      if (sg.idColour != null)
-      {
-        Vector sqs = sg.getSequences(getHiddenRepSequences());
-        for (int s = 0, sSize = sqs.size(); s < sSize; s++)
-        {
-          this.setSequenceColour((SequenceI) sqs.elementAt(s), sg.idColour);
-        }
-      }
-    }
-  }
-
   public boolean followHighlight = true;
 
   public boolean getFollowHighlight()
@@ -737,16 +390,26 @@ public class AlignViewport extends AlignmentViewport implements AlignViewportI,
   {
     return followSelection;
   }
+
   public void sendSelection()
   {
-    jalview.structure.StructureSelectionManager
-            .getStructureSelectionManager(applet).sendSelection(
+    getStructureSelectionManager().sendSelection(
                     new SequenceGroup(getSelectionGroup()),
                     new ColumnSelection(getColumnSelection()), this);
   }
 
-
-
+  /**
+   * Returns an instance of the StructureSelectionManager scoped to this applet
+   * instance.
+   * 
+   * @return
+   */
+  @Override
+  public StructureSelectionManager getStructureSelectionManager()
+  {
+    return jalview.structure.StructureSelectionManager
+            .getStructureSelectionManager(applet);
+  }
 
   /**
    * synthesize a column selection if none exists so it covers the given
@@ -781,12 +444,6 @@ public class AlignViewport extends AlignmentViewport implements AlignViewportI,
     }
   }
 
-  @Override
-  public boolean hasHiddenColumns()
-  {
-    return hasHiddenColumns;
-  }
-  
   public boolean isNormaliseSequenceLogo()
   {
     return normaliseSequenceLogo;
@@ -799,11 +456,59 @@ public class AlignViewport extends AlignmentViewport implements AlignViewportI,
 
   /**
    * 
-   * @return true if alignment characters should be displayed 
+   * @return true if alignment characters should be displayed
    */
   public boolean isValidCharWidth()
   {
     return validCharWidth;
   }
 
+  public AnnotationColumnChooser getAnnotationColumnSelectionState()
+  {
+    return annotationColumnSelectionState;
+  }
+
+  public void setAnnotationColumnSelectionState(
+          AnnotationColumnChooser annotationColumnSelectionState)
+  {
+    this.annotationColumnSelectionState = annotationColumnSelectionState;
+  }
+
+  @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)
+    {
+      // ok to continue;
+    }
+    else
+    {
+      return;
+    }
+
+    CommandI mappedCommand = ssm.mapCommand(command, undo, getAlignment(),
+            getGapCharacter());
+    if (mappedCommand != null)
+    {
+      mappedCommand.doCommand(null);
+      firePropertyChange("alignment", null, getAlignment().getSequences());
+
+      // ap.scalePanelHolder.repaint();
+      // ap.repaint();
+    }
+  }
+
+  @Override
+  public VamsasSource getVamsasSource()
+  {
+    return this;
+  }
+
 }