JAL-975 JAL-974 JAL-976 always adjust height after new annotation added
[jalview.git] / src / jalview / viewmodel / AlignmentViewport.java
index fcb03d8..27af11e 100644 (file)
@@ -17,6 +17,7 @@
  */
 package jalview.viewmodel;
 
+import jalview.analysis.AAFrequency;
 import jalview.analysis.Conservation;
 import jalview.api.AlignCalcManagerI;
 import jalview.api.AlignViewportI;
@@ -27,17 +28,21 @@ import jalview.datamodel.AlignmentView;
 import jalview.datamodel.Annotation;
 import jalview.datamodel.ColumnSelection;
 import jalview.datamodel.Sequence;
+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.workers.AlignCalcManager;
 import jalview.workers.ConsensusThread;
-import jalview.workers.ConservationThread;
 import jalview.workers.StrucConsensusThread;
 
 import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
 import java.util.Vector;
 
 /**
@@ -62,7 +67,7 @@ public abstract class AlignmentViewport implements AlignViewportI
    */
   protected boolean isDataset = false;
 
-  private Hashtable hiddenRepSequences;
+  private Map<SequenceI, SequenceCollectionI> hiddenRepSequences;
 
   protected ColumnSelection colSel = new ColumnSelection();
 
@@ -74,10 +79,192 @@ public abstract class AlignmentViewport implements AlignViewportI
 
   protected ColourSchemeI globalColourScheme = null;
 
+  /**
+   * gui state - changes to colour scheme propagated to all groups
+   */
+  private boolean colourAppliesToAllGroups;
+
+  /**
+   * @param value
+   *          indicating if subsequent colourscheme changes will be propagated
+   *          to all groups
+   */
+  public void setColourAppliesToAllGroups(boolean b)
+  {
+    colourAppliesToAllGroups = b;
+  }
+
+  /**
+   *
+   *
+   * @return flag indicating if colourchanges propagated to all groups
+   */
+  public boolean getColourAppliesToAllGroups()
+  {
+    return colourAppliesToAllGroups;
+  }
+
+  boolean abovePIDThreshold = false;
+
+  /**
+   * GUI state
+   *
+   * @return true if percent identity threshold is applied to shading
+   */
+  public boolean getAbovePIDThreshold()
+  {
+    return abovePIDThreshold;
+  }
+
+  /**
+   * GUI state
+   *
+   *
+   * @param b
+   *          indicate if percent identity threshold is applied to shading
+   */
+  public void setAbovePIDThreshold(boolean b)
+  {
+    abovePIDThreshold = b;
+  }
+
+  int threshold;
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @param thresh
+   *          DOCUMENT ME!
+   */
+  public void setThreshold(int thresh)
+  {
+    threshold = thresh;
+  }
+
+  /**
+   * DOCUMENT ME!
+   *
+   * @return DOCUMENT ME!
+   */
+  public int getThreshold()
+  {
+    return threshold;
+  }
+
+  int increment;
+
+  /**
+   *
+   * @param inc
+   *          set the scalar for bleaching colourschemes according to degree of
+   *          conservation
+   */
+  public void setIncrement(int inc)
+  {
+    increment = inc;
+  }
+
+  /**
+   * GUI State
+   *
+   * @return get scalar for bleaching colourschemes by conservation
+   */
+  public int getIncrement()
+  {
+    return increment;
+  }
+
+  boolean conservationColourSelected = false;
+
+  /**
+   * GUI state
+   *
+   * @return true if conservation based shading is enabled
+   */
+  public boolean getConservationSelected()
+  {
+    return conservationColourSelected;
+  }
+
+  /**
+   * GUI state
+   *
+   * @param b
+   *          enable conservation based shading
+   */
+  public void setConservationSelected(boolean b)
+  {
+    conservationColourSelected = b;
+  }
 
