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: https://sites.google.com/site/cmzmasek/home/software/forester
27 package org.forester.archaeopteryx;
29 import java.awt.Color;
32 import org.forester.util.ForesterUtil;
34 public final class TreeColorSet {
36 public static final String ANNOTATION = "Annotation";
37 public static final String BACKGROUND = "Background";
38 public static final String BACKGROUND_GRADIENT_BOTTOM = "Background Gradient Bottom";
39 public static final String BINARY_DOMAIN_COMBINATIONS = "Binary Domain Combinations";
40 public static final String BRANCH = "Branch";
41 public static final String BRANCH_LENGTH = "Branch Length";
42 public static final String COLLAPSED = "Collapsed";
43 public static final String CONFIDENCE = "Confidence";
44 public static final String DOMAIN_LABEL = "Domain Label";
45 public static final String DOMAIN_BASE = "Domain Base";
46 public static final String DUPLICATION = "Duplication";
47 public static final String DUPLICATION_OR_SPECATION = "Duplication or Specation";
48 public static final String MATCHING_NODES_A = "Matching A";
49 public static final String MATCHING_NODES_A_AND_B = "Matching A and B";
50 public static final String MATCHING_NODES_B = "Matching B";
51 public static final String NODE_BOX = "Node Box";
52 public static final String OVERVIEW = "Overview";
53 public static final String SEQUENCE = "Sequence";
54 public static final String SPECIATION = "Speciation";
55 public static final String TAXONOMY = "Taxonomy";
56 static final String[] COLOR_FIELDS = { BACKGROUND, BACKGROUND_GRADIENT_BOTTOM, SEQUENCE,
57 TAXONOMY, CONFIDENCE, BRANCH_LENGTH, BRANCH, NODE_BOX, COLLAPSED, MATCHING_NODES_A, MATCHING_NODES_B,
58 MATCHING_NODES_A_AND_B, DUPLICATION, SPECIATION, DUPLICATION_OR_SPECATION, DOMAIN_LABEL, DOMAIN_BASE,
59 BINARY_DOMAIN_COMBINATIONS, ANNOTATION, OVERVIEW };
60 static final String[] SCHEME_NAMES = { "Default", "Black", "Black & White", "Simple", "Silver", "Green",
61 "White & Blue", "Cyan", "Orange", "Blue", "Blue & White", "Neon" };
62 private int _color_scheme;
63 private final Color[][] _color_schemes = { { new Color( 0, 0, 0 ), // background_color
64 new Color( 0, 100, 100 ), // background_color_gradient_bottom
65 new Color( 230, 230, 230 ), // sequence __ Default (same as Black)
66 new Color( 180, 180, 180 ), // taxonomy
67 new Color( 180, 180, 180 ), // support
68 new Color( 140, 140, 140 ), // branch_length_color
69 new Color( 255, 255, 255 ), // branch_color
70 new Color( 255, 255, 255 ), // box_color
71 new Color( 255, 255, 255 ), // collapesed_fill_color
72 new Color( 0, 255, 0 ), // found_color 0
73 new Color( 255, 0, 0 ), // found_color 1
74 new Color( 255, 255, 0 ), // found_color 1 + 2
75 new Color( 255, 0, 0 ), // duplication_box_color
76 new Color( 0, 255, 0 ), // speciation_box_color
77 new Color( 255, 255, 0 ), // duplication_speciation_color
78 new Color( 230, 230, 230 ), // domain_label
79 new Color( 100, 100, 100 ), // domains_base
80 new Color( 65, 105, 255 ), // binary_domain_combinations_color
81 new Color( 173, 255, 47 ) // annotation
82 , new Color( 130, 130, 130 ) // overview
83 }, { new Color( 0, 0, 0 ), // background_color
84 new Color( 0, 255, 255 ), // background_color_gradient_bottom
85 new Color( 230, 230, 230 ), // sequence __ Black
86 new Color( 180, 180, 180 ), // taxonomy
87 new Color( 180, 180, 180 ), // support
88 new Color( 140, 140, 140 ), // branch_length_color
89 new Color( 255, 255, 255 ), // branch_color
90 new Color( 255, 255, 255 ), // box_color
91 new Color( 255, 255, 255 ), // collapesed_fill_color
92 new Color( 0, 255, 0 ), // found_color 0
93 new Color( 255, 0, 0 ), // found_color 1
94 new Color( 255, 255, 0 ), // found_color 1 + 2
95 new Color( 255, 0, 0 ), // duplication_box_color
96 new Color( 0, 255, 0 ), // speciation_box_color
97 new Color( 255, 255, 0 ), // duplication_speciation_color
98 new Color( 230, 230, 230 ), // domain_label
99 new Color( 100, 100, 100 ), // domains_base
100 new Color( 65, 105, 255 ), // binary_domain_combinations_color
101 new Color( 173, 255, 47 ) // annotation
102 , new Color( 130, 130, 130 ) // ov
103 }, { new Color( 255, 255, 255 ), // background_color
104 new Color( 0, 255, 255 ), // background_color_gradient_bottom
105 new Color( 0, 0, 0 ), // sequence __ Black & White
106 new Color( 0, 0, 0 ), // taxonomy
107 new Color( 0, 0, 0 ), // support
108 new Color( 0, 0, 0 ), // branch_length_color
109 new Color( 0, 0, 0 ), // branch_color
110 new Color( 0, 0, 0 ), // box_color
111 new Color( 0, 0, 0 ), // collapesed_fill_color
112 new Color( 255, 0, 0 ), // found_color 0
113 new Color( 0, 255, 0 ), // found_color 1
114 new Color( 0, 0, 255 ), // found_color 1 + 2
115 new Color( 255, 0, 0 ), // duplication_box_color
116 new Color( 0, 255, 0 ), // speciation_box_color
117 new Color( 255, 255, 0 ), // duplication_speciation_color
118 new Color( 0, 0, 0 ), // domain_label
119 new Color( 100, 100, 100 ), // domains_base
120 new Color( 0, 0, 0 ), // binary_domain_combinations_color
121 new Color( 0, 0, 0 ) // annotation
122 , new Color( 220, 220, 220 ) // ov
128 { new Color( 255, 255, 255 ), // background_color
129 new Color( 0, 255, 255 ), // background_color_gradient_bottom
130 new Color( 0, 0, 153 ), //sequence __ NEW
131 new Color( 0, 0, 102 ), // taxonomy
132 new Color( 0, 0, 204 ), // support
133 new Color( 0, 51, 255 ), // branch_length_color
134 new Color( 0, 0, 0 ), // branch_color
135 new Color( 0, 51, 255 ), // box_color
136 new Color( 0, 51, 255 ), // collapesed_fill_color
137 new Color( 0, 0, 255 ), // found_color 0
138 new Color( 0, 255, 0 ), // found_color 1
139 new Color( 0, 255, 255 ), // found_color 0 + 1
140 new Color( 102, 51, 255 ), // duplication_box_color
141 new Color( 153, 153, 153 ), // speciation_box_color
142 new Color( 255, 255, 0 ), // duplication_speciation_color
143 new Color( 51, 51, 51), // domain_label
144 new Color( 51, 51, 51 ), // domains_base
145 new Color( 0, 0, 153 ), // binary_domain_combinations_color
146 new Color( 0, 0, 153 ),// annotation
147 new Color( 51, 51, 51 ) // ov
156 { new Color( 0, 0, 0 ), // background_color
157 new Color( 0, 255, 255 ), // background_color_gradient_bottom
158 new Color( 220, 220, 220 ), // sequence __ Silver
159 new Color( 180, 180, 180 ), // taxonomy
160 new Color( 140, 140, 140 ), // support
161 new Color( 140, 140, 140 ), // branch_length_color
162 new Color( 240, 240, 240 ), // branch_color
163 new Color( 140, 140, 140 ), // box_color
164 new Color( 240, 240, 240 ), // collapesed_fill_color
165 new Color( 255, 0, 0 ), // found_color 0
166 new Color( 0, 255, 0 ), // found_color 1
167 new Color( 255, 255, 0 ), // found_color 1 + 2
168 new Color( 255, 0, 0 ), // duplication_box_color
169 new Color( 0, 255, 0 ), // speciation_box_color
170 new Color( 255, 255, 0 ), // duplication_speciation_color
171 new Color( 230, 230, 230 ), // domain_label
172 new Color( 100, 100, 100 ), // domains_base
173 new Color( 180, 180, 180 ), // binary_domain_combinations_color
174 new Color( 140, 140, 140 ) // annotation
175 , new Color( 40, 40, 40 ) // ov
176 }, { new Color( 0, 10, 0 ), // background_color
177 new Color( 0, 255, 255 ), // background_color_gradient_bottom
178 new Color( 0, 255, 0 ), // sequence __ the Matrix
179 new Color( 30, 200, 30 ), // taxonomy
180 new Color( 0, 155, 0 ), // support
181 new Color( 0, 100, 0 ), // branch_length_color
182 new Color( 0, 155, 0 ), // branch_color
183 new Color( 0, 255, 0 ), // box_color
184 new Color( 0, 155, 0 ), // collapesed_fill_color
185 new Color( 255, 0, 0 ), // found_color 0
186 new Color( 0, 255, 0 ), // found_color 1
187 new Color( 255, 255, 0 ), // found_color 1 + 2
188 new Color( 255, 0, 0 ), // duplication_box_color
189 new Color( 0, 255, 0 ), // speciation_box_color
190 new Color( 255, 255, 0 ), // duplication_speciation_color
191 new Color( 230, 230, 230 ), // domain_label
192 new Color( 100, 100, 100 ), // domains_base
193 new Color( 0, 235, 0 ), // binary_domain_combinations_color
194 new Color( 0, 235, 0 ) // annotation
195 , new Color( 40, 40, 40 ) // ov
196 }, { new Color( 255, 255, 255 ), // background_color
197 new Color( 0, 255, 255 ), // background_color_gradient_bottom
198 new Color( 0, 0, 0 ), //sequence __ White & Blue
199 new Color( 40, 40, 40 ), // taxonomy
200 new Color( 0, 125, 0 ), // support
201 new Color( 70, 70, 0 ), // branch_length_color
202 new Color( 0, 20, 200 ), // branch_color
203 new Color( 0, 20, 200 ), // box_color
204 new Color( 0, 20, 200 ), // collapesed_fill_color
205 new Color( 0, 255, 0 ), // found_color 0
206 new Color( 255, 0, 0 ), // found_color 1
207 new Color( 0, 0, 255 ), // found_color 0 + 1
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( 0, 0, 0 ), // domain_label
212 new Color( 50, 50, 50 ), // domains_base
213 new Color( 65, 105, 225 ), // binary_domain_combinations_color
214 new Color( 173, 255, 47 ) // annotation
215 , new Color( 220, 220, 220 ) // ov
216 }, { new Color( 0, 0, 0 ), // background_color
217 new Color( 0, 255, 255 ), // background_color_gradient_bottom
218 new Color( 255, 255, 255 ), // sequence __ Cyan
219 new Color( 200, 200, 200 ), // taxonomy
220 new Color( 255, 255, 255 ), // support
221 new Color( 200, 200, 200 ), // branch_length_color
222 new Color( 0, 255, 255 ), // branch_color
223 new Color( 0, 255, 255 ), // box_color
224 new Color( 0, 255, 255 ), // collapesed_fill_color
225 new Color( 0, 255, 0 ), // found_color 0
226 new Color( 0, 0, 255 ), // found_color 1
227 new Color( 0, 255, 255 ), // found_color 0 + 1
228 new Color( 255, 0, 0 ), // duplication_box_color
229 new Color( 0, 255, 0 ), // speciation_box_color
230 new Color( 255, 255, 0 ), // duplication_speciation_color
231 new Color( 230, 230, 230 ), // domain_label
232 new Color( 100, 100, 100 ), // domains_base
233 new Color( 65, 105, 225 ), // binary_domain_combinations_color
234 new Color( 173, 255, 47 ) // annotation
235 , new Color( 0, 120, 120 ) // ov
236 }, { new Color( 0, 0, 0 ), // background_color
237 new Color( 0, 255, 255 ), // background_color_gradient_bottom
238 new Color( 255, 200, 0 ), // sequence __ Clockwork
239 new Color( 255, 200, 0 ), // taxonomy
240 new Color( 255, 200, 0 ), // support
241 new Color( 255, 200, 0 ), // branch_length_color
242 new Color( 255, 200, 0 ), // branch_color
243 new Color( 255, 200, 0 ), // box_color
244 new Color( 255, 200, 0 ), // collapesed_fill_color
245 new Color( 255, 255, 0 ), // found_color 0
246 new Color( 0, 255, 255 ), // found_color 1
247 new Color( 255, 255, 255 ), // found_color 0 + 1
248 new Color( 255, 0, 0 ), // duplication_box_color
249 new Color( 0, 255, 0 ), // speciation_box_color
250 new Color( 255, 255, 0 ), // duplication_speciation_color
251 new Color( 255, 200, 0 ), // domain_label
252 new Color( 255, 200, 0 ), // domains_base
253 new Color( 150, 150, 150 ), // binary_domain_combinations_color
254 new Color( 150, 150, 150 ) // annotation
255 , new Color( 150, 150, 150 ) // ov
256 }, { new Color( 0, 0, 100 ), // background_color
257 new Color( 0, 255, 255 ), // background_color_gradient_bottom
258 new Color( 255, 255, 255 ), // sequence __ Blue
259 new Color( 255, 255, 255 ), // taxonomy
260 new Color( 255, 0, 0 ), // support
261 new Color( 255, 0, 0 ), // branch_length_color
262 new Color( 255, 0, 0 ), // branch_color
263 new Color( 255, 0, 0 ), // box_color
264 new Color( 255, 0, 0 ), // collapesed_fill_color
265 new Color( 0, 255, 0 ), // found_color
266 new Color( 255, 0, 0 ), // found_color 1
267 new Color( 255, 255, 0 ), // found_color 1 + 2
268 new Color( 255, 0, 0 ), // duplication_box_color
269 new Color( 0, 255, 0 ), // speciation_box_color
270 new Color( 255, 255, 0 ), // duplication_speciation_color
271 new Color( 255, 255, 255 ), // domain_label
272 new Color( 100, 100, 100 ), // domains_base
273 new Color( 255, 255, 255 ), // binary_domain_combinations_color
274 new Color( 255, 255, 255 ) // annotation
275 , new Color( 77, 77, 255 ) // ov
276 }, { new Color( 0, 0, 0 ), // background_color
277 new Color( 0, 255, 255 ), // background_color_gradient_bottom
278 new Color( 255, 255, 255 ), // sequence __ blue & white
279 new Color( 255, 255, 255 ), // taxonomy
280 new Color( 255, 255, 255 ), // support
281 new Color( 0, 191, 255 ), // branch_length_color
282 new Color( 0, 191, 255 ), // branch_color
283 new Color( 0, 191, 255 ), // box_color
284 new Color( 0, 191, 255 ), // collapesed_fill_color
285 new Color( 255, 0, 0 ), // found_color 0
286 new Color( 0, 255, 0 ), // found_color 1
287 new Color( 255, 255, 0 ), // found_color 0 + 1
288 new Color( 255, 0, 0 ), // duplication_box_color
289 new Color( 0, 255, 0 ), // speciation_box_color
290 new Color( 255, 255, 0 ), // duplication_speciation_color
291 new Color( 255, 255, 255 ), // domain_label
292 new Color( 150, 150, 150 ), // domains_base
293 new Color( 255, 255, 255 ), // binary_domain_combinations_color
294 new Color( 255, 255, 255 ) // annotation
295 , new Color( 170, 187, 204 ) // ov
296 }, { new Color( 0, 0, 0 ), // background_color
297 new Color( 255, 255, 0 ), // background_color_gradient_bottom
298 new Color( 127, 255, 0 ), // sequence __ Neon
299 new Color( 255, 110, 199 ), // taxonomy
300 new Color( 234, 173, 234 ), // support
301 new Color( 77, 77, 255 ), // branch_length_color
302 new Color( 234, 173, 234 ), // branch_color
303 new Color( 77, 77, 255 ), // box_color
304 new Color( 234, 173, 234 ), // collapsed_fill_color
305 new Color( 243, 243, 21 ), // found_color 0
306 new Color( 255, 20, 147 ), // found_color 1
307 new Color( 255, 255, 255 ), // found_color 1 + 2
308 new Color( 255, 0, 0 ), // duplication_box_color
309 new Color( 0, 255, 0 ), // speciation_box_color
310 new Color( 255, 255, 0 ), // duplication_speciation_color
311 new Color( 127, 255, 0 ), // domain_label
312 new Color( 234, 173, 234 ), // domains_base
313 new Color( 27, 255, 0 ), // binary_domain_combinations_color
314 new Color( 27, 255, 0 ) // annotation
315 , new Color( 77, 77, 255 ) // ov
317 private Color annotation_color;
318 private Color background_color;
319 private Color background_color_gradient_bottom;
320 private Color binary_domain_combinations_color;
321 private Color bootstrap_color;
322 private Color box_color;
323 private Color branch_color;
324 private Color branch_length_color;
325 private Color collapse_fill_color;
326 private Color domain_label_color;
327 private Color domain_base_color;
328 private Color dup_box_color;
329 private Color duplication_or_specation_color;
330 private Color found_color_0;
331 private Color found_color_0_and_1;
332 private Color found_color_1;
333 private Color ov_color;
334 // The drawing colors
335 private Color seq_color;
336 private Color spec_box_color;
337 private Color taxonomy_color;
339 private TreeColorSet() {
340 // Hidden constructor.
343 public Color getDomainBaseColor() {
344 return domain_base_color;
347 public Color getDomainLabelColor() {
348 return domain_label_color;
351 private void setColorForDefault( final int i, final Color color ) {
352 _color_schemes[ 0 ][ i ] = color;
355 void cycleColorScheme() {
356 if ( getCurrentColorScheme() >= ( _color_schemes.length - 1 ) ) {
360 setColorSchema( getCurrentColorScheme() + 1 );
364 Color getAnnotationColor() {
365 return annotation_color;
368 Color getBackgroundColor() {
369 return background_color;
372 Color getBackgroundColorGradientBottom() {
373 return background_color_gradient_bottom;
376 Color getBinaryDomainCombinationsColor() {
377 if ( AptxConstants.SPECIAL_CUSTOM ) {
378 return new Color( 50, 50, 50 );
380 return binary_domain_combinations_color;
383 Color getBoxColor() {
387 public Color getBranchColor() {
391 Color getBranchColorForPdf() {
395 Color getBranchLengthColor() {
396 return branch_length_color;
399 Color getCollapseFillColor() {
400 return collapse_fill_color;
403 Color[][] getColorSchemes() {
404 return _color_schemes;
407 Color getConfidenceColor() {
408 return bootstrap_color;
411 int getCurrentColorScheme() {
412 return _color_scheme;
415 String getCurrentColorSchemeName() {
416 return SCHEME_NAMES[ getCurrentColorScheme() ];
419 Color getDuplicationBoxColor() {
420 return dup_box_color;
423 Color getDuplicationOrSpeciationColor() {
424 return duplication_or_specation_color;
427 public Color getFoundColor0() {
428 return found_color_0;
431 public Color getFoundColor0and1() {
432 return found_color_0_and_1;
435 public Color getFoundColor1() {
436 return found_color_1;
439 Color getGainedCharactersColor() {
443 Color getLostCharactersColor() {
451 Color getSequenceColor() {
455 Color getSpecBoxColor() {
456 return spec_box_color;
459 Color getTaxonomyColor() {
460 return taxonomy_color;
463 void setColorforDefault( final String color_field_name, final Color color ) {
464 final String query = color_field_name.trim().replace( '_', ' ' );
465 boolean found = false;
467 for( final String cf : COLOR_FIELDS ) {
468 if ( query.equalsIgnoreCase( cf ) ) {
470 setColorForDefault( i, color );
476 throw new IllegalArgumentException( "unknown color field name [" + color_field_name + "]" );
481 * Switches colors between different schemes.
483 void setColorSchema( final int scheme ) {
484 _color_scheme = scheme;
485 background_color = _color_schemes[ scheme ][ 0 ];
486 background_color_gradient_bottom = _color_schemes[ scheme ][ 1 ];
487 seq_color = _color_schemes[ scheme ][ 2 ];
488 taxonomy_color = _color_schemes[ scheme ][ 3 ];
489 bootstrap_color = _color_schemes[ scheme ][ 4 ];
490 branch_length_color = _color_schemes[ scheme ][ 5 ];
491 branch_color = _color_schemes[ scheme ][ 6 ];
492 box_color = _color_schemes[ scheme ][ 7 ];
493 collapse_fill_color = _color_schemes[ scheme ][ 8 ];
494 found_color_0 = _color_schemes[ scheme ][ 9 ];
495 found_color_1 = _color_schemes[ scheme ][ 10 ];
496 found_color_0_and_1 = _color_schemes[ scheme ][ 11 ];
497 dup_box_color = _color_schemes[ scheme ][ 12 ];
498 spec_box_color = _color_schemes[ scheme ][ 13 ];
499 duplication_or_specation_color = _color_schemes[ scheme ][ 14 ];
500 domain_label_color = _color_schemes[ scheme ][ 15 ];
501 domain_base_color = _color_schemes[ scheme ][ 16 ];
502 binary_domain_combinations_color = _color_schemes[ scheme ][ 17 ];
503 annotation_color = _color_schemes[ scheme ][ 18 ];
504 ov_color = _color_schemes[ scheme ][ 19 ];
507 void setCurrentColorScheme( final int color_scheme ) {
508 _color_scheme = color_scheme;
511 static TreeColorSet createInstance() {
512 final TreeColorSet tcs = new TreeColorSet();
513 tcs.setColorSchema( 0 );
517 static TreeColorSet createInstance( final Configuration configuration ) {
518 final TreeColorSet tcs = new TreeColorSet();
519 if ( ( configuration != null ) && ( configuration.getDisplayColors() != null )
520 && ( configuration.getDisplayColors().size() > 0 ) ) {
521 final Map<String, Color> colors = configuration.getDisplayColors();
522 for( final String field : colors.keySet() ) {
523 final Color color = colors.get( field );
525 tcs.setColorforDefault( field, color );
527 catch ( final IllegalArgumentException ex ) {
528 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, ex.getMessage() );
532 tcs.setColorSchema( 0 );