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