Merge branch 'features/JAL-2360colourSchemeApplicability' into
[jalview.git] / src / jalview / viewmodel / AlignmentViewport.java
index cb43d90..0803773 100644 (file)
@@ -36,15 +36,17 @@ import jalview.datamodel.Annotation;
 import jalview.datamodel.CigarArray;
 import jalview.datamodel.ColumnSelection;
 import jalview.datamodel.HiddenSequences;
-import jalview.datamodel.SearchResults;
+import jalview.datamodel.ProfilesI;
+import jalview.datamodel.SearchResultsI;
 import jalview.datamodel.Sequence;
 import jalview.datamodel.SequenceCollectionI;
 import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
 import jalview.schemes.Blosum62ColourScheme;
+import jalview.schemes.CollectionColourScheme;
+import jalview.schemes.CollectionColourSchemeI;
 import jalview.schemes.ColourSchemeI;
 import jalview.schemes.PIDColourScheme;
-import jalview.schemes.ResidueProperties;
 import jalview.structure.CommandListener;
 import jalview.structure.StructureSelectionManager;
 import jalview.structure.VamsasSource;
@@ -597,7 +599,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
 
   protected boolean ignoreGapsInConsensusCalculation = false;
 
-  protected ColourSchemeI globalColourScheme = null;
+  protected CollectionColourScheme globalColourScheme;
 
   @Override
   public void setGlobalColourScheme(ColourSchemeI cs)
@@ -609,28 +611,39 @@ public abstract class AlignmentViewport implements AlignViewportI,
     // - 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;
+
+    /*
+     * only instantiate colour scheme once, thereafter update it
+     */
+    if (globalColourScheme == null)
+    {
+      globalColourScheme = new CollectionColourScheme();
+    }
+    globalColourScheme.setColourScheme(cs);
+
     boolean recalc = false;
     if (cs != null)
     {
-      cs.setConservationApplied(recalc = getConservationSelected());
+      recalc = getConservationSelected();
       if (getAbovePIDThreshold() || cs instanceof PIDColourScheme
               || cs instanceof Blosum62ColourScheme)
       {
         recalc = true;
-        cs.setThreshold(viewStyle.getThreshold(),
+        globalColourScheme.setThreshold(viewStyle.getThreshold(),
                 ignoreGapsInConsensusCalculation);
       }
       else
       {
-        cs.setThreshold(0, ignoreGapsInConsensusCalculation);
+        globalColourScheme
+                .setThreshold(0, ignoreGapsInConsensusCalculation);
       }
       if (recalc)
       {
-        cs.setConsensus(hconsensus);
-        cs.setConservation(hconservation);
+        globalColourScheme.setConsensus(hconsensus);
+        globalColourScheme.setConservation(hconservation);
       }
-      cs.alignmentChanged(alignment, hiddenRepSequences);
+      globalColourScheme.setConservationApplied(getConservationSelected());
+      globalColourScheme.alignmentChanged(alignment, hiddenRepSequences);
     }
     if (getColourAppliesToAllGroups())
     {
@@ -638,31 +651,33 @@ public abstract class AlignmentViewport implements AlignViewportI,
       {
         if (cs == null)
         {
-          sg.cs = null;
+          sg.setColourScheme(null);
           continue;
         }
-        sg.cs = cs.applyTo(sg, getHiddenRepSequences());
+        CollectionColourScheme groupColour = new CollectionColourScheme(cs.getInstance(sg,
+                getHiddenRepSequences()));
+        sg.setGroupColourScheme(groupColour);
         sg.setConsPercGaps(ConsPercGaps);
         if (getAbovePIDThreshold() || cs instanceof PIDColourScheme
                 || cs instanceof Blosum62ColourScheme)
         {
-          sg.cs.setThreshold(viewStyle.getThreshold(),
+          groupColour.setThreshold(viewStyle.getThreshold(),
                   isIgnoreGapsConsensus());
           recalc = true;
         }
         else
         {
-          sg.cs.setThreshold(0, isIgnoreGapsConsensus());
+          groupColour.setThreshold(0, isIgnoreGapsConsensus());
         }
 
         if (getConservationSelected())
         {
-          sg.cs.setConservationApplied(true);
+          groupColour.setConservationApplied(true);
           recalc = true;
         }
         else
         {
-          sg.cs.setConservation(null);
+          groupColour.setConservation(null);
           // sg.cs.setThreshold(0, getIgnoreGapsConsensus());
         }
         if (recalc)
@@ -671,7 +686,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
         }
         else
         {
-          sg.cs.alignmentChanged(sg, hiddenRepSequences);
+          groupColour.alignmentChanged(sg, hiddenRepSequences);
         }
       }
     }
@@ -680,6 +695,13 @@ public abstract class AlignmentViewport implements AlignViewportI,
   @Override
   public ColourSchemeI getGlobalColourScheme()
   {
+    return globalColourScheme == null ? null : globalColourScheme
+            .getColourScheme();
+  }
+
+  @Override
+  public CollectionColourSchemeI getViewportColourScheme()
+  {
     return globalColourScheme;
   }
 
@@ -700,7 +722,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
   /**
    * results of alignment consensus analysis for visible portion of view
    */
-  protected Hashtable[] hconsensus = null;
+  protected ProfilesI hconsensus = null;
 
   /**
    * results of cDNA complement consensus visible portion of view
@@ -734,7 +756,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
   }
 
   @Override
-  public void setSequenceConsensusHash(Hashtable[] hconsensus)
+  public void setSequenceConsensusHash(ProfilesI hconsensus)
   {
     this.hconsensus = hconsensus;
   }
@@ -746,7 +768,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
   }
 
   @Override
-  public Hashtable[] getSequenceConsensusHash()
+  public ProfilesI getSequenceConsensusHash()
   {
     return hconsensus;
   }
@@ -939,7 +961,9 @@ public abstract class AlignmentViewport implements AlignViewportI,
     groupConservation = null;
     hconsensus = null;
     hcomplementConsensus = null;
-    // TODO removed listeners from changeSupport?
+    // colour scheme may hold reference to consensus
+    globalColourScheme = null;
+    // TODO remove listeners from changeSupport?
     changeSupport = null;
     setAlignment(null);
   }
@@ -1574,7 +1598,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
   public boolean isHiddenRepSequence(SequenceI seq)
   {
     return (hiddenRepSequences != null && hiddenRepSequences
-                    .containsKey(seq));
+            .containsKey(seq));
   }
 
   /**
@@ -1856,7 +1880,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
    */
   void resetAllColourSchemes()
   {
-    ColourSchemeI cs = globalColourScheme;
+    CollectionColourScheme cs = globalColourScheme;
     if (cs != null)
     {
       cs.alignmentChanged(alignment, hiddenRepSequences);
@@ -1865,8 +1889,8 @@ public abstract class AlignmentViewport implements AlignViewportI,
       if (cs.conservationApplied())
       {
         cs.setConservation(Conservation.calculateConservation("All",
-                ResidueProperties.propHash, 3, alignment.getSequences(), 0,
-                alignment.getWidth(), false, getConsPercGaps(), false));
+                alignment.getSequences(), 0, alignment.getWidth(), false,
+                getConsPercGaps(), false));
       }
     }
 
