Merge branch 'develop' into merge/JAL-3127
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Mon, 11 Mar 2019 15:07:39 +0000 (15:07 +0000)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Mon, 11 Mar 2019 15:07:39 +0000 (15:07 +0000)
Conflicts:
src/jalview/viewmodel/AlignmentViewport.java

57 files changed:
examples/groovy/colourConserved.groovy
examples/groovy/colourSchemes.groovy
examples/groovy/colourUnconserved.groovy
help/html/calculations/treeviewer.html
help/html/colourSchemes/index.html
help/html/menus/alignmentMenu.html
help/html/menus/alwcolour.html
resources/lang/Messages.properties
resources/lang/Messages_es.properties
src/jalview/api/AlignViewportI.java
src/jalview/appletgui/AlignViewport.java
src/jalview/appletgui/TreeCanvas.java
src/jalview/bin/Jalview.java
src/jalview/controller/AlignViewController.java
src/jalview/datamodel/AlignmentView.java
src/jalview/datamodel/SequenceCollectionI.java
src/jalview/gui/AlignFrame.java
src/jalview/gui/AlignViewport.java
src/jalview/gui/AlignmentPanel.java
src/jalview/gui/AnnotationChooser.java
src/jalview/gui/AnnotationColourChooser.java
src/jalview/gui/PopupMenu.java
src/jalview/gui/StructureViewerBase.java
src/jalview/gui/TreeCanvas.java
src/jalview/io/AnnotationFile.java
src/jalview/project/Jalview2XML.java
src/jalview/schemes/AnnotationColourGradient.java
src/jalview/schemes/Blosum62ColourScheme.java
src/jalview/schemes/BuriedColourScheme.java
src/jalview/schemes/ClustalxColourScheme.java
src/jalview/schemes/ColourSchemeI.java
src/jalview/schemes/ColourSchemeProperty.java
src/jalview/schemes/ColourSchemes.java
src/jalview/schemes/CovariationColourScheme.java
src/jalview/schemes/FollowerColourScheme.java
src/jalview/schemes/HelixColourScheme.java
src/jalview/schemes/HydrophobicColourScheme.java
src/jalview/schemes/IdColourScheme.java [new file with mode: 0644]
src/jalview/schemes/JalviewColourScheme.java
src/jalview/schemes/NucleotideColourScheme.java
src/jalview/schemes/PIDColourScheme.java
src/jalview/schemes/PurinePyrimidineColourScheme.java
src/jalview/schemes/RNAHelicesColour.java
src/jalview/schemes/RNAInteractionColourScheme.java
src/jalview/schemes/ScoreColourScheme.java
src/jalview/schemes/StrandColourScheme.java
src/jalview/schemes/TCoffeeColourScheme.java
src/jalview/schemes/TaylorColourScheme.java
src/jalview/schemes/TurnColourScheme.java
src/jalview/schemes/UserColourScheme.java
src/jalview/schemes/ZappoColourScheme.java
src/jalview/viewmodel/AlignmentViewport.java
test/jalview/project/Jalview2xmlTests.java
test/jalview/schemes/AnnotationColourGradientTest.java
test/jalview/schemes/ColourSchemePropertyTest.java
test/jalview/schemes/ColourSchemesTest.java
test/jalview/schemes/JalviewColourSchemeTest.java

index 4a15922..35c54d5 100644 (file)
@@ -24,6 +24,7 @@ import jalview.schemes.ColourSchemes
 import jalview.datamodel.AnnotatedCollectionI
 import jalview.datamodel.SequenceI
 import jalview.datamodel.SequenceCollectionI
+import jalview.api.AlignViewportI
 import jalview.util.Comparison
 
 /*
@@ -42,7 +43,7 @@ conserved = { ->
     /*
      * to make a new instance for each alignment view
      */
-    getInstance: { AnnotatedCollectionI coll, Map<SequenceI, SequenceCollectionI> map -> conserved() },
+    getInstance: { AlignViewportI view, AnnotatedCollectionI coll, Map<SequenceI, SequenceCollectionI> map -> conserved() },
     
     /*
      * method only needed if colour scheme has to recalculate
index d5ca973..3f1f953 100644 (file)
@@ -4,6 +4,7 @@ import jalview.schemes.ColourSchemes;
 import jalview.datamodel.AnnotatedCollectionI;
 import jalview.datamodel.SequenceI;
 import jalview.datamodel.SequenceCollectionI;
+import jalview.api.AlignViewportI
 
 /*
  * Example script that registers two new alignment colour schemes
@@ -25,7 +26,7 @@ candy = { ->
     /*
      * to make a new instance for each alignment view
      */
-    getInstance: { AnnotatedCollectionI coll, Map<SequenceI, SequenceCollectionI> map -> candy() },
+    getInstance: { AlignViewportI view, AnnotatedCollectionI coll, Map<SequenceI, SequenceCollectionI> map -> candy() },
     
     /*
      * method only needed if colour scheme has to recalculate
index 68730f3..e186766 100644 (file)
@@ -24,6 +24,7 @@ import jalview.schemes.ColourSchemes
 import jalview.datamodel.AnnotatedCollectionI
 import jalview.datamodel.SequenceI
 import jalview.datamodel.SequenceCollectionI
+import jalview.api.AlignViewportI
 import jalview.util.Comparison
 
 /*
index 3d6245e..8cb2b59 100755 (executable)
   </p>
   <p>
     <strong><em>Selecting Sequence Leaf Nodes</em></strong><br>
-    Selecting sequence ids at the leaves of the tree selects the
+    Selecting sequence IDs at the leaves of the tree selects the
     corresponding sequences in the original alignment. These selections
     are also reflected in any other analysis windows associated with the
     alignment, such as another tree viewer.
   </p>
   <p>
-    <strong><em>Grouping sequences by partitioning the
-        tree at a particular distanec</em></strong><br> Clicking anywhere along
+    <strong><em><a name="partitioning">Grouping sequences by partitioning</a> the
+        tree at a particular distance</em></strong><br> Clicking anywhere along
     the extent of the tree (but not on a leaf or internal node) defines
     a tree 'partition', by cutting every branch of the tree spanning the
     depth where the mouse-click occurred. Groups are created containing
     sequences at the leaves of each connected sub tree. These groups are
     each given a different colour, which are reflected in other windows
-    in the same way as if the sequence ids were selected, and can be
+    in the same way as if the sequence IDs were selected, and can be
     edited in the same way as user defined sequence groups.
   </p>
   <p>
     identifying specific patterns of conservation and mutation
     corresponding to the overall phylogenetic structure, when combined
     with the <a href="../colourSchemes/conservation.html">conservation
-      based colour scheme</a>.
+      based colour scheme</a>.To distinguish parts of the alignment assigned
+    to different groups, you may also enable the Sequence ID colour
+    scheme via the <a href="../menus/alwcolour.html">Alignment
+      window's Colours menu</a> (<em>Since 2.11</em>).
   </p>
   <p>
     <strong><em>Selecting Subtrees and changing the branch
index 7664101..51d0738 100755 (executable)
@@ -35,18 +35,18 @@ td {
   <p>
     <strong>Colour schemes</strong>
   </p>
-  <p>Jalview allows the user to set a background colour for the
+  <p>Jalview allows the user to set a colour scheme for the
     whole alignment view or for each group defined on regions within it.</p>
-  <p>To change the background colour, simply select the colour from
+  <p>To change the colour for a view, simply select a new colour scheme from
     the &quot;Colour&quot; menu.</p>
   <p>To change the colour of a group, right click on any residue
     within a group and use the popup menu to define the group colour.</p>
-  <p>At the top of the &quot;Colour&quot; menu the tick box
-    &quot;Apply Background Colour to all groups&quot;. This is ticked by
+  <p>At the top of the &quot;Colour&quot; menu you'll see a tick box
+    &quot;Apply Colour to all groups&quot;. This is ticked by
     default so that a chosen colour scheme will be applied to all
     existing groups. If you wish to maintain the colour scheme for
-    defined groups, make sure you deselect this option before changing
-    the background colour.</p>
+    defined groups, make sure you deselect this option before selecting
+    a new scheme in the Colour menu.</p>
   <p>
     The <strong>&quot;Colour&#8594;<a
       href="../colourSchemes/textcolour.html">Colour Text...</a>&quot;
index f3ab75d..3a057a8 100755 (executable)
       </strong> <em>See <a href="../colourSchemes/index.html">colours</a>
           for a description of all colour schemes.
       </em><br></li>
-      <li><strong>By Conservation<br>
+        <li><strong>Sequence ID<br></strong><em>Shades
+            sequences using their Sequence ID colour. Useful when
+            performing <a
+            href="../calculations/treeviewer.html#partitioning">tree
+              based subfamily analysis</a>.
+        </em></li>
+        <li><strong>By Conservation<br>
       </strong><em>See <a href="../colourSchemes/conservation.html">Colouring
             by Conservation</a>.
       </em><br></li>
index e62a130..9a96595 100755 (executable)
         a description of all colour schemes.
     </em><br>
     </li>
+    <li><strong>Sequence ID<br></strong><em>Shades
+        sequences using their Sequence ID colour. Useful when performing
+        <a href="../calculations/treeviewer.html#partitioning">tree
+          based subfamily analysis</a>.
+    </em></li>
     <li><strong>By Conservation<br>
     </strong><em>See <a href="../colourSchemes/conservation.html">Colouring
           by Conservation</a>.
index c5f2372..6b56f07 100644 (file)
@@ -199,6 +199,7 @@ label.colourScheme_purine/pyrimidine = Purine/Pyrimidine
 label.colourScheme_nucleotide = Nucleotide
 label.colourScheme_t-coffee_scores = T-Coffee Scores
 label.colourScheme_rna_helices = By RNA Helices
+label.colourScheme_sequence_id = Sequence ID Colour
 label.blc = BLC
 label.fasta = Fasta
 label.msf = MSF
index 7ad1828..c367eea 100644 (file)
@@ -195,6 +195,7 @@ label.colourScheme_purine/pyrimidine = Purina/Pirimidina
 label.colourScheme_nucleotide = Nucleótido
 label.colourScheme_t-coffee_scores = Puntuación del T-Coffee
 label.colourScheme_rna_helices = Por hélices de RNA
+label.colourScheme_sequence_id = Color de ID de secuencia
 label.blc = BLC
 label.fasta = Fasta
 label.msf = MSF
index 931eba6..389d9cf 100644 (file)
@@ -490,4 +490,32 @@ public interface AlignViewportI extends ViewStyleI
   public abstract TreeModel getCurrentTree();
 
   public abstract void setCurrentTree(TreeModel tree);
+
+  /**
+   * @param update
+   *          - set the flag for updating structures on next repaint
+   */
+  void setUpdateStructures(boolean update);
+
+  /**
+   *
+   * @return true if structure views will be updated on next refresh
+   */
+  boolean isUpdateStructures();
+
+  /**
+   * check if structure views need to be updated, and clear the flag afterwards.
+   * 
+   * @return if an update is needed
+   */
+  boolean needToUpdateStructureViews();
+
+  /**
+   * Adds sequencegroup to the alignment in the view. Also adds a group to the
+   * complement view if one is defined.
+   * 
+   * @param sequenceGroup
+   *          - a group defined on sequences in the alignment held by the view
+   */
+  void addSequenceGroup(SequenceGroup sequenceGroup);
 }
