/*
 * Licensed Materials - Property of Rogue Wave Software, Inc. 
 * © Copyright Rogue Wave Software, Inc. 2014, 2015 
 * © 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.IlvPoint;
import ilog.views.graphic.IlvGraphicSet;
import ilog.views.maps.IlvCoordinate;
import ilog.views.maps.IlvMapFeature;
import ilog.views.maps.IlvMapGeometry;
import ilog.views.maps.IlvMapRenderException;
import ilog.views.maps.geometry.IlvMapCurve;
import ilog.views.maps.geometry.IlvMapLineString;
import ilog.views.maps.geometry.IlvMapMultiCurve;
import ilog.views.maps.projection.IlvProjectionException;
import ilog.views.maps.projection.IlvProjectionUtil;
import ilog.views.maps.rendering.IlvDefaultCurveRenderer;
import ilog.views.maps.srs.coordtrans.IlvCoordinateTransformation;
import ilog.views.maps.srs.coordtrans.IlvCoordinateTransformationException;
import java.awt.Color;

/**
 * A renderer that takes curve geometries and transforms them into
 * road or railroad graphical objects.
 */
public class IlvRailroadRenderer
  extends IlvDefaultCurveRenderer
{
  IlvRailroadAttributes _attributes;
  // Dummy colors just to show how to customize indexed properties.
  Color[] _dummy = new Color[3]; // here we define an array of 3 colors, but you can create
  // and unlimited array and handle the size and the allocation of the array in the get/set 
  // methods.

  public IlvRailroadRenderer()
  {
    super();
  }

  public IlvGraphic makeGraphic(IlvMapFeature feature, IlvCoordinateTransformation tr)
    throws IlvMapRenderException, IlvCoordinateTransformationException
  {          
    IlvMapGeometry geometry = feature.getGeometry();
    if (geometry == null)
      throw new IllegalArgumentException("No geometry");
    if (geometry instanceof IlvMapMultiCurve)
      return createGraphicFromMultiCurve(feature, tr);
    if (geometry instanceof IlvMapCurve)
      return createGraphicFromCurve(feature, tr);
    throw new IlvMapRenderException("Not an IlvMapCurve geometry");
  }

  IlvGraphic createGraphicFromMultiCurve(IlvMapFeature feature, 
                                                 IlvCoordinateTransformation tr)
    throws IlvMapRenderException, IlvCoordinateTransformationException
  {
    IlvMapMultiCurve multiCurve = (IlvMapMultiCurve)feature.getGeometry();
    int count = multiCurve.getCardinal();
    if (count == 0)
      throw new IllegalArgumentException("MultiCurve with no curve");
    
    if (count == 1) {
      feature.setGeometry(multiCurve.getCurve(0));
      IlvGraphic g = makeGraphic(feature, tr);
      feature.setGeometry(multiCurve);
      return g;
    }
    
    IlvGraphicSet result = new IlvGraphicSet();
    for (int i = 0; i < count; i++) {
      IlvMapCurve curve = multiCurve.getCurve(i);
      feature.setGeometry(curve);
      IlvGraphic g = makeGraphic(feature, tr);
      if(g != null)
        result.addObject(g, false);
    }
    feature.setGeometry(multiCurve);
    return result;
  }
  
  IlvGraphic createGraphicFromCurve(IlvMapFeature feature, 
                                  IlvCoordinateTransformation tr)
    throws IlvMapRenderException, IlvProjectionException, IlvCoordinateTransformationException
  {
    IlvMapGeometry geometry = feature.getGeometry();
    IlvMapLineString ls = (IlvMapLineString)geometry;
    int count = ls.getPointCount();
    if (count == 0)
      return null;
    IlvPoint[] p = makePoints(tr, ls, count); 
    IlvRailroadAttributes ra = getAttributes();
    IlvRailroad g = new IlvRailroad(p, false, ra);
    return g;
  }

  IlvPoint[] makePoints(IlvCoordinateTransformation tr,
                        IlvMapLineString ls, 
                        int count) 
    throws IlvCoordinateTransformationException
  {  
    IlvPoint p[] = new IlvPoint[count];    
    for (int i = 0; i < count; i++) {
      p[i] = new IlvPoint();
      IlvCoordinate c = ls.getPoint(i);
      IlvProjectionUtil.ToViews(tr, c, p[i]);      
    }
    return p;
  }
  
  public IlvRailroadAttributes getAttributes()
  {
    if (_attributes == null)
      _attributes = new IlvRailroadAttributes();
    return _attributes;
  }

  public void setAttributes(IlvRailroadAttributes a)
  {
    _attributes = a;
  }

  // The "dummy" methods below are here just to show how to use
  // indexed properties with CSS.
  public Color getDummy(int i)
  {
    return _dummy[i];
  }
  
  public Color[] getDummy()
  {
    return _dummy;
  }

  public void setDummy(Color[] val)
  {
    _dummy = val;
  }

  public void setDummy(int i, Color val)
  {
    _dummy[i] = val;
  }

}