JAL-2634 Make overview box full height when alignment is wrapped
[jalview.git] / src / jalview / schemes / ResidueColourScheme.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.schemes;
22
23 import jalview.datamodel.AnnotatedCollectionI;
24 import jalview.datamodel.SequenceCollectionI;
25 import jalview.datamodel.SequenceGroup;
26 import jalview.datamodel.SequenceI;
27
28 import java.awt.Color;
29 import java.util.Map;
30
31 /**
32  * Base class for residue-based colour schemes
33  */
34 public abstract class ResidueColourScheme implements ColourSchemeI
35 {
36   public static final String NONE = "None";
37
38   public static final String USER_DEFINED = "User Defined";
39
40   /*
41    * lookup up by character value e.g. 'G' to the colors array index
42    * e.g. if symbolIndex['K'] = 11 then colors[11] is the colour for K
43    */
44   final int[] symbolIndex;
45
46   /*
47    * colour for residue characters as indexed by symbolIndex
48    */
49   Color[] colors = null;
50
51   /* Set when threshold colouring to either pid_gaps or pid_nogaps */
52   protected boolean ignoreGaps = false;
53
54   /**
55    * Creates a new ResidueColourScheme object.
56    * 
57    * @param final int[] index table into colors (ResidueProperties.naIndex or
58    *        ResidueProperties.aaIndex)
59    * @param colors
60    *          colours for symbols in sequences
61    */
62   public ResidueColourScheme(int[] aaOrnaIndex, Color[] colours)
63   {
64     symbolIndex = aaOrnaIndex;
65     this.colors = colours;
66   }
67
68   /**
69    * Creates a new ResidueColourScheme object with a lookup table for indexing
70    * the colour map
71    */
72   public ResidueColourScheme(int[] aaOrNaIndex)
73   {
74     symbolIndex = aaOrNaIndex;
75   }
76
77   /**
78    * Creates a new ResidueColourScheme object - default constructor for
79    * non-sequence dependent colourschemes
80    */
81   public ResidueColourScheme()
82   {
83     symbolIndex = null;
84   }
85
86   /**
87    * Find a colour without an index in a sequence
88    */
89   public Color findColour(char c)
90   {
91     Color colour = Color.white;
92
93     if (colors != null && symbolIndex != null
94             && c < symbolIndex.length
95             && symbolIndex[c] < colors.length)
96     {
97       colour = colors[symbolIndex[c]];
98     }
99
100     return colour;
101   }
102
103   /**
104    * Default is to call the overloaded method that ignores consensus. A colour
105    * scheme that depends on consensus (for example, Blosum62), should override
106    * this method instead.
107    */
108   @Override
109   public Color findColour(char c, int j, SequenceI seq,
110           String consensusResidue, float pid)
111   {
112     return findColour(c, j, seq);
113   }
114
115   /**
116    * Default implementation looks up the residue colour in a fixed scheme, or
117    * returns White if not found. Override this method for a colour scheme that
118    * depends on the column position or sequence.
119    * 
120    * @param c
121    * @param j
122    * @param seq
123    * @return
124    */
125   protected Color findColour(char c, int j, SequenceI seq)
126   {
127     return findColour(c);
128   }
129
130   @Override
131   public void alignmentChanged(AnnotatedCollectionI alignment,
132           Map<SequenceI, SequenceCollectionI> hiddenReps)
133   {
134   }
135
136   /**
137    * Answers false if the colour scheme is nucleotide or peptide specific, and
138    * the data does not match, else true. Override to modify or extend this test
139    * as required.
140    */
141   @Override
142   public boolean isApplicableTo(AnnotatedCollectionI ac)
143   {
144     if (!isPeptideSpecific() && !isNucleotideSpecific())
145     {
146       return true;
147     }
148     if (ac == null)
149     {
150       return true;
151     }
152     /*
153      * pop-up menu on selection group before group created
154      * (no alignment context)
155      */
156     // TODO: add nucleotide flag to SequenceGroup?
157     if (ac instanceof SequenceGroup && ac.getContext() == null)
158     {
159       return true;
160     }
161
162     /*
163      * inspect the data context (alignment) for residue type
164      */
165     boolean nucleotide = ac.isNucleotide();
166
167     /*
168      * does data type match colour scheme type?
169      */
170     return (nucleotide && isNucleotideSpecific())
171             || (!nucleotide && isPeptideSpecific());
172   }
173
174   /**
175    * Answers true if the colour scheme is normally only for peptide data
176    * 
177    * @return
178    */
179   public boolean isPeptideSpecific()
180   {
181     return false;
182   }
183
184   /**
185    * Answers true if the colour scheme is normally only for nucleotide data
186    * 
187    * @return
188    */
189   public boolean isNucleotideSpecific()
190   {
191     return false;
192   }
193
194   /**
195    * Default method returns true. Override this to return false in colour
196    * schemes that are not determined solely by the sequence symbol.
197    */
198   @Override
199   public boolean isSimple()
200   {
201     return true;
202   }
203 }