+  @Override
   public void setGlobalColourScheme(ColourSchemeI cs)
   {
+    // TODO: logic refactored from AlignFrame changeColour -
+    // autorecalc stuff should be changed to rely on the worker system
+    // check to see if we should implement a changeColour(cs) method rather than
+    // put th logic in here
+    // - means that caller decides if they want to just modify state and defer
+    // calculation till later or to do all calculations in thread.
+    // via changecolour
     globalColourScheme = cs;
+    if (getColourAppliesToAllGroups())
+    {
+      for (SequenceGroup sg : getAlignment().getGroups())
+      {
+        if (cs == null)
+        {
+          sg.cs = null;
+          continue;
+        }
+        if (cs instanceof ClustalxColourScheme)
+        {
+          sg.cs = new ClustalxColourScheme(sg, getHiddenRepSequences());
+        }
+        else
+        {
+          try
+          {
+            sg.cs = cs.getClass().newInstance();
+          } catch (Exception ex)
+          {
+            ex.printStackTrace();
+            sg.cs = cs;
+          }
+        }
+
+        if (getAbovePIDThreshold() || cs instanceof PIDColourScheme
+                || cs instanceof Blosum62ColourScheme)
+        {
+          sg.cs.setThreshold(threshold, getIgnoreGapsConsensus());
+          sg.cs.setConsensus(AAFrequency.calculate(
+                  sg.getSequences(getHiddenRepSequences()), 0,
+                  sg.getWidth()));
+        }
+        else
+        {
+          sg.cs.setThreshold(0, getIgnoreGapsConsensus());
+        }
+
+        if (getConservationSelected())
+        {
+          Conservation c = new Conservation("Group",
+                  ResidueProperties.propHash, 3,
+                  sg.getSequences(getHiddenRepSequences()), 0,
+                  getAlignment().getWidth() - 1);
+          c.calculate();
+          c.verdict(false, getConsPercGaps());
+          sg.cs.setConservation(c);
+        }
+        else
+        {
+          sg.cs.setConservation(null);
+          sg.cs.setThreshold(0, getIgnoreGapsConsensus());
+        }
+
+      }
+    }
+
   }
 
   @Override
@@ -184,8 +371,8 @@ public abstract class AlignmentViewport implements AlignViewportI
     {
       return;
     }
