Merge branch 'features/JAL-2360colourSchemeApplicability' into
[jalview.git] / src / jalview / viewmodel / AlignmentViewport.java
index 254a201..0803773 100644 (file)
@@ -36,13 +36,15 @@ import jalview.datamodel.Annotation;
 import jalview.datamodel.CigarArray;
 import jalview.datamodel.ColumnSelection;
 import jalview.datamodel.HiddenSequences;
-import jalview.datamodel.ProfileI;
-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.structure.CommandListener;
@@ -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,7 +611,16 @@ 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)
     {
@@ -618,20 +629,21 @@ public abstract class AlignmentViewport implements AlignViewportI,
               || 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.setConservationApplied(getConservationSelected());
-      cs.alignmentChanged(alignment, hiddenRepSequences);
+      globalColourScheme.setConservationApplied(getConservationSelected());
+      globalColourScheme.alignmentChanged(alignment, hiddenRepSequences);
     }
     if (getColourAppliesToAllGroups())
     {
@@ -639,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)
@@ -672,7 +686,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
         }
         else
         {
-          sg.cs.alignmentChanged(sg, hiddenRepSequences);
+          groupColour.alignmentChanged(sg, hiddenRepSequences);
         }
       }
     }
@@ -681,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;
   }
 
@@ -701,7 +722,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
   /**
    * results of alignment consensus analysis for visible portion of view
    */
-  protected ProfileI[] hconsensus = null;
+  protected ProfilesI hconsensus = null;
 
   /**
    * results of cDNA complement consensus visible portion of view
@@ -735,7 +756,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
   }
 
   @Override
-  public void setSequenceConsensusHash(ProfileI[] hconsensus)
+  public void setSequenceConsensusHash(ProfilesI hconsensus)
   {
     this.hconsensus = hconsensus;
   }
@@ -747,7 +768,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
   }
 
   @Override
-  public ProfileI[] getSequenceConsensusHash()
+  public ProfilesI getSequenceConsensusHash()
   {
     return hconsensus;
   }
@@ -1859,7 +1880,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
    */
   void resetAllColourSchemes()
   {
-    ColourSchemeI cs = globalColourScheme;
+    CollectionColourScheme cs = globalColourScheme;
     if (cs != null)
     {
       cs.alignmentChanged(alignment, hiddenRepSequences);
@@ -1867,7 +1888,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
       cs.setConsensus(hconsensus);
       if (cs.conservationApplied())
       {
-        cs.setConservation(Conservation.calculateConservation("All", 3,
+        cs.setConservation(Conservation.calculateConservation("All",
                 alignment.getSequences(), 0, alignment.getWidth(), false,
                 getConsPercGaps(), false));
       }
@@ -2718,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())
@@ -2825,6 +2846,7 @@ public abstract class AlignmentViewport implements AlignViewportI,
    */
   private boolean selectionIsDefinedGroup = false;
 
+
   @Override
   public boolean isSelectionDefinedGroup()
   {
@@ -2848,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;
+  }
 }