Package org.geomajas.gwt.client.gfx.painter

Source Code of org.geomajas.gwt.client.gfx.painter.FeatureTransactionPainter

/*
* This is part of Geomajas, a GIS framework, http://www.geomajas.org/.
*
* Copyright 2008-2011 Geosparc nv, http://www.geosparc.com/, Belgium.
*
* The program is available in open source according to the GNU Affero
* General Public License. All contributions in this program are covered
* by the Geomajas Contributors License Agreement. For full licensing
* details, see LICENSE.txt in the project root.
*/

package org.geomajas.gwt.client.gfx.painter;

import org.geomajas.geometry.Coordinate;
import org.geomajas.gwt.client.gfx.GraphicsContext;
import org.geomajas.gwt.client.gfx.MapContext;
import org.geomajas.gwt.client.gfx.Paintable;
import org.geomajas.gwt.client.gfx.Painter;
import org.geomajas.gwt.client.gfx.style.ShapeStyle;
import org.geomajas.gwt.client.map.feature.Feature;
import org.geomajas.gwt.client.map.feature.FeatureTransaction;
import org.geomajas.gwt.client.spatial.geometry.Geometry;
import org.geomajas.gwt.client.spatial.geometry.LineString;
import org.geomajas.gwt.client.spatial.geometry.LinearRing;
import org.geomajas.gwt.client.spatial.geometry.MultiLineString;
import org.geomajas.gwt.client.spatial.geometry.MultiPoint;
import org.geomajas.gwt.client.spatial.geometry.MultiPolygon;
import org.geomajas.gwt.client.spatial.geometry.Point;
import org.geomajas.gwt.client.spatial.geometry.Polygon;
import org.geomajas.gwt.client.widget.MapWidget;
import org.geomajas.gwt.client.widget.MapWidget.RenderGroup;

/**
* Paint a feature transaction.
*
* @author Pieter De Graef
*/
public class FeatureTransactionPainter implements Painter {

  private MapWidget mapWidget;

  private ShapeStyle pointStyle;

  private ShapeStyle edgeStyle;

  private ShapeStyle lineStringStyle;

  private ShapeStyle linearRingStyle;

  private ShapeStyle polygonStyle;

  public FeatureTransactionPainter(MapWidget mapWidget) {
    this.mapWidget = mapWidget;
    pointStyle = new ShapeStyle("#FF6600", 1, "#FFFFFF", 0, 1);
    edgeStyle = new ShapeStyle("#FFFFFF", 0, "#FFAA00", 1, 3);
    lineStringStyle = new ShapeStyle("#FFFFFF", 0, "#FFFFFF", 0, 0);
    linearRingStyle = new ShapeStyle("#FFEE00", 0, "#FFAA00", 1, 3);
    polygonStyle = new ShapeStyle("#FFCC00", 0.5f, "#FFAA00", 0, 0);
  }

  /**
   * Return the class-name of the type of object this painter can paint.
   *
   * @return Return the class-name as a string.
   */
  public String getPaintableClassName() {
    return FeatureTransaction.class.getName();
  }

  /**
   * The actual painting function.
   *
   * @param paintable
   *            A {@link FeatureTransaction} object.
   * @param group
   *            The group where the object resides in (optional).
   * @param context
   *            A MapContext object, responsible for actual drawing.
   */
  public void paint(Paintable paintable, Object group, MapContext context) {
    FeatureTransaction featureTransaction = (FeatureTransaction) paintable;

    Feature[] features = featureTransaction.getNewFeatures();
    if (features == null) {
      return;
    }
    context.getVectorContext().drawGroup(mapWidget.getGroup(RenderGroup.VECTOR), featureTransaction);
    for (int i = 0; i < features.length; i++) {
      Geometry geometry = mapWidget.getMapModel().getMapView().getWorldViewTransformer().worldToPan(
          features[i].getGeometry());
      context.getVectorContext().drawGroup(featureTransaction, features[i]);
      if (geometry instanceof Point) {
        paint(features[i], "featureTransaction.feature" + i, (Point) geometry, context.getVectorContext());
      } else if (geometry instanceof MultiPoint) {
        paint(features[i], "featureTransaction.feature" + i, (MultiPoint) geometry, context.getVectorContext());
      } else if (geometry instanceof LineString) {
        paint(features[i], "featureTransaction.feature" + i, (LineString) geometry, context.getVectorContext());
      } else if (geometry instanceof MultiLineString) {
        paint(features[i], "featureTransaction.feature" + i, (MultiLineString) geometry, context
            .getVectorContext());
      } else if (geometry instanceof Polygon) {
        paint(features[i], "featureTransaction.feature" + i, (Polygon) geometry, context.getVectorContext());
      } else if (geometry instanceof MultiPolygon) {
        paint(features[i], "featureTransaction.feature" + i, (MultiPolygon) geometry, context
            .getVectorContext());
      }
    }
  }

