/*
 * Licensed Materials - Property of Perforce Software, Inc. 
 * © Copyright Perforce Software, Inc. 2014, 2021 
 * © Copyright IBM Corp. 2009, 2014
 * © Copyright ILOG 1996, 2009
 * All Rights Reserved.
 *
 * Note to U.S. Government Users Restricted Rights:
 * The Software and Documentation were developed at private expense and
 * are "Commercial Items" as that term is defined at 48 CFR 2.101,
 * consisting of "Commercial Computer Software" and
 * "Commercial Computer Software Documentation", as such terms are
 * used in 48 CFR 12.212 or 48 CFR 227.7202-1 through 227.7202-4,
 * as applicable.
 */

import ilog.views.IlvGraphic;
import ilog.views.graphic.IlvGraphicSet;
import ilog.views.graphic.IlvLabel;
import ilog.views.graphic.IlvMarker;
import ilog.views.io.IlvInputStream;
import ilog.views.io.IlvOutputStream;
import ilog.views.io.IlvReadFileException;
import ilog.views.maps.IlvFeatureAttribute;
import ilog.views.maps.IlvFeatureAttributeProperty;
import ilog.views.maps.IlvMapFeature;
import ilog.views.maps.IlvMapRenderException;
import ilog.views.maps.rendering.IlvDefaultPointRenderer;
import ilog.views.maps.srs.coordtrans.IlvCoordinateTransformation;
import ilog.views.maps.srs.coordtrans.IlvCoordinateTransformationException;

/**
 * This renderer renders IlvMapPoint geometries into IlvMarker with eventually
 * an associated text extracted from a specified attribute.
 */
public class MarkerTextRenderer extends IlvDefaultPointRenderer {
  /**
   * Name of attribute to display
   */
  private String myAttributeName;

  /**
   * Constructs a new MarkerTextRenderer to render points with an attached
   * label.
   * 
   * @param attributeName
   *          the name of the attribute for text of label
   */
  public MarkerTextRenderer(String attributeName) {
    super();
    myAttributeName = attributeName;
  }

  /**
   * Translates the feature into a graphic object
   */
  Override
  public IlvGraphic makeGraphic(IlvMapFeature feature, IlvCoordinateTransformation tr)
      throws IlvMapRenderException, IlvCoordinateTransformationException {
    // Let the super class create the marker
    IlvMarker marker = (IlvMarker) super.makeGraphic(feature, tr);

    // Create label if needed
    IlvLabel label = null;
    IlvFeatureAttributeProperty attributeList = feature.getAttributes();
    if (attributeList != null) {
      try {
        IlvFeatureAttribute attribute = null;
        attribute = attributeList.getAttribute(myAttributeName);
        if (attribute != null)
          label = new IlvLabel(marker.getPoint(), attribute.toString());
      } catch (IllegalArgumentException e) {
        label = null;
      }
    }

    // Case no label : return marker
    if (label == null) {
      return marker;
    }
    // else generate a graphic set containing the marker and the label
    else {
      // make this label of the same color than the marker
      label.setForeground(getPointRenderingStyle().getMarkerColor());

      IlvGraphicSet set = new IlvGraphicSet();
      set.addObject(marker, false);
      set.addObject(label, false);
      return set;
    }
  }

  //
  // Constructors and methods to implement persistence
  //

  /**
   * Returns true if the object must be saved.
   */
  Override
  public boolean isPersistent() {
    return true;
  }

  /**
   * Write this to specified stream
   */
  Override
  public void write(IlvOutputStream stream) throws java.io.IOException {
    super.write(stream);
    stream.write("attributeName", myAttributeName);
  }

  /**
   * Constructs a new ColorLineRenderer from stream
   */
  public MarkerTextRenderer(IlvInputStream stream) throws IlvReadFileException {
    super(stream);
    myAttributeName = stream.readString("attributeName");
  }
}