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