c127885bb9460bc605d5b8cc3eb40e8b891e9390
[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 /*
35  * Maintains the color schemes and a set of colors for drawing a tree.
36  */
37 public final class TreeColorSet {
38
39     public static final String OVERVIEW                   = "Overview";
40     public static final String ANNOTATION                 = "Annotation";
41     public static final String BINARY_DOMAIN_COMBINATIONS = "Binary Domain Combinations";
42     public static final String DOMAINS                    = "Domains";
43     public static final String DUPLICATION_OR_SPECATION   = "Duplication or Specation";
44     public static final String SPECIATION                 = "Speciation";
45     public static final String DUPLICATION                = "Duplication";
46     public static final String MATCHING_NODES             = "Matching Nodes";
47     public static final String COLLAPSED                  = "Collapsed";
48     public static final String NODE_BOX                   = "Node Box";
49     public static final String BRANCH                     = "Branch";
50     public static final String BRANCH_LENGTH              = "Branch Length";
51     public static final String CONFIDENCE                 = "Confidence";
52     public static final String TAXONOMY                   = "Taxonomy";
53     public static final String SEQUENCE                   = "Sequence";
54     public static final String BACKGROUND_GRADIENT_BOTTOM = "Background Gradient Bottom";
55     public static final String BACKGROUND                 = "Background";
56     static final String[]      SCHEME_NAMES               = { "Default", "Black", "Black & White", "Silver",
57             "The Matrix", "White & Blue", "Cyan", "Clockwork", "Blue", "Blue & White", "Neon" };
58     static final String[]      COLOR_FIELDS               = { BACKGROUND, BACKGROUND_GRADIENT_BOTTOM, SEQUENCE,
59             TAXONOMY, CONFIDENCE, BRANCH_LENGTH, BRANCH, NODE_BOX, COLLAPSED, MATCHING_NODES, DUPLICATION, SPECIATION,
60             DUPLICATION_OR_SPECATION, DOMAINS, BINARY_DOMAIN_COMBINATIONS, ANNOTATION, OVERVIEW };
61     // All the color sets; better be the same # of sets as there are names!
62     private final Color[][]    _color_schemes             = { { new Color( 0, 0, 0 ), // background_color
63             new Color( 0, 100, 100 ), // background_color_gradient_bottom
64             new Color( 220, 220, 220 ), // sequence  __ Default (same as 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 0
72             new Color( 255, 0, 0 ), // found_color 1
73             new Color( 255, 255, 0 ), // found_color 1 + 2
74             new Color( 255, 0, 0 ), // duplication_box_color
75             new Color( 0, 255, 0 ), // speciation_box_color
76             new Color( 255, 255, 0 ), // duplication_speciation_color
77             new Color( 123, 104, 238 ), // domains_color  
78             new Color( 65, 105, 255 ), // binary_domain_combinations_color  
79             new Color( 173, 255, 47 ) // annotation
80             , new Color( 130, 130, 130 )                 // overview
81             }, { new Color( 0, 0, 0 ), // background_color
82             new Color( 0, 255, 255 ), // background_color_gradient_bottom    
83             new Color( 220, 220, 220 ), // sequence  __ Black
84             new Color( 180, 180, 180 ), // taxonomy
85             new Color( 56, 176, 222 ), // support  
86             new Color( 140, 140, 140 ), // branch_length_color
87             new Color( 255, 255, 255 ), // branch_color
88             new Color( 255, 255, 255 ), // box_color
89             new Color( 255, 255, 0 ), // collapesed_fill_color
90             new Color( 0, 255, 0 ), // found_color 0
91             new Color( 255, 0, 0 ), // found_color 1
92             new Color( 255, 255, 0 ), // found_color 1 + 2
93             new Color( 255, 0, 0 ), // duplication_box_color
94             new Color( 0, 255, 0 ), // speciation_box_color
95             new Color( 255, 255, 0 ), // duplication_speciation_color
96             new Color( 123, 104, 238 ), // domains_color
97             new Color( 65, 105, 255 ), // binary_domain_combinations_color
98             new Color( 173, 255, 47 ) // annotation
99             , new Color( 130, 130, 130 ) // ov
100             }, { new Color( 255, 255, 255 ), // background_color
101             new Color( 0, 255, 255 ), // background_color_gradient_bottom
102             new Color( 0, 0, 0 ), // sequence  __ Black & White
103             new Color( 0, 0, 0 ), // taxonomy
104             new Color( 0, 0, 0 ), // support 
105             new Color( 0, 0, 0 ), // branch_length_color
106             new Color( 0, 0, 0 ), // branch_color
107             new Color( 0, 0, 0 ), // box_color
108             new Color( 0, 0, 0 ), // collapesed_fill_color
109             new Color( 255, 0, 0 ), // found_color 0
110             new Color( 0, 255, 0 ), // found_color 1
111             new Color( 0, 0, 255 ), // found_color 1 + 2
112             new Color( 255, 0, 0 ), // duplication_box_color
113             new Color( 0, 255, 0 ), // speciation_box_color
114             new Color( 255, 255, 0 ), // duplication_speciation_color
115             new Color( 0, 0, 0 ), // domains_color
116             new Color( 0, 0, 0 ), // binary_domain_combinations_color
117             new Color( 0, 0, 0 ) // annotation
118             , new Color( 220, 220, 220 ) // ov
119             }, { new Color( 0, 0, 0 ), // background_color
120             new Color( 0, 255, 255 ), // background_color_gradient_bottom
121             new Color( 220, 220, 220 ), // sequence __ Silver
122             new Color( 180, 180, 180 ), // taxonomy
123             new Color( 140, 140, 140 ), // support 
124             new Color( 140, 140, 140 ), // branch_length_color
125             new Color( 240, 240, 240 ), // branch_color
126             new Color( 140, 140, 140 ), // box_color
127             new Color( 140, 140, 140 ), // collapesed_fill_color
128             new Color( 255, 0, 0 ), // found_color 0
129             new Color( 0, 255, 0 ), // found_color 1
130             new Color( 255, 255, 0 ), // found_color 1 + 2
131             new Color( 255, 0, 0 ), // duplication_box_color
132             new Color( 0, 255, 0 ), // speciation_box_color
133             new Color( 255, 255, 0 ), // duplication_speciation_color
134             new Color( 180, 180, 180 ), // domains_color
135             new Color( 180, 180, 180 ), // binary_domain_combinations_color
136             new Color( 140, 140, 140 ) // annotation
137             , new Color( 40, 40, 40 ) // ov
138             }, { new Color( 0, 10, 0 ), // background_color
139             new Color( 0, 255, 255 ), // background_color_gradient_bottom
140             new Color( 0, 255, 0 ), // sequence __ the Matrix
141             new Color( 30, 200, 30 ), // taxonomy
142             new Color( 0, 155, 0 ), // support 
143             new Color( 0, 100, 0 ), // branch_length_color
144             new Color( 0, 155, 0 ), // branch_color
145             new Color( 0, 255, 0 ), // box_color
146             new Color( 0, 255, 0 ), // collapesed_fill_color
147             new Color( 255, 0, 0 ), // found_color 0
148             new Color(  0, 255, 0 ), // found_color 1
149             new Color( 255, 255, 0 ), // found_color 1 + 2
150             new Color( 255, 0, 0 ), // duplication_box_color
151             new Color( 0, 255, 0 ), // speciation_box_color
152             new Color( 255, 255, 0 ), // duplication_speciation_color
153             new Color( 0, 235, 0 ), // domains_color
154             new Color( 0, 235, 0 ), // binary_domain_combinations_color
155             new Color( 0, 235, 0 ) // annotation
156             , new Color( 40, 40, 40 ) // ov
157             }, { new Color( 255, 255, 255 ), // background_color
158             new Color( 0, 255, 255 ), // background_color_gradient_bottom
159             new Color( 0, 0, 0 ), //sequence __ White & Blue
160             new Color( 40, 40, 40 ), // taxonomy
161             new Color( 0, 125, 0 ), // support 
162             new Color( 70, 70, 0 ), // branch_length_color
163             new Color( 0, 20, 200 ), // branch_color
164             new Color( 0, 20, 200 ), // box_color
165             new Color( 255, 255, 0 ), // collapesed_fill_color
166             new Color( 0, 255, 0 ), // found_color 0
167             new Color( 255, 0, 0 ), // found_color 1
168             new Color( 0, 0, 255 ), // found_color 0 + 1
169             new Color( 255, 0, 0 ), // duplication_box_color
170             new Color( 0, 255, 0 ), // speciation_box_color
171             new Color( 255, 255, 0 ), // duplication_speciation_color
172             new Color( 123, 104, 238 ), // domains_color
173             new Color( 65, 105, 225 ), // binary_domain_combinations_color
174             new Color( 173, 255, 47 ) // annotation
175             , new Color( 220, 220, 220 ) // ov
176             }, { new Color( 0, 0, 0 ), // background_color
177             new Color( 0, 255, 255 ), // background_color_gradient_bottom
178             new Color( 255, 255, 255 ), // sequence __ Cyan
179             new Color( 200, 200, 200 ), // taxonomy
180             new Color( 255, 255, 255 ), // support 
181             new Color( 200, 200, 200 ), // branch_length_color
182             new Color( 0, 255, 255 ), // branch_color
183             new Color( 0, 255, 255 ), // box_color
184             new Color( 255, 255, 0 ), // collapesed_fill_color
185             new Color( 0, 255, 0 ), // found_color 0
186             new Color( 0, 0, 255 ), // found_color 1
187             new Color( 0, 255, 255 ), // found_color 0 + 1
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( 123, 104, 238 ), // domains_color
192             new Color( 65, 105, 225 ), // binary_domain_combinations_color
193             new Color( 173, 255, 47 ) // annotation
194             , new Color( 0, 120, 120 ) // ov
195             }, { new Color( 0, 0, 0 ), // background_color
196             new Color( 0, 255, 255 ), // background_color_gradient_bottom
197             new Color( 255, 200, 0 ), // sequence __ Clockwork
198             new Color( 255, 200, 0 ), // taxonomy
199             new Color( 255, 200, 0 ), // support 
200             new Color( 255, 200, 0 ), // branch_length_color
201             new Color( 255, 200, 0 ), // branch_color
202             new Color( 255, 200, 0 ), // box_color
203             new Color( 255, 255, 255 ), // collapesed_fill_color
204             new Color( 255, 255, 0 ), // found_color 0
205             new Color( 0, 255, 255 ), // found_color 1
206             new Color( 255, 255, 255 ), // found_color 0 + 1
207             new Color( 255, 0, 0 ), // duplication_box_color
208             new Color( 0, 255, 0 ), // speciation_box_color
209             new Color( 255, 255, 0 ), // duplication_speciation_color
210             new Color( 150, 150, 150 ), // domains_color
211             new Color( 150, 150, 150 ), // binary_domain_combinations_color
212             new Color( 150, 150, 150 ) // annotation
213             , new Color( 150, 150, 150 ) // ov
214             }, { new Color( 0, 0, 100 ), // background_color
215             new Color( 0, 255, 255 ), // background_color_gradient_bottom
216             new Color( 255, 255, 255 ), // sequence __ Blue
217             new Color( 255, 255, 255 ), // taxonomy
218             new Color( 255, 0, 0 ), // support 
219             new Color( 255, 0, 0 ), // branch_length_color
220             new Color( 255, 0, 0 ), // branch_color
221             new Color( 255, 0, 0 ), // box_color
222             new Color( 0, 0, 0 ), // collapesed_fill_color
223             new Color( 0, 255, 0 ), // found_color
224             new Color( 255, 0, 0 ), // found_color 1
225             new Color( 255, 255, 0 ), // found_color 1 + 2
226             new Color( 255, 0, 0 ), // duplication_box_color
227             new Color( 0, 255, 0 ), // speciation_box_color
228             new Color( 255, 255, 0 ), // duplication_speciation_color
229             new Color( 255, 255, 255 ), // domains_color
230             new Color( 255, 255, 255 ), // binary_domain_combinations_color
231             new Color( 255, 255, 255 ) // annotation
232             , new Color( 77, 77, 255 ) // ov
233             }, { new Color( 0, 0, 0 ), // background_color
234             new Color( 0, 255, 255 ), // background_color_gradient_bottom
235             new Color( 255, 255, 255 ), // sequence __ blue &  white
236             new Color( 255, 255, 255 ), // taxonomy
237             new Color( 255, 255, 255 ), // support 
238             new Color( 0, 191, 255 ), // branch_length_color
239             new Color( 0, 191, 255 ), // branch_color
240             new Color( 0, 191, 255 ), // box_color
241             new Color( 255, 255, 255 ), // collapesed_fill_color
242             new Color( 255, 0, 0 ), // found_color 0
243             new Color( 0, 255, 0 ), // found_color 1
244             new Color( 255, 255, 0 ), // found_color 0 + 1
245             new Color( 255, 0, 0 ), // duplication_box_color
246             new Color( 0, 255, 0 ), // speciation_box_color
247             new Color( 255, 255, 0 ), // duplication_speciation_color
248             new Color( 255, 255, 255 ), // domains_color
249             new Color( 255, 255, 255 ), // binary_domain_combinations_color
250             new Color( 255, 255, 255 ) // annotation
251             , new Color( 170, 187, 204 ) // ov
252             }, { new Color( 0, 0, 0 ), // background_color
253             new Color( 255, 255, 0 ), // background_color_gradient_bottom
254             new Color( 127, 255, 0 ), // sequence __ Neon
255             new Color( 255, 110, 199 ), // taxonomy
256             new Color( 234, 173, 234 ), // support 
257             new Color( 77, 77, 255 ), // branch_length_color
258             new Color( 234, 173, 234 ), // branch_color
259             new Color( 77, 77, 255 ), // box_color
260             new Color( 77, 77, 255 ), // collapsed_fill_color
261             new Color( 243, 243, 21 ), // found_color 0
262             new Color( 255,20, 147 ), // found_color 1
263             new Color( 255, 255, 255 ), // found_color 1 + 2
264             new Color( 255, 0, 0 ), // duplication_box_color
265             new Color( 0, 255, 0 ), // speciation_box_color
266             new Color( 255, 255, 0 ), // duplication_speciation_color
267             new Color( 27, 255, 0 ), // domains_color
268             new Color( 27, 255, 0 ), // binary_domain_combinations_color
269             new Color( 27, 255, 0 ) // annotation
270             , new Color( 77, 77, 255 ) // ov
271             }                                            };
272     // Color schemes:
273     private int                _color_scheme;
274     // The drawing colors
275     private Color              seq_color;
276     private Color              taxonomy_color;
277     private Color              bootstrap_color;
278     private Color              branch_length_color;
279     private Color              branch_color;
280     private Color              box_color;
281     private Color              background_color;
282     private Color              background_color_gradient_bottom;
283     private Color              dup_box_color;
284     private Color              spec_box_color;
285     private Color              collapse_fill_color;
286     private Color              found_color_0;
287     private Color              found_color_1;
288     private Color              found_color_0_and_1;
289     private Color              duplication_or_specation_color;
290     private Color              domains_color;
291     private Color              binary_domain_combinations_color;
292     private Color              annotation_color;
293     private Color              ov_color;
294
295     private TreeColorSet() {
296         // Hidden constructor.
297     }
298
299     void cycleColorScheme() {
300         if ( getCurrentColorScheme() >= ( _color_schemes.length - 1 ) ) {
301             setColorSchema( 0 );
302         }
303         else {
304             setColorSchema( getCurrentColorScheme() + 1 );
305         }
306     }
307
308     Color getAnnotationColor() {
309         return annotation_color;
310     }
311
312     Color getBackgroundColor() {
313         return background_color;
314     }
315
316     Color getBackgroundColorGradientBottom() {
317         return background_color_gradient_bottom;
318     }
319
320     Color getBinaryDomainCombinationsColor() {
321         if ( Constants.SPECIAL_CUSTOM ) {
322             return new Color( 50, 50, 50 );
323         }
324         return binary_domain_combinations_color;
325     }
326
327     Color getBoxColor() {
328         return box_color;
329     }
330
331     Color getBranchColor() {
332         return branch_color;
333     }
334
335     Color getBranchColorForPdf() {
336         return Color.BLACK;
337     }
338
339     Color getBranchLengthColor() {
340         return branch_length_color;
341     }
342
343     Color getCollapseFillColor() {
344         return collapse_fill_color;
345     }
346
347     Color[][] getColorSchemes() {
348         return _color_schemes;
349     }
350
351     Color getConfidenceColor() {
352         return bootstrap_color;
353     }
354
355     int getCurrentColorScheme() {
356         return _color_scheme;
357     }
358
359     String getCurrentColorSchemeName() {
360         return SCHEME_NAMES[ getCurrentColorScheme() ];
361     }
362
363     Color getDomainsColor() {
364         return domains_color;
365     }
366
367     Color getDuplicationBoxColor() {
368         return dup_box_color;
369     }
370
371     Color getDuplicationOrSpeciationColor() {
372         return duplication_or_specation_color;
373     }
374
375     Color getFoundColor0() {
376         return found_color_0;
377     }
378     
379     Color getFoundColor1() {
380         return found_color_1;
381     }
382     
383     Color getFoundColor0and1() {
384         return found_color_0_and_1;
385     }
386
387     Color getGainedCharactersColor() {
388         return Color.GREEN;
389     }
390
391     Color getLostCharactersColor() {
392         return Color.RED;
393     }
394
395     Color getOvColor() {
396         return ov_color;
397     }
398
399     Color getSequenceColor() {
400         return seq_color;
401     }
402
403     Color getSpecBoxColor() {
404         return spec_box_color;
405     }
406
407     Color getTaxonomyColor() {
408         return taxonomy_color;
409     }
410
411     void setColorforDefault( final String color_field_name, final Color color ) {
412         final String query = color_field_name.trim().replace( '_', ' ' );
413         boolean found = false;
414         int i = 0;
415         for( final String cf : COLOR_FIELDS ) {
416             if ( query.equalsIgnoreCase( cf ) ) {
417                 found = true;
418                 setColorForDefault( i, color );
419                 break;
420             }
421             ++i;
422         }
423         if ( !found ) {
424             throw new IllegalArgumentException( "unknown color field name [" + color_field_name + "]" );
425         }
426     }
427
428     private void setColorForDefault( final int i, final Color color ) {
429         _color_schemes[ 0 ][ i ] = color;
430     }
431
432     /**
433      * Switches colors between different schemes.
434      */
435     void setColorSchema( final int scheme ) {
436         _color_scheme = scheme;
437         background_color = _color_schemes[ scheme ][ 0 ];
438         background_color_gradient_bottom = _color_schemes[ scheme ][ 1 ];
439         seq_color = _color_schemes[ scheme ][ 2 ];
440         taxonomy_color = _color_schemes[ scheme ][ 3 ];
441         bootstrap_color = _color_schemes[ scheme ][ 4 ];
442         branch_length_color = _color_schemes[ scheme ][ 5 ];
443         branch_color = _color_schemes[ scheme ][ 6 ];
444         box_color = _color_schemes[ scheme ][ 7 ];
445         collapse_fill_color = _color_schemes[ scheme ][ 8 ];
446         found_color_0 = _color_schemes[ scheme ][ 9 ];
447         
448         found_color_1 = _color_schemes[ scheme ][ 10 ];
449         
450         found_color_0_and_1 = _color_schemes[ scheme ][11 ];
451         
452         
453         dup_box_color = _color_schemes[ scheme ][ 12 ];
454         spec_box_color = _color_schemes[ scheme ][ 13 ];
455         duplication_or_specation_color = _color_schemes[ scheme ][ 14 ];
456         domains_color = _color_schemes[ scheme ][ 15 ];
457         binary_domain_combinations_color = _color_schemes[ scheme ][ 16 ];
458         annotation_color = _color_schemes[ scheme ][ 17 ];
459         ov_color = _color_schemes[ scheme ][ 18 ];
460     }
461
462     void setCurrentColorScheme( final int color_scheme ) {
463         _color_scheme = color_scheme;
464     }
465
466     static TreeColorSet createInstance() {
467         final TreeColorSet tcs = new TreeColorSet();
468         tcs.setColorSchema( 0 );
469         return tcs;
470     }
471
472     static TreeColorSet createInstance( final Configuration configuration ) {
473         final TreeColorSet tcs = new TreeColorSet();
474         if ( ( configuration != null ) && ( configuration.getDisplayColors() != null )
475                 && ( configuration.getDisplayColors().size() > 0 ) ) {
476             final Map<String, Color> colors = configuration.getDisplayColors();
477             for( final String field : colors.keySet() ) {
478                 final Color color = colors.get( field );
479                 try {
480                     tcs.setColorforDefault( field, color );
481                 }
482                 catch ( final IllegalArgumentException ex ) {
483                     ForesterUtil.printWarningMessage( Constants.PRG_NAME, ex.getMessage() );
484                 }
485             }
486         }
487         tcs.setColorSchema( 0 );
488         return tcs;
489     }
490 }