2 // FORESTER -- software libraries and applications
3 // for evolutionary biology research and applications.
5 // Copyright (C) 2008-2010 Christian M. Zmasek
6 // Copyright (C) 2008-2010 Burnham Institute for Medical Research
7 // Copyright (C) 2003-2010 Ethalinda K.S. Cannon
10 // This library is free software; you can redistribute it and/or
11 // modify it under the terms of the GNU Lesser General Public
12 // License as published by the Free Software Foundation; either
13 // version 2.1 of the License, or (at your option) any later version.
15 // This library is distributed in the hope that it will be useful,
16 // but WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 // Lesser General Public License for more details.
20 // You should have received a copy of the GNU Lesser General Public
21 // License along with this library; if not, write to the Free Software
22 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24 // Contact: phylosoft @ gmail . com
25 // WWW: www.phylosoft.org/forester
27 package org.forester.archaeopteryx;
29 import java.awt.Color;
32 import org.forester.util.ForesterUtil;
35 * Maintains the color schemes and a set of colors for drawing a tree.
37 final class TreeColorSet {
39 static final String[] SCHEME_NAMES = { "Default", "Black", "Black & White", "Silver", "The Matrix",
40 "White & Blue", "Cyan", "Clockwork", "Blue", "Blue & White", "Neon" };
41 static final String[] COLOR_FIELDS = { "Background", "Background Gradient Bottom", "Sequence", "Taxonomy",
42 "Confidence", "Branch Length", "Branch", "Node Box", "Collapsed", "Matching Nodes", "Duplication",
43 "Speciation", "Duplication or Specation", "Domains", "Binary Domain Combinations", "Annotation", "Overview" };
44 // All the color sets; better be the same # of sets as there are names!
45 private final Color[][] _color_schemes = { { new Color( 0, 0, 0 ), // background_color
46 new Color( 0, 100, 100 ), // background_color_gradient_bottom
47 new Color( 220, 220, 220 ), // sequence __ Default (same as Black)
48 new Color( 180, 180, 180 ), // taxonomy
49 new Color( 56, 176, 222 ), // support
50 new Color( 140, 140, 140 ), // branch_length_color
51 new Color( 255, 255, 255 ), // branch_color
52 new Color( 255, 255, 255 ), // box_color
53 new Color( 255, 255, 0 ), // collapesed_fill_color
54 new Color( 0, 255, 0 ), // found_color
55 new Color( 255, 0, 0 ), // duplication_box_color
56 new Color( 0, 255, 0 ), // speciation_box_color
57 new Color( 255, 255, 0 ), // duplication_speciation_color
58 new Color( 123, 104, 238 ), // domains_color
59 new Color( 65, 105, 255 ), // binary_domain_combinations_color
60 new Color( 173, 255, 47 ) // annotation
61 , new Color( 130, 130, 130 ) // overview
62 }, { new Color( 0, 0, 0 ), // background_color
63 new Color( 0, 255, 255 ), // background_color_gradient_bottom
64 new Color( 220, 220, 220 ), // sequence __ Black
65 new Color( 180, 180, 180 ), // taxonomy
66 new Color( 56, 176, 222 ), // support
67 new Color( 140, 140, 140 ), // branch_length_color
68 new Color( 255, 255, 255 ), // branch_color
69 new Color( 255, 255, 255 ), // box_color
70 new Color( 255, 255, 0 ), // collapesed_fill_color
71 new Color( 0, 255, 0 ), // found_color
72 new Color( 255, 0, 0 ), // duplication_box_color
73 new Color( 0, 255, 0 ), // speciation_box_color
74 new Color( 255, 255, 0 ), // duplication_speciation_color
75 new Color( 123, 104, 238 ), // domains_color
76 new Color( 65, 105, 255 ), // binary_domain_combinations_color
77 new Color( 173, 255, 47 ) // annotation
78 , new Color( 130, 130, 130 ) // ov
79 }, { new Color( 255, 255, 255 ), // background_color
80 new Color( 0, 255, 255 ), // background_color_gradient_bottom
81 new Color( 0, 0, 0 ), // sequence __ Black & White
82 new Color( 0, 0, 0 ), // taxonomy
83 new Color( 0, 0, 0 ), // support
84 new Color( 0, 0, 0 ), // branch_length_color
85 new Color( 0, 0, 0 ), // branch_color
86 new Color( 0, 0, 0 ), // box_color
87 new Color( 0, 0, 0 ), // collapesed_fill_color
88 new Color( 255, 0, 0 ), // found_color
89 new Color( 0, 0, 0 ), // duplication_box_color
90 new Color( 200, 200, 200 ), // speciation_box_color
91 new Color( 0, 0, 0 ), // duplication_speciation_color
92 new Color( 0, 0, 0 ), // domains_color
93 new Color( 0, 0, 0 ), // binary_domain_combinations_color
94 new Color( 0, 0, 0 ) // annotation
95 , new Color( 220, 220, 220 ) // ov
96 }, { new Color( 0, 0, 0 ), // background_color
97 new Color( 0, 255, 255 ), // background_color_gradient_bottom
98 new Color( 220, 220, 220 ), // sequence __ Silver
99 new Color( 180, 180, 180 ), // taxonomy
100 new Color( 140, 140, 140 ), // support
101 new Color( 140, 140, 140 ), // branch_length_color
102 new Color( 240, 240, 240 ), // branch_color
103 new Color( 140, 140, 140 ), // box_color
104 new Color( 140, 140, 140 ), // collapesed_fill_color
105 new Color( 255, 0, 0 ), // found_color
106 new Color( 255, 0, 0 ), // duplication_box_color
107 new Color( 200, 200, 200 ), // speciation_box_color
108 new Color( 140, 140, 140 ), // duplication_speciation_color
109 new Color( 180, 180, 180 ), // domains_color
110 new Color( 180, 180, 180 ), // binary_domain_combinations_color
111 new Color( 140, 140, 140 ) // annotation
112 , new Color( 40, 40, 40 ) // ov
113 }, { new Color( 0, 10, 0 ), // background_color
114 new Color( 0, 255, 255 ), // background_color_gradient_bottom
115 new Color( 0, 255, 0 ), // sequence __ the Matrix
116 new Color( 30, 200, 30 ), // taxonomy
117 new Color( 0, 155, 0 ), // support
118 new Color( 0, 100, 0 ), // branch_length_color
119 new Color( 0, 155, 0 ), // branch_color
120 new Color( 0, 255, 0 ), // box_color
121 new Color( 0, 255, 0 ), // collapesed_fill_color
122 new Color( 255, 255, 255 ), // found_color
123 new Color( 255, 255, 255 ), // duplication_box_color
124 new Color( 0, 255, 0 ), // speciation_box_color
125 new Color( 120, 120, 120 ), // duplication_speciation_color
126 new Color( 0, 235, 0 ), // domains_color
127 new Color( 0, 235, 0 ), // binary_domain_combinations_color
128 new Color( 0, 235, 0 ) // annotation
129 , new Color( 40, 40, 40 ) // ov
130 }, { new Color( 255, 255, 255 ), // background_color
131 new Color( 0, 255, 255 ), // background_color_gradient_bottom
132 new Color( 0, 0, 0 ), //sequence __ White & Blue
133 new Color( 40, 40, 40 ), // taxonomy
134 new Color( 0, 125, 0 ), // support
135 new Color( 70, 70, 0 ), // branch_length_color
136 new Color( 0, 20, 200 ), // branch_color
137 new Color( 0, 20, 200 ), // box_color
138 new Color( 255, 255, 0 ), // collapesed_fill_color
139 new Color( 0, 255, 0 ), // found_color
140 new Color( 255, 0, 0 ), // duplication_box_color
141 new Color( 0, 255, 0 ), // speciation_box_color
142 new Color( 255, 255, 0 ), // duplication_speciation_color
143 new Color( 123, 104, 238 ), // domains_color
144 new Color( 65, 105, 225 ), // binary_domain_combinations_color
145 new Color( 173, 255, 47 ) // annotation
146 , new Color( 220, 220, 220 ) // ov
147 }, { new Color( 0, 0, 0 ), // background_color
148 new Color( 0, 255, 255 ), // background_color_gradient_bottom
149 new Color( 255, 255, 255 ), // sequence __ Cyan
150 new Color( 200, 200, 200 ), // taxonomy
151 new Color( 255, 255, 255 ), // support
152 new Color( 200, 200, 200 ), // branch_length_color
153 new Color( 0, 255, 255 ), // branch_color
154 new Color( 0, 255, 255 ), // box_color
155 new Color( 255, 255, 0 ), // collapesed_fill_color
156 new Color( 0, 255, 0 ), // found_color
157 new Color( 255, 0, 0 ), // duplication_box_color
158 new Color( 0, 255, 0 ), // speciation_box_color
159 new Color( 255, 255, 0 ), // duplication_speciation_color
160 new Color( 123, 104, 238 ), // domains_color
161 new Color( 65, 105, 225 ), // binary_domain_combinations_color
162 new Color( 173, 255, 47 ) // annotation
163 , new Color( 0, 120, 120 ) // ov
164 }, { new Color( 0, 0, 0 ), // background_color
165 new Color( 0, 255, 255 ), // background_color_gradient_bottom
166 new Color( 255, 200, 0 ), // sequence __ Clockwork
167 new Color( 255, 200, 0 ), // taxonomy
168 new Color( 255, 200, 0 ), // support
169 new Color( 255, 200, 0 ), // branch_length_color
170 new Color( 255, 200, 0 ), // branch_color
171 new Color( 255, 200, 0 ), // box_color
172 new Color( 255, 255, 255 ), // collapesed_fill_color
173 new Color( 255, 255, 255 ), // found_color
174 new Color( 255, 0, 0 ), // duplication_box_color
175 new Color( 0, 255, 0 ), // speciation_box_color
176 new Color( 255, 255, 0 ), // duplication_speciation_color
177 new Color( 150, 150, 150 ), // domains_color
178 new Color( 150, 150, 150 ), // binary_domain_combinations_color
179 new Color( 150, 150, 150 ) // annotation
180 , new Color( 150, 150, 150 ) // ov
181 }, { new Color( 0, 0, 100 ), // background_color
182 new Color( 0, 255, 255 ), // background_color_gradient_bottom
183 new Color( 255, 255, 255 ), // sequence __ Blue
184 new Color( 255, 255, 255 ), // taxonomy
185 new Color( 255, 0, 0 ), // support
186 new Color( 255, 0, 0 ), // branch_length_color
187 new Color( 255, 0, 0 ), // branch_color
188 new Color( 255, 0, 0 ), // box_color
189 new Color( 0, 0, 0 ), // collapesed_fill_color
190 new Color( 0, 255, 0 ), // found_color
191 new Color( 255, 0, 255 ), // duplication_box_color
192 new Color( 255, 255, 255 ), // speciation_box_color
193 new Color( 100, 100, 100 ), // duplication_speciation_color
194 new Color( 255, 255, 255 ), // domains_color
195 new Color( 255, 255, 255 ), // binary_domain_combinations_color
196 new Color( 255, 255, 255 ) // annotation
197 , new Color( 77, 77, 255 ) // ov
198 }, { new Color( 0, 0, 0 ), // background_color
199 new Color( 0, 255, 255 ), // background_color_gradient_bottom
200 new Color( 255, 255, 255 ), // sequence __ blue & white
201 new Color( 255, 255, 255 ), // taxonomy
202 new Color( 255, 255, 255 ), // support
203 new Color( 0, 191, 255 ), // branch_length_color
204 new Color( 0, 191, 255 ), // branch_color
205 new Color( 0, 191, 255 ), // box_color
206 new Color( 255, 255, 255 ), // collapesed_fill_color
207 new Color( 255, 0, 0 ), // found_color
208 new Color( 255, 0, 0 ), // duplication_box_color
209 new Color( 0, 255, 0 ), // speciation_box_color
210 new Color( 255, 255, 0 ), // duplication_speciation_color
211 new Color( 255, 255, 255 ), // domains_color
212 new Color( 255, 255, 255 ), // binary_domain_combinations_color
213 new Color( 255, 255, 255 ) // annotation
214 , new Color( 170, 187, 204 ) // ov
215 }, { new Color( 0, 0, 0 ), // background_color
216 new Color( 255, 255, 0 ), // background_color_gradient_bottom
217 new Color( 127, 255, 0 ), // sequence __ Neon
218 new Color( 255, 110, 199 ), // taxonomy
219 new Color( 234, 173, 234 ), // support
220 new Color( 77, 77, 255 ), // branch_length_color
221 new Color( 234, 173, 234 ), // branch_color
222 new Color( 77, 77, 255 ), // box_color
223 new Color( 77, 77, 255 ), // collapesed_fill_color
224 new Color( 243, 243, 21 ), // found_color
225 new Color( 255, 0, 0 ), // duplication_box_color
226 new Color( 0, 255, 0 ), // speciation_box_color
227 new Color( 255, 255, 0 ), // duplication_speciation_color
228 new Color( 27, 255, 0 ), // domains_color
229 new Color( 27, 255, 0 ), // binary_domain_combinations_color
230 new Color( 27, 255, 0 ) // annotation
231 , new Color( 77, 77, 255 ) // ov
234 private int _color_scheme;
235 // The drawing colors
236 private Color seq_color;
237 private Color taxonomy_color;
238 private Color bootstrap_color;
239 private Color branch_length_color;
240 private Color branch_color;
241 private Color box_color;
242 private Color background_color;
243 private Color background_color_gradient_bottom;
244 private Color dup_box_color;
245 private Color spec_box_color;
246 private Color collapse_fill_color;
247 private Color found_color;
248 private Color duplication_or_specation_color;
249 private Color domains_color;
250 private Color binary_domain_combinations_color;
251 private Color annotation_color;
252 private Color ov_color;
254 private TreeColorSet() {
255 // Hidden constructor.
258 void cycleColorScheme() {
259 if ( getCurrentColorScheme() >= _color_schemes.length - 1 ) {
263 setColorSchema( getCurrentColorScheme() + 1 );
267 Color getAnnotationColor() {
268 return annotation_color;
271 Color getBackgroundColor() {
272 return background_color;
275 Color getBackgroundColorGradientBottom() {
276 return background_color_gradient_bottom;
279 Color getBinaryDomainCombinationsColor() {
280 if ( Constants.SPECIAL_CUSTOM ) {
281 return new Color( 50, 50, 50 );
283 return binary_domain_combinations_color;
286 Color getBoxColor() {
290 Color getBranchColor() {
294 Color getBranchColorForPdf() {
298 Color getBranchLengthColor() {
299 return branch_length_color;
302 Color getCollapseFillColor() {
303 return collapse_fill_color;
306 Color[][] getColorSchemes() {
307 return _color_schemes;
310 Color getConfidenceColor() {
311 return bootstrap_color;
314 int getCurrentColorScheme() {
315 return _color_scheme;
318 String getCurrentColorSchemeName() {
319 return SCHEME_NAMES[ getCurrentColorScheme() ];
322 Color getDomainsColor() {
323 return domains_color;
326 Color getDuplicationBoxColor() {
327 return dup_box_color;
330 Color getDuplicationOrSpeciationColor() {
331 return duplication_or_specation_color;
334 Color getFoundColor() {
338 Color getGainedCharactersColor() {
342 Color getLostCharactersColor() {
350 Color getSequenceColor() {
354 Color getSpecBoxColor() {
355 return spec_box_color;
358 Color getTaxonomyColor() {
359 return taxonomy_color;
362 void setColorforDefault( final String color_field_name, final Color color ) {
363 final String query = color_field_name.trim().replace( '_', ' ' );
364 boolean found = false;
366 for( final String cf : COLOR_FIELDS ) {
367 if ( query.equalsIgnoreCase( cf ) ) {
369 setColorForDefault( i, color );
375 throw new IllegalArgumentException( "unknown color field name [" + color_field_name + "]" );
379 private void setColorForDefault( final int i, final Color color ) {
380 _color_schemes[ 0 ][ i ] = color;
384 * Switches colors between different schemes.
386 void setColorSchema( final int scheme ) {
387 _color_scheme = scheme;
388 background_color = _color_schemes[ scheme ][ 0 ];
389 background_color_gradient_bottom = _color_schemes[ scheme ][ 1 ];
390 seq_color = _color_schemes[ scheme ][ 2 ];
391 taxonomy_color = _color_schemes[ scheme ][ 3 ];
392 bootstrap_color = _color_schemes[ scheme ][ 4 ];
393 branch_length_color = _color_schemes[ scheme ][ 5 ];
394 branch_color = _color_schemes[ scheme ][ 6 ];
395 box_color = _color_schemes[ scheme ][ 7 ];
396 collapse_fill_color = _color_schemes[ scheme ][ 8 ];
397 found_color = _color_schemes[ scheme ][ 9 ];
398 dup_box_color = _color_schemes[ scheme ][ 10 ];
399 spec_box_color = _color_schemes[ scheme ][ 11 ];
400 duplication_or_specation_color = _color_schemes[ scheme ][ 12 ];
401 domains_color = _color_schemes[ scheme ][ 13 ];
402 binary_domain_combinations_color = _color_schemes[ scheme ][ 14 ];
403 annotation_color = _color_schemes[ scheme ][ 15 ];
404 ov_color = _color_schemes[ scheme ][ 16 ];
407 void setCurrentColorScheme( final int color_scheme ) {
408 _color_scheme = color_scheme;
411 static TreeColorSet createInstance() {
412 final TreeColorSet tcs = new TreeColorSet();
413 tcs.setColorSchema( 0 );
417 static TreeColorSet createInstance( final Configuration configuration ) {
418 final TreeColorSet tcs = new TreeColorSet();
419 if ( ( configuration != null ) && ( configuration.getDisplayColors() != null )
420 && ( configuration.getDisplayColors().size() > 0 ) ) {
421 final Map<String, Color> colors = configuration.getDisplayColors();
422 for( final String field : colors.keySet() ) {
423 final Color color = colors.get( field );
425 tcs.setColorforDefault( field, color );
427 catch ( final IllegalArgumentException ex ) {
428 ForesterUtil.printWarningMessage( Constants.PRG_NAME, ex.getMessage() );
432 tcs.setColorSchema( 0 );