JAL-1640 more properties moved to style bean and rationalisation of layout update...
[jalview.git] / src / jalview / viewmodel / AlignmentViewport.java
index 5dd5aa3..3a40a16 100644 (file)
  */
 package jalview.viewmodel;
 
-import jalview.analysis.AAFrequency;
 import jalview.analysis.Conservation;
 import jalview.api.AlignCalcManagerI;
 import jalview.api.AlignViewportI;
 import jalview.api.AlignmentViewPanel;
 import jalview.api.FeaturesDisplayedI;
+import jalview.api.ViewStyleI;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.AlignmentView;
@@ -36,11 +36,10 @@ import jalview.datamodel.SequenceCollectionI;
 import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
 import jalview.schemes.Blosum62ColourScheme;
-import jalview.schemes.ClustalxColourScheme;
 import jalview.schemes.ColourSchemeI;
 import jalview.schemes.PIDColourScheme;
 import jalview.schemes.ResidueProperties;
-import jalview.viewmodel.seqfeatures.FeaturesDisplayed;
+import jalview.viewmodel.styles.ViewStyle;
 import jalview.workers.AlignCalcManager;
 import jalview.workers.ConsensusThread;
 import jalview.workers.StrucConsensusThread;
@@ -60,151 +59,484 @@ import java.util.Vector;
  * @author jimp
  * 
  */