index 262948d..055584a 100644 (file)
@@ -25,14 +25,11 @@ import jalview.api.FeatureSettingsModelI;
 import jalview.bin.JalviewLite;
 import jalview.commands.CommandI;
 import jalview.datamodel.AlignmentI;
-import jalview.datamodel.Annotation;
 import jalview.datamodel.ColumnSelection;
 import jalview.datamodel.HiddenColumns;
 import jalview.datamodel.SearchResults;
 import jalview.datamodel.SearchResultsI;
-import jalview.datamodel.Sequence;
 import jalview.datamodel.SequenceGroup;
-import jalview.datamodel.SequenceI;
 import jalview.renderer.ResidueShader;
 import jalview.schemes.ColourSchemeProperty;
 import jalview.schemes.UserColourScheme;
@@ -200,7 +197,8 @@ public class AlignViewport extends AlignmentViewport
       if (colour != null)
       {
         residueShading = new ResidueShader(
-                ColourSchemeProperty.getColourScheme(alignment, colour));
+                ColourSchemeProperty.getColourScheme(this, alignment,
+                        colour));
         if (residueShading != null)
         {
           residueShading.setConsensus(hconsensus);
index 6ee75bd..cb26fb5 100755 (executable)
@@ -631,7 +631,7 @@ public class TreeCanvas extends Panel
 
       Vector<SequenceNode> l = tree.findLeaves(groups.get(i));
 
-      Vector<SequenceI> sequences = new Vector<SequenceI>();
+      Vector<SequenceI> sequences = new Vector<>();
       for (int j = 0; j < l.size(); j++)
       {
         SequenceI s1 = (SequenceI) l.elementAt(j).element();
@@ -657,7 +657,8 @@ public class TreeCanvas extends Panel
         }
         else
         {
-          cs = ColourSchemeProperty.getColourScheme(sg, ColourSchemeProperty
+          cs = ColourSchemeProperty.getColourScheme(av, sg,
+                  ColourSchemeProperty
                   .getColourName(av.getGlobalColourScheme()));
         }
         // cs is null if shading is an annotationColourGradient
index c7738da..cc41c53 100755 (executable)
@@ -538,7 +538,8 @@ public class Jalview
           data.replaceAll("%20", " ");
 
           ColourSchemeI cs = ColourSchemeProperty
-                  .getColourScheme(af.getViewport().getAlignment(), data);
+                  .getColourScheme(af.getViewport(),
+                          af.getViewport().getAlignment(), data);
 
           if (cs != null)
           {
index d992e4e..a82b98d 100644 (file)
@@ -35,6 +35,7 @@ import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
 import jalview.io.DataSourceType;
 import jalview.io.FeaturesFile;
+import jalview.schemes.ColourSchemeI;
 import jalview.util.MessageManager;
 
 import java.awt.Color;
@@ -97,19 +98,22 @@ public class AlignViewController implements AlignViewControllerI
       viewport.getAlignment().deleteAllGroups();
       viewport.clearSequenceColours();
       viewport.setSelectionGroup(null);
+      ColourSchemeI colours = viewport.getGlobalColourScheme();
       // set view properties for each group
       for (int g = 0; g < gps.length; g++)
       {
         // gps[g].setShowunconserved(viewport.getShowUnconserved());
         gps[g].setshowSequenceLogo(viewport.isShowSequenceLogo());
         viewport.getAlignment().addGroup(gps[g]);
-        Color col = new Color((int) (Math.random() * 255),
-                (int) (Math.random() * 255), (int) (Math.random() * 255));
-        col = col.brighter();
-        for (SequenceI sq : gps[g].getSequences(null))
+        if (colours != null)
         {
-          viewport.setSequenceColour(sq, col);
+          gps[g].setColourScheme(colours.getInstance(viewport, gps[g]));
         }
+        Color col = new Color((int) (Math.random() * 255),
+                (int) (Math.random() * 255), (int) (Math.random() * 255));
+        gps[g].idColour = col;
+        viewport.setUpdateStructures(true);
+        viewport.addSequenceGroup(gps[g]);
       }
       return true;
     }
index d3d1b2b..e6604d1 100644 (file)
@@ -74,7 +74,7 @@ public class AlignmentView
 
     ScGroup()
     {
-      seqs = new ArrayList<SeqCigar>();
+      seqs = new ArrayList<>();
     }
 
     /**
@@ -160,7 +160,6 @@ public class AlignmentView
     SequenceI[] selseqs;
     if (selection != null && selection.getSize() > 0)
     {
-      List<SequenceI> sel = selection.getSequences(null);
       this.selected = new ScGroup();
       selseqs = selection.getSequencesInOrder(alignment,
               selectedRegionOnly);
@@ -170,9 +169,9 @@ public class AlignmentView
       selseqs = alignment.getSequencesArray();
     }
 
-    List<List<SequenceI>> seqsets = new ArrayList<List<SequenceI>>();
+    List<List<SequenceI>> seqsets = new ArrayList<>();
     // get the alignment's group list and make a copy
-    List<SequenceGroup> grps = new ArrayList<SequenceGroup>();
+    List<SequenceGroup> grps = new ArrayList<>();
     List<SequenceGroup> gg = alignment.getGroups();
     grps.addAll(gg);
     ScGroup[] sgrps = null;
@@ -185,7 +184,7 @@ public class AlignmentView
         // strip out any groups that do not actually intersect with the
         // visible and selected region
         int ssel = selection.getStartRes(), esel = selection.getEndRes();
-        List<SequenceGroup> isg = new ArrayList<SequenceGroup>();
+        List<SequenceGroup> isg = new ArrayList<>();
         for (SequenceGroup sg : grps)
         {
           if (!(sg.getStartRes() > esel || sg.getEndRes() < ssel))
@@ -245,7 +244,7 @@ public class AlignmentView
               {
                 if (scGroups == null)
                 {
-                  scGroups = new ArrayList<ScGroup>();
+                  scGroups = new ArrayList<>();
                 }
                 addedgps[sg] = true;
                 scGroups.add(sgrps[sg]);
index f681f11..e2bb5a6 100644 (file)
@@ -25,8 +25,21 @@ import java.util.Map;
 
 public interface SequenceCollectionI
 {
+  /**
+   * 
+   * @return (visible) sequences in this collection. This may be a direct
+   *         reference to the collection so not thread safe
+   */
   List<SequenceI> getSequences();
 
+  /**
+   * FIXME: AlignmentI.getSequences(hiddenReps) doesn't actually obey this
+   * contract!
+   * 
+   * @param hiddenReps
+   * @return the full set of sequences in this collection, including any
+   *         sequences represented by sequences in the collection.
+   */
   List<SequenceI> getSequences(
           Map<SequenceI, SequenceCollectionI> hiddenReps);
 
index 8dd6d0c..a587ac3 100644 (file)
@@ -3352,6 +3352,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
      * otherwise set the chosen colour scheme (or null for 'None')
      */
     ColourSchemeI cs = ColourSchemes.getInstance().getColourScheme(name,
+            viewport,
             viewport.getAlignment(), viewport.getHiddenRepSequences());
     changeColour(cs);
   }
@@ -5308,7 +5309,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     {
       PaintRefresher.Refresh(this, viewport.getSequenceSetId());
       alignPanel.updateAnnotation();
-      alignPanel.paintAlignment(true, true);
+      alignPanel.paintAlignment(true,
+              viewport.needToUpdateStructureViews());
     }
   }
 
