rrenkert@33: package de.intevation.mxd.reader;
rrenkert@25: 
rrenkert@25: import org.apache.log4j.Logger;
rrenkert@25: 
rrenkert@25: import com.esri.arcgis.carto.IFeatureRenderer;
rrenkert@25: import com.esri.arcgis.display.ISymbol;
rrenkert@25: import com.esri.arcgis.carto.SimpleRenderer;
rrenkert@25: 
rrenkert@31: import org.w3c.dom.Element;
rrenkert@116: import java.io.IOException;
rrenkert@31: 
rrenkert@33: import de.intevation.mxd.utils.MapToXMLUtils;
rrenkert@33: 
rrenkert@25: /**
rrenkert@25:  * Reads simple renderer information.
rrenkert@25:  *
rrenkert@25:  * @author <a href="mailto:raimund.renkert@intevation.de">Raimund Renkert</a>
rrenkert@25:  */
rrenkert@31: public class SimpleRendererReader
rrenkert@31: implements IRendererReader {
rrenkert@25: 
rrenkert@31:     /**
rrenkert@31:      * The logger.
rrenkert@31:      */
rrenkert@31:     private static final Logger logger =
rrenkert@36:         Logger.getLogger(SimpleRendererReader.class);
rrenkert@31: 
rrenkert@31:     /**
rrenkert@31:      * Private member.
rrenkert@31:      */
rrenkert@25:     private ISymbol symbol;
rrenkert@31:     private SimpleRenderer renderer;
rrenkert@31:     private Element layer;
rrenkert@31:     private MapToXMLUtils util;
rrenkert@25: 
rrenkert@181:     /**
rrenkert@181:      * Constructor with renderer.
rrenkert@181:      *
rrenkert@181:      * @param renderer ArcGIS renderer used to draw symbols.
rrenkert@181:      */
rrenkert@31:     public SimpleRendererReader(IFeatureRenderer renderer)
rrenkert@31:     throws Exception {
rrenkert@31:         logger.debug("constructor()");
rrenkert@31:         if(renderer instanceof SimpleRenderer) {
rrenkert@31:             this.renderer = (SimpleRenderer)renderer;
rrenkert@25:         }
rrenkert@31:         else{
rrenkert@31:             throw new Exception ("Not an instance of SimpleRenderer!");
rrenkert@31:         }
rrenkert@25:     }
rrenkert@25: 
rrenkert@31:     /**
rrenkert@31:      * Setter for the parent XML element.
rrenkert@31:      *
rrenkert@31:      * @param parent The XML parent node.
rrenkert@31:      */
rrenkert@31:     public void setParent(Element parent) {
rrenkert@31:         this.layer = parent;
rrenkert@31:     }
rrenkert@31: 
rrenkert@31:     /**
rrenkert@31:      * Setter for the XML document helper.
rrenkert@31:      *
rrenkert@31:      * @param util The helper class for storing map information.
rrenkert@31:      */
rrenkert@31:     public void setUtil(MapToXMLUtils util) {
rrenkert@31:         this.util = util;
rrenkert@31:     }
rrenkert@31: 
rrenkert@31:     /**
rrenkert@31:      * Reads the renderer attributes.
rrenkert@31:      *
rrenkert@31:      * @return The XML node.
rrenkert@31:      */
rrenkert@116:     public Element read() {
rrenkert@31:         logger.debug("read()");
rrenkert@31:         Element rendererElement;
rrenkert@74:         rendererElement = util.addRenderer(layer);
rrenkert@60: 
rrenkert@116:         try {
rrenkert@116:             rendererElement.setAttribute("label", renderer.getLabel());
rrenkert@31:         }
rrenkert@116:         catch(IOException ioe) {
rrenkert@116:             logger.warn(
rrenkert@116:                 "Could not read label name." +
rrenkert@116:                 "Setting label name to \"default-label\"");
rrenkert@116:             rendererElement.setAttribute("label", "default-label");
rrenkert@31:         }
rrenkert@116: 
rrenkert@116:         try {
rrenkert@116:             rendererElement.setAttribute(
rrenkert@116:                 "description",
rrenkert@116:                 renderer.getDescription());
rrenkert@74:         }
rrenkert@116:         catch(IOException ioe) {
rrenkert@135:             logger.warn("Could not read description.");
rrenkert@116:         }
rrenkert@116: 
rrenkert@116:         try {
rrenkert@116:             symbol = renderer.getSymbol();
rrenkert@116: 
rrenkert@116:             MarkerSymbolReader markerReader = new MarkerSymbolReader();
rrenkert@116:             LineSymbolReader lineReader = new LineSymbolReader();
rrenkert@116:             FillSymbolReader fillReader = new FillSymbolReader();
rrenkert@116:             if(markerReader.canRead(symbol)) {
rrenkert@116:                 markerReader.setSymbol(symbol);
rrenkert@116:                 markerReader.setUtil(util);
rrenkert@116:                 markerReader.setParent(rendererElement);
rrenkert@116:                 markerReader.read();
rrenkert@116:             }
rrenkert@116:             else if(lineReader.canRead(symbol)) {
rrenkert@116:                 lineReader.setSymbol(symbol);
rrenkert@116:                 lineReader.setUtil(util);
rrenkert@116:                 lineReader.setParent(rendererElement);
rrenkert@116:                 lineReader.read();
rrenkert@116:             }
rrenkert@116:             else if(fillReader.canRead(symbol)) {
rrenkert@116:                 fillReader.setSymbol(symbol);
rrenkert@116:                 fillReader.setUtil(util);
rrenkert@116:                 fillReader.setParent(rendererElement);
rrenkert@116:                 fillReader.read();
rrenkert@116:             }
rrenkert@116:             else {
rrenkert@116:                 logger.debug(
rrenkert@116:                     "No known Symbol type: " +
rrenkert@116:                     symbol.getClass().toString());
rrenkert@116:             }
rrenkert@116:         }
rrenkert@116:         catch(Exception e) {
rrenkert@116:             logger.error("Could not read symbol. Stopped reading renderer.");
rrenkert@74:         }
rrenkert@74:         return layer;
rrenkert@25:     }
rrenkert@25: }
rrenkert@25: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :