--- /dev/null
+/*
+ * BioJava development code
+ *
+ * This code may be freely distributed and modified under the
+ * terms of the GNU Lesser General Public Licence. This should
+ * be distributed with the code. If you do not have a copy,
+ * see:
+ *
+ * http://www.gnu.org/copyleft/lesser.html
+ *
+ * Copyright for this code is held jointly by the individual
+ * authors. These should be listed in @author doc comments.
+ *
+ * For more information on the BioJava project and its aims,
+ * or to join the biojava-l mailing list, visit the home page
+ * at:
+ *
+ * http://www.biojava.org/
+ *
+ * Created on Aug 3, 2005
+ *
+ */
+package org.biojava.dasobert.das;
+
+
+import org.xml.sax.helpers.DefaultHandler;
+import org.xml.sax.Attributes ;
+import java.util.*;
+import java.util.logging.Logger;
+import java.awt.Color;
+
+/** a class to parse the XML response of a DAS - stylesheet request.
+ * @author Andreas Prlic
+ *
+ */
+public class DAS_Stylesheet_Handler extends DefaultHandler {
+
+ List typeGlyphMaps;
+ Map currentType;
+ String chars ;
+ boolean threeDstyle;
+ List threeDGlyphMaps;
+ static Logger logger = Logger.getLogger("org.biojava.spice");
+
+ /**
+ *
+ */
+ public DAS_Stylesheet_Handler() {
+ super();
+ typeGlyphMaps = new ArrayList();
+ currentType = new HashMap();
+ threeDGlyphMaps = new ArrayList();
+ threeDstyle = false;
+ }
+
+
+ public Map[] getTypeStyles(){
+ return (Map[]) typeGlyphMaps.toArray(new Map[typeGlyphMaps.size()]);
+ }
+
+ public Map[] get3DStyles(){
+ return (Map[]) threeDGlyphMaps.toArray(new Map[threeDGlyphMaps.size()]);
+ }
+
+ public void startElement (String uri, String name, String qName, Attributes atts){
+ chars = "";
+
+ if ( qName.equals("CATEGORY")){
+ String id = atts.getValue("id");
+ if ( id.equals("3D")){
+ // here follow the 3D styles...
+ threeDstyle = true;
+ } else {
+ threeDstyle = false;
+
+ }
+ }
+
+ if ( qName.equals("TYPE")){
+ // this glyph matches to features of type >id<.
+ String id = atts.getValue("id");
+ currentType = new HashMap();
+ currentType.put("type",id);
+ }
+
+ else if ( qName.equals("ARROW")){
+ currentType.put("style","arrow");
+ } else if ( qName.equals("ANCHORED_ARROW")){
+ currentType.put("style","anchored_arrow");
+ } else if ( qName.equals("BOX")){
+ currentType.put("style","box");
+ } else if ( qName.equals("CROSS")){
+ currentType.put("style","cross");
+ } else if ( qName.equals("EX")){
+ currentType.put("style","EX");
+ } else if ( qName.equals("HELIX")){
+ currentType.put("style","helix");
+ } else if ( qName.equals("LINE")){
+ currentType.put("style","LINE");
+ } else if ( qName.equals("SPAN")){
+ currentType.put("style","span");
+ } else if ( qName.equals("TRIANGLE")){
+ currentType.put("style","triangle");
+ }
+
+ }
+
+ /** convert the color provided by the stylesheet to a java Color
+ *
+ * @param chars
+ * @return
+ */
+ private Color getColorFromString(String chars){
+
+
+ if (chars.equals("rotate")) {
+ // use the default SPICE colors ...
+ return null;
+ }
+
+ try {
+ Color col = Color.decode(chars);
+ return col;
+ } catch ( Exception e) {
+ logger.finest("could not decode color from stylesheet " + e.getMessage());
+ }
+
+
+ // map the string to a build in color...
+ // thanks to the Xpm.java script provided by Phil Brown (under LGPL)
+ // AP downloaded it from http://www.bolthole.com/java/Xpm.java
+
+ // the DAS spec stylesheet only requires 16 VGA colors to be supported, but here we do more... :-)
+
+ int[] rgb = Xpm.NameToRGB3(chars);
+ if ( rgb != null) {
+ Color col = new Color(rgb[0],rgb[1],rgb[2]);
+ return col;
+ }
+ return null ;
+ }
+
+ public void endElement(String uri, String name, String qName) {
+ if ( qName.equals("HEIGHT")){
+ currentType.put("height",chars);
+ } else if ( qName.equals("COLOR")){
+ //System.out.println("got color " + chars);
+ Color col = getColorFromString(chars);
+ if ( col != null ){
+ currentType.put("color",col);
+ } else {
+ if ( chars.equals("cpk")){
+ currentType.put("cpkcolor","true");
+ }
+ }
+
+ } else if ( qName.equals("OUTLINECOLOR")){
+ currentType.put("outlinecolor",chars);
+ } else if ( qName.equals("BACKGROUND")){
+ currentType.put("background",chars);
+ } else if ( qName.equals("BUMP")){
+ if ( chars.equals("no"))
+ currentType.put("bump","no");
+ else
+ currentType.put("bump","yes");
+
+ // 3D stuff
+ } else if ( qName.equals("WIREFRAME")){
+ currentType.put("display","wireframe");
+ } else if ( qName.equals("SPACEFILL")){
+ currentType.put("display","spacefill");
+ } else if ( qName.equals("BACKBONE")){
+ currentType.put("display","backbone");
+ } else if ( qName.equals("CARTOON")){
+ currentType.put("display","cartoon");
+ } else if ( qName.equals("RIBBONS")){
+ currentType.put("display","ribbons");
+ } else if ( qName.equals("WIDTH")){
+ currentType.put("width",chars);
+ }
+
+ else if ( qName.equals("TYPE")){
+ if ( threeDstyle){
+ threeDGlyphMaps.add(currentType);
+ } else {
+ typeGlyphMaps.add(currentType);
+ }
+ }
+ }
+
+ public void characters (char ch[], int start, int length){
+
+
+ for (int i = start; i < start + length; i++) {
+ chars += ch[i];
+ }
+
+
+ }
+
+}
+
+
+
+