index e0abfd9..bc668fd 100644 (file)
@@ -290,7 +290,7 @@ public class AlignViewport extends AlignmentViewport
               ResidueColourScheme.NONE);
     }
     ColourSchemeI colourScheme = ColourSchemeProperty
-            .getColourScheme(alignment, schemeName);
+            .getColourScheme(this, alignment, schemeName);
     residueShading = new ResidueShader(colourScheme);
 
     if (colourScheme instanceof UserColourScheme)
index 51e703d..92b9a50 100644 (file)
@@ -532,7 +532,7 @@ public class AlignmentPanel extends GAlignmentPanel implements
     addNotify();
     // TODO: many places call this method and also paintAlignment with various
     // different settings. this means multiple redraws are triggered...
-    paintAlignment(true, false);
+    paintAlignment(true, av.needToUpdateStructureViews());
   }
 
   /**
index 84883d7..791421d 100644 (file)
@@ -195,14 +195,7 @@ public class AnnotationChooser extends JPanel
   {
     setAnnotationVisibility(true);
 
-    // copied from AnnotationLabel.actionPerformed (after show/hide row)...
-    // TODO should drive this functionality into AlignmentPanel
     ap.updateAnnotation();
-    // this.ap.annotationPanel.adjustPanelHeight();
-    // this.ap.alabels.setSize(this.ap.alabels.getSize().width,
-    // this.ap.annotationPanel.getSize().height);
-    // this.ap.validate();
-    this.ap.paintAlignment(true, false);
   }
 
   /**
@@ -229,11 +222,6 @@ public class AnnotationChooser extends JPanel
       }
     }
     ap.updateAnnotation();
-    // // this.ap.annotationPanel.adjustPanelHeight();
-    // this.ap.alabels.setSize(this.ap.alabels.getSize().width,
-    // this.ap.annotationPanel.getSize().height);
-    // this.ap.validate();
-    this.ap.paintAlignment(true, false);
   }
 
   /**
@@ -249,9 +237,7 @@ public class AnnotationChooser extends JPanel
   {
     setAnnotationVisibility(false);
 
-    this.ap.updateAnnotation();
-    // this.ap.annotationPanel.adjustPanelHeight();
-    this.ap.paintAlignment(true, false);
+    ap.updateAnnotation();
   }
 
   /**
index 12693f0..60ad75d 100644 (file)
@@ -454,7 +454,7 @@ public class AnnotationColourChooser extends AnnotationRowFilter
           continue;
         }
         sg.setColourScheme(
-                acg.getInstance(sg, ap.av.getHiddenRepSequences()));
+                acg.getInstance(av, sg));
       }
     }
   }
index 8059935..86febed 100644 (file)
@@ -2151,7 +2151,7 @@ public class PopupMenu extends JPopupMenu implements ColourChangeListener
      * switch to the chosen colour scheme (or null for None)
      */
     ColourSchemeI colourScheme = ColourSchemes.getInstance()
-            .getColourScheme(colourSchemeName, sg,
+            .getColourScheme(colourSchemeName, ap.av, sg,
                     ap.av.getHiddenRepSequences());
     sg.setColourScheme(colourScheme);
     if (colourScheme instanceof Blosum62ColourScheme
index 72b0bcc..35a5475 100644 (file)
@@ -564,7 +564,8 @@ public abstract class StructureViewerBase extends GStructureViewer
   {
     AlignmentI al = getAlignmentPanel().av.getAlignment();
     ColourSchemeI cs = ColourSchemes.getInstance()
-            .getColourScheme(colourSchemeName, al, null);
+            .getColourScheme(colourSchemeName, getAlignmentPanel().av, al,
+                    null);
     getBinding().setJalviewColourScheme(cs);
   }
 
index c195c80..180467a 100755 (executable)
@@ -28,11 +28,8 @@ import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
 import jalview.datamodel.SequenceNode;
 import jalview.schemes.ColourSchemeI;
-import jalview.schemes.ColourSchemeProperty;
-import jalview.schemes.UserColourScheme;
 import jalview.structure.SelectionSource;
 import jalview.util.Format;
-import jalview.util.MappingUtils;
 import jalview.util.MessageManager;
 
 import java.awt.Color;
@@ -512,29 +509,21 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
       return;
     }
 
-    if ((node.left() == null) && (node.right() == null)) // TODO: internal node
+    node.color = c;
+    if (node.element() instanceof SequenceI)
     {
-      node.color = c;
-
-      if (node.element() instanceof SequenceI)
+      final SequenceI seq = (SequenceI) node.element();
+      AlignmentPanel[] aps = getAssociatedPanels();
+      if (aps != null)
       {
-        AlignmentPanel[] aps = getAssociatedPanels();
-        if (aps != null)
+        for (int a = 0; a < aps.length; a++)
         {
-          for (int a = 0; a < aps.length; a++)
-          {
-            final SequenceI seq = (SequenceI) node.element();
-            aps[a].av.setSequenceColour(seq, c);
-          }
+          aps[a].av.setSequenceColour(seq, c);
         }
       }
     }
-    else
-    {
-      node.color = c;
-      setColor((SequenceNode) node.left(), c);
-      setColor((SequenceNode) node.right(), c);
-    }
+    setColor((SequenceNode) node.left(), c);
+    setColor((SequenceNode) node.right(), c);
   }
 
   /**
@@ -960,6 +949,7 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
                     .deleteAllGroups();
             aps[a].av.getCodingComplement().clearSequenceColours();
           }
+          aps[a].av.setUpdateStructures(true);
         }
         colourGroups(groups);
 
@@ -1003,76 +993,48 @@ public class TreeCanvas extends JPanel implements MouseListener, Runnable,
       }
 
       ColourSchemeI cs = null;
-      SequenceGroup sg = new SequenceGroup(sequences, null, cs, true, true,
+      SequenceGroup _sg = new SequenceGroup(sequences, null, cs, true, true,
               false, 0, av.getAlignment().getWidth() - 1);
 
-      if (av.getGlobalColourScheme() != null)
-      {
-        if (av.getGlobalColourScheme() instanceof UserColourScheme)
-        {
-          cs = new UserColourScheme(
-                  ((UserColourScheme) av.getGlobalColourScheme())
-                          .getColours());
-
-        }
-        else
-        {
-          cs = ColourSchemeProperty.getColourScheme(sg, ColourSchemeProperty
-                  .getColourName(av.getGlobalColourScheme()));
-        }
-        // cs is null if shading is an annotationColourGradient
-        // if (cs != null)
-        // {
-        // cs.setThreshold(av.getViewportColourScheme().getThreshold(),
-        // av.isIgnoreGapsConsensus());
-        // }
-      }
-      sg.setColourScheme(cs);
-      sg.getGroupColourScheme().setThreshold(
-              av.getResidueShading().getThreshold(),
-              av.isIgnoreGapsConsensus());
-      // sg.recalcConservation();
-      sg.setName("JTreeGroup:" + sg.hashCode());
-      sg.setIdColour(col);
+      _sg.setName("JTreeGroup:" + _sg.hashCode());
+      _sg.setIdColour(col);
 
       for (int a = 0; a < aps.length; a++)
       {
-        if (aps[a].av.getGlobalColourScheme() != null
-                && aps[a].av.getResidueShading().conservationApplied())
-        {
-          Conservation c = new Conservation("Group", sg.getSequences(null),
-                  sg.getStartRes(), sg.getEndRes());
-          c.calculate();
-          c.verdict(false, aps[a].av.getConsPercGaps());
-          sg.cs.setConservation(c);
-        }
+        SequenceGroup sg = new SequenceGroup(_sg);
+        AlignViewport viewport = aps[a].av;
 
-        aps[a].av.getAlignment().addGroup(new SequenceGroup(sg));
-        // TODO can we push all of the below into AlignViewportI?
-        final AlignViewportI codingComplement = aps[a].av
-                .getCodingComplement();
-        if (codingComplement != null)
+        // Propagate group colours in each view
+        if (viewport.getGlobalColourScheme() != null)
         {
-          SequenceGroup mappedGroup = MappingUtils.mapSequenceGroup(sg, av,
-                  codingComplement);
-          if (mappedGroup.getSequences().size() > 0)
+          cs = viewport.getGlobalColourScheme().getInstance(viewport, sg);
+          sg.setColourScheme(cs);
+          sg.getGroupColourScheme().setThreshold(
+                  viewport.getResidueShading().getThreshold(),
+                  viewport.isIgnoreGapsConsensus());
+
+          if (viewport.getResidueShading().conservationApplied())
           {
-            codingComplement.getAlignment().addGroup(mappedGroup);
-            for (SequenceI seq : mappedGroup.getSequences())
-            {
-              codingComplement.setSequenceColour(seq, col.brighter());
-            }
+            Conservation c = new Conservation("Group",
+                    sg.getSequences(null), sg.getStartRes(),
+                    sg.getEndRes());
+            c.calculate();
+            c.verdict(false, viewport.getConsPercGaps());
+            sg.cs.setConservation(c);
           }
         }
+        // indicate that associated structure views will need an update
+        viewport.setUpdateStructures(true);
+        // propagate structure view update and sequence group to complement view
+        viewport.addSequenceGroup(sg);
       }
     }
 
-    // notify the panel(s) to redo any group specific stuff.
+    // notify the panel(s) to redo any group specific stuff
+    // also updates structure views if necessary
     for (int a = 0; a < aps.length; a++)
     {
       aps[a].updateAnnotation();
-      // TODO: JAL-868 - need to ensure view colour change message is broadcast
-      // to any Jmols listening in
       final AlignViewportI codingComplement = aps[a].av
               .getCodingComplement();
       if (codingComplement != null)
index e578a45..dd385d2 100755 (executable)
@@ -1617,8 +1617,10 @@ public class AnnotationFile
         }
         else if (key.equalsIgnoreCase("colour"))
         {
+          // TODO need to notify colourscheme of view reference once it is
+          // available
           sg.cs.setColourScheme(
-                  ColourSchemeProperty.getColourScheme(al, value));
+                  ColourSchemeProperty.getColourScheme(null, al, value));
         }
         else if (key.equalsIgnoreCase("pidThreshold"))
         {
index 1797fb7..cf5974c 100644 (file)
@@ -3859,7 +3859,7 @@ public class Jalview2XML
           }
           else
           {
-            cs = ColourSchemeProperty.getColourScheme(al,
+            cs = ColourSchemeProperty.getColourScheme(null, al,
                     jGroup.getColour());
           }
         }
@@ -4973,7 +4973,8 @@ public class Jalview2XML
       }
       else
       {
-        cs = ColourSchemeProperty.getColourScheme(al, view.getBgColour());
+        cs = ColourSchemeProperty.getColourScheme(af.getViewport(), al,
+                view.getBgColour());
       }
     }
 
@@ -5271,7 +5272,7 @@ public class Jalview2XML
     else
     {
       cs = new AnnotationColourGradient(matchedAnnotation,
-              ColourSchemeProperty.getColourScheme(al,
+              ColourSchemeProperty.getColourScheme(af.getViewport(), al,
                       viewAnnColour.getColourScheme()),
               safeInt(viewAnnColour.getAboveThreshold()));
     }
index 54eaeb0..75a07b9 100755 (executable)
@@ -20,6 +20,7 @@
  */
 package jalview.schemes;
 
