JAL-2844 removed resetting line drawing to keep line on screen
[jalview.git] / forester / java / src / org / forester / archaeopteryx / Configuration.java
1 // $Id:
2 // FORESTER -- software libraries and applications
3 // for evolutionary biology research and applications.
4 //
5 // Copyright (C) 2008-2009 Christian M. Zmasek
6 // Copyright (C) 2008-2009 Burnham Institute for Medical Research
7 // Copyright (C) 2000-2001 Washington University School of Medicine
8 // and Howard Hughes Medical Institute
9 // Copyright (C) 2003-2007 Ethalinda K.S. Cannon
10 // All rights reserved
11 //
12 // This library is free software; you can redistribute it and/or
13 // modify it under the terms of the GNU Lesser General Public
14 // License as published by the Free Software Foundation; either
15 // version 2.1 of the License, or (at your option) any later version.
16 //
17 // This library is distributed in the hope that it will be useful,
18 // but WITHOUT ANY WARRANTY; without even the implied warranty of
19 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 // Lesser General Public License for more details.
21 //
22 // You should have received a copy of the GNU Lesser General Public
23 // License along with this library; if not, write to the Free Software
24 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
25 //
26 // Contact: phylosoft @ gmail . com
27 // WWW: https://sites.google.com/site/cmzmasek/home/software/forester
28
29 package org.forester.archaeopteryx;
30
31 import java.awt.Color;
32 import java.io.BufferedReader;
33 import java.io.File;
34 import java.io.FileReader;
35 import java.io.IOException;
36 import java.io.InputStream;
37 import java.io.InputStreamReader;
38 import java.net.URL;
39 import java.util.Arrays;
40 import java.util.Hashtable;
41 import java.util.Map;
42 import java.util.SortedMap;
43 import java.util.StringTokenizer;
44 import java.util.TreeMap;
45
46 import org.forester.archaeopteryx.Options.CLADOGRAM_TYPE;
47 import org.forester.archaeopteryx.Options.NODE_LABEL_DIRECTION;
48 import org.forester.archaeopteryx.Options.OVERVIEW_PLACEMENT_TYPE;
49 import org.forester.archaeopteryx.Options.PHYLOGENY_GRAPHICS_TYPE;
50 import org.forester.io.parsers.nhx.NHXParser.TAXONOMY_EXTRACTION;
51 import org.forester.phylogeny.data.NodeDataField;
52 import org.forester.phylogeny.data.NodeVisualData;
53 import org.forester.phylogeny.data.NodeVisualData.NodeFill;
54 import org.forester.phylogeny.data.NodeVisualData.NodeShape;
55 import org.forester.util.ForesterUtil;
56
57 public final class Configuration {
58
59     public enum EXT_NODE_DATA_RETURN_ON {
60         BUFFER_ONLY, CONSOLE, WINODW;
61     }
62
63     public enum UI {
64         CROSSPLATFORM, NATIVE, NIMBUS, UNKNOWN
65     }
66
67     static enum TRIPLET {
68         FALSE, TRUE, UNKNOWN
69     }
70     final static String                     clickto_options[][]                                    = {
71         { "Display Node Data", "display" }, { "Collapse/Uncollapse", "display" }, { "Root/Reroot", "display" },
72         { "Go to Sub/Supertree", "display" }, { "Swap Descendants", "display" },
73         { "Colorize Node(s)", "display" }, { "Change Node Font(s)", "display" },
74         { "Colorize Subtree(s)", "display" }, { "Open Sequence DB", "display" }, { "Open PDB", "display" },
75         { "Open Taxonomy DB", "display" }, { "Launch BLAST", "display" }, { "Cut Subtree", "display" },
76         { "Copy Subtree", "display" }, { "Paste Subtree", "display" }, { "Delete Subtree/Node", "display" },
77         { "Add New Node", "display" }, { "Edit Node Data", "display" }, { "Sort Descendants", "display" },
78         { "List Node Data", "display" }, { "Select Node(s)", "display" } , { "Uncollapse All", "display" },  { "Order Subtree", "display" },                     };
79     private final static String             DEFAULT_SPECIES_COLORS[][]                             = {
80         { "BRAFL", "0x00FFFF" }, { "SPHGR", "0x9620F0" }, { "STRPU", "0x9620F0" }, { "CIOIN", "0xFF1CAE" },
81         { "CIOSA", "0xFF2CAE" }, { "BOVIN", "0x5C3317" }, { "CANFA", "0x8B2323" }, { "HUMAN", "0xFF2400" },
82         { "PANTR", "0xCC2400" }, { "MOUSE", "0xFF7F00" }, { "RAT", "0xFFEF00" }, { "MONDO", "0xEE9A49" },
83         { "ORNAN", "0xCD853F" }, { "XENLA", "0x6BAA23" }, { "XENTR", "0x6BAA23" }, { "CHICK", "0xFFC125" },
84         { "FUGRU", "0x0000FF" }, { "BRARE", "0x0000DD" }, { "DANRE", "0x0000BB" }, { "TETNG", "0x0000AA" },
85         { "ORYLA", "0x000088" }, { "GASAC", "0x000066" }, { "CAEEL", "0x666699" }, { "CAEBR", "0xB0B0B0" },
86         { "DROME", "0x663366" }, { "DROPS", "0x996699" }, { "APIME", "0x7A7700" }, { "AEDAE", "0x8C5900" },
87         { "TRICA", "0x918E00" }, { "NEMVE", "0x0066CC" }, { "HYDVU", "0x3399FF" }, { "LUBBA", "0xF7B5CB" },
88         { "GEOCY", "0xF5A0BD" }, { "AMPQE", "0x009966" }, { "SUBDO", "0xC790B9" }, { "MONBE", "0xFC0FC0" },
89         { "DICPU", "0xFFCC33" }, { "DICDI", "0xFFCC00" }, { "ENTHI", "0x5959AB" }, { "ARATH", "0x00FF00" },
90         { "POPTR", "0x006400" }, { "VITVI", "0x00CD00" }, { "GLYMA", "0x00FF7F" }, { "ORYSA", "0x008B00" },
91         { "ORYSJ", "0x008C00" }, { "SORBI", "0x00EE76" }, { "SELMO", "0x238E23" }, { "PHYPA", "0x09F911" },
92         { "OSTLU", "0x7FFF00" }, { "OSTTA", "0x7FFF00" }, { "OSTRC", "0x7FFF00" }, { "MICPU", "0x66CD00" },
93         { "MIC99", "0x66CD00" }, { "CHLRE", "0xB3EE3A" }, { "VOLCA", "0xC0FF3E" }, { "CHLSP", "0x6B8E23" },
94         { "CYAME", "0xD02090" }, { "YEAST", "0xAAAAAA" }, { "BACFR", "0xFF0000" }, { "BACTN", "0xFFFF00" },
95         { "MYXXD", "0x0000FF" }, { "STIAU", "0x00FFFF" }, { "BACOV", "0x8C5900" }, { "BACUN", "0x66CD00" },
96         { "PORGI", "0x918E00" }                                                               };
97     final static int                        display_node_data                                      = 0;
98     final static int                        collapse_uncollapse                                    = 1;
99     final static int                        reroot                                                 = 2;
100     final static int                        subtree                                                = 3;
101     final static int                        swap                                                   = 4;
102     final static int                        color_node_font                                        = 5;
103     final static int                        change_node_font                                       = 6;
104     final static int                        color_subtree                                          = 7;
105     final static int                        open_seq_web                                           = 8;
106     final static int                        open_pdb_web                                           = 9;
107     final static int                        open_tax_web                                           = 10;
108     final static int                        blast                                                  = 11;
109     final static int                        cut_subtree                                            = 12;
110     final static int                        copy_subtree                                           = 13;
111     final static int                        paste_subtree                                          = 14;
112     final static int                        delete_subtree_or_node                                 = 15;
113     final static int                        add_new_node                                           = 16;
114     final static int                        edit_node_data                                         = 17;
115     final static int                        sort_descendents                                       = 18;
116     final static int                        get_ext_desc_data                                      = 19;
117     final static int                        select_nodes                                           = 20;
118     final static int                        uncollapse_all                                         = 21;
119     final static int                        order_subtree                                         = 22;
120     
121     // ------------------
122     // Click-to options
123     // ------------------
124     final static String                     display_options[][]                                    = {
125         { "Phylogram", "display", "?" }, { "Node Name", "display", "yes" }, { "Taxonomy Code", "display", "yes" },
126         { "Seq Annotations", "display", "no" }, { "Confidence Values", "display", "?" },
127         { "Node Events", "display", "?" }, { "Colorize by Taxonomy", "display", "no" },
128         { "Colorize by Sequence", "display", "no" }, { "Visual Styles/Branch Colors", "display", "no" },
129         { "Branch Widths", "display", "no" }, { "Domain Architectures", "display", "no" },
130         { "Binary Characters", "nodisplay", "no" }, { "Binary Char Counts", "nodisplay", "no" },
131         { "Seq Name", "display", "yes" }, { "Seq Accession", "display", "no" },
132         { "Show Internal Data", "display", "yes" }, { "Dyna Hide", "display", "yes" },
133         { "Taxonomy Scientific", "display", "yes" }, { "Taxonomy Common", "display", "no" },
134         { "Colorize by Annotation", "display", "no" }, { "Seq Symbol", "display", "yes" },
135         { "Rollover", "display", "yes" }, { "Relation Confidence", "nodisplay", "no" },
136         { "Vector Data", "nodisplay", "no" }, { "Taxonomy Images", "display", "no" },
137         { "Properties", "display", "no" }, { "Gene Name", "display", "yes" },
138         { "Multiple Seq Alignment", "display", "no" }, { "Branch Length Values", "display", "no" }
139         , { "Taxonomy Rank", "display", "no" }, { "Show External Data", "display", "yes" }};
140     final static int                        display_as_phylogram                                   = 0;
141     final static int                        show_node_names                                        = 1;
142     final static int                        show_tax_code                                          = 2;
143     final static int                        show_annotation                                        = 3;
144     final static int                        write_confidence_values                                = 4;
145     final static int                        write_events                                           = 5;
146     final static int                        color_according_to_species                             = 6;
147     final static int                        color_according_to_sequence                            = 7;
148     final static int                        use_style                                              = 8;
149     final static int                        width_branches                                         = 9;
150     final static int                        show_domain_architectures                              = 10;
151     final static int                        show_binary_characters                                 = 11;
152     final static int                        show_binary_character_counts                           = 12;
153     final static int                        show_seq_names                                         = 13;
154     final static int                        show_sequence_acc                                      = 14;
155     final static int                        display_internal_data                                  = 15;
156     final static int                        dynamically_hide_data                                  = 16;
157     final static int                        show_taxonomy_scientific_names                         = 17;
158     final static int                        show_taxonomy_common_names                             = 18;
159     final static int                        color_according_to_annotation                          = 19;
160     final static int                        show_seq_symbols                                       = 20;
161     final static int                        node_data_popup                                        = 21;
162     final static int                        show_relation_confidence                               = 22;
163     final static int                        show_vector_data                                       = 23;
164     final static int                        show_taxonomy_images                                   = 24;
165     final static int                        show_properties                                        = 25;
166     final static int                        show_gene_names                                        = 26;
167     final static int                        show_mol_seqs                                          = 27;
168     final static int                        write_branch_length_values                             = 28;
169     final static int                        show_tax_rank                                          = 29;
170     final static int                        display_external_data                                  = 30;
171     
172     static final String                     VALIDATE_AGAINST_PHYLOXML_XSD_SCHEMA                   = "validate_against_phyloxml_xsd_schema";
173     private static Hashtable<String, Color> _sequence_colors;
174     private static Hashtable<String, Color> _annotation_colors;
175     private static Hashtable<String, Color> _domain_colors;
176     private static Hashtable<String, Color> _species_colors;
177     private static String                   DEFAULT_FONT_FAMILY                                    = "";
178     private static final int                DEPRECATED                                             = -2;
179     private static final String             DISPLAY_COLOR_KEY                                      = "display_color";
180     // ---------------------------
181     // Display options for trees
182     // ---------------------------
183     // ---------------------------------
184     // Pertaining to the config itself
185     // ---------------------------------
186     // Full path to config (may be URL)
187     String                                  config_filename;
188     // This option is selected in the dropdown
189     int                                     default_clickto                                        = Configuration.display_node_data;
190     String                                  default_config_filename                                = AptxConstants.DEFAULT_CONFIGURATION_FILE_NAME;
191     // --------------
192     // Color set
193     // --------------
194     TreeColorSet                            tree_color_set;
195     // -------
196     // Fonts
197     // -------
198     TreeFontSet                             tree_font_set;
199     boolean                                 verbose                                                = AptxConstants.VERBOSE_DEFAULT;
200     private boolean                         _abbreviate_scientific_names                           = false;
201     private boolean                         _antialias_screen                                      = true;
202     private boolean                         _background_color_gradient                             = false;
203     private String                          _base_font_family_name                                 = "";
204     private int                             _base_font_size                                        = -1;
205     private CLADOGRAM_TYPE                  _cladogram_type                                        = AptxConstants.CLADOGRAM_TYPE_DEFAULT;
206     private boolean                         _color_labels_same_as_parent_branch                    = false;
207     private int                             _default_bootstrap_samples                             = -1;
208     private NodeFill                        _default_node_fill                                     = NodeFill.SOLID;
209     private NodeShape                       _default_node_shape                                    = NodeShape.RECTANGLE;
210     private short                           _default_node_shape_size                               = AptxConstants.DEFAULT_NODE_SHAPE_SIZE_DEFAULT;
211     private SortedMap<String, Color>        _display_colors                                        = null;
212     private boolean                         _display_sequence_relations                            = false;
213     private boolean                         _editable                                              = true;
214     private NodeDataField                   _ext_desc_data_to_return                               = NodeDataField.UNKNOWN;
215     private EXT_NODE_DATA_RETURN_ON         _ext_node_data_return_on                               = EXT_NODE_DATA_RETURN_ON.WINODW;
216     private int                             _frame_x_size;
217     private int                             _frame_y_size;
218     private Color                           _gui_background_color                                  = AptxConstants.GUI_BACKGROUND_DEFAULT;
219     private Color                           _gui_button_background_color                           = AptxConstants.BUTTON_BACKGROUND_COLOR_DEFAULT;
220     private Color                           _gui_button_border_color                               = AptxConstants.BUTTON_BORDER_COLOR_DEFAULT;
221     private Color                           _gui_button_text_color                                 = AptxConstants.BUTTON_TEXT_COLOR_DEFAULT;
222     private Color                           _gui_checkbox_and_button_active_color                  = AptxConstants.CHECKBOX_AND_BUTTON_ACTIVE_COLOR_DEFAULT;
223     private Color                           _gui_checkbox_text_color                               = AptxConstants.CHECKBOX_TEXT_COLOR_DEFAULT;
224     private Color                           _gui_menu_background_color                             = AptxConstants.MENU_BACKGROUND_COLOR_DEFAULT;
225     private Color                           _gui_menu_text_color                                   = AptxConstants.MENU_TEXT_COLOR_DEFAULT;
226     private boolean                         _hide_controls_and_menus                               = false;
227     private boolean                         _internal_number_are_confidence_for_nh_parsing         = false;
228     private String                          _label_for_get_ext_descendents_data                    = "";
229     private int                             _max_base_font_size                                    = 20;
230     private boolean                         _midpoint_root                                         = false;
231     private int                             _min_base_font_size                                    = 2;
232     private double                          _min_confidence_value                                  = Options.MIN_CONFIDENCE_DEFAULT;
233     private boolean                         _nh_parsing_replace_underscores                        = false;
234     private NODE_LABEL_DIRECTION            _node_label_direction                                  = NODE_LABEL_DIRECTION.HORIZONTAL;
235     private short                           _number_of_digits_after_comma_for_branch_length_values = AptxConstants.NUMBER_OF_DIGITS_AFTER_COMMA_FOR_BRANCH_LENGTH_VALUES_DEFAULT;
236     private short                           _number_of_digits_after_comma_for_confidence_values    = AptxConstants.NUMBER_OF_DIGITS_AFTER_COMMA_FOR_CONFIDENCE_VALUES_DEFAULT;
237     private short                           _ov_max_height                                         = 80;
238     private short                           _ov_max_width                                          = 80;
239     private OVERVIEW_PLACEMENT_TYPE         _ov_placement                                          = OVERVIEW_PLACEMENT_TYPE.UPPER_LEFT;
240     private File                            _path_to_local_fastme                                  = null;
241     private File                            _path_to_local_mafft                                   = null;
242     private File                            _path_to_local_raxml                                   = null;
243     private PHYLOGENY_GRAPHICS_TYPE         _phylogeny_graphics_type                               = PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR;
244     private float                           _print_line_width                                      = AptxConstants.PDF_LINE_WIDTH_DEFAULT;
245     private boolean                         _show_annotation_ref_source                            = true;
246     private boolean                         _show_default_node_shapes_external                     = false;
247     private boolean                         _show_default_node_shapes_for_marked_nodes             = false;
248     private boolean                         _show_default_node_shapes_internal                     = false;
249     private boolean                         _show_domain_labels                                    = true;
250     private boolean                         _show_overview                                         = true;
251     private boolean                         _show_scale                                            = false;
252     private TAXONOMY_EXTRACTION             _taxonomy_extraction                                   = TAXONOMY_EXTRACTION.NO;
253     private UI                              _ui                                                    = UI.UNKNOWN;
254     private boolean                         _use_tabbed_display                                    = false;
255     private boolean                         _validate_against_phyloxml_xsd_schema                  = AptxConstants.VALIDATE_AGAINST_PHYLOXML_XSD_SCJEMA_DEFAULT;
256     private Color                           _vector_data_min_color                                 = Color.BLUE;
257     private Color                           _vector_data_max_color                                 = Color.YELLOW;
258     private Color                           _vector_data_mean_color                                = Color.WHITE;
259     private double                          _vector_data_height                                    = 12;
260     private int                             _vector_data_width                                     = 120;
261     private boolean                         _line_up_renderable_node_data                          = true;
262     private boolean                         _right_align_domains                                   = false;
263     private boolean                         _allow_thick_strokes                                   = false;
264     private boolean                         _could_read_config_file = false;
265     static {
266         for( final String font_name : AptxConstants.DEFAULT_FONT_CHOICES ) {
267             if ( Arrays.binarySearch( AptxUtil.getAvailableFontFamiliesSorted(), font_name ) >= 0 ) {
268                 DEFAULT_FONT_FAMILY = font_name;
269                 break;
270             }
271         }
272         if ( ForesterUtil.isEmpty( DEFAULT_FONT_FAMILY ) ) {
273             DEFAULT_FONT_FAMILY = AptxConstants.DEFAULT_FONT_CHOICES[ AptxConstants.DEFAULT_FONT_CHOICES.length - 1 ];
274         }
275     }
276
277     public Configuration() {
278         this( null, false, false, false );
279     }
280     public Configuration(final InputStream is, final boolean is_applet, final boolean verbose) {
281  
282         setDisplayColors( new TreeMap<String, Color>() );
283         try {
284             InputStreamReader isr = new InputStreamReader(is);
285             final BufferedReader bf = new BufferedReader( isr );
286             readConfig( bf );
287             bf.close();
288             ForesterUtil.programMessage( AptxConstants.PRG_NAME, "successfully read from configuration url ["
289                     + config_filename + "]" );
290             _could_read_config_file = true;
291         }
292         catch ( final Exception e ) {
293             ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "failed to read configuration from ["
294                     + config_filename + "]: " + e.getLocalizedMessage() );
295         }
296     }
297     public Configuration( final String cf, final boolean is_url, final boolean is_applet, final boolean verbose ) {
298         if ( ForesterUtil.isEmpty( cf ) ) {
299             config_filename = default_config_filename;
300         }
301         else {
302             config_filename = cf;
303         }
304         _could_read_config_file = false;
305         setDisplayColors( new TreeMap<String, Color>() );
306         config_filename = config_filename.trim();
307         URL u = null;
308         if ( is_url ) {
309             // If URL, open accordingly
310             try {
311                 u = new URL( config_filename );
312                 try {
313                     final InputStreamReader isr = new InputStreamReader( u.openStream() );
314                     final BufferedReader bf = new BufferedReader( isr );
315                     readConfig( bf );
316                     bf.close();
317                     ForesterUtil.programMessage( AptxConstants.PRG_NAME, "successfully read from configuration url ["
318                             + config_filename + "]" );
319                     _could_read_config_file = true;
320                 }
321                 catch ( final Exception e ) {
322                     ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "failed to read configuration from ["
323                             + config_filename + "]: " + e.getLocalizedMessage() );
324                 }
325             }
326             catch ( final Exception e ) {
327                 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "cannot find or open configuration url ["
328                         + config_filename + "]" );
329             }
330         }
331         else {
332             // Otherwise, open as a file
333             File f = new File( config_filename );
334             if ( !f.exists() ) {
335                 f = new File( config_filename + ".txt" );
336             }
337             if ( f.exists() && f.canRead() ) {
338                 try {
339                     final BufferedReader bf = new BufferedReader( new FileReader( f ) );
340                     readConfig( bf );
341                     bf.close();
342                     _could_read_config_file = true;
343                 }
344                 catch ( final Exception e ) {
345                     if ( verbose ) {
346                         ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "failed to read configuration from ["
347                                 + config_filename + "]: " + e );
348                     }
349                 }
350             }
351             else {
352                 if ( verbose ) {
353                     ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "cannot find or open configuration file ["
354                             + config_filename + "]" );
355                 }
356             }
357         }
358     }
359
360     public String getBaseFontFamilyName() {
361         return _base_font_family_name;
362     }
363
364     public int getDefaultBootstrapSamples() {
365         return _default_bootstrap_samples;
366     }
367
368     public NodeFill getDefaultNodeFill() {
369         return _default_node_fill;
370     }
371
372     public NodeShape getDefaultNodeShape() {
373         return _default_node_shape;
374     }
375
376     public short getDefaultNodeShapeSize() {
377         return _default_node_shape_size;
378     }
379
380     public NodeDataField getExtDescNodeDataToReturn() {
381         return _ext_desc_data_to_return;
382     }
383
384     public EXT_NODE_DATA_RETURN_ON getExtNodeDataReturnOn() {
385         return _ext_node_data_return_on;
386     }
387
388     public int getFrameXSize() {
389         return _frame_x_size;
390     }
391
392     public int getFrameYSize() {
393         return _frame_y_size;
394     }
395
396     public String getLabelForGetExtDescendentsData() {
397         return _label_for_get_ext_descendents_data;
398     }
399
400     public File getPathToLocalFastme() {
401         return _path_to_local_fastme;
402     }
403
404     public File getPathToLocalMafft() {
405         return _path_to_local_mafft;
406     }
407
408     public File getPathToLocalRaxml() {
409         return _path_to_local_raxml;
410     }
411
412     public double getVectorDataHeight() {
413         return _vector_data_height;
414     }
415
416     public Color getVectorDataMaxColor() {
417         return _vector_data_max_color;
418     }
419
420     public Color getVectorDataMeanColor() {
421         return _vector_data_mean_color;
422     }
423
424     public Color getVectorDataMinColor() {
425         return _vector_data_min_color;
426     }
427
428     public int getVectorDataWidth() {
429         return _vector_data_width;
430     }
431
432     public boolean isAbbreviateScientificTaxonNames() {
433         return _abbreviate_scientific_names;
434     }
435
436     public boolean isAllowThickStrokes() {
437         return _allow_thick_strokes;
438     }
439
440     public boolean isBackgroundColorGradient() {
441         return _background_color_gradient;
442     }
443
444     public boolean isColorByTaxonomicGroup() {
445         return false;
446     }
447
448     public boolean isColorLabelsSameAsParentBranch() {
449         return _color_labels_same_as_parent_branch;
450     }
451
452     final public boolean isLineUpRendarableNodeData() {
453         return _line_up_renderable_node_data;
454     }
455
456     public boolean isMidpointReroot() {
457         return _midpoint_root;
458     }
459
460     final public boolean isRightLineUpDomains() {
461         return _right_align_domains;
462     }
463
464     public boolean isShowAnnotationRefSource() {
465         return _show_annotation_ref_source;
466     }
467
468     public boolean isShowDefaultNodeShapesExternal() {
469         return _show_default_node_shapes_external;
470     }
471
472     public boolean isShowDefaultNodeShapesForMarkedNodes() {
473         return _show_default_node_shapes_for_marked_nodes;
474     }
475
476     public boolean isShowDefaultNodeShapesInternal() {
477         return _show_default_node_shapes_internal;
478     }
479
480     public boolean isShowDomainLabels() {
481         return _show_domain_labels;
482     }
483
484     public void putDisplayColors( final String key, final Color color ) {
485         getDisplayColors().put( key, color );
486     }
487
488     public void setAbbreviateScientificTaxonNames( final boolean abbreviate_scientific_names ) {
489         _abbreviate_scientific_names = abbreviate_scientific_names;
490     }
491
492     public void setAddTaxonomyImagesCB( final boolean b ) {
493         display_options[ show_taxonomy_images ][ 1 ] = b ? "yes" : "no";
494     }
495
496     public void setBackgroundColorGradient( final boolean background_color_gradient ) {
497         _background_color_gradient = background_color_gradient;
498     }
499
500     public void setBaseFontFamilyName( final String base_font_family_name ) {
501         _base_font_family_name = base_font_family_name;
502     }
503
504     public void setBaseFontSize( final int base_font_size ) {
505         _base_font_size = base_font_size;
506     }
507
508     public void setColorizeBranches( final boolean b ) {
509         display_options[ use_style ][ 2 ] = b ? "yes" : "no";
510     }
511
512     public void setColorLabelsSameAsParentBranch( final boolean color_labels_same_as_parent_branch ) {
513         _color_labels_same_as_parent_branch = color_labels_same_as_parent_branch;
514     }
515
516     public void setDefaultNodeFill( final NodeFill default_node_fill ) {
517         _default_node_fill = default_node_fill;
518     }
519
520     public void setDefaultNodeShape( final NodeShape default_node_shape ) {
521         _default_node_shape = default_node_shape;
522     }
523
524     public void setDefaultNodeShapeSize( final short default_node_shape_size ) {
525         _default_node_shape_size = default_node_shape_size;
526     }
527
528     public void setDisplayAsPhylogram( final boolean b ) {
529         display_options[ display_as_phylogram ][ 2 ] = b ? "yes" : "no";
530     }
531
532     public void setDisplayColors( final SortedMap<String, Color> display_colors ) {
533         _display_colors = display_colors;
534     }
535
536     public void setDisplayConfidenceValues( final boolean b ) {
537         display_options[ write_confidence_values ][ 2 ] = b ? "yes" : "no";
538     }
539
540     public void setDisplayGeneNames( final boolean b ) {
541         display_options[ show_gene_names ][ 2 ] = b ? "yes" : "no";
542     }
543
544     public void setDisplayInternalData( final boolean b ) {
545         display_options[ display_internal_data ][ 2 ] = b ? "yes" : "no";
546     }
547     
548     public void setDisplayExternalData( final boolean b ) {
549         display_options[ display_external_data ][ 2 ] = b ? "yes" : "no";
550     }
551
552     public void setDisplayMultipleSequenceAlignment( final boolean b ) {
553         display_options[ show_mol_seqs ][ 2 ] = b ? "yes" : "no";
554     }
555
556     public void setDisplayNodeNames( final boolean b ) {
557         display_options[ show_node_names ][ 2 ] = b ? "yes" : "no";
558     }
559
560     public void setDisplaySequenceAcc( final boolean b ) {
561         display_options[ show_sequence_acc ][ 2 ] = b ? "yes" : "no";
562     }
563
564     public void setDisplaySequenceNames( final boolean b ) {
565         display_options[ show_seq_names ][ 2 ] = b ? "yes" : "no";
566     }
567
568     public void setDisplaySequenceRelations( final boolean display_sequence_relations ) {
569         _display_sequence_relations = display_sequence_relations;
570     }
571
572     public void setDisplaySequenceSymbols( final boolean b ) {
573         display_options[ show_seq_symbols ][ 2 ] = b ? "yes" : "no";
574     }
575
576     public void setDisplayTaxonomyCode( final boolean b ) {
577         display_options[ show_tax_code ][ 2 ] = b ? "yes" : "no";
578     }
579     
580     public void setDisplayTaxonomyRank( final boolean b ) {
581         display_options[ show_tax_rank ][ 2 ] = b ? "yes" : "no";
582     }
583
584     public void setDisplayTaxonomyCommonNames( final boolean b ) {
585         display_options[ show_taxonomy_common_names ][ 2 ] = b ? "yes" : "no";
586     }
587
588     public void setDisplayTaxonomyImages( final boolean b ) {
589         display_options[ show_taxonomy_images ][ 2 ] = b ? "yes" : "no";
590     }
591
592     public void setDisplayTaxonomyScientificNames( final boolean b ) {
593         display_options[ show_taxonomy_scientific_names ][ 2 ] = b ? "yes" : "no";
594     }
595
596     public void setDynamicallyHideData( final boolean b ) {
597         display_options[ dynamically_hide_data ][ 2 ] = b ? "yes" : "no";
598     }
599
600     public void setExtDescNodeDataToReturn( final NodeDataField ext_desc_data_to_return ) {
601         _ext_desc_data_to_return = ext_desc_data_to_return;
602     }
603
604     public void setFrameXSize( final int frame_x_size ) {
605         _frame_x_size = frame_x_size;
606     }
607
608     public void setFrameYSize( final int frame_y_size ) {
609         _frame_y_size = frame_y_size;
610     }
611
612     final public void setLineUpRendarableNodeData( final boolean line_up_renderable_node_data ) {
613         _line_up_renderable_node_data = line_up_renderable_node_data;
614     }
615
616     public void setMidpointReroot( final boolean midpoint_root ) {
617         _midpoint_root = midpoint_root;
618     }
619
620     public void setMinConfidenceValue( final double min_confidence_value ) {
621         _min_confidence_value = min_confidence_value;
622     }
623
624     public void setNodeLabelDirection( final NODE_LABEL_DIRECTION node_label_direction ) {
625         _node_label_direction = node_label_direction;
626     }
627
628     public void setNumberOfDigitsAfterCommaForBranchLengthValue( final short number_of_digits_after_comma_for_branch_length_values ) {
629         _number_of_digits_after_comma_for_branch_length_values = number_of_digits_after_comma_for_branch_length_values;
630     }
631
632     public void setNumberOfDigitsAfterCommaForConfidenceValues( final short number_of_digits_after_comma_for_confidence_values ) {
633         _number_of_digits_after_comma_for_confidence_values = number_of_digits_after_comma_for_confidence_values;
634     }
635
636     public void setPhylogenyGraphicsType( final PHYLOGENY_GRAPHICS_TYPE phylogeny_graphics_type ) {
637         _phylogeny_graphics_type = phylogeny_graphics_type;
638     }
639
640     public void setPrintLineWidth( final float print_line_width ) {
641         _print_line_width = print_line_width;
642     }
643
644     public void setReplaceUnderscoresInNhParsing( final boolean nh_parsing_replace_underscores ) {
645         _nh_parsing_replace_underscores = nh_parsing_replace_underscores;
646     }
647
648     final public void setRightLineUpDomains( final boolean right_align_domains ) {
649         _right_align_domains = right_align_domains;
650     }
651
652     public void setShowDefaultNodeShapesExternal( final boolean show_default_node_shapes_external ) {
653         _show_default_node_shapes_external = show_default_node_shapes_external;
654     }
655
656     public void setShowDefaultNodeShapesForMarkedNodes( final boolean show_default_node_shapes_for_marked_nodes ) {
657         _show_default_node_shapes_for_marked_nodes = show_default_node_shapes_for_marked_nodes;
658     }
659
660     public void setShowDefaultNodeShapesInternal( final boolean show_default_node_shapes_internal ) {
661         _show_default_node_shapes_internal = show_default_node_shapes_internal;
662     }
663
664     public void setShowDomainLabels( final boolean show_domain_labels ) {
665         _show_domain_labels = show_domain_labels;
666     }
667
668     public void setShowScale( final boolean show_scale ) {
669         _show_scale = show_scale;
670     }
671
672     public void setUseStyle( final boolean b ) {
673         display_options[ use_style ][ 2 ] = b ? "yes" : "no";
674     }
675
676     private int getClickToIndex( final String name ) {
677         int index = -1;
678         if ( name.equals( "edit_info" ) ) {
679             index = Configuration.display_node_data;
680             ForesterUtil
681             .printWarningMessage( AptxConstants.PRG_NAME,
682                                   "configuration key [edit_info] is deprecated, use [display node data] instead" );
683         }
684         else if ( name.equals( "display_node_data" ) ) {
685             index = Configuration.display_node_data;
686         }
687         else if ( name.equals( "collapse_uncollapse" ) ) {
688             index = Configuration.collapse_uncollapse;
689         }
690         else if ( name.equals( "uncollapse_all" ) ) {
691             index = Configuration.uncollapse_all;
692         }
693         else if ( name.equals( "reroot" ) ) {
694             index = Configuration.reroot;
695         }
696         else if ( name.equals( "subtree" ) ) {
697             index = Configuration.subtree;
698         }
699         else if ( name.equals( "swap" ) ) {
700             index = Configuration.swap;
701         }
702         else if ( name.equals( "order_subtree" ) ) {
703             index = Configuration.order_subtree;
704         }
705         else if ( name.equals( "sort_descendants" ) ) {
706             index = Configuration.sort_descendents;
707         }
708         else if ( name.equals( "get_ext_descendents_data" ) ) {
709             index = Configuration.get_ext_desc_data;
710         }
711         else if ( name.equals( "display_sequences" ) ) {
712             ForesterUtil
713             .printWarningMessage( AptxConstants.PRG_NAME, "configuration key [display_sequences] is deprecated" );
714             return DEPRECATED;
715         }
716         else if ( name.equals( "open_seq_web" ) ) {
717             index = Configuration.open_seq_web;
718         }
719         else if ( name.equals( "open_pdb_web" ) ) {
720             index = Configuration.open_pdb_web;
721         }
722         else if ( name.equals( "open_tax_web" ) ) {
723             index = Configuration.open_tax_web;
724         }
725         else if ( name.equals( "blast" ) ) {
726             index = Configuration.blast;
727         }
728         else if ( name.equals( "cut_subtree" ) ) {
729             index = Configuration.cut_subtree;
730         }
731         else if ( name.equals( "copy_subtree" ) ) {
732             index = Configuration.copy_subtree;
733         }
734         else if ( name.equals( "paste_subtree" ) ) {
735             index = Configuration.paste_subtree;
736         }
737         else if ( name.equals( "delete" ) ) {
738             index = Configuration.delete_subtree_or_node;
739         }
740         else if ( name.equals( "add_new_node" ) ) {
741             index = Configuration.add_new_node;
742         }
743         else if ( name.equals( "edit_node_data" ) ) {
744             index = Configuration.edit_node_data;
745         }
746         else if ( name.equals( "select_nodes" ) ) {
747             index = Configuration.select_nodes;
748         }
749         else if ( name.equals( "display_node_popup" ) ) {
750             ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME,
751                     "configuration key [display_node_popup] is deprecated" );
752             return DEPRECATED;
753         }
754         else if ( name.equals( "custom_option" ) ) {
755             ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "configuration key [custom_option] is deprecated" );
756             return DEPRECATED;
757         }
758         else if ( name.equals( "color_subtree" ) ) {
759             index = Configuration.color_subtree;
760         }
761         else if ( name.equals( "change_node_font" ) ) {
762             index = Configuration.change_node_font;
763         }
764         else if ( name.equals( "color_node_font" ) ) {
765             index = Configuration.color_node_font;
766         }
767         else if ( name.equals( "color_subtree" ) ) {
768             index = Configuration.color_subtree;
769         }
770         return index;
771     }
772
773     private final void initSpeciesColors() {
774         _species_colors = new Hashtable<String, Color>();
775         for( final String[] s : DEFAULT_SPECIES_COLORS ) {
776             _species_colors.put( s[ 0 ], Color.decode( s[ 1 ] ) );
777         }
778     }
779
780     private boolean parseBoolean( final String str ) {
781         final String my_str = str.trim().toLowerCase();
782         if ( my_str.equals( "yes" ) || my_str.equals( "true" ) ) {
783             return true;
784         }
785         else if ( my_str.equals( "no" ) || my_str.equals( "false" ) ) {
786             return false;
787         }
788         else {
789             ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "could not parse boolean value from [" + str + "]" );
790             return false;
791         }
792     }
793
794     private double parseDouble( final String str ) {
795         double d = 0.0;
796         try {
797             d = Double.parseDouble( str.trim() );
798         }
799         catch ( final Exception e ) {
800             ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "could not parse double from [" + str + "]" );
801             d = 0.0;
802         }
803         return d;
804     }
805
806     private float parseFloat( final String str ) {
807         float f = 0.0f;
808         try {
809             f = Float.parseFloat( str.trim() );
810         }
811         catch ( final Exception e ) {
812             ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "could not parse float from [" + str + "]" );
813             f = 0.0f;
814         }
815         return f;
816     }
817
818     private int parseInt( final String str ) {
819         int i = -1;
820         try {
821             i = Integer.parseInt( str.trim() );
822         }
823         catch ( final Exception e ) {
824             ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "could not parse integer from [" + str + "]" );
825             i = -1;
826         }
827         return i;
828     }
829
830     private short parseShort( final String str ) {
831         short i = -1;
832         try {
833             i = Short.parseShort( str.trim() );
834         }
835         catch ( final Exception e ) {
836             ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "could not parse short from [" + str + "]" );
837             i = -1;
838         }
839         return i;
840     }
841
842     private void processFontFamily( final StringTokenizer st ) {
843         setBaseFontFamilyName( "" );
844         final String font_str = ( ( String ) st.nextElement() ).trim();
845         final String[] fonts = font_str.split( ",+" );
846         for( String font : fonts ) {
847             font = font.replace( '_', ' ' ).trim();
848             if ( Arrays.binarySearch( AptxUtil.getAvailableFontFamiliesSorted(), font ) >= 0 ) {
849                 setBaseFontFamilyName( font );
850                 break;
851             }
852         }
853     }
854
855     /**
856      * read each line of config file, process non-comment lines
857      * @throws IOException
858      */
859     private void readConfig( final BufferedReader conf_in ) throws IOException {
860         String line;
861         do {
862             line = conf_in.readLine();
863             if ( line != null ) {
864                 line = line.trim();
865                 // skip comments and blank lines
866                 if ( !line.startsWith( "#" ) && ( !ForesterUtil.isEmpty( line ) ) ) {
867                     // convert runs of spaces to tabs
868                     line = line.replaceAll( "\\s+", "\t" );
869                     final StringTokenizer st = new StringTokenizer( line, "\t" );
870                     setKeyValue( st );
871                 }
872             }
873         } while ( line != null );
874     }
875
876     private void setAntialiasScreen( final boolean antialias_screen ) {
877         _antialias_screen = antialias_screen;
878     }
879
880     private void setCladogramType( final CLADOGRAM_TYPE cladogram_type ) {
881         _cladogram_type = cladogram_type;
882     }
883
884     private void setDefaultBootstrapSamples( final int default_bootstrap_samples ) {
885         _default_bootstrap_samples = default_bootstrap_samples;
886     }
887
888     private void setEditable( final boolean editable ) {
889         _editable = editable;
890     }
891
892     private void setExtNodeDataReturnOn( final EXT_NODE_DATA_RETURN_ON ext_node_data_return_on ) {
893         _ext_node_data_return_on = ext_node_data_return_on;
894     }
895
896     //private void setGraphicsExportX( final int graphics_export_x ) {
897     //    _graphics_export_x = graphics_export_x;
898     //}
899
900     //private void setGraphicsExportY( final int graphics_export_y ) {
901     //    _graphics_export_y = graphics_export_y;
902     //}
903
904     private void setInternalNumberAreConfidenceForNhParsing( final boolean internal_number_are_confidence_for_nh_parsing ) {
905         _internal_number_are_confidence_for_nh_parsing = internal_number_are_confidence_for_nh_parsing;
906     }
907
908     /**
909      * Set a key-value(s) tuple
910      */
911     private void setKeyValue( final StringTokenizer st ) {
912         final String key = ( ( String ) st.nextElement() ).replace( ':', ' ' ).trim().toLowerCase();
913         if ( !st.hasMoreElements() ) {
914             return;
915         }
916         // Handle single value settings first:
917         if ( key.equals( "default_click_to" ) ) {
918             final String clickto_name = ( String ) st.nextElement();
919             default_clickto = getClickToIndex( clickto_name );
920             if ( default_clickto == -1 ) {
921                 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "invalid value [" + clickto_name
922                                                   + "] for [default_click_to]" );
923                 default_clickto = 0;
924             }
925             else if ( default_clickto == DEPRECATED ) {
926                 // Deprecated.
927             }
928         }
929         else if ( key.equals( "native_ui" ) ) {
930             final String my_str = ( ( String ) st.nextElement() ).trim().toLowerCase();
931             if ( my_str.equals( "yes" ) || my_str.equals( "true" ) ) {
932                 _ui = UI.NATIVE;
933             }
934             else if ( my_str.equals( "no" ) || my_str.equals( "false" ) ) {
935                 _ui = UI.CROSSPLATFORM;
936             }
937             else if ( my_str.equals( "?" ) ) {
938                 _ui = UI.UNKNOWN;
939             }
940             else {
941                 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "could not parse yes/no/? value from [" + my_str
942                                                   + "]" );
943                 _ui = UI.UNKNOWN;
944             }
945         }
946         else if ( key.equals( VALIDATE_AGAINST_PHYLOXML_XSD_SCHEMA ) ) {
947             setValidatePhyloXmlAgainstSchema( parseBoolean( ( String ) st.nextElement() ) );
948         }
949         else if ( key.equals( "antialias_screen" ) ) {
950             setAntialiasScreen( parseBoolean( ( String ) st.nextElement() ) );
951         }
952         else if ( key.equals( "phylogeny_graphics_type" ) ) {
953             final String type_str = ( ( String ) st.nextElement() ).trim();
954             if ( type_str.equalsIgnoreCase( PHYLOGENY_GRAPHICS_TYPE.CONVEX.toString() ) ) {
955                 setPhylogenyGraphicsType( PHYLOGENY_GRAPHICS_TYPE.CONVEX );
956             }
957             else if ( type_str.equalsIgnoreCase( PHYLOGENY_GRAPHICS_TYPE.CURVED.toString() ) ) {
958                 setPhylogenyGraphicsType( PHYLOGENY_GRAPHICS_TYPE.CURVED );
959             }
960             else if ( type_str.equalsIgnoreCase( PHYLOGENY_GRAPHICS_TYPE.EURO_STYLE.toString() ) ) {
961                 setPhylogenyGraphicsType( PHYLOGENY_GRAPHICS_TYPE.EURO_STYLE );
962             }
963             else if ( type_str.equalsIgnoreCase( PHYLOGENY_GRAPHICS_TYPE.ROUNDED.toString() ) ) {
964                 setPhylogenyGraphicsType( PHYLOGENY_GRAPHICS_TYPE.ROUNDED );
965             }
966             else if ( type_str.equalsIgnoreCase( PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR.toString() ) ) {
967                 setPhylogenyGraphicsType( PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR );
968             }
969             else if ( type_str.equalsIgnoreCase( PHYLOGENY_GRAPHICS_TYPE.TRIANGULAR.toString() ) ) {
970                 setPhylogenyGraphicsType( PHYLOGENY_GRAPHICS_TYPE.TRIANGULAR );
971             }
972             else if ( type_str.equalsIgnoreCase( PHYLOGENY_GRAPHICS_TYPE.UNROOTED.toString() ) ) {
973                 setPhylogenyGraphicsType( PHYLOGENY_GRAPHICS_TYPE.UNROOTED );
974             }
975             else if ( type_str.equalsIgnoreCase( PHYLOGENY_GRAPHICS_TYPE.CIRCULAR.toString() ) ) {
976                 setPhylogenyGraphicsType( PHYLOGENY_GRAPHICS_TYPE.CIRCULAR );
977             }
978             else {
979                 setPhylogenyGraphicsType( PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR );
980                 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "unknown value [" + type_str
981                                                   + "] for [phylogeny_graphics_type]" );
982             }
983         }
984         else if ( key.equals( "min_confidence_value" ) ) {
985             final String mcv_str = ( ( String ) st.nextElement() ).trim();
986             final double d = parseDouble( mcv_str );
987             setMinConfidenceValue( d );
988         }
989         else if ( key.equals( "font_family" ) ) {
990             processFontFamily( st );
991         }
992         else if ( key.equals( "font_size" ) ) {
993             final String size_str = ( ( String ) st.nextElement() ).trim();
994             final int i = parseInt( size_str );
995             if ( i > 0 ) {
996                 setBaseFontSize( i );
997             }
998         }
999         else if ( key.equals( "font_size_min" ) ) {
1000             final String size_str = ( ( String ) st.nextElement() ).trim();
1001             final int i = parseInt( size_str );
1002             if ( i > 0 ) {
1003                 setMinBaseFontSize( i );
1004             }
1005         }
1006         else if ( key.equals( "font_size_max" ) ) {
1007             final String size_str = ( ( String ) st.nextElement() ).trim();
1008             final int i = parseInt( size_str );
1009             if ( i > 1 ) {
1010                 setMaxBaseFontSize( i );
1011             }
1012         }
1013         else if ( key.equals( "pdf_export_line_width" ) ) {
1014             final String str = ( ( String ) st.nextElement() ).trim();
1015             final float f = parseFloat( str );
1016             if ( f > 0 ) {
1017                 setPrintLineWidth( f );
1018             }
1019             else {
1020                 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME,
1021                         "value for [pdf_export_line_width] cannot be zero or negative" );
1022             }
1023         }
1024         else if ( key.equals( "window_initial_size_x" ) ) {
1025             final String str = ( ( String ) st.nextElement() ).trim();
1026             final int i = parseInt( str );
1027             if ( i > 0 ) {
1028                 setFrameXSize( i );
1029             }
1030         }
1031         else if ( key.equals( "window_initial_size_y" ) ) {
1032             final String str = ( ( String ) st.nextElement() ).trim();
1033             final int i = parseInt( str );
1034             if ( i > 0 ) {
1035                 setFrameYSize( i );
1036             }
1037         }
1038         else if ( key.equals( "default_number_of_bootstrap_resamples" ) ) {
1039             final String str = ( ( String ) st.nextElement() ).trim();
1040             final int i = parseInt( str );
1041             if ( i >= 0 ) {
1042                 setDefaultBootstrapSamples( i );
1043             }
1044             else {
1045                 ForesterUtil
1046                 .printWarningMessage( AptxConstants.PRG_NAME,
1047                                       "value for [default_number_of_bootstrap_resamples] cannot be negative" );
1048             }
1049         }
1050         else if ( key.equals( "mafft_local" ) ) {
1051             final String str = ( ( String ) st.nextElement() ).trim();
1052             if ( !ForesterUtil.isEmpty( str ) ) {
1053                 setPathToLocalMafft( new File( str ) );
1054             }
1055         }
1056         else if ( key.equals( "fastme_local" ) ) {
1057             final String str = ( ( String ) st.nextElement() ).trim();
1058             if ( !ForesterUtil.isEmpty( str ) ) {
1059                 setPathToLocalFastme( new File( str ) );
1060             }
1061         }
1062         else if ( key.equals( "raxml_local" ) ) {
1063             final String str = ( ( String ) st.nextElement() ).trim();
1064             if ( !ForesterUtil.isEmpty( str ) ) {
1065                 setPathToLocalRaxml( new File( str ) );
1066             }
1067         }
1068         else if ( key.equals( "show_scale" ) ) {
1069             setShowScale( parseBoolean( ( String ) st.nextElement() ) );
1070         }
1071         else if ( key.equals( "show_overview" ) ) {
1072             setShowOverview( parseBoolean( ( String ) st.nextElement() ) );
1073         }
1074         else if ( key.equals( "background_gradient" ) ) {
1075             setBackgroundColorGradient( parseBoolean( ( String ) st.nextElement() ) );
1076         }
1077         else if ( key.equals( "color_labels_same_as_branch_length_values" ) ) {
1078             setColorLabelsSameAsParentBranch( parseBoolean( ( String ) st.nextElement() ) );
1079         }
1080         else if ( key.equals( "show_domain_labels" ) ) {
1081             setShowDomainLabels( parseBoolean( ( String ) st.nextElement() ) );
1082         }
1083         else if ( key.equals( "show_seq_annotation_ref_sources" ) ) {
1084             setShowAnnotationRefSource( parseBoolean( ( String ) st.nextElement() ) );
1085         }
1086         else if ( key.equals( "abbreviate_scientific_names" ) ) {
1087             setAbbreviateScientificTaxonNames( parseBoolean( ( String ) st.nextElement() ) );
1088         }
1089         else if ( key.equals( "cladogram_type" ) ) {
1090             final String type_str = ( ( String ) st.nextElement() ).trim();
1091             if ( type_str.equalsIgnoreCase( Options.CLADOGRAM_TYPE.NON_LINED_UP.toString() ) ) {
1092                 setCladogramType( Options.CLADOGRAM_TYPE.NON_LINED_UP );
1093             }
1094             else if ( type_str.equalsIgnoreCase( Options.CLADOGRAM_TYPE.LINED_UP.toString() ) ) {
1095                 setCladogramType( Options.CLADOGRAM_TYPE.LINED_UP );
1096             }
1097             else {
1098                 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "unknown value [" + type_str
1099                                                   + "] for [cladogram_type]" );
1100             }
1101         }
1102         else if ( key.equals( "hide_controls_and_menus" ) ) {
1103             _hide_controls_and_menus = parseBoolean( ( String ) st.nextElement() );
1104         }
1105         else if ( key.equals( "use_tabbed_display" ) ) {
1106             _use_tabbed_display = parseBoolean( ( String ) st.nextElement() );
1107         }
1108         else if ( key.equals( "overview_width" ) ) {
1109             final short i = parseShort( ( ( String ) st.nextElement() ) );
1110             setOvMaxWidth( i );
1111         }
1112         else if ( key.equals( "overview_height" ) ) {
1113             final short i = parseShort( ( ( String ) st.nextElement() ) );
1114             setOvMaxHeight( i );
1115         }
1116         else if ( key.equals( "overview_placement_type" ) ) {
1117             final String type_str = ( ( String ) st.nextElement() ).trim();
1118             if ( type_str.equalsIgnoreCase( OVERVIEW_PLACEMENT_TYPE.UPPER_LEFT.toTag() ) ) {
1119                 setOvPlacement( OVERVIEW_PLACEMENT_TYPE.UPPER_LEFT );
1120             }
1121             else if ( type_str.equalsIgnoreCase( OVERVIEW_PLACEMENT_TYPE.UPPER_RIGHT.toTag() ) ) {
1122                 setOvPlacement( OVERVIEW_PLACEMENT_TYPE.UPPER_RIGHT );
1123             }
1124             else if ( type_str.equalsIgnoreCase( OVERVIEW_PLACEMENT_TYPE.LOWER_LEFT.toTag() ) ) {
1125                 setOvPlacement( OVERVIEW_PLACEMENT_TYPE.LOWER_LEFT );
1126             }
1127             else if ( type_str.equalsIgnoreCase( OVERVIEW_PLACEMENT_TYPE.LOWER_RIGHT.toTag() ) ) {
1128                 setOvPlacement( OVERVIEW_PLACEMENT_TYPE.LOWER_RIGHT );
1129             }
1130             else {
1131                 setOvPlacement( OVERVIEW_PLACEMENT_TYPE.UPPER_LEFT );
1132                 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "unknown value [" + type_str
1133                                                   + "] for [overview_placement_type]" );
1134             }
1135         }
1136         else if ( key.equals( "node_label_direction" ) ) {
1137             final String type_str = ( ( String ) st.nextElement() ).trim();
1138             if ( type_str.equalsIgnoreCase( NODE_LABEL_DIRECTION.HORIZONTAL.toString() ) ) {
1139                 setNodeLabelDirection( NODE_LABEL_DIRECTION.HORIZONTAL );
1140             }
1141             else if ( type_str.equalsIgnoreCase( NODE_LABEL_DIRECTION.RADIAL.toString() ) ) {
1142                 setNodeLabelDirection( NODE_LABEL_DIRECTION.RADIAL );
1143             }
1144             else {
1145                 setNodeLabelDirection( NODE_LABEL_DIRECTION.HORIZONTAL );
1146                 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "unknown value [" + type_str
1147                                                   + "] for [node_label_direction]" );
1148             }
1149         }
1150         else if ( key.equals( "branch_length_value_digits" ) ) {
1151             final short i = parseShort( ( ( String ) st.nextElement() ).trim() );
1152             if ( i >= 0 ) {
1153                 setNumberOfDigitsAfterCommaForBranchLengthValue( i );
1154             }
1155             else {
1156                 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "illegal value [" + i
1157                                                   + "] for [branch_length_value_digits]" );
1158             }
1159         }
1160         else if ( key.equals( "confidence_value_digits" ) ) {
1161             final short i = parseShort( ( ( String ) st.nextElement() ).trim() );
1162             if ( i >= 0 ) {
1163                 setNumberOfDigitsAfterCommaForConfidenceValues( i );
1164             }
1165             else {
1166                 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "illegal value [" + i
1167                                                   + "] for [confidence_value_digits]" );
1168             }
1169         }
1170         else if ( key.equals( "allow_editing" ) ) {
1171             setEditable( parseBoolean( ( String ) st.nextElement() ) );
1172         }
1173         else if ( key.equals( "display_sequence_relations" ) ) {
1174             setDisplaySequenceRelations( parseBoolean( ( String ) st.nextElement() ) );
1175         }
1176         else if ( key.equals( "replace_underscores_in_nh_parsing" ) ) {
1177             final boolean r = parseBoolean( ( String ) st.nextElement() );
1178             if ( r && ( getTaxonomyExtraction() != TAXONOMY_EXTRACTION.NO ) ) {
1179                 ForesterUtil
1180                 .printWarningMessage( AptxConstants.PRG_NAME,
1181                                       "attempt to extract taxonomies and replace underscores at the same time" );
1182             }
1183             else {
1184                 setReplaceUnderscoresInNhParsing( r );
1185             }
1186         }
1187         else if ( key.equals( "taxonomy_extraction_in_nh_parsing" ) ) {
1188             final String s = ( String ) st.nextElement();
1189             if ( s.equalsIgnoreCase( "no" ) ) {
1190                 setTaxonomyExtraction( TAXONOMY_EXTRACTION.NO );
1191             }
1192             else if ( s.equalsIgnoreCase( "pfam_relaxed" ) ) {
1193                 setTaxonomyExtraction( TAXONOMY_EXTRACTION.PFAM_STYLE_RELAXED );
1194             }
1195             else if ( s.equalsIgnoreCase( "pfam_strict" ) ) {
1196                 setTaxonomyExtraction( TAXONOMY_EXTRACTION.PFAM_STYLE_STRICT );
1197             }
1198             else if ( s.equalsIgnoreCase( "aggressive" ) ) {
1199                 setTaxonomyExtraction( TAXONOMY_EXTRACTION.AGGRESSIVE );
1200             }
1201             else {
1202                 ForesterUtil
1203                 .printWarningMessage( AptxConstants.PRG_NAME,
1204                                       "unknown value for \"taxonomy_extraction_in_nh_parsing\": "
1205                                               + s
1206                                               + " (must be either: no, pfam_relaxed, pfam_strict, or aggressive)" );
1207             }
1208             if ( ( getTaxonomyExtraction() != TAXONOMY_EXTRACTION.NO ) && isReplaceUnderscoresInNhParsing() ) {
1209                 ForesterUtil
1210                 .printWarningMessage( AptxConstants.PRG_NAME,
1211                                       "attempt to extract taxonomies and replace underscores at the same time" );
1212             }
1213         }
1214         else if ( key.equals( "internal_labels_are_confidence_values" ) ) {
1215             setInternalNumberAreConfidenceForNhParsing( parseBoolean( ( String ) st.nextElement() ) );
1216         }
1217         else if ( key.equals( "gui_background_color" ) ) {
1218             _gui_background_color = Color.decode( ( String ) st.nextElement() );
1219         }
1220         else if ( key.equals( "gui_checkbox_text_color" ) ) {
1221             _gui_checkbox_text_color = Color.decode( ( String ) st.nextElement() );
1222         }
1223         else if ( key.equals( "gui_checkbox_and_button_active_color" ) ) {
1224             _gui_checkbox_and_button_active_color = Color.decode( ( String ) st.nextElement() );
1225         }
1226         else if ( key.equals( "gui_button_text_color" ) ) {
1227             _gui_button_text_color = Color.decode( ( String ) st.nextElement() );
1228         }
1229         else if ( key.equals( "gui_button_background_color" ) ) {
1230             _gui_button_background_color = Color.decode( ( String ) st.nextElement() );
1231         }
1232         else if ( key.equals( "gui_menu_background_color" ) ) {
1233             _gui_menu_background_color = Color.decode( ( String ) st.nextElement() );
1234         }
1235         else if ( key.equals( "gui_menu_text_color" ) ) {
1236             _gui_menu_text_color = Color.decode( ( String ) st.nextElement() );
1237         }
1238         else if ( key.equals( "gui_button_border_color" ) ) {
1239             _gui_button_border_color = Color.decode( ( String ) st.nextElement() );
1240         }
1241         else if ( key.equals( "show_default_node_shapes_internal" ) ) {
1242             setShowDefaultNodeShapesInternal( parseBoolean( ( ( String ) st.nextElement() ).trim() ) );
1243         }
1244         else if ( key.equals( "show_default_node_shapes_external" ) ) {
1245             setShowDefaultNodeShapesExternal( parseBoolean( ( ( String ) st.nextElement() ).trim() ) );
1246         }
1247         else if ( key.equals( "show_node_shapes_for_nodes_with_vis_data" ) ) {
1248             setShowDefaultNodeShapesForMarkedNodes( parseBoolean( ( ( String ) st.nextElement() ).trim() ) );
1249         }
1250         else if ( key.equals( "default_node_size" ) ) {
1251             final short i = parseShort( ( ( String ) st.nextElement() ).trim() );
1252             setDefaultNodeShapeSize( i );
1253         }
1254         else if ( key.equals( "default_node_fill" ) ) {
1255             final String fill_str = ( ( String ) st.nextElement() ).trim();
1256             if ( fill_str.equalsIgnoreCase( NodeVisualData.NodeFill.NONE.toString() ) ) {
1257                 setDefaultNodeFill( NodeFill.NONE );
1258             }
1259             else if ( fill_str.equalsIgnoreCase( NodeVisualData.NodeFill.GRADIENT.toString() ) ) {
1260                 setDefaultNodeFill( NodeFill.GRADIENT );
1261             }
1262             else if ( fill_str.equalsIgnoreCase( NodeVisualData.NodeFill.SOLID.toString() ) ) {
1263                 setDefaultNodeFill( NodeFill.SOLID );
1264             }
1265             else {
1266                 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "unknown value [" + fill_str
1267                                                   + "] for [default_node_fill]" );
1268             }
1269         }
1270         else if ( key.equals( "default_node_shape" ) ) {
1271             final String shape_str = ( ( String ) st.nextElement() ).trim();
1272             if ( shape_str.equalsIgnoreCase( NodeVisualData.NodeShape.CIRCLE.toString() ) ) {
1273                 setDefaultNodeShape( NodeShape.CIRCLE );
1274             }
1275             else if ( shape_str.equalsIgnoreCase( NodeVisualData.NodeShape.RECTANGLE.toString() ) ) {
1276                 setDefaultNodeShape( NodeShape.RECTANGLE );
1277             }
1278             else {
1279                 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "unknown value [" + shape_str
1280                                                   + "] for [default_node_shape]" );
1281             }
1282         }
1283         else if ( key.equals( "midpoint_reroot" ) ) {
1284             setMidpointReroot( parseBoolean( ( String ) st.nextElement() ) );
1285         }
1286         else if ( key.equals( "list_node_data_field" ) || key.equals( "ext_descendents_data_to_return" ) ) {
1287             final String s = ( ( String ) st.nextElement() ).trim();
1288             if ( s.equalsIgnoreCase( "node_name" ) ) {
1289                 setExtDescNodeDataToReturn( NodeDataField.NODE_NAME );
1290             }
1291             else if ( s.equalsIgnoreCase( "sequence_acc" ) ) {
1292                 setExtDescNodeDataToReturn( NodeDataField.SEQUENCE_ACC );
1293             }
1294             else if ( s.equalsIgnoreCase( "sequence_mol_seq_fasta" ) ) {
1295                 setExtDescNodeDataToReturn( NodeDataField.SEQUENCE_MOL_SEQ_FASTA );
1296             }
1297             else if ( s.equalsIgnoreCase( "sequence_name" ) ) {
1298                 setExtDescNodeDataToReturn( NodeDataField.SEQUENCE_NAME );
1299             }
1300             else if ( s.equalsIgnoreCase( "gene_name" ) ) {
1301                 setExtDescNodeDataToReturn( NodeDataField.GENE_NAME );
1302             }
1303             else if ( s.equalsIgnoreCase( "sequence_symbol" ) ) {
1304                 setExtDescNodeDataToReturn( NodeDataField.SEQUENCE_SYMBOL );
1305             }
1306             else if ( s.equalsIgnoreCase( "taxonomy_scientific_name" ) ) {
1307                 setExtDescNodeDataToReturn( NodeDataField.TAXONOMY_SCIENTIFIC_NAME );
1308             }
1309             else if ( s.equalsIgnoreCase( "taxonomy_code" ) ) {
1310                 setExtDescNodeDataToReturn( NodeDataField.TAXONOMY_CODE );
1311             }
1312             else if ( s.equalsIgnoreCase( "user_selected" ) ) {
1313                 setExtDescNodeDataToReturn( NodeDataField.UNKNOWN );
1314             }
1315             else if ( s.equalsIgnoreCase( "domains" ) ) {
1316                 setExtDescNodeDataToReturn( NodeDataField.DOMAINS_ALL );
1317             }
1318             else if ( s.equalsIgnoreCase( "domains_collapsed" ) ) {
1319                 setExtDescNodeDataToReturn( NodeDataField.DOMAINS_COLLAPSED_PER_PROTEIN );
1320             }
1321             else if ( s.equalsIgnoreCase( "seq_annotations" ) ) {
1322                 setExtDescNodeDataToReturn( NodeDataField.SEQ_ANNOTATIONS );
1323             }
1324             else if ( s.equalsIgnoreCase( "go_term_ids" ) ) {
1325                 setExtDescNodeDataToReturn( NodeDataField.GO_TERM_IDS );
1326             }
1327             else {
1328                 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "unknown value [" + s
1329                                                   + "] for [ext_descendents_data_to_return]" );
1330             }
1331         }
1332         else if ( key.equals( "list_node_data_custom_label" ) || key.equals( "label_for_get_ext_descendents_data" ) ) {
1333             final String s = ( ( String ) st.nextElement() ).trim();
1334             if ( !ForesterUtil.isEmpty( s ) && ( s.length() > 1 ) ) {
1335                 setLabelForGetExtDescendentsData( s.replaceAll( "_", " " ) );
1336             }
1337         }
1338         else if ( key.equals( "list_node_data_in" ) || key.equals( "ext_descendents_data_to_return_on" ) ) {
1339             final String s = ( ( String ) st.nextElement() ).trim().toLowerCase();
1340             if ( s.equals( "console" ) ) {
1341                 setExtNodeDataReturnOn( EXT_NODE_DATA_RETURN_ON.CONSOLE );
1342             }
1343             else if ( s.equals( "window" ) ) {
1344                 setExtNodeDataReturnOn( EXT_NODE_DATA_RETURN_ON.WINODW );
1345             }
1346             else if ( s.equals( "buffer_only" ) ) {
1347                 setExtNodeDataReturnOn( EXT_NODE_DATA_RETURN_ON.BUFFER_ONLY );
1348             }
1349             else {
1350                 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "unknown value [" + s
1351                                                   + "] for [ext_descendents_data_to_return_on]" );
1352             }
1353         }
1354         else if ( key.equals( "vector_data_min_color" ) ) {
1355             _vector_data_min_color = Color.decode( ( String ) st.nextElement() );
1356         }
1357         else if ( key.equals( "vector_data_max_color" ) ) {
1358             _vector_data_max_color = Color.decode( ( String ) st.nextElement() );
1359         }
1360         else if ( key.equals( "vector_data_mean_color" ) ) {
1361             _vector_data_mean_color = Color.decode( ( String ) st.nextElement() );
1362         }
1363         else if ( key.equals( "vector_data_width" ) ) {
1364             _vector_data_width = parseShort( ( String ) st.nextElement() );
1365             if ( _vector_data_width < 1 ) {
1366                 _vector_data_width = 120;
1367             }
1368         }
1369         else if ( key.equals( "vector_data_height" ) ) {
1370             _vector_data_height = parseShort( ( String ) st.nextElement() );
1371             if ( _vector_data_height < 1 ) {
1372                 _vector_data_height = 12;
1373             }
1374         }
1375         else if ( key.equals( "line_up_renderable_data" ) ) {
1376             setLineUpRendarableNodeData( parseBoolean( ( String ) st.nextElement() ) );
1377         }
1378         else if ( key.equals( "right_align_domain_architectures" ) ) {
1379             setRightLineUpDomains( parseBoolean( ( String ) st.nextElement() ) );
1380         }
1381         else if ( key.equals( "allow_thick_strokes" ) ) {
1382             _allow_thick_strokes = parseBoolean( ( String ) st.nextElement() );
1383         }
1384         else if ( st.countTokens() >= 2 ) { // counts the tokens that are not
1385             // yet retrieved!
1386             int key_index = -1;
1387             if ( key.equals( "phylogram" ) ) {
1388                 key_index = Configuration.display_as_phylogram;
1389             }
1390             else if ( key.equals( "rollover" ) ) {
1391                 key_index = Configuration.node_data_popup;
1392             }
1393             else if ( key.equals( "color_according_to_species" ) ) {
1394                 key_index = Configuration.color_according_to_species;
1395             }
1396             else if ( key.equals( "color_according_to_sequence" ) ) {
1397                 key_index = Configuration.color_according_to_sequence;
1398             }
1399             else if ( key.equals( "show_node_names" ) ) {
1400                 key_index = Configuration.show_node_names;
1401             }
1402             else if ( key.equals( "show_taxonomy_code" ) ) {
1403                 key_index = Configuration.show_tax_code;
1404             }
1405             else if ( key.equals( "show_taxonomy_rank" ) ) {
1406                 key_index = Configuration.show_tax_rank;
1407             }
1408             else if ( key.equals( "write_confidence_values" ) ) {
1409                 key_index = Configuration.write_confidence_values;
1410             }
1411             else if ( key.equals( "write_branch_length_values" ) ) {
1412                 key_index = Configuration.write_branch_length_values;
1413             }
1414             else if ( key.equals( "write_events" ) ) {
1415                 key_index = Configuration.write_events;
1416             }
1417             else if ( key.equals( "use_visual_styles" ) ) {
1418                 key_index = Configuration.use_style;
1419             }
1420             else if ( key.equals( "color_branches" ) ) {
1421                 key_index = Configuration.use_style;
1422                 ForesterUtil
1423                 .printWarningMessage( AptxConstants.PRG_NAME,
1424                                       "configuration key [color_branches] is deprecated, use [use_visual_styles] instead" );
1425             }
1426             else if ( key.equals( "width_branches" ) ) {
1427                 key_index = Configuration.width_branches;
1428             }
1429             else if ( key.equals( "show_domain_architectures" ) ) {
1430                 key_index = Configuration.show_domain_architectures;
1431             }
1432             else if ( key.equals( "show_msa" ) ) {
1433                 key_index = Configuration.show_mol_seqs;
1434             }
1435             else if ( key.equals( "show_annotations" ) ) {
1436                 key_index = Configuration.show_annotation;
1437             }
1438             else if ( key.equals( "show_binary_characters" ) ) {
1439                 key_index = Configuration.show_binary_characters;
1440             }
1441             else if ( key.equals( "show_binary_character_counts" ) ) {
1442                 key_index = Configuration.show_binary_character_counts;
1443             }
1444             else if ( key.equals( "show_seq_names" ) ) {
1445                 key_index = Configuration.show_seq_names;
1446             }
1447             else if ( key.equals( "show_gene_names" ) ) {
1448                 key_index = Configuration.show_gene_names;
1449             }
1450             else if ( key.equals( "show_seq_symbols" ) ) {
1451                 key_index = Configuration.show_seq_symbols;
1452             }
1453             else if ( key.equals( "show_seq_acc" ) ) {
1454                 key_index = Configuration.show_sequence_acc;
1455             }
1456             else if ( key.equals( "display_internal_data" ) ) {
1457                 key_index = Configuration.display_internal_data;
1458             }
1459             else if ( key.equals( "display_external_data" ) ) {
1460                 key_index = Configuration.display_external_data;
1461             }
1462             else if ( key.equals( "dynamically_hide_data" ) ) {
1463                 key_index = Configuration.dynamically_hide_data;
1464             }
1465             else if ( key.equals( "show_taxonomy_scientific_names" ) ) {
1466                 key_index = Configuration.show_taxonomy_scientific_names;
1467             }
1468             else if ( key.equals( "show_taxonomy_common_names" ) ) {
1469                 key_index = Configuration.show_taxonomy_common_names;
1470             }
1471             else if ( key.equals( "show_taxonomy_images" ) ) {
1472                 key_index = Configuration.show_taxonomy_images;
1473             }
1474             else if ( key.equals( "color_according_to_annotation" ) ) {
1475                 key_index = Configuration.color_according_to_annotation;
1476             }
1477             else if ( key.equals( "show_vector_data" ) ) {
1478                 key_index = Configuration.show_vector_data;
1479             }
1480             else if ( key.equals( "show_properties" ) ) {
1481                 key_index = Configuration.show_properties;
1482             }
1483             else if ( key.equals( "show_relation_confidence" ) ) {
1484                 key_index = Configuration.show_relation_confidence;
1485             }
1486             // If we've found the key, set the values
1487             if ( key_index >= 0 ) {
1488                 display_options[ key_index ][ 1 ] = ( String ) st.nextElement();
1489                 display_options[ key_index ][ 2 ] = ( String ) st.nextElement();
1490                 // otherwise, keep looking
1491             }
1492             else {
1493                 if ( key_index == DEPRECATED ) {
1494                     // Deprecated.
1495                 }
1496                 else if ( key.equals( "click_to" ) ) {
1497                     final String click_to_name = ( String ) st.nextElement();
1498                     key_index = getClickToIndex( click_to_name );
1499                     if ( key_index >= 0 ) {
1500                         clickto_options[ key_index ][ 1 ] = ( String ) st.nextElement();
1501                     }
1502                     else if ( key_index == DEPRECATED ) {
1503                         // Deprecated.
1504                     }
1505                     else {
1506                         ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "unknown click-to option: "
1507                                 + click_to_name );
1508                     }
1509                 }
1510                 else if ( key.equals( "species_color" ) ) {
1511                     getSpeciesColors().put( ( ( String ) st.nextElement() ).replace( '_', ' ' ),
1512                                             Color.decode( ( String ) st.nextElement() ) );
1513                 }
1514                 else if ( key.equals( "sequence_color" ) ) {
1515                     getSequenceColors().put( ( ( String ) st.nextElement() ).replace( '_', ' ' ),
1516                                              Color.decode( ( String ) st.nextElement() ) );
1517                 }
1518                 else if ( key.equals( "domain_color" ) ) {
1519                     getDomainColors().put( ( String ) st.nextElement(), Color.decode( ( String ) st.nextElement() ) );
1520                 }
1521                 else if ( key.equals( "annotation_color" ) ) {
1522                     getAnnotationColors()
1523                     .put( ( String ) st.nextElement(), Color.decode( ( String ) st.nextElement() ) );
1524                 }
1525                 else if ( key.equals( "function_color" ) ) {
1526                     ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME,
1527                             "configuration key [function_color] is deprecated" );
1528                 }
1529                 else if ( key.equals( DISPLAY_COLOR_KEY ) ) {
1530                     putDisplayColors( ( String ) st.nextElement(), Color.decode( ( String ) st.nextElement() ) );
1531                 }
1532                 else {
1533                     ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "unknown configuration key [" + key
1534                                                       + "] in: " + config_filename );
1535                 }
1536             }
1537         }
1538         else {
1539             ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "unknown configuration key [" + key + "] in: "
1540                     + config_filename );
1541         }
1542     }
1543
1544     private void setLabelForGetExtDescendentsData( final String label_for_get_ext_descendents_data ) {
1545         _label_for_get_ext_descendents_data = label_for_get_ext_descendents_data;
1546     }
1547
1548     private void setMaxBaseFontSize( final int max_base_font_size ) {
1549         _max_base_font_size = max_base_font_size;
1550     }
1551
1552     private void setMinBaseFontSize( final int min_base_font_size ) {
1553         _min_base_font_size = min_base_font_size;
1554     }
1555
1556     private void setOvMaxHeight( final short ov_max_height ) {
1557         _ov_max_height = ov_max_height;
1558     }
1559
1560     private void setOvMaxWidth( final short ov_max_width ) {
1561         _ov_max_width = ov_max_width;
1562     }
1563
1564     private void setOvPlacement( final OVERVIEW_PLACEMENT_TYPE ov_placement ) {
1565         _ov_placement = ov_placement;
1566     }
1567
1568     private void setPathToLocalFastme( final File path_to_local_fastme ) {
1569         _path_to_local_fastme = path_to_local_fastme;
1570     }
1571
1572     private void setPathToLocalMafft( final File path_to_local_mafft ) {
1573         _path_to_local_mafft = path_to_local_mafft;
1574     }
1575
1576     private void setPathToLocalRaxml( final File path_to_local_raxml ) {
1577         _path_to_local_raxml = path_to_local_raxml;
1578     }
1579
1580     private void setShowAnnotationRefSource( final boolean b ) {
1581         _show_annotation_ref_source = b;
1582     }
1583
1584     private void setShowOverview( final boolean show_overview ) {
1585         _show_overview = show_overview;
1586     }
1587
1588     private void setValidatePhyloXmlAgainstSchema( final boolean validate_against_phyloxml_xsd_schema ) {
1589         _validate_against_phyloxml_xsd_schema = validate_against_phyloxml_xsd_schema;
1590     }
1591
1592     boolean displaySequenceRelations() {
1593         return _display_sequence_relations;
1594     }
1595
1596     boolean doCheckOption( final int which ) {
1597         return ( display_options[ which ][ 2 ].equalsIgnoreCase( "yes" ) )
1598                 || ( display_options[ which ][ 2 ].equalsIgnoreCase( "true" ) );
1599     }
1600
1601     boolean doDisplayClickToOption( final int which ) {
1602         return clickto_options[ which ][ 1 ].equalsIgnoreCase( "display" );
1603     }
1604
1605     boolean doDisplayOption( final int which ) {
1606         return display_options[ which ][ 1 ].equalsIgnoreCase( "display" );
1607     }
1608
1609     /**
1610      * Will attempt to use the phylogeny to determine whether to check
1611      * this or not (e.g. phylogram)
1612      *
1613      */
1614     boolean doGuessCheckOption( final int which ) {
1615         return display_options[ which ][ 2 ].equals( "?" );
1616     }
1617
1618     Map<String, Color> getAnnotationColors() {
1619         if ( _annotation_colors == null ) {
1620             _annotation_colors = new Hashtable<String, Color>();
1621         }
1622         return _annotation_colors;
1623     }
1624
1625     int getBaseFontSize() {
1626         return _base_font_size;
1627     }
1628
1629     CLADOGRAM_TYPE getCladogramType() {
1630         return _cladogram_type;
1631     }
1632
1633     int getClickToOptionsCount() {
1634         return clickto_options.length;
1635     }
1636
1637     String getClickToTitle( final int which ) {
1638         return clickto_options[ which ][ 0 ];
1639     }
1640
1641     int getDefaultDisplayClicktoOption() {
1642         return default_clickto;
1643     }
1644
1645     SortedMap<String, Color> getDisplayColors() {
1646         return _display_colors;
1647     }
1648
1649     String getDisplayTitle( final int which ) {
1650         return display_options[ which ][ 0 ];
1651     }
1652
1653     Map<String, Color> getDomainColors() {
1654         if ( _domain_colors == null ) {
1655             _domain_colors = new Hashtable<String, Color>();
1656         }
1657         return _domain_colors;
1658     }
1659
1660  
1661     Color getGuiBackgroundColor() {
1662         return _gui_background_color;
1663     }
1664
1665     Color getGuiButtonBackgroundColor() {
1666         return _gui_button_background_color;
1667     }
1668
1669     Color getGuiButtonBorderColor() {
1670         return _gui_button_border_color;
1671     }
1672
1673     Color getGuiButtonTextColor() {
1674         return _gui_button_text_color;
1675     }
1676
1677     Color getGuiCheckboxAndButtonActiveColor() {
1678         return _gui_checkbox_and_button_active_color;
1679     }
1680
1681     Color getGuiCheckboxTextColor() {
1682         return _gui_checkbox_text_color;
1683     }
1684
1685     Color getGuiMenuBackgroundColor() {
1686         return _gui_menu_background_color;
1687     }
1688
1689     Color getGuiMenuTextColor() {
1690         return _gui_menu_text_color;
1691     }
1692
1693     static int getGuiFontSize() {
1694         return 11;
1695     }
1696     
1697     int getMaxBaseFontSize() {
1698         return _max_base_font_size;
1699     }
1700
1701     int getMinBaseFontSize() {
1702         return _min_base_font_size;
1703     }
1704
1705     double getMinConfidenceValue() {
1706         return _min_confidence_value;
1707     }
1708
1709     NODE_LABEL_DIRECTION getNodeLabelDirection() {
1710         return _node_label_direction;
1711     }
1712
1713     short getNumberOfDigitsAfterCommaForBranchLengthValues() {
1714         return _number_of_digits_after_comma_for_branch_length_values;
1715     }
1716
1717     short getNumberOfDigitsAfterCommaForConfidenceValues() {
1718         return _number_of_digits_after_comma_for_confidence_values;
1719     }
1720
1721     short getOvMaxHeight() {
1722         return _ov_max_height;
1723     }
1724
1725     short getOvMaxWidth() {
1726         return _ov_max_width;
1727     }
1728
1729     OVERVIEW_PLACEMENT_TYPE getOvPlacement() {
1730         return _ov_placement;
1731     }
1732
1733     PHYLOGENY_GRAPHICS_TYPE getPhylogenyGraphicsType() {
1734         return _phylogeny_graphics_type;
1735     }
1736
1737     float getPrintLineWidth() {
1738         return _print_line_width;
1739     }
1740
1741     Hashtable<String, Color> getSequenceColors() {
1742         if ( _sequence_colors == null ) {
1743             _sequence_colors = new Hashtable<String, Color>();
1744         }
1745         return _sequence_colors;
1746     }
1747
1748     Hashtable<String, Color> getSpeciesColors() {
1749         if ( _species_colors == null ) {
1750             initSpeciesColors();
1751         }
1752         return _species_colors;
1753     }
1754
1755     public final TAXONOMY_EXTRACTION getTaxonomyExtraction() {
1756         return _taxonomy_extraction;
1757     }
1758
1759     boolean isAntialiasScreen() {
1760         return _antialias_screen;
1761     }
1762
1763     /**
1764      * Convenience method.
1765      *
1766      * @return true if value in configuration file was 'yes'
1767      */
1768     boolean isDrawAsPhylogram() {
1769         return doCheckOption( display_as_phylogram );
1770     }
1771
1772     boolean isEditable() {
1773         return _editable;
1774     }
1775
1776     /**
1777      * Only used by ArchaeoptryxE.
1778      *
1779      */
1780     boolean isHideControlPanelAndMenubar() {
1781         return _hide_controls_and_menus;
1782     }
1783
1784     public boolean isInternalNumberAreConfidenceForNhParsing() {
1785         return _internal_number_are_confidence_for_nh_parsing;
1786     }
1787
1788     public boolean isReplaceUnderscoresInNhParsing() {
1789         return _nh_parsing_replace_underscores;
1790     }
1791
1792     boolean isShowOverview() {
1793         return _show_overview;
1794     }
1795
1796     boolean isShowScale() {
1797         return _show_scale;
1798     }
1799
1800     final boolean isUseNativeUI() {
1801         if ( ( _ui == UI.UNKNOWN ) && ForesterUtil.isMac() ) {
1802             _ui = UI.NATIVE;
1803         }
1804         return _ui == UI.NATIVE;
1805     }
1806
1807     /**
1808      * Only used by ArchaeoptryxE.
1809      *
1810      */
1811     boolean isUseTabbedDisplay() {
1812         return _use_tabbed_display;
1813     }
1814
1815    public boolean isValidatePhyloXmlAgainstSchema() {
1816         return _validate_against_phyloxml_xsd_schema;
1817     }
1818
1819     final void setTaxonomyExtraction( final TAXONOMY_EXTRACTION taxonomy_extraction ) {
1820         _taxonomy_extraction = taxonomy_extraction;
1821     }
1822
1823     static String getDefaultFontFamilyName() {
1824         return DEFAULT_FONT_FAMILY;
1825     }
1826
1827     public boolean isCouldReadConfigFile() {
1828         return _could_read_config_file;
1829     }
1830
1831     
1832     public String getConfigFilename() {
1833         return config_filename;
1834     }
1835     
1836
1837     
1838 }