@@ -2715,7 +2739,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
    *          the SearchResults to add to
    * @return the offset (below top of visible region) of the matched sequence
    */
-  protected int findComplementScrollTarget(SearchResults sr)
+  protected int findComplementScrollTarget(SearchResultsI sr)
   {
     final AlignViewportI complement = getCodingComplement();
     if (complement == null || !complement.isFollowHighlight())
@@ -2797,8 +2821,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
   public void expandColSelection(SequenceGroup sg, boolean wholewidth)
   {
     int sgs, sge;
-    if (sg != null
-            && (sgs = sg.getStartRes()) >= 0
+    if (sg != null && (sgs = sg.getStartRes()) >= 0
             && sg.getStartRes() <= (sge = sg.getEndRes())
             && !this.hasSelectedColumns())
     {
@@ -2823,6 +2846,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
    */
   private boolean selectionIsDefinedGroup = false;
 
+
   @Override
   public boolean isSelectionDefinedGroup()
   {
@@ -2846,4 +2870,27 @@ public abstract class AlignmentViewport implements AlignViewportI,
     return selectionGroup.getContext() == alignment
             || selectionIsDefinedGroup;
   }
+
+  /**
+   * null, or currently highlighted results on this view
+   */
+  private SearchResultsI searchResults = null;
+
+  @Override
+  public boolean hasSearchResults()
+  {
+    return searchResults != null;
+  }
+
+  @Override
+  public void setSearchResults(SearchResultsI results)
+  {
+    searchResults = results;
+  }
+
+  @Override
+  public SearchResultsI getSearchResults()
+  {
+    return searchResults;
+  }
 }