-public abstract class AlignmentViewport implements AlignViewportI
+public abstract class AlignmentViewport implements AlignViewportI,
+        ViewStyleI
 {
+  protected ViewStyleI viewStyle = new ViewStyle();
+  
+  
   /**
-   * alignment displayed in the viewport. Please use get/setter
+   * @param name
+   * @see jalview.api.ViewStyleI#setFontName(java.lang.String)
    */
-  protected AlignmentI alignment;
+  public void setFontName(String name)
+  {
+    viewStyle.setFontName(name);
+  }
 
-  protected String sequenceSetID;
+  /**
+   * @param style
+   * @see jalview.api.ViewStyleI#setFontStyle(int)
+   */
+  public void setFontStyle(int style)
+  {
+    viewStyle.setFontStyle(style);
+  }
 
   /**
-   * probably unused indicator that view is of a dataset rather than an
-   * alignment
+   * @param size
+   * @see jalview.api.ViewStyleI#setFontSize(int)
    */
-  protected boolean isDataset = false;
+  public void setFontSize(int size)
+  {
+    viewStyle.setFontSize(size);
+  }
 
-  private Map<SequenceI, SequenceCollectionI> hiddenRepSequences;
+  /**
+   * @return
+   * @see jalview.api.ViewStyleI#getFontStyle()
+   */
+  public int getFontStyle()
+  {
+    return viewStyle.getFontStyle();
+  }
 
-  protected ColumnSelection colSel = new ColumnSelection();
+  /**
+   * @return
+   * @see jalview.api.ViewStyleI#getFontName()
+   */
+  public String getFontName()
+  {
+    return viewStyle.getFontName();
+  }
 
-  public boolean autoCalculateConsensus = true;
+  /**
+   * @return
+   * @see jalview.api.ViewStyleI#getFontSize()
+   */
+  public int getFontSize()
+  {
+    return viewStyle.getFontSize();
+  }
 
-  protected boolean autoCalculateStrucConsensus = true;
+  /**
+   * @param upperCasebold
+   * @see jalview.api.ViewStyleI#setUpperCasebold(boolean)
+   */
+  public void setUpperCasebold(boolean upperCasebold)
+  {
+    viewStyle.setUpperCasebold(upperCasebold);
+  }
 
-  protected boolean ignoreGapsInConsensusCalculation = false;
+  /**
+   * @return
+   * @see jalview.api.ViewStyleI#isUpperCasebold()
+   */
+  public boolean isUpperCasebold()
+  {
+    return viewStyle.isUpperCasebold();
+  }
 
-  protected ColourSchemeI globalColourScheme = null;
+  /**
+   * @return
+   * @see jalview.api.ViewStyleI#isSeqNameItalics()
+   */
+  public boolean isSeqNameItalics()
+  {
+    return viewStyle.isSeqNameItalics();
+  }
 
   /**
-   * gui state - changes to colour scheme propagated to all groups
+   * @param colourByReferenceSeq
+   * @see jalview.api.ViewStyleI#setColourByReferenceSeq(boolean)
    */
-  private boolean colourAppliesToAllGroups;
+  public void setColourByReferenceSeq(boolean colourByReferenceSeq)
+  {
+    viewStyle.setColourByReferenceSeq(colourByReferenceSeq);
+  }
 
   /**
-   * @param value
-   *          indicating if subsequent colourscheme changes will be propagated
-   *          to all groups
+   * @param b
+   * @see jalview.api.ViewStyleI#setColourAppliesToAllGroups(boolean)
    */
   public void setColourAppliesToAllGroups(boolean b)
   {
-    colourAppliesToAllGroups = b;
+    viewStyle.setColourAppliesToAllGroups(b);
   }
 
   /**
-   * 
-   * 
-   * @return flag indicating if colourchanges propagated to all groups
+   * @return
+   * @see jalview.api.ViewStyleI#getColourAppliesToAllGroups()
    */
   public boolean getColourAppliesToAllGroups()
   {
-    return colourAppliesToAllGroups;
+    return viewStyle.getColourAppliesToAllGroups();
   }
 
-  boolean abovePIDThreshold = false;
-
   /**
-   * GUI state
-   * 
-   * @return true if percent identity threshold is applied to shading
+   * @return
+   * @see jalview.api.ViewStyleI#getAbovePIDThreshold()
    */
   public boolean getAbovePIDThreshold()
   {
-    return abovePIDThreshold;
+    return viewStyle.getAbovePIDThreshold();
+  }
+
+  /**
+   * @param inc
+   * @see jalview.api.ViewStyleI#setIncrement(int)
+   */
+  public void setIncrement(int inc)
+  {
+    viewStyle.setIncrement(inc);
+  }
+
+  /**
+   * @return
+   * @see jalview.api.ViewStyleI#getIncrement()
+   */
+  public int getIncrement()
+  {
+    return viewStyle.getIncrement();
   }
 
   /**
-   * GUI state
-   * 
-   * 
    * @param b
-   *          indicate if percent identity threshold is applied to shading
+   * @see jalview.api.ViewStyleI#setConservationSelected(boolean)
    */
-  public void setAbovePIDThreshold(boolean b)
+  public void setConservationSelected(boolean b)
   {
-    abovePIDThreshold = b;
+    viewStyle.setConservationSelected(b);
   }
 
-  int threshold;
+  /**
+   * @param show
+   * @see jalview.api.ViewStyleI#setShowHiddenMarkers(boolean)
+   */
+  public void setShowHiddenMarkers(boolean show)
+  {
+    viewStyle.setShowHiddenMarkers(show);
+  }
+
+  /**
+   * @return
+   * @see jalview.api.ViewStyleI#getShowHiddenMarkers()
+   */
+  public boolean getShowHiddenMarkers()
+  {
+    return viewStyle.getShowHiddenMarkers();
+  }
+
+  /**
+   * @param b
+   * @see jalview.api.ViewStyleI#setScaleRightWrapped(boolean)
+   */
+  public void setScaleRightWrapped(boolean b)
+  {
+    viewStyle.setScaleRightWrapped(b);
+  }
+
+  /**
+   * @param b
+   * @see jalview.api.ViewStyleI#setScaleLeftWrapped(boolean)
+   */
+  public void setScaleLeftWrapped(boolean b)
+  {
+    viewStyle.setScaleLeftWrapped(b);
+  }
+
+  /**
+   * @param b
+   * @see jalview.api.ViewStyleI#setScaleAboveWrapped(boolean)
+   */
+  public void setScaleAboveWrapped(boolean b)
+  {
+    viewStyle.setScaleAboveWrapped(b);
+  }
+
+  /**
+   * @return
+   * @see jalview.api.ViewStyleI#getScaleLeftWrapped()
+   */
+  public boolean getScaleLeftWrapped()
+  {
+    return viewStyle.getScaleLeftWrapped();
+  }
+
+  /**
+   * @return
+   * @see jalview.api.ViewStyleI#getScaleAboveWrapped()
+   */
+  public boolean getScaleAboveWrapped()
+  {
+    return viewStyle.getScaleAboveWrapped();
+  }
+
+  /**
+   * @return
+   * @see jalview.api.ViewStyleI#getScaleRightWrapped()
+   */
+  public boolean getScaleRightWrapped()
+  {
+    return viewStyle.getScaleRightWrapped();
+  }
+
+  /**
+   * @param b
+   * @see jalview.api.ViewStyleI#setAbovePIDThreshold(boolean)
+   */
+  public void setAbovePIDThreshold(boolean b)
+  {
+    viewStyle.setAbovePIDThreshold(b);
+  }
 
   /**
-   * DOCUMENT ME!
-   * 
    * @param thresh
-   *          DOCUMENT ME!
+   * @see jalview.api.ViewStyleI#setThreshold(int)
    */
   public void setThreshold(int thresh)
   {
-    threshold = thresh;
+    viewStyle.setThreshold(thresh);
   }
 
   /**
-   * DOCUMENT ME!
-   * 
-   * @return DOCUMENT ME!
+   * @return
+   * @see jalview.api.ViewStyleI#getThreshold()
    */
   public int getThreshold()
   {
-    return threshold;
+    return viewStyle.getThreshold();
   }
 
-  int increment;
+  /**
+   * @return
+   * @see jalview.api.ViewStyleI#getShowJVSuffix()
+   */
+  public boolean getShowJVSuffix()
+  {
+    return viewStyle.getShowJVSuffix();
+  }
 
   /**
-   * 
-   * @param inc
-   *          set the scalar for bleaching colourschemes according to degree of
-   *          conservation
+   * @param b
+   * @see jalview.api.ViewStyleI#setShowJVSuffix(boolean)
    */
-  public void setIncrement(int inc)
+  public void setShowJVSuffix(boolean b)
   {
-    increment = inc;
+    viewStyle.setShowJVSuffix(b);
   }
 
   /**
-   * GUI State
-   * 
-   * @return get scalar for bleaching colourschemes by conservation
+   * @param state
+   * @see jalview.api.ViewStyleI#setWrapAlignment(boolean)
    */
-  public int getIncrement()
+  public void setWrapAlignment(boolean state)
+  {
+    viewStyle.setWrapAlignment(state);
+  }
+
+  /**
+   * @param state
+   * @see jalview.api.ViewStyleI#setShowText(boolean)
+   */
+  public void setShowText(boolean state)
   {
-    return increment;
+    viewStyle.setShowText(state);
   }
 
-  boolean conservationColourSelected = false;
+  /**
+   * @param state
+   * @see jalview.api.ViewStyleI#setRenderGaps(boolean)
+   */
+  public void setRenderGaps(boolean state)
+  {
+    viewStyle.setRenderGaps(state);
+  }
 
   /**
-   * GUI state
-   * 
-   * @return true if conservation based shading is enabled
+   * @return
+   * @see jalview.api.ViewStyleI#getColourText()
    */
-  public boolean getConservationSelected()
+  public boolean getColourText()
   {
-    return conservationColourSelected;
+    return viewStyle.getColourText();
   }
 
   /**
-   * GUI state
-   * 
-   * @param b
-   *          enable conservation based shading
+   * @param state
+   * @see jalview.api.ViewStyleI#setColourText(boolean)
    */
-  public void setConservationSelected(boolean b)
+  public void setColourText(boolean state)
+  {
+    viewStyle.setColourText(state);
+  }
+
+  /**
+   * @return
+   * @see jalview.api.ViewStyleI#getWrapAlignment()
+   */
+  public boolean getWrapAlignment()
+  {
+    return viewStyle.getWrapAlignment();
+  }
+
+  /**
+   * @return
+   * @see jalview.api.ViewStyleI#getShowText()
+   */
+  public boolean getShowText()
   {
-    conservationColourSelected = b;
+    return viewStyle.getShowText();
   }
 
+  /**
+   * @return
+   * @see jalview.api.ViewStyleI#getWrappedWidth()
+   */
+  public int getWrappedWidth()
+  {
+    return viewStyle.getWrappedWidth();
+  }
+
+  /**
+   * @param w
+   * @see jalview.api.ViewStyleI#setWrappedWidth(int)
+   */
+  public void setWrappedWidth(int w)
+  {
+    viewStyle.setWrappedWidth(w);
+  }
+
+  /**
+   * @return
+   * @see jalview.api.ViewStyleI#getCharHeight()
+   */
+  public int getCharHeight()
+  {
+    return viewStyle.getCharHeight();
+  }
+
+  /**
+   * @param h
+   * @see jalview.api.ViewStyleI#setCharHeight(int)
+   */
+  public void setCharHeight(int h)
+  {
+    viewStyle.setCharHeight(h);
+  }
+
+  /**
+   * @return
+   * @see jalview.api.ViewStyleI#getCharWidth()
+   */
+  public int getCharWidth()
+  {
+    return viewStyle.getCharWidth();
+  }
+
+  /**
+   * @param w
+   * @see jalview.api.ViewStyleI#setCharWidth(int)
+   */
+  public void setCharWidth(int w)
+  {
+    viewStyle.setCharWidth(w);
+  }
+
+  /**
+   * @return
+   * @see jalview.api.ViewStyleI#getShowBoxes()
+   */
+  public boolean getShowBoxes()
+  {
+    return viewStyle.getShowBoxes();
+  }
+
+  /**
+   * @return
+   * @see jalview.api.ViewStyleI#getShowUnconserved()
+   */
+  public boolean getShowUnconserved()
+  {
+    return viewStyle.getShowUnconserved();
+  }
+
+  /**
+   * @param showunconserved
+   * @see jalview.api.ViewStyleI#setShowUnconserved(boolean)
+   */
+  public void setShowUnconserved(boolean showunconserved)
+  {
+    viewStyle.setShowUnconserved(showunconserved);
+  }
+
+  /**
+   * @param default1
+   * @see jalview.api.ViewStyleI#setSeqNameItalics(boolean)
+   */
+  public void setSeqNameItalics(boolean default1)
+  {
+    viewStyle.setSeqNameItalics(default1);
+  }
+
+  /**
+   * @param selected
+   * @see jalview.api.ViewStyleI#setShowSeqFeaturesHeight(boolean)
+   */
+  public void setShowSeqFeaturesHeight(boolean selected)
+  {
+    viewStyle.setShowSeqFeaturesHeight(selected);
+  }
+
+  /**
+   * alignment displayed in the viewport. Please use get/setter
+   */
+  protected AlignmentI alignment;
+
+  @Override
+  public AlignmentI getAlignment()
+  {
+    return alignment;
+  }
+
+  @Override
+  public char getGapCharacter()
+  {
+    return alignment.getGapCharacter();
+  }
+
+  protected String sequenceSetID;
+
+  /**
+   * probably unused indicator that view is of a dataset rather than an
+   * alignment
+   */
+  protected boolean isDataset = false;
+
+  public void setDataset(boolean b)
+  {
+    isDataset = b;
+  }
+
+  public boolean isDataset()
+  {
+    return isDataset;
+  }
+
+
+  private Map<SequenceI, SequenceCollectionI> hiddenRepSequences;
+
+  protected ColumnSelection colSel = new ColumnSelection();
+
+  public boolean autoCalculateConsensus = true;
+
+  protected boolean autoCalculateStrucConsensus = true;
+
+  protected boolean ignoreGapsInConsensusCalculation = false;
+
+  protected ColourSchemeI globalColourScheme = null;
+
+
   @Override
   public void setGlobalColourScheme(ColourSchemeI cs)
   {
@@ -224,7 +556,8 @@ public abstract class AlignmentViewport implements AlignViewportI
               || cs instanceof Blosum62ColourScheme)
       {
         recalc = true;
-        cs.setThreshold(threshold, ignoreGapsInConsensusCalculation);
+        cs.setThreshold(viewStyle.getThreshold(),
+                ignoreGapsInConsensusCalculation);
       }
       else
       {
@@ -251,12 +584,13 @@ public abstract class AlignmentViewport implements AlignViewportI
         if (getAbovePIDThreshold() || cs instanceof PIDColourScheme
                 || cs instanceof Blosum62ColourScheme)
         {
-          sg.cs.setThreshold(threshold, getIgnoreGapsConsensus());
+          sg.cs.setThreshold(viewStyle.getThreshold(),
+                  isIgnoreGapsConsensus());
           recalc = true;
         }
         else
         {
-          sg.cs.setThreshold(0, getIgnoreGapsConsensus());
+          sg.cs.setThreshold(0, isIgnoreGapsConsensus());
         }
 
         if (getConservationSelected())
@@ -449,7 +783,9 @@ public abstract class AlignmentViewport implements AlignViewportI
           AlignmentAnnotation alignmentAnnotation)
   {
     if (!alignmentAnnotation.autoCalculated)
+    {
       return false;
+    }
     if (calculator.workingInvolvedWith(alignmentAnnotation))
     {
       // System.err.println("grey out ("+alignmentAnnotation.label+")");
@@ -578,11 +914,6 @@ public abstract class AlignmentViewport implements AlignViewportI
   }
 
   /**
-   * show non-conserved residues only
-   */
-  protected boolean showUnconserved = false;
-
-  /**
    * when set, updateAlignment will always ensure sequences are of equal length
    */
   private boolean padGaps = false;
@@ -592,24 +923,6 @@ public abstract class AlignmentViewport implements AlignViewportI
    */
   public boolean sortByTree = false;
 
-  public boolean getShowUnconserved()
-  {
-    return showUnconserved;
-  }
-
-  public void setShowUnconserved(boolean showunconserved)
-  {
-    showUnconserved = showunconserved;
-  }
-
-  /**
-   * @param showNonconserved
-   *          the showUnconserved to set
-   */
-  public void setShowunconserved(boolean displayNonconserved)
-  {
-    this.showUnconserved = displayNonconserved;
-  }
 
   /**
    * 
@@ -638,10 +951,6 @@ public abstract class AlignmentViewport implements AlignViewportI
   public void setHiddenColumns(ColumnSelection colsel)
   {
     this.colSel = colsel;
-    if (colSel.getHiddenColumns() != null)
-    {
-      hasHiddenColumns = true;
-    }
   }
 
   @Override
@@ -650,9 +959,14 @@ public abstract class AlignmentViewport implements AlignViewportI
     return colSel;
   }
 
+  @Override
   public void setColumnSelection(ColumnSelection colSel)
   {
     this.colSel = colSel;
+    if (colSel != null)
+    {
+      updateHiddenColumns();
+    }
   }
 
   /**
@@ -672,15 +986,22 @@ public abstract class AlignmentViewport implements AlignViewportI
     this.hiddenRepSequences = hiddenRepSequences;
   }
 
-  protected boolean hasHiddenColumns = false;
+  @Override
+  public boolean hasHiddenColumns()
+  {
+    return colSel != null && colSel.hasHiddenColumns();
+  }
 
   public void updateHiddenColumns()
   {
-    hasHiddenColumns = colSel.getHiddenColumns() != null;
+    // this method doesn't really do anything now. But - it could, since a
+    // column Selection could be in the process of modification
+    // hasHiddenColumns = colSel.hasHiddenColumns();
   }
 
   protected boolean hasHiddenRows = false;
 
+  @Override
   public boolean hasHiddenRows()
   {
     return hasHiddenRows;
@@ -698,6 +1019,7 @@ public abstract class AlignmentViewport implements AlignViewportI
     sequenceSetID = new String(newid);
   }
 
+  @Override
   public String getSequenceSetId()
   {
     if (sequenceSetID == null)
@@ -788,7 +1110,7 @@ public abstract class AlignmentViewport implements AlignViewportI
   }
 
   @Override
-  public boolean getIgnoreGapsConsensus()
+  public boolean isIgnoreGapsConsensus()
   {
     return ignoreGapsInConsensusCalculation;
   }
@@ -859,7 +1181,6 @@ public abstract class AlignmentViewport implements AlignViewportI
     colSel.hideSelectedColumns();
     setSelectionGroup(null);
 
-    hasHiddenColumns = true;
   }
 
   public void hideColumns(int start, int end)
@@ -872,23 +1193,17 @@ public abstract class AlignmentViewport implements AlignViewportI
     {
       colSel.hideColumns(start, end);
     }
-
-    hasHiddenColumns = true;
   }
 
   public void showColumn(int col)
   {
     colSel.revealHiddenColumns(col);
-    if (colSel.getHiddenColumns() == null)
-    {
-      hasHiddenColumns = false;
-    }
+
   }
 
   public void showAllHiddenColumns()
   {
     colSel.revealAllHiddenColumns();
-    hasHiddenColumns = false;
   }
 
   // common hide/show seq stuff
@@ -901,11 +1216,12 @@ public abstract class AlignmentViewport implements AlignViewportI
         selectionGroup = new SequenceGroup();
         selectionGroup.setEndRes(alignment.getWidth() - 1);
       }
-      Vector tmp = alignment.getHiddenSequences().showAll(
+      List<SequenceI> tmp = alignment.getHiddenSequences().showAll(
               hiddenRepSequences);
-      for (int t = 0; t < tmp.size(); t++)
+      for (SequenceI seq : tmp)
       {
-        selectionGroup.addSequence((SequenceI) tmp.elementAt(t), false);
+        selectionGroup.addSequence(seq, false);
+        setSequenceAnnotationsVisible(seq, true);
       }
 
       hasHiddenRows = false;
@@ -920,7 +1236,8 @@ public abstract class AlignmentViewport implements AlignViewportI
 
   public void showSequence(int index)
   {
-    Vector tmp = alignment.getHiddenSequences().showSequence(index,
+    List<SequenceI> tmp = alignment.getHiddenSequences().showSequence(
+            index,
             hiddenRepSequences);
     if (tmp.size() > 0)
     {
@@ -930,9 +1247,10 @@ public abstract class AlignmentViewport implements AlignViewportI
         selectionGroup.setEndRes(alignment.getWidth() - 1);
       }
 
-      for (int t = 0; t < tmp.size(); t++)
+      for (SequenceI seq : tmp)
       {
-        selectionGroup.addSequence((SequenceI) tmp.elementAt(t), false);
+        selectionGroup.addSequence(seq, false);
+        setSequenceAnnotationsVisible(seq, true);
       }
       // JBPNote: refactor: only update flag if we modified visiblity (used to
       // do this regardless)
@@ -966,12 +1284,30 @@ public abstract class AlignmentViewport implements AlignViewportI
       for (int i = 0; i < seq.length; i++)
       {
         alignment.getHiddenSequences().hideSequence(seq[i]);
+        setSequenceAnnotationsVisible(seq[i], false);
       }
       hasHiddenRows = true;
       firePropertyChange("alignment", null, alignment.getSequences());
     }
   }
 
+  /**
+   * Set visibility for any annotations for the given sequence.
+   * 
+   * @param sequenceI
+   */
+  protected void setSequenceAnnotationsVisible(SequenceI sequenceI,
+          boolean visible)
+  {
+    for (AlignmentAnnotation ann : alignment.getAlignmentAnnotation())
+    {
+      if (ann.sequenceRef == sequenceI)
+      {
+        ann.visible = visible;
+      }
+    }
+  }
+
   public void hideRepSequences(SequenceI repSequence, SequenceGroup sg)
   {
     int sSize = sg.getSize();
@@ -1010,8 +1346,8 @@ public abstract class AlignmentViewport implements AlignViewportI
 
   public boolean isHiddenRepSequence(SequenceI seq)
   {
-    return hiddenRepSequences != null
-            && hiddenRepSequences.containsKey(seq);
+    return alignment.getSeqrep()==seq || (hiddenRepSequences != null
+            && hiddenRepSequences.containsKey(seq));
   }
 
   public SequenceGroup getRepresentedSequences(SequenceI seq)
@@ -1020,32 +1356,24 @@ public abstract class AlignmentViewport implements AlignViewportI
             : hiddenRepSequences.get(seq));
   }
 
+  @Override
   public int adjustForHiddenSeqs(int alignmentIndex)
   {
     return alignment.getHiddenSequences().adjustForHiddenSeqs(
             alignmentIndex);
   }
 
-  // Selection manipulation
-  /**
-   * broadcast selection to any interested parties
-   */
+  @Override
   public abstract void sendSelection();
 
+  @Override
   public void invertColumnSelection()
   {
     colSel.invertColumnSelection(0, alignment.getWidth());
   }
 
-  /**
-   * This method returns an array of new SequenceI objects derived from the
-   * whole alignment or just the current selection with start and end points
-   * adjusted
-   * 
-   * @note if you need references to the actual SequenceI objects in the
-   *       alignment or currently selected then use getSequenceSelection()
-   * @return selection as new sequenceI objects
-   */
+
+  @Override
   public SequenceI[] getSelectionAsNewSequence()
   {
     SequenceI[] sequences;
@@ -1074,12 +1402,7 @@ public abstract class AlignmentViewport implements AlignViewportI
     return sequences;
   }
 
-  /**
-   * get the currently selected sequence objects or all the sequences in the
-   * alignment.
-   * 
-   * @return array of references to sequence objects
-   */
+
   @Override
   public SequenceI[] getSequenceSelection()
   {
@@ -1095,31 +1418,16 @@ public abstract class AlignmentViewport implements AlignViewportI
     return sequences;
   }
 
-  /**
-   * This method returns the visible alignment as text, as seen on the GUI, ie
-   * if columns are hidden they will not be returned in the result. Use this for
-   * calculating trees, PCA, redundancy etc on views which contain hidden
-   * columns.
-   * 
-   * @return String[]
-   */
+
   @Override
   public jalview.datamodel.CigarArray getViewAsCigars(
           boolean selectedRegionOnly)
   {
-    return new jalview.datamodel.CigarArray(alignment,
-            (hasHiddenColumns ? colSel : null),
+    return new jalview.datamodel.CigarArray(alignment, colSel,
             (selectedRegionOnly ? selectionGroup : null));
   }
 
-  /**
-   * return a compact representation of the current alignment selection to pass
-   * to an analysis function
-   * 
-   * @param selectedOnly
-   *          boolean true to just return the selected view
-   * @return AlignmentView
-   */
+
   @Override
   public jalview.datamodel.AlignmentView getAlignmentView(
           boolean selectedOnly)
@@ -1127,34 +1435,17 @@ public abstract class AlignmentViewport implements AlignViewportI
     return getAlignmentView(selectedOnly, false);
   }
 
-  /**
-   * return a compact representation of the current alignment selection to pass
-   * to an analysis function
-   * 
-   * @param selectedOnly
-   *          boolean true to just return the selected view
-   * @param markGroups
-   *          boolean true to annotate the alignment view with groups on the
-   *          alignment (and intersecting with selected region if selectedOnly
-   *          is true)
-   * @return AlignmentView
-   */
+
   @Override
   public jalview.datamodel.AlignmentView getAlignmentView(
           boolean selectedOnly, boolean markGroups)
   {
     return new AlignmentView(alignment, colSel, selectionGroup,
-            hasHiddenColumns, selectedOnly, markGroups);
+            colSel != null && colSel.hasHiddenColumns(), selectedOnly,
+            markGroups);
   }
 
