in progress
[jalview.git] / forester / java / src / org / forester / archaeopteryx / TreeColorSet.java
1 // $Id:
2 // FORESTER -- software libraries and applications
3 // for evolutionary biology research and applications.
4 //
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
8 // All rights reserved
9 //
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.
14 //
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.
19 //
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
23 //
24 // Contact: phylosoft @ gmail . com
25 // WWW: https://sites.google.com/site/cmzmasek/home/software/forester
26
27 package org.forester.archaeopteryx;
28
29 import java.awt.Color;
30 import java.util.Map;
31
32 import org.forester.util.ForesterUtil;
33
34 public final class TreeColorSet {
35
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", "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
123     }, { new Color( 0, 0, 0 ), // background_color
124         new Color( 0, 255, 255 ), // background_color_gradient_bottom
125         new Color( 220, 220, 220 ), // sequence __ Silver
126         new Color( 180, 180, 180 ), // taxonomy
127         new Color( 140, 140, 140 ), // support
128         new Color( 140, 140, 140 ), // branch_length_color
129         new Color( 240, 240, 240 ), // branch_color
130         new Color( 140, 140, 140 ), // box_color
131         new Color( 240, 240, 240 ), // collapesed_fill_color
132         new Color( 255, 0, 0 ), // found_color 0
133         new Color( 0, 255, 0 ), // found_color 1
134         new Color( 255, 255, 0 ), // found_color 1 + 2
135         new Color( 255, 0, 0 ), // duplication_box_color
136         new Color( 0, 255, 0 ), // speciation_box_color
137         new Color( 255, 255, 0 ), // duplication_speciation_color
138         new Color( 230, 230, 230 ), // domain_label
139         new Color( 100, 100, 100 ), // domains_base
140         new Color( 180, 180, 180 ), // binary_domain_combinations_color
141         new Color( 140, 140, 140 ) // annotation
142     , new Color( 40, 40, 40 ) // ov
143     }, { new Color( 0, 10, 0 ), // background_color
144         new Color( 0, 255, 255 ), // background_color_gradient_bottom
145         new Color( 0, 255, 0 ), // sequence __ the Matrix
146         new Color( 30, 200, 30 ), // taxonomy
147         new Color( 0, 155, 0 ), // support
148         new Color( 0, 100, 0 ), // branch_length_color
149         new Color( 0, 155, 0 ), // branch_color
150         new Color( 0, 255, 0 ), // box_color
151         new Color( 0, 155, 0 ), // collapesed_fill_color
152         new Color( 255, 0, 0 ), // found_color 0
153         new Color( 0, 255, 0 ), // found_color 1
154         new Color( 255, 255, 0 ), // found_color 1 + 2
155         new Color( 255, 0, 0 ), // duplication_box_color
156         new Color( 0, 255, 0 ), // speciation_box_color
157         new Color( 255, 255, 0 ), // duplication_speciation_color
158         new Color( 230, 230, 230 ), // domain_label
159         new Color( 100, 100, 100 ), // domains_base
160         new Color( 0, 235, 0 ), // binary_domain_combinations_color
161         new Color( 0, 235, 0 ) // annotation
162     , new Color( 40, 40, 40 ) // ov
163     }, { new Color( 255, 255, 255 ), // background_color
164         new Color( 0, 255, 255 ), // background_color_gradient_bottom
165         new Color( 0, 0, 0 ), //sequence __ White & Blue
166         new Color( 40, 40, 40 ), // taxonomy
167         new Color( 0, 125, 0 ), // support
168         new Color( 70, 70, 0 ), // branch_length_color
169         new Color( 0, 20, 200 ), // branch_color
170         new Color( 0, 20, 200 ), // box_color
171         new Color( 0, 20, 200 ), // collapesed_fill_color
172         new Color( 0, 255, 0 ), // found_color 0
173         new Color( 255, 0, 0 ), // found_color 1
174         new Color( 0, 0, 255 ), // found_color 0 + 1
175         new Color( 255, 0, 0 ), // duplication_box_color
176         new Color( 0, 255, 0 ), // speciation_box_color
177         new Color( 255, 255, 0 ), // duplication_speciation_color
178         new Color( 0, 0, 0 ), // domain_label
179         new Color( 50, 50, 50 ), // domains_base
180         new Color( 65, 105, 225 ), // binary_domain_combinations_color
181         new Color( 173, 255, 47 ) // annotation
182     , new Color( 220, 220, 220 ) // ov
183     }, { new Color( 0, 0, 0 ), // background_color
184         new Color( 0, 255, 255 ), // background_color_gradient_bottom
185         new Color( 255, 255, 255 ), // sequence __ Cyan
186         new Color( 200, 200, 200 ), // taxonomy
187         new Color( 255, 255, 255 ), // support
188         new Color( 200, 200, 200 ), // branch_length_color
189         new Color( 0, 255, 255 ), // branch_color
190         new Color( 0, 255, 255 ), // box_color
191         new Color( 0, 255, 255 ), // collapesed_fill_color
192         new Color( 0, 255, 0 ), // found_color 0
193         new Color( 0, 0, 255 ), // found_color 1
194         new Color( 0, 255, 255 ), // found_color 0 + 1
195         new Color( 255, 0, 0 ), // duplication_box_color
196         new Color( 0, 255, 0 ), // speciation_box_color
197         new Color( 255, 255, 0 ), // duplication_speciation_color
198         new Color( 230, 230, 230 ), // domain_label
199         new Color( 100, 100, 100 ), // domains_base
200         new Color( 65, 105, 225 ), // binary_domain_combinations_color
201         new Color( 173, 255, 47 ) // annotation
202     , new Color( 0, 120, 120 ) // ov
203     }, { new Color( 0, 0, 0 ), // background_color
204         new Color( 0, 255, 255 ), // background_color_gradient_bottom
205         new Color( 255, 200, 0 ), // sequence __ Clockwork
206         new Color( 255, 200, 0 ), // taxonomy
207         new Color( 255, 200, 0 ), // support
208         new Color( 255, 200, 0 ), // branch_length_color
209         new Color( 255, 200, 0 ), // branch_color
210         new Color( 255, 200, 0 ), // box_color
211         new Color( 255, 200, 0 ), // collapesed_fill_color
212         new Color( 255, 255, 0 ), // found_color 0
213         new Color( 0, 255, 255 ), // found_color 1
214         new Color( 255, 255, 255 ), // found_color 0 + 1
215         new Color( 255, 0, 0 ), // duplication_box_color
216         new Color( 0, 255, 0 ), // speciation_box_color
217         new Color( 255, 255, 0 ), // duplication_speciation_color
218         new Color( 255, 200, 0 ), // domain_label
219         new Color( 255, 200, 0 ), // domains_base
220         new Color( 150, 150, 150 ), // binary_domain_combinations_color
221         new Color( 150, 150, 150 ) // annotation
222     , new Color( 150, 150, 150 ) // ov
223     }, { new Color( 0, 0, 100 ), // background_color
224         new Color( 0, 255, 255 ), // background_color_gradient_bottom
225         new Color( 255, 255, 255 ), // sequence __ Blue
226         new Color( 255, 255, 255 ), // taxonomy
227         new Color( 255, 0, 0 ), // support
228         new Color( 255, 0, 0 ), // branch_length_color
229         new Color( 255, 0, 0 ), // branch_color
230         new Color( 255, 0, 0 ), // box_color
231         new Color( 255, 0, 0 ), // collapesed_fill_color
232         new Color( 0, 255, 0 ), // found_color
233         new Color( 255, 0, 0 ), // found_color 1
234         new Color( 255, 255, 0 ), // found_color 1 + 2
235         new Color( 255, 0, 0 ), // duplication_box_color
236         new Color( 0, 255, 0 ), // speciation_box_color
237         new Color( 255, 255, 0 ), // duplication_speciation_color
238         new Color( 255, 255, 255 ), // domain_label
239         new Color( 100, 100, 100 ), // domains_base
240         new Color( 255, 255, 255 ), // binary_domain_combinations_color
241         new Color( 255, 255, 255 ) // annotation
242     , new Color( 77, 77, 255 ) // ov
243     }, { new Color( 0, 0, 0 ), // background_color
244         new Color( 0, 255, 255 ), // background_color_gradient_bottom
245         new Color( 255, 255, 255 ), // sequence __ blue &  white
246         new Color( 255, 255, 255 ), // taxonomy
247         new Color( 255, 255, 255 ), // support
248         new Color( 0, 191, 255 ), // branch_length_color
249         new Color( 0, 191, 255 ), // branch_color
250         new Color( 0, 191, 255 ), // box_color
251         new Color( 0, 191, 255 ), // collapesed_fill_color
252         new Color( 255, 0, 0 ), // found_color 0
253         new Color( 0, 255, 0 ), // found_color 1
254         new Color( 255, 255, 0 ), // found_color 0 + 1
255         new Color( 255, 0, 0 ), // duplication_box_color
256         new Color( 0, 255, 0 ), // speciation_box_color
257         new Color( 255, 255, 0 ), // duplication_speciation_color
258         new Color( 255, 255, 255 ), // domain_label
259         new Color( 150, 150, 150 ), // domains_base
260         new Color( 255, 255, 255 ), // binary_domain_combinations_color
261         new Color( 255, 255, 255 ) // annotation
262     , new Color( 170, 187, 204 ) // ov
263     }, { new Color( 0, 0, 0 ), // background_color
264         new Color( 255, 255, 0 ), // background_color_gradient_bottom
265         new Color( 127, 255, 0 ), // sequence __ Neon
266         new Color( 255, 110, 199 ), // taxonomy
267         new Color( 234, 173, 234 ), // support
268         new Color( 77, 77, 255 ), // branch_length_color
269         new Color( 234, 173, 234 ), // branch_color
270         new Color( 77, 77, 255 ), // box_color
271         new Color( 234, 173, 234 ), // collapsed_fill_color
272         new Color( 243, 243, 21 ), // found_color 0
273         new Color( 255, 20, 147 ), // found_color 1
274         new Color( 255, 255, 255 ), // found_color 1 + 2
275         new Color( 255, 0, 0 ), // duplication_box_color
276         new Color( 0, 255, 0 ), // speciation_box_color
277         new Color( 255, 255, 0 ), // duplication_speciation_color
278         new Color( 127, 255, 0 ), // domain_label
279         new Color( 234, 173, 234 ), // domains_base
280         new Color( 27, 255, 0 ), // binary_domain_combinations_color
281         new Color( 27, 255, 0 ) // annotation
282     , new Color( 77, 77, 255 ) // ov
283     }                                            };
284     private Color              annotation_color;
285     private Color              background_color;
286     private Color              background_color_gradient_bottom;
287     private Color              binary_domain_combinations_color;
288     private Color              bootstrap_color;
289     private Color              box_color;
290     private Color              branch_color;
291     private Color              branch_length_color;
292     private Color              collapse_fill_color;
293     private Color              domain_label_color;
294     private Color              domain_base_color;
295     private Color              dup_box_color;
296     private Color              duplication_or_specation_color;
297     private Color              found_color_0;
298     private Color              found_color_0_and_1;
299     private Color              found_color_1;
300     private Color              ov_color;
301     // The drawing colors
302     private Color              seq_color;
303     private Color              spec_box_color;
304     private Color              taxonomy_color;
305
306     private TreeColorSet() {
307         // Hidden constructor.
308     }
309
310     public Color getDomainBaseColor() {
311         return domain_base_color;
312     }
313
314     public Color getDomainLabelColor() {
315         return domain_label_color;
316     }
317
318     private void setColorForDefault( final int i, final Color color ) {
319         _color_schemes[ 0 ][ i ] = color;
320     }
321
322     void cycleColorScheme() {
323         if ( getCurrentColorScheme() >= ( _color_schemes.length - 1 ) ) {
324             setColorSchema( 0 );
325         }
326         else {
327             setColorSchema( getCurrentColorScheme() + 1 );
328         }
329     }
330
331     Color getAnnotationColor() {
332         return annotation_color;
333     }
334
335     Color getBackgroundColor() {
336         return background_color;
337     }
338
339     Color getBackgroundColorGradientBottom() {
340         return background_color_gradient_bottom;
341     }
342
343     Color getBinaryDomainCombinationsColor() {
344         if ( Constants.SPECIAL_CUSTOM ) {
345             return new Color( 50, 50, 50 );
346         }
347         return binary_domain_combinations_color;
348     }
349
350     Color getBoxColor() {
351         return box_color;
352     }
353
354     Color getBranchColor() {
355         return branch_color;
356     }
357
358     Color getBranchColorForPdf() {
359         return Color.BLACK;
360     }
361
362     Color getBranchLengthColor() {
363         return branch_length_color;
364     }
365
366     Color getCollapseFillColor() {
367         return collapse_fill_color;
368     }
369
370     Color[][] getColorSchemes() {
371         return _color_schemes;
372     }
373
374     Color getConfidenceColor() {
375         return bootstrap_color;
376     }
377
378     int getCurrentColorScheme() {
379         return _color_scheme;
380     }
381
382     String getCurrentColorSchemeName() {
383         return SCHEME_NAMES[ getCurrentColorScheme() ];
384     }
385
386     Color getDuplicationBoxColor() {
387         return dup_box_color;
388     }
389
390     Color getDuplicationOrSpeciationColor() {
391         return duplication_or_specation_color;
392     }
393
394     Color getFoundColor0() {
395         return found_color_0;
396     }
397
398     Color getFoundColor0and1() {
399         return found_color_0_and_1;
400     }
401
402     Color getFoundColor1() {
403         return found_color_1;
404     }
405
406     Color getGainedCharactersColor() {
407         return Color.GREEN;
408     }
409
410     Color getLostCharactersColor() {
411         return Color.RED;
412     }
413
414     Color getOvColor() {
415         return ov_color;
416     }
417
418     Color getSequenceColor() {
419         return seq_color;
420     }
421
422     Color getSpecBoxColor() {
423         return spec_box_color;
424     }
425
426     Color getTaxonomyColor() {
427         return taxonomy_color;
428     }
429
430     void setColorforDefault( final String color_field_name, final Color color ) {
431         final String query = color_field_name.trim().replace( '_', ' ' );
432         boolean found = false;
433         int i = 0;
434         for( final String cf : COLOR_FIELDS ) {
435             if ( query.equalsIgnoreCase( cf ) ) {
436                 found = true;
437                 setColorForDefault( i, color );
438                 break;
439             }
440             ++i;
441         }
442         if ( !found ) {
443             throw new IllegalArgumentException( "unknown color field name [" + color_field_name + "]" );
444         }
445     }
446
447     /**
448      * Switches colors between different schemes.
449      */
450     void setColorSchema( final int scheme ) {
451         _color_scheme = scheme;
452         background_color = _color_schemes[ scheme ][ 0 ];
453         background_color_gradient_bottom = _color_schemes[ scheme ][ 1 ];
454         seq_color = _color_schemes[ scheme ][ 2 ];
455         taxonomy_color = _color_schemes[ scheme ][ 3 ];
456         bootstrap_color = _color_schemes[ scheme ][ 4 ];
457         branch_length_color = _color_schemes[ scheme ][ 5 ];
458         branch_color = _color_schemes[ scheme ][ 6 ];
459         box_color = _color_schemes[ scheme ][ 7 ];
460         collapse_fill_color = _color_schemes[ scheme ][ 8 ];
461         found_color_0 = _color_schemes[ scheme ][ 9 ];
462         found_color_1 = _color_schemes[ scheme ][ 10 ];
463         found_color_0_and_1 = _color_schemes[ scheme ][ 11 ];
464         dup_box_color = _color_schemes[ scheme ][ 12 ];
465         spec_box_color = _color_schemes[ scheme ][ 13 ];
466         duplication_or_specation_color = _color_schemes[ scheme ][ 14 ];
467         domain_label_color = _color_schemes[ scheme ][ 15 ];
468         domain_base_color = _color_schemes[ scheme ][ 16 ];
469         binary_domain_combinations_color = _color_schemes[ scheme ][ 17 ];
470         annotation_color = _color_schemes[ scheme ][ 18 ];
471         ov_color = _color_schemes[ scheme ][ 19 ];
472     }
473
474     void setCurrentColorScheme( final int color_scheme ) {
475         _color_scheme = color_scheme;
476     }
477
478     static TreeColorSet createInstance() {
479         final TreeColorSet tcs = new TreeColorSet();
480         tcs.setColorSchema( 0 );
481         return tcs;
482     }
483
484     static TreeColorSet createInstance( final Configuration configuration ) {
485         final TreeColorSet tcs = new TreeColorSet();
486         if ( ( configuration != null ) && ( configuration.getDisplayColors() != null )
487                 && ( configuration.getDisplayColors().size() > 0 ) ) {
488             final Map<String, Color> colors = configuration.getDisplayColors();
489             for( final String field : colors.keySet() ) {
490                 final Color color = colors.get( field );
491                 try {
492                     tcs.setColorforDefault( field, color );
493                 }
494                 catch ( final IllegalArgumentException ex ) {
495                     ForesterUtil.printWarningMessage( Constants.PRG_NAME, ex.getMessage() );
496                 }
497             }
498         }
499         tcs.setColorSchema( 0 );
500         return tcs;
501     }
502 }