+import jalview.api.AlignViewportI;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.AnnotatedCollectionI;
@@ -76,8 +77,8 @@ public class AnnotationColourGradient extends FollowerColourScheme
   private IdentityHashMap<SequenceI, AlignmentAnnotation> seqannot = null;
 
   @Override
-  public ColourSchemeI getInstance(AnnotatedCollectionI sg,
-          Map<SequenceI, SequenceCollectionI> hiddenRepSequences)
+  public ColourSchemeI getInstance(AlignViewportI view,
+          AnnotatedCollectionI sg)
   {
     AnnotationColourGradient acg = new AnnotationColourGradient(annotation,
             getColourScheme(), aboveAnnotationThreshold);
index 02f9b3e..8188f4d 100755 (executable)
 package jalview.schemes;
 
 import jalview.analysis.scoremodels.ScoreModels;
+import jalview.api.AlignViewportI;
 import jalview.api.analysis.PairwiseScoreModelI;
 import jalview.datamodel.AnnotatedCollectionI;
-import jalview.datamodel.SequenceCollectionI;
 import jalview.datamodel.SequenceI;
 import jalview.util.Comparison;
 
 import java.awt.Color;
-import java.util.Map;
 
 public class Blosum62ColourScheme extends ResidueColourScheme
 {
@@ -46,8 +45,8 @@ public class Blosum62ColourScheme extends ResidueColourScheme
    * be coloured
    */
   @Override
-  public ColourSchemeI getInstance(AnnotatedCollectionI coll,
-          Map<SequenceI, SequenceCollectionI> hrs)
+  public ColourSchemeI getInstance(AlignViewportI view,
+          AnnotatedCollectionI coll)
   {
     return new Blosum62ColourScheme();
   }
index a3b85b9..e6672fc 100755 (executable)
  */
 package jalview.schemes;
 
+import jalview.api.AlignViewportI;
 import jalview.datamodel.AnnotatedCollectionI;
-import jalview.datamodel.SequenceCollectionI;
-import jalview.datamodel.SequenceI;
 
 import java.awt.Color;
-import java.util.Map;
 
 /**
  * DOCUMENT ME!
@@ -75,8 +73,8 @@ public class BuriedColourScheme extends ScoreColourScheme
    * be coloured
    */
   @Override
-  public ColourSchemeI getInstance(AnnotatedCollectionI coll,
-          Map<SequenceI, SequenceCollectionI> hrs)
+  public ColourSchemeI getInstance(AlignViewportI view,
+          AnnotatedCollectionI coll)
   {
     return new BuriedColourScheme();
   }
index ec13343..b1cfe82 100755 (executable)
@@ -20,6 +20,7 @@
  */
 package jalview.schemes;
 
+import jalview.api.AlignViewportI;
 import jalview.datamodel.AnnotatedCollectionI;
 import jalview.datamodel.SequenceCollectionI;
 import jalview.datamodel.SequenceI;
@@ -335,11 +336,11 @@ public class ClustalxColourScheme extends ResidueColourScheme
   }
 
   @Override
-  public ColourSchemeI getInstance(AnnotatedCollectionI sg,
-          Map<SequenceI, SequenceCollectionI> hiddenRepSequences)
+  public ColourSchemeI getInstance(AlignViewportI view,
+          AnnotatedCollectionI sg)
   {
     ClustalxColourScheme css = new ClustalxColourScheme(sg,
-            hiddenRepSequences);
+            view.getHiddenRepSequences());
     css.includeGaps = includeGaps;
     return css;
   }
index d70b4e2..7b79d88 100755 (executable)
@@ -20,6 +20,7 @@
  */
 package jalview.schemes;
 
+import jalview.api.AlignViewportI;
 import jalview.datamodel.AnnotatedCollectionI;
 import jalview.datamodel.SequenceCollectionI;
 import jalview.datamodel.SequenceI;
@@ -62,12 +63,14 @@ public interface ColourSchemeI
    * new instance for each call to this method, as different instances may have
    * differing shading by consensus or percentage identity applied.
    * 
+   * @param viewport
+   *          - the parent viewport
    * @param sg
-   * @param hiddenRepSequences
+   *          - the collection of sequences to be coloured
    * @return copy of current scheme with any inherited settings transferred
    */
-  ColourSchemeI getInstance(AnnotatedCollectionI sg,
-          Map<SequenceI, SequenceCollectionI> hiddenRepSequences);
+  ColourSchemeI getInstance(AlignViewportI viewport,
+          AnnotatedCollectionI sg);
 
   /**
    * Answers true if the colour scheme is suitable for the given data, else
index fc92cd9..2d5b23d 100755 (executable)
@@ -20,6 +20,7 @@
  */
 package jalview.schemes;
 
