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