-  /**
-   * This method returns the visible alignment as text, as seen on the GUI, ie
-   * if columns are hidden they will not be returned in the result. Use this for
-   * calculating trees, PCA, redundancy etc on views which contain hidden
-   * columns.
-   * 
-   * @return String[]
-   */
+
   @Override
   public String[] getViewAsString(boolean selectedRegionOnly)
   {
@@ -1177,7 +1468,7 @@ public abstract class AlignmentViewport implements AlignViewportI
     }
 
     selection = new String[iSize];
-    if (hasHiddenColumns)
+    if (colSel != null && colSel.hasHiddenColumns())
     {
       selection = colSel.getVisibleSequenceStrings(start, end, seqs);
     }
@@ -1192,15 +1483,8 @@ public abstract class AlignmentViewport implements AlignViewportI
     return selection;
   }
 
-  /**
-   * return visible region boundaries within given column range
-   * 
-   * @param min
-   *          first column (inclusive, from 0)
-   * @param max
-   *          last column (exclusive)
-   * @return int[][] range of {start,end} visible positions
-   */
+
+  @Override
   public int[][] getVisibleRegionBoundaries(int min, int max)
   {
     Vector regions = new Vector();
@@ -1209,7 +1493,7 @@ public abstract class AlignmentViewport implements AlignViewportI
 
     do
     {
-      if (hasHiddenColumns)
+      if (colSel != null && colSel.hasHiddenColumns())
       {
         if (start == 0)
         {
@@ -1230,7 +1514,7 @@ public abstract class AlignmentViewport implements AlignViewportI
       regions.addElement(new int[]
       { start, end });
 
-      if (hasHiddenColumns)
+      if (colSel != null && colSel.hasHiddenColumns())
       {
         start = colSel.adjustForHiddenColumns(end);
         start = colSel.getHiddenBoundaryLeft(start) + 1;
@@ -1245,18 +1529,37 @@ public abstract class AlignmentViewport implements AlignViewportI
 
   }
 
-  /**
-   * @return the padGaps
-   */
+  @Override
+  public List<AlignmentAnnotation> getVisibleAlignmentAnnotation(boolean selectedOnly)
+  {
+    ArrayList<AlignmentAnnotation> ala = new ArrayList<AlignmentAnnotation>();
+    AlignmentAnnotation[] aa;
+    if ((aa=alignment.getAlignmentAnnotation())!=null)
+    {
+      for (AlignmentAnnotation annot:aa)
+      {
+        AlignmentAnnotation clone = new AlignmentAnnotation(annot);
+        if (selectedOnly && selectionGroup!=null)
+        {
+          colSel.makeVisibleAnnotation(selectionGroup.getStartRes(), selectionGroup.getEndRes(),clone);
+        } else {
+          colSel.makeVisibleAnnotation(clone);
+        }
+        ala.add(clone);
+      }
+    }
+    return ala;
+  }
+
+
+  @Override
   public boolean isPadGaps()
   {
     return padGaps;
   }
 
-  /**
-   * @param padGaps
-   *          the padGaps to set
-   */
+
+  @Override
   public void setPadGaps(boolean padGaps)
   {
     this.padGaps = padGaps;
@@ -1268,6 +1571,7 @@ public abstract class AlignmentViewport implements AlignViewportI
    * 
    * @param ap
    */
+  @Override
   public void alignmentChanged(AlignmentViewPanel ap)
   {
     if (isPadGaps())
@@ -1429,6 +1733,7 @@ public abstract class AlignmentViewport implements AlignViewportI
    * 
    * @see jalview.api.AlignViewportI#calcPanelHeight()
    */
+  @Override
   public int calcPanelHeight()
   {
     // setHeight of panels
@@ -1560,6 +1865,23 @@ public abstract class AlignmentViewport implements AlignViewportI
     }
     oldrfs.clear();
   }
+  @Override
+  public boolean isDisplayReferenceSeq()
+  {
+    return alignment.hasSeqrep() && viewStyle.isDisplayReferenceSeq();
+  }
+
+  @Override
+  public void setDisplayReferenceSeq(boolean displayReferenceSeq)
+  {
+    viewStyle.setDisplayReferenceSeq(displayReferenceSeq);
+  }
+
+  public boolean isColourByReferenceSeq()
+  {
+    return alignment.hasSeqrep() && viewStyle.isColourByReferenceSeq();
+  }
+
 
   @Override
   public Color getSequenceColour(SequenceI seq)
@@ -1627,14 +1949,281 @@ public abstract class AlignmentViewport implements AlignViewportI
     return featuresDisplayed;
   }
 
+  @Override
   public void setFeaturesDisplayed(FeaturesDisplayedI featuresDisplayedI)
   {
     featuresDisplayed = featuresDisplayedI;
   }
 
+  @Override
   public boolean areFeaturesDisplayed()
   {
     return featuresDisplayed != null && featuresDisplayed.getRegisterdFeaturesCount()>0;
   }
 
+  /**
+   * set the flag
+   * 
+   * @param b
+   *          features are displayed if true
+   */
+  @Override
+  public void setShowSequenceFeatures(boolean b)
+  {
+    viewStyle.setShowSequenceFeatures(b);
+  }
+  @Override
+  public boolean isShowSequenceFeatures()
+  {
+    return viewStyle.isShowSequenceFeatures();
+  }
+
+  @Override
+  public void setShowSequenceFeaturesHeight(boolean selected)
+  {
+    viewStyle.setShowSeqFeaturesHeight(selected);
+  }
+
+  @Override
+  public boolean isShowSequenceFeaturesHeight()
+  {
+    return viewStyle.isShowSequenceFeaturesHeight();
+  }
+
+
+
+  @Override
+  public void setShowAnnotation(boolean b)
+  {
+    viewStyle.setShowAnnotation(b);
+  }
+
+  @Override
+  public boolean isShowAnnotation()
+  {
+    return viewStyle.isShowAnnotation();
+  }
+
+  @Override
+  public boolean isRightAlignIds()
+  {
+    return viewStyle.isRightAlignIds();
+  }
+
+  @Override
+  public void setRightAlignIds(boolean rightAlignIds)
+  {
+    viewStyle.setRightAlignIds(rightAlignIds);
+  }
+
+  @Override
+  public boolean getConservationSelected()
+  {
+    return viewStyle.getConservationSelected();
+  }
+
+  @Override
+  public void setShowBoxes(boolean state)
+  {
+    viewStyle.setShowBoxes(state);
+  }
+
+  /**
+   * @return
+   * @see jalview.api.ViewStyleI#getTextColour()
+   */
+  public Color getTextColour()
+  {
+    return viewStyle.getTextColour();
+  }
+
+  /**
+   * @return
+   * @see jalview.api.ViewStyleI#getTextColour2()
+   */
+  public Color getTextColour2()
+  {
+    return viewStyle.getTextColour2();
+  }
+
+  /**
+   * @return
+   * @see jalview.api.ViewStyleI#getThresholdTextColour()
+   */
+  public int getThresholdTextColour()
+  {
+    return viewStyle.getThresholdTextColour();
+  }
+
+  /**
+   * @return
+   * @see jalview.api.ViewStyleI#isConservationColourSelected()
+   */
+  public boolean isConservationColourSelected()
+  {
+    return viewStyle.isConservationColourSelected();
+  }
+
+  /**
+   * @return
+   * @see jalview.api.ViewStyleI#isRenderGaps()
+   */
+  public boolean isRenderGaps()
+  {
+    return viewStyle.isRenderGaps();
+  }
+
+  /**
+   * @return
+   * @see jalview.api.ViewStyleI#isShowColourText()
+   */
+  public boolean isShowColourText()
+  {
+    return viewStyle.isShowColourText();
+  }
+
+  /**
+   * @return
+   * @see jalview.api.ViewStyleI#isShowSeqFeaturesHeight()
+   */
+  public boolean isShowSeqFeaturesHeight()
+  {
+    return viewStyle.isShowSeqFeaturesHeight();
+  }
+
+  /**
+   * @param conservationColourSelected
+   * @see jalview.api.ViewStyleI#setConservationColourSelected(boolean)
+   */
+  public void setConservationColourSelected(
+          boolean conservationColourSelected)
+  {
+    viewStyle.setConservationColourSelected(conservationColourSelected);
+  }
+
+  /**
+   * @param showColourText
+   * @see jalview.api.ViewStyleI#setShowColourText(boolean)
+   */
+  public void setShowColourText(boolean showColourText)
+  {
+    viewStyle.setShowColourText(showColourText);
+  }
+
+  /**
+   * @param textColour
+   * @see jalview.api.ViewStyleI#setTextColour(java.awt.Color)
+   */
+  public void setTextColour(Color textColour)
+  {
+    viewStyle.setTextColour(textColour);
+  }
+
+  /**
+   * @param thresholdTextColour
+   * @see jalview.api.ViewStyleI#setThresholdTextColour(int)
+   */
+  public void setThresholdTextColour(int thresholdTextColour)
+  {
+    viewStyle.setThresholdTextColour(thresholdTextColour);
+  }
+
+  /**
+   * @param textColour2
+   * @see jalview.api.ViewStyleI#setTextColour2(java.awt.Color)
+   */
+  public void setTextColour2(Color textColour2)
+  {
+    viewStyle.setTextColour2(textColour2);
+  }
+
+  @Override
+  public ViewStyleI getViewStyle()
+  {
+    return new ViewStyle(viewStyle);
+  }
+
+  @Override
+  public void setViewStyle(ViewStyleI settingsForView)
+  {
+    viewStyle = new ViewStyle(settingsForView);
+  }
+
+  @Override
+  public boolean sameStyle(ViewStyleI them)
+  {
+    return viewStyle.sameStyle(them);
+  }
+
+  /**
+   * @return
+   * @see jalview.api.ViewStyleI#getIdWidth()
+   */
+  public int getIdWidth()
+  {
+    return viewStyle.getIdWidth();
+  }
+
+  /**
+   * @param i
+   * @see jalview.api.ViewStyleI#setIdWidth(int)
+   */
+  public void setIdWidth(int i)
+  {
+    viewStyle.setIdWidth(i);
+  }
+
+  /**
+   * @return
+   * @see jalview.api.ViewStyleI#isCentreColumnLabels()
+   */
+  public boolean isCentreColumnLabels()
+  {
+    return viewStyle.isCentreColumnLabels();
+  }
+
+  /**
+   * @param centreColumnLabels
+   * @see jalview.api.ViewStyleI#setCentreColumnLabels(boolean)
+   */
+  public void setCentreColumnLabels(boolean centreColumnLabels)
+  {
+    viewStyle.setCentreColumnLabels(centreColumnLabels);
+  }
+
+  /**
+   * @param showdbrefs
+   * @see jalview.api.ViewStyleI#setShowDBRefs(boolean)
+   */
+  public void setShowDBRefs(boolean showdbrefs)
+  {
+    viewStyle.setShowDBRefs(showdbrefs);
+  }
+
+  /**
+   * @return
+   * @see jalview.api.ViewStyleI#isShowDBRefs()
+   */
+  public boolean isShowDBRefs()
+  {
+    return viewStyle.isShowDBRefs();
+  }
+
+  /**
+   * @return
+   * @see jalview.api.ViewStyleI#isShowNPFeats()
+   */
+  public boolean isShowNPFeats()
+  {
+    return viewStyle.isShowNPFeats();
+  }
+
+  /**
+   * @param shownpfeats
+   * @see jalview.api.ViewStyleI#setShowNPFeats(boolean)
+   */
+  public void setShowNPFeats(boolean shownpfeats)
+  {
+    viewStyle.setShowNPFeats(shownpfeats);
+  }
 }