  /**
   * Delete a {@link Paintable} object from the given {@link GraphicsContext}. It the object does not exist,
   * nothing will be done.
   *
   * @param paintable
   *            The object to be painted.
   * @param group
   *            The group where the object resides in (optional).
   * @param graphics
   *            The context to paint on.
   */
  public void deleteShape(Paintable paintable, Object group, MapContext context) {
    context.getVectorContext().deleteGroup(paintable);
  }

  // -------------------------------------------------------------------------
  // Private drawing functions:
  // -------------------------------------------------------------------------

  private void paint(Object parent, String name, Point point, GraphicsContext graphics) {
    if (!point.isEmpty()) {
      paint(parent, name + ".coordinate0", point.getCoordinate(), graphics);
    }
  }
 
  private void paint(Object parent, String name, LineString lineString, GraphicsContext graphics) {
    // Draw LineString fill area:
    graphics.drawLine(parent, name + ".area", lineString, lineStringStyle);

    // Draw individual edges:
    Coordinate[] coordinates = lineString.getCoordinates();
    for (int i = 1; i < coordinates.length; i++) {
      LineString edge = lineString.getGeometryFactory().createLineString(
          new Coordinate[] { coordinates[i - 1], coordinates[i] });
      graphics.drawLine(parent, name + ".edge" + i, edge, edgeStyle);
    }

    // Draw individual vertices:
    for (int i = 0; i < coordinates.length; i++) {
      graphics.drawCircle(parent, name + ".coordinate" + i, coordinates[i], 5.0f, pointStyle);
    }
  }

  private void paint(Object parent, String name, Polygon polygon, GraphicsContext graphics) {
    graphics.drawPolygon(parent, "background", polygon, polygonStyle);
    if (polygon.getExteriorRing() != null) {
      paint(parent, name + ".shell", polygon.getExteriorRing(), graphics);
    }
    for (int i = 0; i < polygon.getNumInteriorRing(); i++) {
      paint(parent, name + ".hole" + i, polygon.getInteriorRingN(i), graphics);
    }
  }

  private void paint(Object parent, String name, MultiPoint multipoint, GraphicsContext graphics) {
    for (int i = 0; i < multipoint.getNumGeometries(); i++) {
      paint(parent, name + ".point" + i, (Point) multipoint.getGeometryN(i), graphics);
    }
  }

  private void paint(Object parent, String name, MultiLineString multiline, GraphicsContext graphics) {
    for (int i = 0; i < multiline.getNumGeometries(); i++) {
      paint(parent, name + ".linestring" + i, (LineString) multiline.getGeometryN(i), graphics);
    }
  }


  private void paint(Object parent, String name, MultiPolygon multipolygon, GraphicsContext graphics) {
    for (int i = 0; i < multipolygon.getNumGeometries(); i++) {
      paint(parent, name + ".polygon" + i, (Polygon) multipolygon.getGeometryN(i), graphics);
    }
  }

  private void paint(Object parent, String name, Coordinate coordinate, GraphicsContext graphics) {
    graphics.drawCircle(parent, name, coordinate, 5.0f, pointStyle);
  }


  private void paint(Object parent, String name, LinearRing linearRing, GraphicsContext graphics) {
    // Draw LineString fill area:
    graphics.drawLine(parent, name + ".area", linearRing, linearRingStyle);

    // Draw individual edges:
    Coordinate[] coordinates = linearRing.getCoordinates();
    for (int i = 1; i < coordinates.length; i++) {
      LineString edge = linearRing.getGeometryFactory().createLineString(
          new Coordinate[] { coordinates[i - 1], coordinates[i] });
      graphics.drawLine(parent, name + ".edge" + i, edge, edgeStyle);
    }

    // Draw individual vertices:
    for (int i = 0; i < coordinates.length - 1; i++) {
      graphics.drawCircle(parent, name + ".coordinate" + i, coordinates[i], 5.0f, pointStyle);
    }
  }

}
TOP

Related Classes of org.geomajas.gwt.client.gfx.painter.FeatureTransactionPainter

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.