+import jalview.api.AlignViewportI;
 import jalview.datamodel.AnnotatedCollectionI;
 import jalview.util.ColorUtils;
 
@@ -75,7 +76,8 @@ public class ColourSchemeProperty
    * @param name
    * @return
    */
-  public static ColourSchemeI getColourScheme(AnnotatedCollectionI forData,
+  public static ColourSchemeI getColourScheme(AlignViewportI view,
+          AnnotatedCollectionI forData,
           String name)
   {
     if (ResidueColourScheme.NONE.equalsIgnoreCase(name))
@@ -89,6 +91,7 @@ public class ColourSchemeProperty
      * create a new instance of it
      */
     ColourSchemeI scheme = ColourSchemes.getInstance().getColourScheme(name,
+            view,
             forData, null);
     if (scheme != null)
     {
index 99e9759..42465f2 100644 (file)
@@ -20,6 +20,7 @@
  */
 package jalview.schemes;
 
+import jalview.api.AlignViewportI;
 import jalview.datamodel.AnnotatedCollectionI;
 import jalview.datamodel.SequenceCollectionI;
 import jalview.datamodel.SequenceI;
@@ -65,7 +66,7 @@ public class ColourSchemes
      * store in an order-preserving map, so items can be added to menus 
      * in the order in which they are 'discovered'
      */
-    schemes = new LinkedHashMap<String, ColourSchemeI>();
+    schemes = new LinkedHashMap<>();
 
     for (JalviewColourScheme cs : JalviewColourScheme.values())
     {
@@ -76,6 +77,7 @@ public class ColourSchemes
       {
         System.err.println("Error instantiating colour scheme for "
                 + cs.toString() + " " + e.getMessage());
+        e.printStackTrace();
       }
     }
   }
@@ -126,6 +128,7 @@ public class ColourSchemes
    * 
    * @param name
    *          name of the colour scheme
+   * @param viewport
    * @param forData
    *          the data to be coloured
    * @param optional
@@ -134,7 +137,7 @@ public class ColourSchemes
    * @return
    */
   public ColourSchemeI getColourScheme(String name,
-          AnnotatedCollectionI forData,
+          AlignViewportI viewport, AnnotatedCollectionI forData,
           Map<SequenceI, SequenceCollectionI> hiddenRepSequences)
   {
     if (name == null)
@@ -142,7 +145,8 @@ public class ColourSchemes
       return null;
     }
     ColourSchemeI cs = schemes.get(name.toLowerCase());
-    return cs == null ? null : cs.getInstance(forData, hiddenRepSequences);
+    return cs == null ? null
+            : cs.getInstance(viewport, forData);
   }
 
   /**
@@ -158,7 +162,7 @@ public class ColourSchemes
   public ColourSchemeI getColourScheme(String name,
           AnnotatedCollectionI forData)
   {
-    return getColourScheme(name, forData, null);
+    return getColourScheme(name, null, forData, null);
   }
 
   /**
index 923bd85..dc7971b 100644 (file)
  */
 package jalview.schemes;
 
+import jalview.api.AlignViewportI;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.AnnotatedCollectionI;
-import jalview.datamodel.SequenceCollectionI;
-import jalview.datamodel.SequenceI;
 import jalview.util.ColorUtils;
 
 import java.awt.Color;
@@ -38,9 +37,9 @@ import java.util.Map;
  */
 public class CovariationColourScheme extends ResidueColourScheme
 {
-  public Map<String, Color> helixcolorhash = new Hashtable<String, Color>();
+  public Map<String, Color> helixcolorhash = new Hashtable<>();
 
-  public Map<Integer, String> positionsToHelix = new Hashtable<Integer, String>();
+  public Map<Integer, String> positionsToHelix = new Hashtable<>();
 
   int numHelix = 0;
 
@@ -51,8 +50,8 @@ public class CovariationColourScheme extends ResidueColourScheme
    * be coloured
    */
   @Override
-  public ColourSchemeI getInstance(AnnotatedCollectionI coll,
-          Map<SequenceI, SequenceCollectionI> hrs)
+  public ColourSchemeI getInstance(AlignViewportI view,
+          AnnotatedCollectionI coll)
   {
     return new CovariationColourScheme(coll.getAlignmentAnnotation()[0]);
   }
index 57c19e5..24b7713 100644 (file)
  */
 package jalview.schemes;
 
+import jalview.api.AlignViewportI;
 import jalview.datamodel.AnnotatedCollectionI;
-import jalview.datamodel.SequenceCollectionI;
-import jalview.datamodel.SequenceI;
-
-import java.util.Map;
 
 /**
  * Colourscheme that takes its colours from some other colourscheme
@@ -53,8 +50,8 @@ public class FollowerColourScheme extends ResidueColourScheme
    * be coloured
    */
   @Override
-  public ColourSchemeI getInstance(AnnotatedCollectionI coll,
-          Map<SequenceI, SequenceCollectionI> hrs)
+  public ColourSchemeI getInstance(AlignViewportI view,
+          AnnotatedCollectionI coll)
   {
     return new FollowerColourScheme();
   }
index 7123d93..2724f77 100755 (executable)
  */
 package jalview.schemes;
 
+import jalview.api.AlignViewportI;
 import jalview.datamodel.AnnotatedCollectionI;
-import jalview.datamodel.SequenceCollectionI;
-import jalview.datamodel.SequenceI;
 
 import java.awt.Color;
-import java.util.Map;
 
 public class HelixColourScheme extends ScoreColourScheme
 {
@@ -58,8 +56,8 @@ public class HelixColourScheme extends ScoreColourScheme
    * be coloured
    */
   @Override
-  public ColourSchemeI getInstance(AnnotatedCollectionI coll,
-          Map<SequenceI, SequenceCollectionI> hrs)
+  public ColourSchemeI getInstance(AlignViewportI view,
+          AnnotatedCollectionI coll)
   {
     return new HelixColourScheme();
   }
index 69af3c9..d886bdf 100755 (executable)
  */
 package jalview.schemes;
 
+import jalview.api.AlignViewportI;
 import jalview.datamodel.AnnotatedCollectionI;
-import jalview.datamodel.SequenceCollectionI;
-import jalview.datamodel.SequenceI;
 
 import java.awt.Color;
-import java.util.Map;
 
 /**
  * DOCUMENT ME!
@@ -75,8 +73,8 @@ public class HydrophobicColourScheme extends ScoreColourScheme
    * be coloured
    */
   @Override
-  public ColourSchemeI getInstance(AnnotatedCollectionI coll,
-          Map<SequenceI, SequenceCollectionI> hrs)
+  public ColourSchemeI getInstance(AlignViewportI view,
+          AnnotatedCollectionI coll)
   {
     return new HydrophobicColourScheme();
   }
diff --git a/src/jalview/schemes/IdColourScheme.java b/src/jalview/schemes/IdColourScheme.java
new file mode 100644 (file)
index 0000000..5add470
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ * 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.
+ *  
+ * 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/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
+package jalview.schemes;
+
+import jalview.api.AlignViewportI;
+import jalview.datamodel.AnnotatedCollectionI;
+import jalview.datamodel.SequenceCollectionI;
+import jalview.datamodel.SequenceI;
+
+import java.awt.Color;
+import java.util.Map;
+
+/**
+ * shade sequences using the colour shown in the ID panel. Useful to map
+ * sequence groupings onto residue data (eg tree subgroups visualised on
+ * structures or overview window)
+ * 
+ * @author jprocter
+ */
+public class IdColourScheme implements ColourSchemeI
+{
+  AlignViewportI view = null;
+
+  public IdColourScheme()
+  {
+
+  }
+  public IdColourScheme(AlignViewportI view, AnnotatedCollectionI coll)
+  {
+    this.view = view;
+  }
+
+
+  @Override
+  public String getSchemeName()
+  {
+    return JalviewColourScheme.IdColour.toString();
+  }
+
+  /**
+   * Returns a new instance of this colour scheme with which the given data may
+   * be coloured
+   */
+  @Override
+  public ColourSchemeI getInstance(AlignViewportI view,
+          AnnotatedCollectionI coll)
+  {
+    return new IdColourScheme(view, coll);
+  }
+
+  @Override
+  public void alignmentChanged(AnnotatedCollectionI alignment,
+          Map<SequenceI, SequenceCollectionI> hiddenReps)
+  {
+  }
+
+  @Override
+  public Color findColour(char symbol, int position, SequenceI seq,
+          String consensusResidue, float pid)
+  {
+    // rather than testing if coll is a sequence group, and if so looking at
+    // ((SequenceGroup)coll).idColour
+    // we always return the sequence ID colour, in case the user has customised
+    // the displayed Id colour by right-clicking an internal node in the tree.
+    if (view == null)
+    {
+      return Color.WHITE;
+    }
+    Color col = view.getSequenceColour(seq);
+    return Color.WHITE.equals(col) ? Color.WHITE : col.darker();
+  }
+
+  @Override
+  public boolean hasGapColour()
+  {
+    return false;
+  }
+
+  @Override
+  public boolean isApplicableTo(AnnotatedCollectionI ac)
+  {
+    return true;
+  }
+
+  @Override
+  public boolean isSimple()
+  {
+    return false;
+  }
+}
index e1fc02d..456397e 100644 (file)
@@ -42,7 +42,8 @@ public enum JalviewColourScheme
   Nucleotide("Nucleotide", NucleotideColourScheme.class),
   PurinePyrimidine("Purine/Pyrimidine", PurinePyrimidineColourScheme.class),
   RNAHelices("RNA Helices", RNAHelicesColour.class),
-  TCoffee("T-Coffee Scores", TCoffeeColourScheme.class);
+  TCoffee("T-Coffee Scores", TCoffeeColourScheme.class),
+  IdColour("Sequence ID", IdColourScheme.class);
   // RNAInteraction("RNA Interaction type", RNAInteractionColourScheme.class)
 
   private String name;
index abae733..4977107 100755 (executable)
  */
 package jalview.schemes;
 
+import jalview.api.AlignViewportI;
 import jalview.datamodel.AnnotatedCollectionI;
-import jalview.datamodel.SequenceCollectionI;
-import jalview.datamodel.SequenceI;
-
-import java.util.Map;
 
 /**
  * DOCUMENT ME!
@@ -59,8 +56,8 @@ public class NucleotideColourScheme extends ResidueColourScheme
    * be coloured
    */
   @Override
-  public ColourSchemeI getInstance(AnnotatedCollectionI coll,
-          Map<SequenceI, SequenceCollectionI> hrs)
+  public ColourSchemeI getInstance(AlignViewportI view,
+          AnnotatedCollectionI coll)
   {
     return new NucleotideColourScheme();
   }
index fc922b9..3a5c066 100755 (executable)
  */
 package jalview.schemes;
 
+import jalview.api.AlignViewportI;
 import jalview.datamodel.AnnotatedCollectionI;
-import jalview.datamodel.SequenceCollectionI;
 import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
 import jalview.util.Comparison;
 
 import java.awt.Color;
-import java.util.Map;
 
 public class PIDColourScheme extends ResidueColourScheme
 {
@@ -92,8 +91,8 @@ public class PIDColourScheme extends ResidueColourScheme
    * be coloured
    */
   @Override
-  public ColourSchemeI getInstance(AnnotatedCollectionI coll,
-          Map<SequenceI, SequenceCollectionI> hrs)
+  public ColourSchemeI getInstance(AlignViewportI view,
+          AnnotatedCollectionI coll)
   {
     return new PIDColourScheme();
   }
index 1b36f30..a8270cc 100644 (file)
  */
 package jalview.schemes;
 
+import jalview.api.AlignViewportI;
 import jalview.datamodel.AnnotatedCollectionI;
-import jalview.datamodel.SequenceCollectionI;
-import jalview.datamodel.SequenceI;
-
-import java.util.Map;
 
 /**
  * Class is based off of NucleotideColourScheme
@@ -59,8 +56,8 @@ public class PurinePyrimidineColourScheme extends ResidueColourScheme
    * be coloured
    */
   @Override
-  public ColourSchemeI getInstance(AnnotatedCollectionI coll,
-          Map<SequenceI, SequenceCollectionI> hrs)
+  public ColourSchemeI getInstance(AlignViewportI view,
+          AnnotatedCollectionI coll)
   {
     return new PurinePyrimidineColourScheme();
   }
index dbc9c03..33b275d 100644 (file)
@@ -20,6 +20,7 @@
  */
 package jalview.schemes;
 
+import jalview.api.AlignViewportI;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.AnnotatedCollectionI;
@@ -45,7 +46,7 @@ public class RNAHelicesColour extends ResidueColourScheme
    * Maps sequence positions to the RNA helix they belong to. Key: position,
    * Value: helix TODO: Revise or drop in favour of annotation position numbers
    */
-  public Hashtable<Integer, String> positionsToHelix = new Hashtable<Integer, String>();
+  public Hashtable<Integer, String> positionsToHelix = new Hashtable<>();
 
   /**
    * Number of helices in the RNA secondary structure
@@ -132,7 +133,7 @@ public class RNAHelicesColour extends ResidueColourScheme
       annotation.getRNAStruc();
       lastrefresh = annotation._rnasecstr.hashCode();
       numHelix = 0;
-      positionsToHelix = new Hashtable<Integer, String>();
+      positionsToHelix = new Hashtable<>();
 
       // Figure out number of helices
       // Length of rnasecstr is the number of pairs of positions that base pair
@@ -206,8 +207,8 @@ public class RNAHelicesColour extends ResidueColourScheme
   }
 
   @Override
-  public ColourSchemeI getInstance(AnnotatedCollectionI sg,
-          Map<SequenceI, SequenceCollectionI> hiddenRepSequences)
+  public ColourSchemeI getInstance(AlignViewportI view,
+          AnnotatedCollectionI sg)
   {
     return new RNAHelicesColour(sg);
   }
index d236803..8610417 100644 (file)
  */
 package jalview.schemes;
 
+import jalview.api.AlignViewportI;
 import jalview.datamodel.AnnotatedCollectionI;
-import jalview.datamodel.SequenceCollectionI;
 import jalview.datamodel.SequenceI;
 
 import java.awt.Color;
-import java.util.Map;
 
 public class RNAInteractionColourScheme extends ResidueColourScheme
 {
@@ -73,8 +72,8 @@ public class RNAInteractionColourScheme extends ResidueColourScheme
    * be coloured
    */
   @Override
-  public ColourSchemeI getInstance(AnnotatedCollectionI coll,
-          Map<SequenceI, SequenceCollectionI> hrs)
+  public ColourSchemeI getInstance(AlignViewportI view,
+          AnnotatedCollectionI coll)
   {
     return new RNAInteractionColourScheme();
   }
index e1b60ca..eae76e1 100755 (executable)
  */
 package jalview.schemes;
 
+import jalview.api.AlignViewportI;
 import jalview.datamodel.AnnotatedCollectionI;
-import jalview.datamodel.SequenceCollectionI;
 import jalview.datamodel.SequenceI;
 import jalview.util.Comparison;
 
 import java.awt.Color;
-import java.util.Map;
 
 /**
  * DOCUMENT ME!
@@ -119,8 +118,8 @@ public class ScoreColourScheme extends ResidueColourScheme
    * be coloured
    */
   @Override
-  public ColourSchemeI getInstance(AnnotatedCollectionI coll,
-          Map<SequenceI, SequenceCollectionI> hrs)
+  public ColourSchemeI getInstance(AlignViewportI view,
+          AnnotatedCollectionI coll)
   {
     return new ScoreColourScheme(symbolIndex, scores, min, max);
   }
index 5f11c29..ef55d69 100755 (executable)
  */
 package jalview.schemes;
 
+import jalview.api.AlignViewportI;
 import jalview.datamodel.AnnotatedCollectionI;
-import jalview.datamodel.SequenceCollectionI;
-import jalview.datamodel.SequenceI;
 
 import java.awt.Color;
-import java.util.Map;
 
 /**
  * DOCUMENT ME!
@@ -75,8 +73,8 @@ public class StrandColourScheme extends ScoreColourScheme
    * be coloured
    */
   @Override
-  public ColourSchemeI getInstance(AnnotatedCollectionI coll,
-          Map<SequenceI, SequenceCollectionI> hrs)
+  public ColourSchemeI getInstance(AlignViewportI view,
+          AnnotatedCollectionI coll)
   {
     return new StrandColourScheme();
   }
index 812dca7..db85cc8 100644 (file)
@@ -20,6 +20,7 @@
  */
 package jalview.schemes;
 
+import jalview.api.AlignViewportI;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.AnnotatedCollectionI;
@@ -83,10 +84,10 @@ public class TCoffeeColourScheme extends ResidueColourScheme
 
     // assume only one set of TCOFFEE scores - but could have more than one
     // potentially.
-    List<AlignmentAnnotation> annots = new ArrayList<AlignmentAnnotation>();
+    List<AlignmentAnnotation> annots = new ArrayList<>();
     // Search alignment to get all tcoffee annotation and pick one set of
     // annotation to use to colour seqs.
-    seqMap = new IdentityHashMap<SequenceI, Color[]>();
+    seqMap = new IdentityHashMap<>();
     AnnotatedCollectionI alcontext = alignment instanceof AlignmentI
             ? alignment
             : alignment.getContext();
@@ -143,8 +144,8 @@ public class TCoffeeColourScheme extends ResidueColourScheme
   }
 
   @Override
-  public ColourSchemeI getInstance(AnnotatedCollectionI sg,
-          Map<SequenceI, SequenceCollectionI> hiddenRepSequences)
+  public ColourSchemeI getInstance(AlignViewportI view,
+          AnnotatedCollectionI sg)
   {
     return new TCoffeeColourScheme(sg);
   }
index ac8abbc..e2a4516 100755 (executable)
  */
 package jalview.schemes;
 
+import jalview.api.AlignViewportI;
 import jalview.datamodel.AnnotatedCollectionI;
-import jalview.datamodel.SequenceCollectionI;
-import jalview.datamodel.SequenceI;
-
-import java.util.Map;
 
 public class TaylorColourScheme extends ResidueColourScheme
 {
@@ -50,8 +47,8 @@ public class TaylorColourScheme extends ResidueColourScheme
    * be coloured
    */
   @Override
-  public ColourSchemeI getInstance(AnnotatedCollectionI coll,
-          Map<SequenceI, SequenceCollectionI> hrs)
+  public ColourSchemeI getInstance(AlignViewportI view,
+          AnnotatedCollectionI coll)
   {
     return new TaylorColourScheme();
   }
index 67116b8..7d8035a 100755 (executable)
  */
 package jalview.schemes;
 
+import jalview.api.AlignViewportI;
 import jalview.datamodel.AnnotatedCollectionI;
-import jalview.datamodel.SequenceCollectionI;
-import jalview.datamodel.SequenceI;
 
 import java.awt.Color;
-import java.util.Map;
 
 /**
  * DOCUMENT ME!
@@ -75,8 +73,8 @@ public class TurnColourScheme extends ScoreColourScheme
    * be coloured
    */
   @Override
-  public ColourSchemeI getInstance(AnnotatedCollectionI coll,
-          Map<SequenceI, SequenceCollectionI> hrs)
+  public ColourSchemeI getInstance(AlignViewportI view,
+          AnnotatedCollectionI coll)
   {
     return new TurnColourScheme();
   }
index bf62e45..d77f2f5 100755 (executable)
@@ -20,9 +20,8 @@
  */
 package jalview.schemes;
 
+import jalview.api.AlignViewportI;
 import jalview.datamodel.AnnotatedCollectionI;
-import jalview.datamodel.SequenceCollectionI;
-import jalview.datamodel.SequenceI;
 import jalview.util.ColorUtils;
 import jalview.util.StringUtils;
 
@@ -56,8 +55,8 @@ public class UserColourScheme extends ResidueColourScheme
   }
 
   @Override
-  public ColourSchemeI getInstance(AnnotatedCollectionI sg,
-          Map<SequenceI, SequenceCollectionI> hiddenRepSequences)
+  public ColourSchemeI getInstance(AlignViewportI view,
+          AnnotatedCollectionI sg)
   {
     return new UserColourScheme(this);
   }
index c32a39c..d69695f 100755 (executable)
  */
 package jalview.schemes;
 
+import jalview.api.AlignViewportI;
 import jalview.datamodel.AnnotatedCollectionI;
-import jalview.datamodel.SequenceCollectionI;
-import jalview.datamodel.SequenceI;
-
-import java.util.Map;
 
 /**
  * DOCUMENT ME!
@@ -59,8 +56,8 @@ public class ZappoColourScheme extends ResidueColourScheme
    * be coloured
    */
   @Override
-  public ColourSchemeI getInstance(AnnotatedCollectionI coll,
-          Map<SequenceI, SequenceCollectionI> hrs)
+  public ColourSchemeI getInstance(AlignViewportI view,
+          AnnotatedCollectionI coll)
   {
     return new ZappoColourScheme();
   }
index 0ea31d7..148ea16 100644 (file)
@@ -663,7 +663,7 @@ public abstract class AlignmentViewport
          * changing choice of colour scheme (JAL-2386)
          */
         sg.setColourScheme(
-                cs == null ? null : cs.getInstance(sg, hiddenRepSequences));
+                cs == null ? null : cs.getInstance(this, sg));
         if (cs != null)
         {
           sg.getGroupColourScheme().alignmentChanged(sg,
@@ -2956,4 +2956,68 @@ public abstract class AlignmentViewport
   {
     return currentTree;
   }
+
+  /**
+   * flag set to indicate if structure views might be out of sync with sequences
+   * in the alignment
+   */
+
+  private boolean needToUpdateStructureViews = false;
+
+  @Override
+  public boolean isUpdateStructures()
+  {
+    return needToUpdateStructureViews;
+  }
+
+  @Override
+  public void setUpdateStructures(boolean update)
+  {
+    needToUpdateStructureViews = update;
+  }
+
+  @Override
+  public boolean needToUpdateStructureViews()
+  {
+    boolean update = needToUpdateStructureViews;
+    needToUpdateStructureViews = false;
+    return update;
+  }
+
+  @Override
+  public void addSequenceGroup(SequenceGroup sequenceGroup)
+  {
+    alignment.addGroup(sequenceGroup);
+
+    Color col = sequenceGroup.idColour;
+    if (col != null)
+    {
+      col = col.brighter();
+
+      for (SequenceI sq : sequenceGroup.getSequences())
+      {
+        setSequenceColour(sq, col);
+      }
+    }
+
+    if (codingComplement != null)
+    {
+      SequenceGroup mappedGroup = MappingUtils
+              .mapSequenceGroup(sequenceGroup, this, codingComplement);
+      if (mappedGroup.getSequences().size() > 0)
+      {
+        codingComplement.getAlignment().addGroup(mappedGroup);
+
+        if (col != null)
+        {
+          for (SequenceI seq : mappedGroup.getSequences())
+          {
+            codingComplement.setSequenceColour(seq, col);
+          }
+        }
+      }
+      // propagate the structure view update flag according to our own setting
+      codingComplement.setUpdateStructures(needToUpdateStructureViews);
+    }
+  }
 }
index ea3f00b..1250748 100644 (file)
@@ -147,12 +147,13 @@ public class Jalview2xmlTests extends Jalview2xmlBase
             DataSourceType.FILE);
     assertNotNull(af, "Didn't read input file " + inFile);
     af.loadJalviewDataFile(inAnnot, DataSourceType.FILE, null, null);
-    assertSame(af.getViewport().getGlobalColourScheme().getClass(),
+    AlignViewport viewport = af.getViewport();
+    assertSame(viewport.getGlobalColourScheme().getClass(),
             TCoffeeColourScheme.class, "Didn't set T-coffee colourscheme");
     assertNotNull(
-            ColourSchemeProperty.getColourScheme(
-                    af.getViewport().getAlignment(),
-                    af.getViewport().getGlobalColourScheme()
+            ColourSchemeProperty.getColourScheme(viewport,
+                    viewport.getAlignment(),
+                    viewport.getGlobalColourScheme()
                             .getSchemeName()),
             "Recognise T-Coffee score from string");
 
@@ -163,7 +164,7 @@ public class Jalview2xmlTests extends Jalview2xmlBase
     af = new FileLoader().LoadFileWaitTillLoaded(tfile,
             DataSourceType.FILE);
     assertNotNull(af, "Failed to import new project");
-    assertSame(af.getViewport().getGlobalColourScheme().getClass(),
+    assertSame(viewport.getGlobalColourScheme().getClass(),
             TCoffeeColourScheme.class,
             "Didn't set T-coffee colourscheme for imported project.");
     System.out.println(
index 22124f7..c56da59 100644 (file)
@@ -208,7 +208,7 @@ public class AnnotationColourGradientTest
   {
     AnnotationColourGradient testee = new AnnotationColourGradient(ann,
             minColour, maxColour, AnnotationColourGradient.ABOVE_THRESHOLD);
-    testee = (AnnotationColourGradient) testee.getInstance(al, null);
+    testee = (AnnotationColourGradient) testee.getInstance(null, al);
 
     for (int col = 0; col < WIDTH; col++)
     {
@@ -252,7 +252,7 @@ public class AnnotationColourGradientTest
   {
     AnnotationColourGradient testee = new AnnotationColourGradient(ann,
             minColour, maxColour, AnnotationColourGradient.BELOW_THRESHOLD);
-    testee = (AnnotationColourGradient) testee.getInstance(al, null);
+    testee = (AnnotationColourGradient) testee.getInstance(null, al);
   
     for (int col = 0; col < WIDTH; col++)
     {
@@ -287,7 +287,7 @@ public class AnnotationColourGradientTest
   {
     AnnotationColourGradient testee = new AnnotationColourGradient(ann,
             minColour, maxColour, AnnotationColourGradient.NO_THRESHOLD);
-    testee = (AnnotationColourGradient) testee.getInstance(al, null);
+    testee = (AnnotationColourGradient) testee.getInstance(null, al);
 
     for (int col = 0; col < WIDTH; col++)
     {
@@ -306,7 +306,7 @@ public class AnnotationColourGradientTest
   {
     AnnotationColourGradient testee = new AnnotationColourGradient(ann,
             minColour, maxColour, AnnotationColourGradient.NO_THRESHOLD);
-    testee = (AnnotationColourGradient) testee.getInstance(al, null);
+    testee = (AnnotationColourGradient) testee.getInstance(null, al);
 
     /*
      * flag corresponding to 'use original colours' checkbox
index 11562b8..f71d647 100644 (file)
@@ -76,51 +76,54 @@ public class ColourSchemePropertyTest
     SequenceI seq = new Sequence("Seq1", "abcd");
     AlignmentI al = new Alignment(new SequenceI[] { seq });
     // the strings here correspond to JalviewColourScheme.toString() values
-    ColourSchemeI cs = ColourSchemeProperty.getColourScheme(al, "Clustal");
+    ColourSchemeI cs = ColourSchemeProperty.getColourScheme(null, al,
+            "Clustal");
     assertTrue(cs instanceof ClustalxColourScheme);
     // not case-sensitive
-    cs = ColourSchemeProperty.getColourScheme(al, "CLUSTAL");
+    cs = ColourSchemeProperty.getColourScheme(null, al, "CLUSTAL");
     assertTrue(cs instanceof ClustalxColourScheme);
-    cs = ColourSchemeProperty.getColourScheme(al, "clustal");
+    cs = ColourSchemeProperty.getColourScheme(null, al, "clustal");
     assertTrue(cs instanceof ClustalxColourScheme);
-    cs = ColourSchemeProperty.getColourScheme(al, "Blosum62");
+    cs = ColourSchemeProperty.getColourScheme(null, al, "Blosum62");
     assertTrue(cs instanceof Blosum62ColourScheme);
-    cs = ColourSchemeProperty.getColourScheme(al, "% Identity");
+    cs = ColourSchemeProperty.getColourScheme(null, al, "% Identity");
     assertTrue(cs instanceof PIDColourScheme);
-    cs = ColourSchemeProperty.getColourScheme(al, "Zappo");
+    cs = ColourSchemeProperty.getColourScheme(null, al, "Zappo");
     assertTrue(cs instanceof ZappoColourScheme);
-    cs = ColourSchemeProperty.getColourScheme(al, "Taylor");
+    cs = ColourSchemeProperty.getColourScheme(null, al, "Taylor");
     assertTrue(cs instanceof TaylorColourScheme);
-    cs = ColourSchemeProperty.getColourScheme(al, "Hydrophobic");
+    cs = ColourSchemeProperty.getColourScheme(null, al, "Hydrophobic");
     assertTrue(cs instanceof HydrophobicColourScheme);
-    cs = ColourSchemeProperty.getColourScheme(al, "Helix Propensity");
+    cs = ColourSchemeProperty.getColourScheme(null, al, "Helix Propensity");
     assertTrue(cs instanceof HelixColourScheme);
-    cs = ColourSchemeProperty.getColourScheme(al, "Strand Propensity");
+    cs = ColourSchemeProperty.getColourScheme(null, al,
+            "Strand Propensity");
     assertTrue(cs instanceof StrandColourScheme);
-    cs = ColourSchemeProperty.getColourScheme(al, "Turn Propensity");
+    cs = ColourSchemeProperty.getColourScheme(null, al, "Turn Propensity");
     assertTrue(cs instanceof TurnColourScheme);
-    cs = ColourSchemeProperty.getColourScheme(al, "Buried Index");
+    cs = ColourSchemeProperty.getColourScheme(null, al, "Buried Index");
     assertTrue(cs instanceof BuriedColourScheme);
-    cs = ColourSchemeProperty.getColourScheme(al, "Nucleotide");
+    cs = ColourSchemeProperty.getColourScheme(null, al, "Nucleotide");
     assertTrue(cs instanceof NucleotideColourScheme);
-    cs = ColourSchemeProperty.getColourScheme(al, "Purine/Pyrimidine");
+    cs = ColourSchemeProperty.getColourScheme(null, al,
+            "Purine/Pyrimidine");
     assertTrue(cs instanceof PurinePyrimidineColourScheme);
-    cs = ColourSchemeProperty.getColourScheme(al, "T-Coffee Scores");
+    cs = ColourSchemeProperty.getColourScheme(null, al, "T-Coffee Scores");
     assertTrue(cs instanceof TCoffeeColourScheme);
-    cs = ColourSchemeProperty.getColourScheme(al, "RNA Helices");
+    cs = ColourSchemeProperty.getColourScheme(null, al, "RNA Helices");
     assertTrue(cs instanceof RNAHelicesColour);
     // 'None' is a special value
-    assertNull(ColourSchemeProperty.getColourScheme(al, "None"));
-    assertNull(ColourSchemeProperty.getColourScheme(al, "none"));
+    assertNull(ColourSchemeProperty.getColourScheme(null, al, "None"));
+    assertNull(ColourSchemeProperty.getColourScheme(null, al, "none"));
     // default is to convert the name into a fixed colour
-    cs = ColourSchemeProperty.getColourScheme(al, "elephants");
+    cs = ColourSchemeProperty.getColourScheme(null, al, "elephants");
     assertTrue(cs instanceof UserColourScheme);
 
     /*
      * explicit aa colours
      */
     UserColourScheme ucs = (UserColourScheme) ColourSchemeProperty
-            .getColourScheme(al,
+            .getColourScheme(null, al,
             "R,G=red;C=blue;c=green;Q=10,20,30;S,T=11ffdd");
     assertEquals(ucs.findColour('H'), Color.white);
     assertEquals(ucs.findColour('R'), Color.red);
index 0aaa38c..5db3743 100644 (file)
@@ -5,6 +5,7 @@ import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertSame;
 import static org.testng.Assert.assertTrue;
 
+import jalview.api.AlignViewportI;
 import jalview.bin.Cache;
 import jalview.bin.Jalview;
 import jalview.datamodel.AnnotatedCollectionI;
@@ -54,8 +55,8 @@ public class ColourSchemesTest
     }
 
     @Override
-    public ColourSchemeI getInstance(AnnotatedCollectionI sg,
-            Map<SequenceI, SequenceCollectionI> hiddenRepSequences)
+    public ColourSchemeI getInstance(AlignViewportI view,
+            AnnotatedCollectionI sg)
     {
       final ColourSchemeI cs1 = ColourSchemes.getInstance()
               .getColourScheme(JalviewColourScheme.Taylor.toString(),
@@ -144,10 +145,10 @@ public class ColourSchemesTest
     }
 
     @Override
-    public ColourSchemeI getInstance(AnnotatedCollectionI sg,
-            Map<SequenceI, SequenceCollectionI> hiddenRepSequences)
+    public ColourSchemeI getInstance(AlignViewportI view,
+            AnnotatedCollectionI sg)
     {
-      return new MyClustal(sg,              hiddenRepSequences);
+      return new MyClustal(sg, view.getHiddenRepSequences());
     }
 
     @Override
index d9403d2..e8a70e4 100644 (file)
@@ -24,6 +24,8 @@ public class JalviewColourSchemeTest
     assertTrue(JalviewColourScheme.PurinePyrimidine.getSchemeClass() == PurinePyrimidineColourScheme.class);
     assertTrue(JalviewColourScheme.TCoffee.getSchemeClass() == TCoffeeColourScheme.class);
     assertTrue(JalviewColourScheme.RNAHelices.getSchemeClass() == RNAHelicesColour.class);
+    assertTrue(JalviewColourScheme.IdColour
+            .getSchemeClass() == IdColourScheme.class);
   }
 
   @Test(groups = "Functional")
@@ -44,5 +46,6 @@ public class JalviewColourSchemeTest
             "Purine/Pyrimidine");
     assertEquals(JalviewColourScheme.TCoffee.toString(), "T-Coffee Scores");
     assertEquals(JalviewColourScheme.RNAHelices.toString(), "RNA Helices");
+    assertEquals(JalviewColourScheme.IdColour.toString(), "Sequence ID");
   }
 }