JAL-3032 adds Java 8 functionality (2/2)
[jalview.git] / src2 / fr / orsay / lri / varna / models / VARNAConfig.java
1 /*
2  VARNA is a tool for the automated drawing, visualization and annotation of the secondary structure of RNA, designed as a companion software for web servers and databases.
3  Copyright (C) 2008  Kevin Darty, Alain Denise and Yann Ponty.
4  electronic mail : Yann.Ponty@lri.fr
5  paper mail : LRI, bat 490 Université Paris-Sud 91405 Orsay Cedex France
6
7  This file is part of VARNA version 3.1.
8  VARNA version 3.1 is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License
9  as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
10
11  VARNA version 3.1 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
12  without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13  See the GNU General Public License for more details.
14
15  You should have received a copy of the GNU General Public License along with VARNA version 3.1.
16  If not, see http://www.gnu.org/licenses.
17  */
18 package fr.orsay.lri.varna.models;
19
20 import java.awt.Color;
21 import java.awt.Font;
22 import java.io.ByteArrayInputStream;
23 import java.io.ByteArrayOutputStream;
24 import java.io.ObjectInputStream;
25 import java.io.ObjectOutputStream;
26 import java.io.Serializable;
27
28 import javax.xml.transform.sax.TransformerHandler;
29
30 import org.xml.sax.Attributes;
31 import org.xml.sax.SAXException;
32 import org.xml.sax.helpers.AttributesImpl;
33
34 import fr.orsay.lri.varna.models.annotations.HighlightRegionAnnotation;
35 import fr.orsay.lri.varna.models.annotations.TextAnnotation;
36 import fr.orsay.lri.varna.models.rna.ModeleBP;
37 import fr.orsay.lri.varna.models.rna.ModeleBPStyle;
38 import fr.orsay.lri.varna.models.rna.ModeleBase;
39 import fr.orsay.lri.varna.models.rna.ModeleColorMap;
40 import fr.orsay.lri.varna.utils.XMLUtils;
41
42 public class VARNAConfig implements Serializable, Cloneable {
43
44         /**
45          * 
46          */
47         private static final long serialVersionUID = 2853916694420964233L;
48         /**
49          * 
50          */
51         public static final int MAJOR_VERSION = 3;
52         public static final int MINOR_VERSION = 9;
53         
54         public static String getFullName()
55         {
56                 return "VARNA "+MAJOR_VERSION+"."+MINOR_VERSION;
57         }
58
59         /**
60          * Enum types and internal classes
61          */
62
63         public enum BP_STYLE implements Serializable {
64                 NONE, SIMPLE, RNAVIZ, LW, LW_ALT;
65                 public String toString()
66                 {
67                         switch(this)
68                         {
69                                 case LW: return "Leontis/Westhof (Centered)";
70                                 case SIMPLE: return "Line";
71                                 case RNAVIZ: return "Circles";
72                                 case NONE: return "None";
73                                 case LW_ALT: return "Leontis/Westhof (End)";
74                         }
75                         return "Unspecified";
76                 }
77                 public String getOpt()
78                 {
79                         switch(this)
80                         {
81                                 case NONE: return "none";
82                                 case SIMPLE: return "simple";
83                                 case LW: return "lw";
84                                 case RNAVIZ: return "rnaviz";
85                                 case LW_ALT: return "lwalt";
86                         }
87                         return "x";
88                 }
89                 public static BP_STYLE getStyle(String opt)
90                 {
91                         for(BP_STYLE b: BP_STYLE.values())
92                         {
93                                 if (opt.toLowerCase().equals(b.getOpt().toLowerCase()))
94                                         return b;
95                         }
96                         return null;
97                 }
98         };
99
100         /**
101          * Default values for config options
102          */
103
104         public static final double MAX_ZOOM = 60;
105         public static final double MIN_ZOOM = 0.5;
106         public static final double DEFAULT_ZOOM = 1;
107         public static final double MAX_AMOUNT = 2;
108         public static final double MIN_AMOUNT = 1.01;
109         public static final double DEFAULT_AMOUNT = 1.2;
110         public static final double DEFAULT_BP_THICKNESS = 1.0;
111         public static final double DEFAULT_DIST_NUMBERS = 3.0;
112
113         public static final int DEFAULT_PERIOD = 10;
114
115         public static final Color DEFAULT_TITLE_COLOR = Color.black;
116         public static final Color DEFAULT_BACKBONE_COLOR = Color.DARK_GRAY.brighter();
117         public static final Color DEFAULT_BOND_COLOR = Color.blue;
118         public static final Color DEFAULT_SPECIAL_BASE_COLOR = Color.green.brighter();
119         public static final Color DEFAULT_DASH_BASE_COLOR = Color.yellow.brighter();
120         public static final double DEFAULT_BASE_OUTLINE_THICKNESS = 1.5;
121         public static final Color BASE_OUTLINE_COLOR_DEFAULT = Color.DARK_GRAY.brighter();
122         public static final Color BASE_INNER_COLOR_DEFAULT = new Color(242, 242,242);
123         public static final Color BASE_NUMBER_COLOR_DEFAULT = Color.DARK_GRAY;
124         public static final Color BASE_NAME_COLOR_DEFAULT = Color.black;
125         
126         public static final Color DEFAULT_HOVER_COLOR  =  new Color(230, 230,230);
127
128         public static final Color DEFAULT_BACKGROUND_COLOR = Color.WHITE;
129         public static final Font DEFAULT_TITLE_FONT = new Font("SansSerif", Font.BOLD,18);
130         public static final Font DEFAULT_BASE_FONT = new Font("SansSerif", Font.PLAIN, 18);
131         public static final Font DEFAULT_NUMBERS_FONT = new Font("SansSerif",
132                         Font.BOLD, 18);
133         public static final Font DEFAULT_MESSAGE_FONT = Font.decode("dialog-PLAIN-25");
134         public static final Color DEFAULT_MESSAGE_COLOR = new Color(230, 230,230);
135
136
137         public static final BP_STYLE DEFAULT_BP_STYLE = BP_STYLE.LW;
138
139         public static final ModeleColorMap DEFAULT_COLOR_MAP = ModeleColorMap.defaultColorMap();
140         public static final Color DEFAULT_COLOR_MAP_OUTLINE = Color.gray;
141         public static final double DEFAULT_BP_INCREMENT = 0.65;
142
143         public static double DEFAULT_COLOR_MAP_WIDTH = 120; 
144         public static double DEFAULT_COLOR_MAP_HEIGHT = 30; 
145         public static double DEFAULT_COLOR_MAP_X_OFFSET = 40; 
146         public static double DEFAULT_COLOR_MAP_Y_OFFSET = 0; 
147         public static int DEFAULT_COLOR_MAP_STRIPE_WIDTH = 2; 
148         public static int DEFAULT_COLOR_MAP_FONT_SIZE = 20; 
149         public static Color DEFAULT_COLOR_MAP_FONT_COLOR = Color.gray.darker(); 
150
151         public static double DEFAULT_SPACE_BETWEEN_BASES = 1.0; 
152
153         /**
154          * Various options.
155          */
156         
157         public static String XML_VAR_DRAW_OUTLINE = "drawoutline";
158         public static String XML_VAR_FILL_BASE = "fillbase";
159         public static String XML_VAR_AUTO_FIT = "autofit";
160         public static String XML_VAR_AUTO_CENTER = "autocenter";
161         public static String XML_VAR_MODIFIABLE = "modifiable";
162         public static String XML_VAR_ERRORS = "errors";
163         public static String XML_VAR_SPECIAL_BASES = "specialbases";
164         public static String XML_VAR_DASH_BASES = "dashbases";
165         public static String XML_VAR_USE_BASE_BPS = "usebasebps";
166         public static String XML_VAR_DRAW_NC = "drawnc";
167         public static String XML_VAR_DRAW_NON_PLANAR = "drawnonplanar";
168         public static String XML_VAR_SHOW_WARNINGS = "warnings";
169         public static String XML_VAR_COMPARISON_MODE = "comparison";
170         public static String XML_VAR_FLAT = "flat";
171         public static String XML_VAR_DRAW_BACKGROUND = "drawbackground";
172         public static String XML_VAR_COLOR_MAP = "drawcm";
173         public static String XML_VAR_DRAW_BACKBONE = "drawbackbone";
174         
175         public static String XML_VAR_CM_HEIGHT = "cmh";
176         public static String XML_VAR_CM_WIDTH = "cmw";
177         public static String XML_VAR_CM_X_OFFSET = "cmx";
178         public static String XML_VAR_CM_Y_OFFSET = "cmy";
179         public static String XML_VAR_DEFAULT_ZOOM = "defaultzoom";
180         public static String XML_VAR_ZOOM_AMOUNT = "zoominc";
181         public static String XML_VAR_BP_THICKNESS = "bpthick";
182         public static String XML_VAR_BASE_THICKNESS = "basethick";
183         public static String XML_VAR_DIST_NUMBERS = "distnumbers";
184         
185         public static String XML_VAR_NUM_PERIOD = "numperiod";
186         
187         public static String XML_VAR_MAIN_BP_STYLE = "bpstyle";
188
189         public static String XML_VAR_CM = "cm";
190         
191         public static String XML_VAR_BACKBONE_COLOR = "backbonecol";
192         public static String XML_VAR_HOVER_COLOR = "hovercol";
193         public static String XML_VAR_BACKGROUND_COLOR = "backgroundcol";
194         public static String XML_VAR_BOND_COLOR = "bondcol";
195         public static String XML_VAR_TITLE_COLOR = "titlecol";
196         public static String XML_VAR_SPECIAL_BASES_COLOR = "specialco";
197         public static String XML_VAR_DASH_BASES_COLOR = "dashcol";
198         public static String XML_VAR_SPACE_BETWEEN_BASES = "spacebetweenbases";
199         
200         public static String XML_VAR_TITLE_FONT = "titlefont";
201         public static String XML_VAR_NUMBERS_FONT = "numbersfont";
202         public static String XML_VAR_FONT_BASES = "basefont";
203         
204         public static String XML_VAR_CM_CAPTION = "cmcaption";
205         public static String XML_VAR_TITLE = "title";
206         
207     
208         public boolean _drawOutlineBases = true;
209         public boolean _fillBases = true;
210         public boolean _autoFit = true;
211         public boolean _autoCenter = true;
212         public boolean _modifiable = true;
213         public boolean _errorsOn = false;
214         public boolean _colorSpecialBases = false;
215         public boolean _colorDashBases = false;
216         public boolean _useBaseColorsForBPs = false;
217         public boolean _drawnNonCanonicalBP = true;
218         public boolean _drawnNonPlanarBP = true;
219         public boolean _showWarnings = false;
220         public boolean _comparisonMode = false;
221         public boolean _flatExteriorLoop = true;
222         public boolean _drawBackground = false;
223         public boolean _drawColorMap = false;
224         public boolean _drawBackbone = true;
225         
226         public double _colorMapHeight  = DEFAULT_COLOR_MAP_HEIGHT; 
227         public double _colorMapWidth   = DEFAULT_COLOR_MAP_WIDTH; 
228         public double _colorMapXOffset = DEFAULT_COLOR_MAP_X_OFFSET; 
229         public double _colorMapYOffset = DEFAULT_COLOR_MAP_Y_OFFSET; 
230         public double _zoom            = DEFAULT_ZOOM;
231         public double _zoomAmount      = DEFAULT_AMOUNT;
232         public double _bpThickness     = 1.0;
233         public double _baseThickness   = DEFAULT_BASE_OUTLINE_THICKNESS;
234         public double _distNumbers     = DEFAULT_DIST_NUMBERS;
235         public double _spaceBetweenBases = DEFAULT_SPACE_BETWEEN_BASES;
236         
237         public int _numPeriod = DEFAULT_PERIOD;
238         public BP_STYLE _mainBPStyle = DEFAULT_BP_STYLE;
239         
240         public ModeleColorMap _cm = DEFAULT_COLOR_MAP;  
241
242         public Color _backboneColor      = DEFAULT_BACKBONE_COLOR;
243         public Color _hoverColor         = DEFAULT_HOVER_COLOR;
244         public Color _backgroundColor    = DEFAULT_BACKGROUND_COLOR;
245         public Color _bondColor          = DEFAULT_BOND_COLOR;
246         public Color _titleColor         = DEFAULT_TITLE_COLOR;
247         public Color _specialBasesColor  = DEFAULT_SPECIAL_BASE_COLOR;
248         public Color _dashBasesColor     = DEFAULT_DASH_BASE_COLOR;
249         
250         public Font _titleFont           = DEFAULT_TITLE_FONT;
251         public Font _numbersFont         = DEFAULT_NUMBERS_FONT;
252         public Font _fontBasesGeneral    = DEFAULT_BASE_FONT;
253         
254         public String _colorMapCaption = "";
255         //public String _title = "";
256
257         
258         public static String XML_ELEMENT_NAME = "config";
259         
260         public void toXML(TransformerHandler hd) throws SAXException
261         {
262                 AttributesImpl atts = new AttributesImpl();
263                 atts.addAttribute("","",XML_VAR_DRAW_OUTLINE,"CDATA",   ""+_drawOutlineBases);
264                 atts.addAttribute("","",XML_VAR_FILL_BASE,"CDATA",      ""+_fillBases);
265                 atts.addAttribute("","",XML_VAR_AUTO_FIT,"CDATA",       ""+_autoFit);
266                 atts.addAttribute("","",XML_VAR_AUTO_CENTER,"CDATA",    ""+_autoCenter);
267                 atts.addAttribute("","",XML_VAR_MODIFIABLE,"CDATA",     ""+_modifiable);
268                 atts.addAttribute("","",XML_VAR_ERRORS,"CDATA",         ""+_errorsOn);
269                 atts.addAttribute("","",XML_VAR_SPECIAL_BASES,"CDATA",  ""+_colorSpecialBases);
270                 atts.addAttribute("","",XML_VAR_DASH_BASES,"CDATA",     ""+_colorDashBases);
271                 atts.addAttribute("","",XML_VAR_USE_BASE_BPS,"CDATA",   ""+_useBaseColorsForBPs);
272                 atts.addAttribute("","",XML_VAR_DRAW_NC,"CDATA",        ""+_drawnNonCanonicalBP);
273                 atts.addAttribute("","",XML_VAR_DRAW_NON_PLANAR,"CDATA",""+_drawnNonPlanarBP);
274                 atts.addAttribute("","",XML_VAR_SHOW_WARNINGS,"CDATA",  ""+_showWarnings);
275                 atts.addAttribute("","",XML_VAR_COMPARISON_MODE,"CDATA",""+_comparisonMode);
276                 atts.addAttribute("","",XML_VAR_FLAT,"CDATA",           ""+_flatExteriorLoop);
277                 atts.addAttribute("","",XML_VAR_DRAW_BACKGROUND,"CDATA",""+_drawBackground);
278                 atts.addAttribute("","",XML_VAR_COLOR_MAP,"CDATA",      ""+_drawColorMap);
279                 atts.addAttribute("","",XML_VAR_DRAW_BACKBONE,"CDATA",  ""+_drawBackbone);
280
281                 atts.addAttribute("","",XML_VAR_CM_HEIGHT,"CDATA",      ""+_colorMapHeight);
282                 atts.addAttribute("","",XML_VAR_CM_WIDTH,"CDATA",       ""+_colorMapWidth);
283                 atts.addAttribute("","",XML_VAR_CM_X_OFFSET,"CDATA",    ""+_colorMapXOffset);
284                 atts.addAttribute("","",XML_VAR_CM_Y_OFFSET,"CDATA",    ""+_colorMapYOffset);
285                 atts.addAttribute("","",XML_VAR_DEFAULT_ZOOM,"CDATA",   ""+_zoom);
286                 atts.addAttribute("","",XML_VAR_ZOOM_AMOUNT,"CDATA",    ""+_zoomAmount);
287                 atts.addAttribute("","",XML_VAR_BP_THICKNESS,"CDATA",   ""+_bpThickness);
288                 atts.addAttribute("","",XML_VAR_BASE_THICKNESS,"CDATA", ""+_baseThickness);
289                 atts.addAttribute("","",XML_VAR_DIST_NUMBERS,"CDATA",   ""+_distNumbers);
290                 atts.addAttribute("","",XML_VAR_SPACE_BETWEEN_BASES,"CDATA",   ""+_spaceBetweenBases);
291                 
292                         
293                 atts.addAttribute("","",XML_VAR_NUM_PERIOD,"CDATA",     ""+_numPeriod);
294                         
295                 atts.addAttribute("","",XML_VAR_MAIN_BP_STYLE,"CDATA",  ""+_mainBPStyle.getOpt());
296                         
297                 atts.addAttribute("","",XML_VAR_BACKBONE_COLOR,"CDATA",     XMLUtils.toHTMLNotation(_backboneColor));
298                 atts.addAttribute("","",XML_VAR_HOVER_COLOR,"CDATA",        XMLUtils.toHTMLNotation(_hoverColor));
299                 atts.addAttribute("","",XML_VAR_BACKGROUND_COLOR,"CDATA",   XMLUtils.toHTMLNotation(_backgroundColor));
300                 atts.addAttribute("","",XML_VAR_BOND_COLOR,"CDATA",         XMLUtils.toHTMLNotation(_bondColor));
301                 atts.addAttribute("","",XML_VAR_TITLE_COLOR,"CDATA",        XMLUtils.toHTMLNotation(_titleColor));
302                 atts.addAttribute("","",XML_VAR_SPECIAL_BASES_COLOR,"CDATA",XMLUtils.toHTMLNotation(_specialBasesColor));
303                 atts.addAttribute("","",XML_VAR_DASH_BASES_COLOR,"CDATA",   XMLUtils.toHTMLNotation(_dashBasesColor)); 
304
305                 atts.addAttribute("","",XML_VAR_CM,"CDATA",                             _cm.getParamEncoding()); 
306                 
307                 
308                 hd.startElement("","",XML_ELEMENT_NAME,atts);
309                 XMLUtils.toXML(hd, _titleFont,XML_VAR_TITLE_FONT);
310                 XMLUtils.toXML(hd, _numbersFont,XML_VAR_NUMBERS_FONT);
311                 XMLUtils.toXML(hd, _fontBasesGeneral,XML_VAR_FONT_BASES);
312                 
313                 XMLUtils.exportCDATAElem(hd,XML_VAR_CM_CAPTION, _colorMapCaption);
314                 hd.endElement("","",XML_ELEMENT_NAME);
315         }
316         
317         
318         
319
320         public void loadFromXMLAttributes(Attributes attributes)
321         {
322                 _drawOutlineBases      = Boolean.parseBoolean(attributes.getValue(XML_VAR_DRAW_OUTLINE));                             
323                 _fillBases             = Boolean.parseBoolean(attributes.getValue(XML_VAR_FILL_BASE));                                
324                 _autoFit              = Boolean.parseBoolean(attributes.getValue(XML_VAR_AUTO_FIT));                                 
325                 _autoCenter           = Boolean.parseBoolean(attributes.getValue(XML_VAR_AUTO_CENTER));                              
326                 _modifiable           = Boolean.parseBoolean(attributes.getValue(XML_VAR_MODIFIABLE));                               
327                 _errorsOn             = Boolean.parseBoolean(attributes.getValue(XML_VAR_ERRORS));                                   
328                 _colorSpecialBases    = Boolean.parseBoolean(attributes.getValue(XML_VAR_SPECIAL_BASES));                            
329                 _colorDashBases       = Boolean.parseBoolean(attributes.getValue(XML_VAR_DASH_BASES));                               
330                 _useBaseColorsForBPs  = Boolean.parseBoolean(attributes.getValue(XML_VAR_USE_BASE_BPS));                             
331                 _drawnNonCanonicalBP  = Boolean.parseBoolean(attributes.getValue(XML_VAR_DRAW_NC));                                  
332                 _drawnNonPlanarBP     = Boolean.parseBoolean(attributes.getValue(XML_VAR_DRAW_NON_PLANAR));                          
333                 _showWarnings         = Boolean.parseBoolean(attributes.getValue(XML_VAR_SHOW_WARNINGS));                            
334                 _comparisonMode       = Boolean.parseBoolean(attributes.getValue(XML_VAR_COMPARISON_MODE));                          
335                 _flatExteriorLoop     = Boolean.parseBoolean(attributes.getValue(XML_VAR_FLAT));                                     
336                 _drawBackground       = Boolean.parseBoolean(attributes.getValue(XML_VAR_DRAW_BACKGROUND));                          
337                 _drawColorMap         = Boolean.parseBoolean(attributes.getValue(XML_VAR_COLOR_MAP));                                
338                 _drawBackbone         = Boolean.parseBoolean(attributes.getValue(XML_VAR_DRAW_BACKBONE));     
339                 
340                 _colorMapHeight       = Double.parseDouble(attributes.getValue(XML_VAR_CM_HEIGHT));
341                 _colorMapWidth        = Double.parseDouble(attributes.getValue(XML_VAR_CM_WIDTH));
342                 _colorMapXOffset      = Double.parseDouble(attributes.getValue(XML_VAR_CM_X_OFFSET));
343                 _colorMapYOffset      = Double.parseDouble(attributes.getValue(XML_VAR_CM_Y_OFFSET));
344                 _zoom                             = Double.parseDouble(attributes.getValue(XML_VAR_DEFAULT_ZOOM));
345                 _zoomAmount                   = Double.parseDouble(attributes.getValue(XML_VAR_ZOOM_AMOUNT));
346                 _bpThickness          = Double.parseDouble(attributes.getValue(XML_VAR_BP_THICKNESS));
347                 _baseThickness        = Double.parseDouble(attributes.getValue(XML_VAR_BASE_THICKNESS));
348                 _distNumbers          = Double.parseDouble(attributes.getValue(XML_VAR_DIST_NUMBERS));
349                 _spaceBetweenBases    = XMLUtils.getDouble(attributes, XML_VAR_SPACE_BETWEEN_BASES, DEFAULT_SPACE_BETWEEN_BASES);
350                                                                         
351                 _numPeriod            = Integer.parseInt(attributes.getValue(XML_VAR_NUM_PERIOD));
352                                                                         
353                 _mainBPStyle          = BP_STYLE.getStyle(attributes.getValue(XML_VAR_MAIN_BP_STYLE));           
354                                                                         
355                 _backboneColor        = Color.decode(attributes.getValue(XML_VAR_BACKBONE_COLOR));                     
356                 _hoverColor           = Color.decode(attributes.getValue(XML_VAR_HOVER_COLOR));                        
357                 _backgroundColor      = Color.decode(attributes.getValue(XML_VAR_BACKGROUND_COLOR));                   
358                 _bondColor            = Color.decode(attributes.getValue(XML_VAR_BOND_COLOR));                         
359                 _titleColor           = Color.decode(attributes.getValue(XML_VAR_TITLE_COLOR));                        
360                 _specialBasesColor    = Color.decode(attributes.getValue(XML_VAR_SPECIAL_BASES_COLOR));                
361                 _dashBasesColor       = Color.decode(attributes.getValue(XML_VAR_DASH_BASES_COLOR));                   
362                                                                              
363                 _cm                   = ModeleColorMap.parseColorMap(attributes.getValue(XML_VAR_CM)); 
364         }
365         
366         
367         
368     public VARNAConfig clone ()
369     {
370       
371       /**
372        * @j2sNative
373        * 
374        * return this;
375        * 
376        */
377         try
378         {
379             ByteArrayOutputStream out = new ByteArrayOutputStream ();
380             ObjectOutputStream oout = new ObjectOutputStream (out);
381             oout.writeObject (this);
382             
383             ObjectInputStream in = new ObjectInputStream (
384                 new ByteArrayInputStream (out.toByteArray ()));
385             return (VARNAConfig)in.readObject ();
386         }
387         catch (Exception e)
388         {
389             throw new RuntimeException ("cannot clone class [" +
390                 this.getClass ().getName () + "] via serialization: " +
391                 e.toString ());
392         }
393     }
394
395 }