JAL-3148 SequenceRenderer, ResidueColourFinder overloads and
[jalview.git] / src / jalview / renderer / ResidueColourFinder.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.renderer;
22
23 import jalview.api.AlignViewportI;
24 import jalview.datamodel.SequenceGroup;
25 import jalview.datamodel.SequenceI;
26 import jalview.renderer.seqfeatures.FeatureColourFinder;
27 import jalview.schemes.ColourSchemeI;
28
29 import java.awt.Color;
30
31 public class ResidueColourFinder
32 {
33   private ResidueShaderI shader;
34         
35   public ResidueColourFinder()
36   {
37   }
38
39   public ResidueColourFinder(AlignViewportI viewport, ColourSchemeI cs) 
40   {
41         shader = new ResidueShader(cs);
42         // TODO what if consensus is still calculating - or changes?
43         shader.setConsensus(viewport.getSequenceConsensusHash());
44   }
45
46 /**
47    * Get the colour of a residue in a sequence
48    * 
49    * @param showBoxes
50    *          true if the viewport's Show Boxes setting is true
51    * @param shader
52    *          the viewport's colour scheme
53    * @param allGroups
54    *          all the groups which seq participates in
55    * @param seq
56    *          the sequence containing the residue
57    * @param position
58    *          the position of the residue in the sequence
59    * @param finder
60    *          FeatureColourFinder for the viewport
61    * @return colour of the residue
62    */
63   public Color getResidueColour(boolean showBoxes, ResidueShaderI colourScheme,
64           SequenceGroup[] allGroups,
65           final SequenceI seq, int position, FeatureColourFinder finder)
66   {
67     /*
68      * override alignment colour scheme if one set on construction of this
69      */
70         if (shader != null)
71         {
72           colourScheme = shader;
73         }
74     Color col = getResidueBoxColour(showBoxes, colourScheme, allGroups, seq,
75             position);
76
77     // if there's a FeatureColourFinder we might override the residue colour
78     // here with feature colouring
79     if (finder != null)
80     {
81       col = finder.findFeatureColour(col, seq, position);
82     }
83     return col;
84   }
85
86   /**
87    * Get the residue colour without accounting for any features
88    * 
89    * @param showBoxes
90    *          true if the viewport's Show Boxes setting is true
91    * @param shader
92    *          the viewport's colour scheme
93    * @param allGroups
94    *          all the groups which seq participates in
95    * @param seq
96    *          the sequence containing the residue
97    * @param i
98    *          the position of the residue in the sequence
99    * @return
100    */
101   protected Color getResidueBoxColour(boolean showBoxes,
102           ResidueShaderI shader,
103           SequenceGroup[] allGroups,
104           SequenceI seq, int i)
105   {
106     SequenceGroup currentSequenceGroup = getCurrentSequenceGroup(allGroups,
107             i);
108     if (currentSequenceGroup != null)
109     {
110       if (currentSequenceGroup.getDisplayBoxes())
111       {
112         return getBoxColour(currentSequenceGroup.getGroupColourScheme(),
113                 seq, i);
114       }
115     }
116     else if (showBoxes)
117     {
118       return getBoxColour(shader, seq, i);
119     }
120   
121     return Color.white;
122   }
123
124   /**
125    * Search all the groups for a sequence to find the one which a given res
126    * falls into
127    * 
128    * @param allGroups
129    *          all the groups a sequence participates in
130    * @param res
131    *          the residue to search for
132    * @return a sequence group for res, or null if no sequence group applies
133    */
134   public SequenceGroup getCurrentSequenceGroup(SequenceGroup[] allGroups,
135           int res)
136   {
137     if (allGroups == null)
138     {
139       return null;
140     }
141
142     for (int i = 0; i < allGroups.length; i++)
143     {
144       if ((allGroups[i].getStartRes() <= res)
145               && (allGroups[i].getEndRes() >= res))
146       {
147         return (allGroups[i]);
148       }
149     }
150
151     return null;
152   }
153
154   /**
155    * DOCUMENT ME!
156    * 
157    * @param shader
158    *          the viewport's colour scheme
159    * @param seq
160    *          the sequence containing the residue
161    * @param i
162    *          the position of the residue in the sequence
163    */
164   public Color getBoxColour(ResidueShaderI shader, SequenceI seq, int i)
165   {
166     return shader.findColour(seq.getCharAt(i), i, seq);
167   }
168
169 }