JAL-3032 adds Java 8 functionality (2/2)
[jalview.git] / src2 / fr / orsay / lri / varna / models / rna / ModeleBaseNucleotide.java
diff --git a/src2/fr/orsay/lri/varna/models/rna/ModeleBaseNucleotide.java b/src2/fr/orsay/lri/varna/models/rna/ModeleBaseNucleotide.java
new file mode 100644 (file)
index 0000000..ad0c5c1
--- /dev/null
@@ -0,0 +1,408 @@
+/*
+ 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.
+ Copyright (C) 2008  Kevin Darty, Alain Denise and Yann Ponty.
+ electronic mail : Yann.Ponty@lri.fr
+ paper mail : LRI, bat 490 Université Paris-Sud 91405 Orsay Cedex France
+
+ This file is part of VARNA version 3.1.
+ VARNA version 3.1 is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+
+ VARNA version 3.1 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with VARNA version 3.1.
+ If not, see http://www.gnu.org/licenses.
+ */
+package fr.orsay.lri.varna.models.rna;
+
+import java.awt.geom.Point2D;
+import java.util.HashMap;
+
+import javax.xml.transform.sax.TransformerHandler;
+
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.AttributesImpl;
+
+import fr.orsay.lri.varna.utils.XMLUtils;
+
+
+/**
+ * The rna base model with the first character of the nitrogenous base and it
+ * display
+ * 
+ * @author darty
+ * 
+ */
+public class ModeleBaseNucleotide extends ModeleBase {
+
+       /**
+        * 
+        */
+       private static final long serialVersionUID = -5493938366569588113L;
+       private String _c;
+       private int _index;
+       
+
+       
+       public static String XML_ELEMENT_NAME = "nt";
+       public static String XML_VAR_CONTENT_NAME = "base";
+       
+       
+       public void toXML(TransformerHandler hd) throws SAXException
+       {
+               AttributesImpl atts = new AttributesImpl();
+               atts.addAttribute("","",XML_VAR_INDEX_NAME,"CDATA",""+_index);
+               atts.addAttribute("","",XML_VAR_NUMBER_NAME,"CDATA",""+_realIndex);
+               atts.addAttribute("","",XML_VAR_CUSTOM_DRAWN_NAME,"CDATA",""+_colorie);
+               atts.addAttribute("","",XML_VAR_VALUE_NAME,"CDATA",""+_value);
+               atts.addAttribute("","",XML_VAR_LABEL_NAME,"CDATA",""+_label);
+               hd.startElement("","",XML_ELEMENT_NAME,atts);
+               atts.clear();
+               hd.startElement("","",XML_VAR_CONTENT_NAME,atts);
+               XMLUtils.exportCDATAString(hd, _c);
+               hd.endElement("","",XML_VAR_CONTENT_NAME);
+
+               _coords.toXML(hd,XML_VAR_POSITION_NAME);
+               _center.toXML(hd,XML_VAR_CENTER_NAME);
+               if (_colorie)
+               { _styleBase.toXML(hd); }
+               hd.endElement("","",XML_ELEMENT_NAME);
+       }
+
+       /**
+        * Creates a new rna base with the default display style and a space as
+        * nitrogenous base
+        * @param index The index of this base
+        */
+       public ModeleBaseNucleotide(int index) {
+               this(" ", index);
+       }
+
+       /**
+        * Creates a new rna base with the nitrogenous base
+        * 
+        * @param s
+        *            The code of this base
+        * @param index The index of this base
+        */
+       public ModeleBaseNucleotide(String s, int index) {
+               this(s, new ModelBaseStyle(), index);
+       }
+
+
+       /**
+        * Creates a new rna base with the nitrogenous base
+        * 
+        * @param s
+        *            The full label, potentially requiring further decoding
+        * @param index The index of this base
+        * @param baseNumber The number of this base, which may differ from the index (e.g. discontinuous numbering)
+        */
+       public ModeleBaseNucleotide(String s, int index, int baseNumber) {
+               this(s, new ModelBaseStyle(), index);
+               _realIndex = baseNumber;
+       }
+
+       /**
+        * Creates a new rna base with the nitrogenous base and the display style
+        * 
+        * @param s
+        *            The full label, potentially requiring further decoding
+        * @param msb
+        *            The display style
+        * @param index The index of this base
+        */
+       public ModeleBaseNucleotide(String s, ModelBaseStyle msb, int index) {
+               this(new Point2D.Double(), new Point2D.Double(), true, s, msb, -1,
+                               index);
+       }
+
+       /**
+        * Creates a new rna base with a display style
+        * 
+        * @param msb
+        *            The display style
+        */
+       public ModeleBaseNucleotide(ModelBaseStyle msb, int index, int baseNumber) {
+               this("", msb, index);
+               _realIndex = baseNumber;
+       }
+
+       /**
+        * Creates a new rna base with a space as the nitrogenous base and the
+        * display style
+        * 
+        * @param coord
+        * @param index
+        */
+       public ModeleBaseNucleotide(Point2D.Double coord, int index) {
+               this(new Point2D.Double(coord.getX(), coord.getY()),
+                               new Point2D.Double(), true, "", new ModelBaseStyle(), -1,
+                               index);
+       }
+
+       /**
+        * Creates a new rna base from another one with the same attributes
+        * 
+        * @param mb
+        *            The base to copy
+        */
+       public ModeleBaseNucleotide(ModeleBaseNucleotide mb, int index) {
+               this(
+                               new Point2D.Double(mb.getCoords().getX(), mb.getCoords()
+                                               .getY()), new Point2D.Double(mb.getCenter().getX(), mb
+                                               .getCenter().getY()), true, mb.getBase(), mb
+                                               .getStyleBase(), mb.getElementStructure(), index);
+       }
+
+       public ModeleBaseNucleotide(Point2D.Double coords, Point2D.Double center,
+                       boolean colorie, String label, ModelBaseStyle mb, int elementStruct,
+                       int index) {
+               _colorie = colorie;
+               _c = label;
+               _styleBase = mb;
+               _coords = new VARNAPoint(coords);
+               _center = new VARNAPoint(center);
+               _index = index;
+               _realIndex = index + 1;
+               _value = 0.0;
+       }
+
+       
+       public ModelBaseStyle getStyleBase() {
+               if (_colorie)
+                       return _styleBase;
+               return new ModelBaseStyle();
+       }
+
+       public String getBase() {
+               return decode(_c);
+       }
+
+       public void setBase(String _s) {
+               this._c = _s;
+       }
+
+
+
+       public String getContent() {
+               return getBase();
+       }
+
+       public void setContent(String s) {
+               setBase(s);
+       }
+
+       public int getIndex() {
+               return _index;
+       }
+       
+       public String toString()
+       {
+               return ""+this._realIndex+" ("+_index+") (x,y):"+this._coords +" C:"+_center;
+       }
+
+       
+       private enum STATE_SPECIAL_CHARS_STATES{ NORMAL,SUBSCRIPT, SUPERSCRIPT, COMMAND};
+
+       private static HashMap<Character,Character> _subscripts = new HashMap<Character,Character>();
+       private static HashMap<Character,Character> _superscripts = new HashMap<Character,Character>();
+       private static HashMap<String,Character> _commands = new HashMap<String,Character>();
+       {
+               _subscripts.put('0', '\u2080');
+               _subscripts.put('1', '\u2081');
+               _subscripts.put('2', '\u2082');
+               _subscripts.put('3', '\u2083');
+               _subscripts.put('4', '\u2084');
+               _subscripts.put('5', '\u2085');
+               _subscripts.put('6', '\u2086');
+               _subscripts.put('7', '\u2087');
+               _subscripts.put('8', '\u2088');
+               _subscripts.put('9', '\u2089');
+               _subscripts.put('+', '\u208A');
+               _subscripts.put('-', '\u208B');
+               _subscripts.put('a', '\u2090');
+               _subscripts.put('e', '\u2091');
+               _subscripts.put('o', '\u2092');
+               _subscripts.put('i', '\u1D62');
+               _subscripts.put('r', '\u1D63');
+               _subscripts.put('u', '\u1D64');
+               _subscripts.put('v', '\u1D65');
+               _subscripts.put('x', '\u2093');
+               _superscripts.put('0', '\u2070');
+               _superscripts.put('1', '\u00B9');
+               _superscripts.put('2', '\u00B2');
+               _superscripts.put('3', '\u00B3');
+               _superscripts.put('4', '\u2074');
+               _superscripts.put('5', '\u2075');
+               _superscripts.put('6', '\u2076');
+               _superscripts.put('7', '\u2077');
+               _superscripts.put('8', '\u2078');
+               _superscripts.put('9', '\u2079');
+               _superscripts.put('+', '\u207A');
+               _superscripts.put('-', '\u207B');
+               _superscripts.put('i', '\u2071');
+               _superscripts.put('n', '\u207F');
+               _commands.put("alpha",  '\u03B1');
+               _commands.put("beta",   '\u03B2');
+               _commands.put("gamma",  '\u03B3');
+               _commands.put("delta",  '\u03B4');
+               _commands.put("epsilon",'\u03B5');
+               _commands.put("zeta",   '\u03B6');
+               _commands.put("eta",    '\u03B7');
+               _commands.put("theta",  '\u03B8');
+               _commands.put("iota",   '\u03B9');
+               _commands.put("kappa",  '\u03BA');
+               _commands.put("lambda", '\u03BB');
+               _commands.put("mu",     '\u03BC');
+               _commands.put("nu",     '\u03BD');
+               _commands.put("xi",     '\u03BE');
+               _commands.put("omicron",'\u03BF');
+               _commands.put("pi",     '\u03C1');
+               _commands.put("rho",    '\u03C2');
+               _commands.put("sigma",  '\u03C3');
+               _commands.put("tau",    '\u03C4');
+               _commands.put("upsilon",'\u03C5');
+               _commands.put("phi",    '\u03C6');
+               _commands.put("chi",    '\u03C7');
+               _commands.put("psi",    '\u03C8');
+               _commands.put("omega",  '\u03C9');
+               _commands.put("Psi",    '\u03A8');
+               _commands.put("Phi",    '\u03A6');
+               _commands.put("Sigma",  '\u03A3');
+               _commands.put("Pi",     '\u03A0');
+               _commands.put("Theta",  '\u0398');
+               _commands.put("Omega",  '\u03A9');
+               _commands.put("Gamma",  '\u0393');
+               _commands.put("Delta",  '\u0394');
+               _commands.put("Lambda", '\u039B');
+       }
+
+       
+       
+       private static String decode(String s)
+       {
+               if (s.length()<=1)
+               {
+                       return s;
+               }
+               STATE_SPECIAL_CHARS_STATES state = STATE_SPECIAL_CHARS_STATES.NORMAL;
+               
+               String result = "";
+               String buffer = ""; 
+               for(int i=0;i<s.length();i++)
+               {
+                       char c = s.charAt(i);
+                       switch (state)
+                       {
+                               case NORMAL:
+                               {
+                                       switch(c)
+                                       {
+                                               case '_':
+                                                       state = STATE_SPECIAL_CHARS_STATES.SUBSCRIPT;
+                                               break;
+                                               case '^':
+                                                       state = STATE_SPECIAL_CHARS_STATES.SUPERSCRIPT;
+                                               break;
+                                               case '\\':
+                                                       buffer = "";
+                                                       state = STATE_SPECIAL_CHARS_STATES.COMMAND;
+                                               break;
+                                               default:
+                                                       result += c;
+                                                       state = STATE_SPECIAL_CHARS_STATES.NORMAL;
+                                               break;
+                                       }
+                               }
+                               break;
+                               case SUBSCRIPT:
+                               case SUPERSCRIPT:
+                               {
+                                       switch(c)
+                                       {
+                                               case '_':
+                                                       state = STATE_SPECIAL_CHARS_STATES.SUBSCRIPT;
+                                               break;
+                                               case '^':
+                                                       state = STATE_SPECIAL_CHARS_STATES.SUPERSCRIPT;
+                                               break;
+                                               case '\\':
+                                                       buffer = "";
+                                                       state = STATE_SPECIAL_CHARS_STATES.COMMAND;
+                                               break;
+                                               default:
+                                                       if ((state==STATE_SPECIAL_CHARS_STATES.SUBSCRIPT) && _subscripts.containsKey(c))
+                                                               result += _subscripts.get(c); 
+                                                       else if ((state==STATE_SPECIAL_CHARS_STATES.SUPERSCRIPT) && _superscripts.containsKey(c))
+                                                               result += _superscripts.get(c); 
+                                                       else
+                                                               result += c;
+                                                       state = STATE_SPECIAL_CHARS_STATES.NORMAL;
+                                               break;
+                                       }
+                               }
+                               break;
+                               case COMMAND:
+                               {
+                                       switch(c)
+                                       {
+                                               case '_':
+                                                       if (_commands.containsKey(buffer))
+                                                       { result += _commands.get(buffer); }
+                                                       else
+                                                       { result += buffer; }
+                                                       buffer = "";
+                                                       state = STATE_SPECIAL_CHARS_STATES.SUBSCRIPT;
+                                               break;
+                                               case '^':
+                                                       if (_commands.containsKey(buffer))
+                                                       { result += _commands.get(buffer); }
+                                                       else
+                                                       { result += buffer; }
+                                                       buffer = "";
+                                                       state = STATE_SPECIAL_CHARS_STATES.SUPERSCRIPT;
+                                               break;
+                                               case '\\':
+                                                       if (_commands.containsKey(buffer))
+                                                       { result += _commands.get(buffer); }
+                                                       else
+                                                       { result += buffer; }
+                                                       buffer = "";
+                                                       state = STATE_SPECIAL_CHARS_STATES.COMMAND;
+                                               break;
+                                               case ' ':
+                                                       state = STATE_SPECIAL_CHARS_STATES.NORMAL;
+                                                       if (_commands.containsKey(buffer))
+                                                       { 
+                                                               result += _commands.get(buffer);
+                                                       }
+                                                       else
+                                                       {
+                                                               result += buffer;
+                                                       }
+                                                       buffer = "";
+                                               break;
+                                               default:
+                                                       buffer += c;
+                                               break;
+                                       }
+                               }
+                               break;
+                       }
+               }
+               if (_commands.containsKey(buffer))
+               { 
+                       result += _commands.get(buffer);
+               }
+               else
+               {
+                       result += buffer;
+               }
+               return result;
+       }
+       
+       
+}