+package fr.orsay.lri.varna.models.annotations;
+
+import java.awt.Color;
+import java.awt.geom.Point2D;
+import java.io.Serializable;
+
+import javax.xml.transform.sax.TransformerHandler;
+
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.AttributesImpl;
+
+import fr.orsay.lri.varna.models.rna.ModeleBase;
+import fr.orsay.lri.varna.utils.XMLUtils;
+
+
+public class ChemProbAnnotation implements Serializable {
+
+ public static final String HEADER_TEXT = "ChemProbAnnotation";
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 5833315460145031242L;
+
+
+ public enum ChemProbAnnotationType
+ {
+ TRIANGLE,
+ ARROW,
+ PIN,
+ DOT;
+ };
+
+ public static double DEFAULT_INTENSITY = 1.0;
+ public static ChemProbAnnotationType DEFAULT_TYPE = ChemProbAnnotationType.ARROW;
+ public static Color DEFAULT_COLOR = Color.blue.darker();
+
+ private ModeleBase _mbfst;
+ private ModeleBase _mbsnd;
+ private Color _color;
+ private double _intensity;
+ private ChemProbAnnotationType _type;
+ private boolean _outward;
+
+ public static String XML_ELEMENT_NAME = "ChemProbAnnotation";
+ public static String XML_VAR_INDEX5_NAME = "Index5";
+ public static String XML_VAR_INDEX3_NAME = "Index3";
+ public static String XML_VAR_COLOR_NAME = "Color";
+ public static String XML_VAR_INTENSITY_NAME = "Intensity";
+ public static String XML_VAR_TYPE_NAME = "Type";
+ public static String XML_VAR_OUTWARD_NAME = "Outward";
+
+ public void toXML(TransformerHandler hd) throws SAXException
+ {
+ AttributesImpl atts = new AttributesImpl();
+ atts.addAttribute("","",XML_VAR_INDEX5_NAME,"CDATA",""+_mbfst.getIndex());
+ atts.addAttribute("","",XML_VAR_INDEX3_NAME,"CDATA",""+_mbsnd.getIndex());
+ atts.addAttribute("","",XML_VAR_COLOR_NAME,"CDATA",XMLUtils.toHTMLNotation(_color));
+ atts.addAttribute("","",XML_VAR_INTENSITY_NAME,"CDATA",""+_intensity);
+ atts.addAttribute("","",XML_VAR_TYPE_NAME,"CDATA",""+_type);
+ atts.addAttribute("","",XML_VAR_OUTWARD_NAME,"CDATA",""+_outward);
+ hd.startElement("","",XML_ELEMENT_NAME,atts);
+ hd.endElement("","",XML_ELEMENT_NAME);
+ }
+
+
+ public ChemProbAnnotation(ModeleBase mbfst, ModeleBase mbsnd, String styleDesc) {
+ this(mbfst,mbsnd);
+ applyStyle(styleDesc);
+ }
+
+ public ChemProbAnnotation(ModeleBase mbfst, ModeleBase mbsnd) {
+ this(mbfst,mbsnd,ChemProbAnnotation.DEFAULT_TYPE,ChemProbAnnotation.DEFAULT_INTENSITY);
+ }
+
+ public ChemProbAnnotation(ModeleBase mbfst, ModeleBase mbsnd, double intensity) {
+ this(mbfst,mbsnd,ChemProbAnnotation.DEFAULT_TYPE,intensity);
+ }
+
+ public ChemProbAnnotation(ModeleBase mbfst, ModeleBase mbsnd, ChemProbAnnotationType type) {
+ this(mbfst,mbsnd,type,ChemProbAnnotation.DEFAULT_INTENSITY);
+ }
+
+ public ChemProbAnnotation(ModeleBase mbfst, ModeleBase mbsnd, ChemProbAnnotationType type, double intensity) {
+ this(mbfst,mbsnd, type, intensity, DEFAULT_COLOR, true);
+ }
+
+ public ChemProbAnnotation(ModeleBase mbfst, ModeleBase mbsnd, ChemProbAnnotationType type, double intensity, Color color, boolean out) {
+ if (mbfst.getIndex()>mbsnd.getIndex())
+ {
+ ModeleBase tmp = mbsnd;
+ mbsnd = mbfst;
+ mbfst = tmp;
+ }
+ _mbfst = mbfst;
+ _mbsnd = mbsnd;
+ _type = type;
+ _intensity = intensity;
+ _color = color;
+ _outward = out;
+ }
+
+ public boolean isOut()
+ {
+ return _outward;
+ }
+
+ public void setOut(boolean b)
+ {
+ _outward = b;
+ }
+
+ public Color getColor()
+ {
+ return _color;
+ }
+
+ public double getIntensity()
+ {
+ return _intensity;
+ }
+
+ public ChemProbAnnotationType getType()
+ {
+ return _type;
+ }
+
+ public void setColor(Color c){
+ _color = c;
+ }
+
+ public void setIntensity(double d){
+ _intensity = d;
+ }
+
+ public Point2D.Double getAnchorPosition()
+ {
+ Point2D.Double result = new Point2D.Double(
+ (_mbfst.getCoords().x+_mbsnd.getCoords().x)/2.0,
+ (_mbfst.getCoords().y+_mbsnd.getCoords().y)/2.0);
+ return result;
+ }
+
+ public Point2D.Double getDirVector()
+ {
+ Point2D.Double norm = getNormalVector();
+ Point2D.Double result = new Point2D.Double(-norm.y,norm.x);
+ Point2D.Double anchor = getAnchorPosition();
+ Point2D.Double center = new Point2D.Double(
+ (_mbfst.getCenter().x+_mbsnd.getCenter().x)/2.0,
+ (_mbfst.getCenter().y+_mbsnd.getCenter().y)/2.0);
+ Point2D.Double vradius = new Point2D.Double(
+ (center.x-anchor.x)/2.0,
+ (center.y-anchor.y)/2.0);
+ if (_outward)
+ {
+ if (result.x*vradius.x+result.y*vradius.y>0)
+ {
+ return new Point2D.Double(-result.x,-result.y);
+ }
+ }
+ else
+ {
+ if (result.x*vradius.x+result.y*vradius.y<0)
+ {
+ return new Point2D.Double(-result.x,-result.y);
+ }
+ }
+ return result;
+ }
+ public Point2D.Double getNormalVector()
+ {
+ Point2D.Double tmp;
+ if (_mbfst==_mbsnd)
+ {
+ tmp = new Point2D.Double(
+ (-(_mbsnd.getCenter().y-_mbsnd.getCoords().y)),
+ ((_mbsnd.getCenter().x-_mbsnd.getCoords().x)));
+ }
+ else
+ {
+ tmp = new Point2D.Double(
+ (_mbsnd.getCoords().x-_mbfst.getCoords().x)/2.0,
+ (_mbsnd.getCoords().y-_mbfst.getCoords().y)/2.0);
+ }
+
+ double norm = tmp.distance(0, 0);
+ Point2D.Double result = new Point2D.Double(tmp.x/norm,tmp.y/norm);
+ return result;
+ }
+
+ public static ChemProbAnnotationType annotTypeFromString(String value)
+ {
+ if (value.toLowerCase().equals("arrow"))
+ {return ChemProbAnnotationType.ARROW;}
+ else if (value.toLowerCase().equals("triangle"))
+ {return ChemProbAnnotationType.TRIANGLE;}
+ else if (value.toLowerCase().equals("pin"))
+ {return ChemProbAnnotationType.PIN;}
+ else if (value.toLowerCase().equals("dot"))
+ {return ChemProbAnnotationType.DOT;}
+ else
+ {return ChemProbAnnotationType.ARROW;}
+ }
+
+
+ public void applyStyle(String styleDesc)
+ {
+ String[] chemProbs = styleDesc.split(",");
+ for (int i = 0; i < chemProbs.length; i++) {
+ String thisStyle = chemProbs[i];
+ String[] data = thisStyle.split("=");
+ if (data.length==2)
+ {
+ String name = data[0];
+ String value = data[1];
+ if (name.toLowerCase().equals("color"))
+ {
+ Color c = Color.decode(value);
+ if (c==null)
+ { c = _color; }
+ setColor(c);
+ }
+ else if (name.toLowerCase().equals("intensity"))
+ {
+ _intensity = Double.parseDouble(value);
+ }
+ else if (name.toLowerCase().equals("dir"))
+ {
+ _outward = value.toLowerCase().equals("out");
+ }
+ else if (name.toLowerCase().equals("glyph"))
+ {
+ _type= annotTypeFromString(value);
+ }
+ }
+ }
+ }
+
+ public void setType(ChemProbAnnotationType s)
+ {
+ _type = s;
+ }
+
+ public ChemProbAnnotation clone()
+ {
+ ChemProbAnnotation result = new ChemProbAnnotation(this._mbfst,this._mbsnd);
+ result._intensity = _intensity;
+ result._type = _type;
+ result._color= _color;
+ result._outward = _outward;
+ return result;
+ }
+
+ public String toString()
+ {
+ return "Chem. prob. "+this._type+" Base#"+this._mbfst.getBaseNumber()+"-"+this._mbsnd.getBaseNumber();
+ }
+
+}