-    if (!calculator
-            .startRegisteredWorkersOfClass(jalview.workers.ConservationThread.class))
+    if (calculator
+            .getRegisteredWorkersOfClass(jalview.workers.ConservationThread.class)==null)
     {
       calculator.registerWorker(new jalview.workers.ConservationThread(
               this, ap));
@@ -202,7 +389,7 @@ public abstract class AlignmentViewport implements AlignViewportI
     {
       return;
     }
-    if (!calculator.startRegisteredWorkersOfClass(ConsensusThread.class))
+    if (calculator.getRegisteredWorkersOfClass(ConsensusThread.class)==null)
     {
       calculator.registerWorker(new ConsensusThread(this, ap));
     }
@@ -222,8 +409,8 @@ public abstract class AlignmentViewport implements AlignViewportI
     {
       return;
     }
-    if (!calculator
-            .startRegisteredWorkersOfClass(StrucConsensusThread.class))
+    if (calculator
+            .getRegisteredWorkersOfClass(StrucConsensusThread.class)==null)
     {
       calculator.registerWorker(new StrucConsensusThread(this, ap));
     }
@@ -442,14 +629,24 @@ public abstract class AlignmentViewport implements AlignViewportI
   {
     this.colSel = colSel;
   }
-  public Hashtable getHiddenRepSequences()
+
+  /**
+   *
+   * @return
+   */
+  @Override
+  public Map<SequenceI, SequenceCollectionI> getHiddenRepSequences()
   {
     return hiddenRepSequences;
   }
-  public void setHiddenRepSequences(Hashtable hiddenRepSequences)
+
+  @Override
+  public void setHiddenRepSequences(
+          Map<SequenceI, SequenceCollectionI> hiddenRepSequences)
   {
     this.hiddenRepSequences = hiddenRepSequences;
   }
+
   protected boolean hasHiddenColumns = false;
 
   public void updateHiddenColumns()
@@ -1060,12 +1257,11 @@ public abstract class AlignmentViewport implements AlignViewportI
 
     // Reset endRes of groups if beyond alignment width
     int alWidth = alignment.getWidth();
-    Vector groups = alignment.getGroups();
+    List<SequenceGroup> groups = alignment.getGroups();
     if (groups != null)
     {
-      for (int i = 0; i < groups.size(); i++)
+      for (SequenceGroup sg : groups)
       {
-        SequenceGroup sg = (SequenceGroup) groups.elementAt(i);
         if (sg.getEndRes() > alWidth)
         {
           sg.setEndRes(alWidth - 1);
@@ -1083,7 +1279,6 @@ public abstract class AlignmentViewport implements AlignViewportI
     // alignment.adjustSequenceAnnotations();
   }
 
-  
   /**
    * reset scope and do calculations for all applied colourschemes on alignment
    */
@@ -1092,13 +1287,7 @@ public abstract class AlignmentViewport implements AlignViewportI
     ColourSchemeI cs = globalColourScheme;
     if (cs != null)
     {
-      cs.alignmentChanged(alignment);
-      // TODO: fold all recalc events for clustalX into alignmentChanged
-      if (cs instanceof ClustalxColourScheme)
-      {
-        ((ClustalxColourScheme) cs).resetClustalX(alignment.getSequences(),
-                alignment.getWidth());
-      }
+      cs.alignmentChanged(alignment, null);
 
       cs.setConsensus(hconsensus);
       if (cs.conservationApplied())
@@ -1109,14 +1298,11 @@ public abstract class AlignmentViewport implements AlignViewportI
       }
     }
 
-    int s, sSize = alignment.getGroups().size();
-    for (s = 0; s < sSize; s++)
+    for (SequenceGroup sg : alignment.getGroups())
     {
-      SequenceGroup sg = (SequenceGroup) alignment.getGroups().elementAt(s);
-      if (sg.cs != null && sg.cs instanceof ClustalxColourScheme)
+      if (sg.cs != null)
       {
-        ((ClustalxColourScheme) sg.cs).resetClustalX(sg
-                .getSequences(hiddenRepSequences), sg.getWidth());
+        sg.cs.alignmentChanged(sg, hiddenRepSequences);
       }
       sg.recalcConservation();
     }
@@ -1188,4 +1374,75 @@ public abstract class AlignmentViewport implements AlignViewportI
     }
   }
 
+  /*
+   * (non-Javadoc)
+   * @see jalview.api.AlignViewportI#calcPanelHeight()
+   */
+  public int calcPanelHeight()
+  {
+    // setHeight of panels
+    AlignmentAnnotation[] aa = getAlignment().getAlignmentAnnotation();
+    int height = 0;
+    int charHeight=getCharHeight();
+    if (aa != null)
+    {
+      boolean graphgrp[] = null;
+      for (int i = 0; i < aa.length; i++)
+      {
+        if (aa[i] == null)
+        {
+          System.err.println("Null annotation row: ignoring.");
+          continue;
+        }
+        if (!aa[i].visible)
+        {
+          continue;
+        }
+        if (aa[i].graphGroup > -1)
+        {
+          if (graphgrp == null)
+          {
+            graphgrp = new boolean[aa.length];
+          }
+          if (graphgrp[aa[i].graphGroup])
+          {
+            continue;
+          }
+          else
+          {
+            graphgrp[aa[i].graphGroup] = true;
+          }
+        }
+        aa[i].height = 0;
+  
+        if (aa[i].hasText)
+        {
+          aa[i].height += charHeight;
+        }
+  
+        if (aa[i].hasIcons)
+        {
+          aa[i].height += 16;
+        }
+  
+        if (aa[i].graph > 0)
+        {
+          aa[i].height += aa[i].graphHeight;
+        }
+  
+        if (aa[i].height == 0)
+        {
+          aa[i].height = 20;
+        }
+  
+        height += aa[i].height;
+      }
+    }
+    if (height == 0)
+    {
+      // set minimum
+      height = 20;
+    }
+    return height;
+  }
 }