Revision: 5983
          http://sourceforge.net/p/jump-pilot/code/5983
Author:   ma15569
Date:     2018-10-29 12:05:46 +0000 (Mon, 29 Oct 2018)
Log Message:
-----------
Workaround to keep the label outside the vertex symbol object if vetex size is 
enables

Modified Paths:
--------------
    
core/trunk/src/com/vividsolutions/jump/workbench/ui/renderer/style/LabelStyle.java

Modified: 
core/trunk/src/com/vividsolutions/jump/workbench/ui/renderer/style/LabelStyle.java
===================================================================
--- 
core/trunk/src/com/vividsolutions/jump/workbench/ui/renderer/style/LabelStyle.java
  2018-10-29 11:59:10 UTC (rev 5982)
+++ 
core/trunk/src/com/vividsolutions/jump/workbench/ui/renderer/style/LabelStyle.java
  2018-10-29 12:05:46 UTC (rev 5983)
@@ -31,21 +31,31 @@
  */
 package com.vividsolutions.jump.workbench.ui.renderer.style;
 
+import java.awt.BasicStroke;
 import java.awt.Color;
 import java.awt.Font;
 import java.awt.Graphics2D;
 import java.awt.Shape;
+import java.awt.Stroke;
 import java.awt.font.TextLayout;
-import java.awt.geom.*;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Area;
+import java.awt.geom.NoninvertibleTransformException;
+import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
+import java.text.DateFormat;
+import java.text.NumberFormat;
+import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
 
-import java.awt.BasicStroke;
-import java.awt.Stroke;
-
 import org.openjump.core.ui.util.ScreenScale;
 
-import com.vividsolutions.jts.geom.*;
+import com.vividsolutions.jts.geom.Coordinate;
+import com.vividsolutions.jts.geom.Envelope;
+import com.vividsolutions.jts.geom.Geometry;
+import com.vividsolutions.jts.geom.GeometryFactory;
+import com.vividsolutions.jts.geom.LineSegment;
 import com.vividsolutions.jts.index.quadtree.Quadtree;
 import com.vividsolutions.jts.simplify.DouglasPeuckerSimplifier;
 import com.vividsolutions.jts.util.Assert;
@@ -58,55 +68,71 @@
 import com.vividsolutions.jump.workbench.model.Layer;
 import com.vividsolutions.jump.workbench.ui.GUIUtil;
 import com.vividsolutions.jump.workbench.ui.Viewport;
-import java.text.DateFormat;
-import java.text.NumberFormat;
-import java.util.Date;
 
 public class LabelStyle implements Style {
-    
+
     public final static int FONT_BASE_SIZE = 12;
-    public static final String FID_COLUMN  = "$FID";
-    
-    public final static String ABOVE_LINE  = "ABOVE_LINE";  //LDB: keep these 
for Project file
-    public final static String ON_LINE     = "ON_LINE";
-    public final static String BELOW_LINE  = "BELOW_LINE";
-    public final static String DEFAULT     = "DEFAULT";
-    public final static String[] verticalAlignmentLookup = {ABOVE_LINE, 
ON_LINE, BELOW_LINE, DEFAULT};
-    
-    public final static String LEFT_SIDE   = "LEFT_SIDE";
-    public final static String CENTER      = "CENTER";
-    public final static String RIGHT_SIDE  = "RIGHT_SIDE";
-    public final static String[] horizontalPositionLookup = {LEFT_SIDE, 
CENTER, RIGHT_SIDE};
-    
+    public static final String FID_COLUMN = "$FID";
+
+    public final static String ABOVE_LINE = "ABOVE_LINE"; // LDB: keep these 
for
+                                                          // Project file
+    public final static String ON_LINE = "ON_LINE";
+    public final static String BELOW_LINE = "BELOW_LINE";
+    public final static String DEFAULT = "DEFAULT";
+    public final static String[] verticalAlignmentLookup = { ABOVE_LINE,
+            ON_LINE, BELOW_LINE, DEFAULT };
+
+    public final static String LEFT_SIDE = "LEFT_SIDE";
+    public final static String CENTER = "CENTER";
+    public final static String RIGHT_SIDE = "RIGHT_SIDE";
+    public final static String[] horizontalPositionLookup = { LEFT_SIDE,
+            CENTER, RIGHT_SIDE };
+
     // At the moment, internationalization is of no use as the UI display
     // an image in the vertical alignment ComboBox used [mmichaud 2007-06-02]
-    // Disabled image in ComboBox and replaced with existing I18N text [LDB 
2007-08-27]
-    public static String DEFAULT_TEXT               = 
I18N.get("ui.renderer.style.LabelStyle.default");
-    public static String ABOVE_TEXT                 = 
I18N.get("ui.renderer.style.LabelStyle.above");
-    public static String MIDDLE_TEXT                = 
I18N.get("ui.renderer.style.LabelStyle.middle");
-    public static String BELOW_TEXT                 = 
I18N.get("ui.renderer.style.LabelStyle.below");
-    
-    public final static String LEFT_SIDE_TEXT       = 
I18N.get("ui.renderer.style.LabelStyle.left-side");
-    public final static String CENTER_TEXT          = 
I18N.get("ui.renderer.style.LabelStyle.center");
-    public final static String RIGHT_SIDE_TEXT      = 
I18N.get("ui.renderer.style.LabelStyle.right-side");
-    
-    public final static String JUSTIFY_CENTER_TEXT  = 
I18N.get("ui.renderer.style.LabelStyle.centered");
-    public final static String JUSTIFY_LEFT_TEXT    = 
I18N.get("ui.renderer.style.LabelStyle.left-alignment");
-    public final static String JUSTIFY_RIGHT_TEXT   = 
I18N.get("ui.renderer.style.LabelStyle.right-alignment");
-    public final static int JUSTIFY_CENTER = 0; // LDB: in retrospect, should 
have used text lookup as above
-    public final static int JUSTIFY_LEFT   = 1; // for readabilty of Project 
XML file
-    public final static int JUSTIFY_RIGHT  = 2;
-    
-    private GeometryFactory factory = new GeometryFactory();
+    // Disabled image in ComboBox and replaced with existing I18N text [LDB
+    // 2007-08-27]
+    public static String DEFAULT_TEXT = I18N
+            .get("ui.renderer.style.LabelStyle.default");
+    public static String ABOVE_TEXT = I18N
+            .get("ui.renderer.style.LabelStyle.above");
+    public static String MIDDLE_TEXT = I18N
+            .get("ui.renderer.style.LabelStyle.middle");
+    public static String BELOW_TEXT = I18N
+            .get("ui.renderer.style.LabelStyle.below");
+
+    public final static String LEFT_SIDE_TEXT = I18N
+            .get("ui.renderer.style.LabelStyle.left-side");
+    public final static String CENTER_TEXT = I18N
+            .get("ui.renderer.style.LabelStyle.center");
+    public final static String RIGHT_SIDE_TEXT = I18N
+            .get("ui.renderer.style.LabelStyle.right-side");
+
+    public final static String JUSTIFY_CENTER_TEXT = I18N
+            .get("ui.renderer.style.LabelStyle.centered");
+    public final static String JUSTIFY_LEFT_TEXT = I18N
+            .get("ui.renderer.style.LabelStyle.left-alignment");
+    public final static String JUSTIFY_RIGHT_TEXT = I18N
+            .get("ui.renderer.style.LabelStyle.right-alignment");
+    public final static int JUSTIFY_CENTER = 0; // LDB: in retrospect, should
+                                                // have used text lookup as
+                                                // above
+    public final static int JUSTIFY_LEFT = 1; // for readabilty of Project XML
+                                              // file
+    public final static int JUSTIFY_RIGHT = 2;
+
+    private final GeometryFactory factory = new GeometryFactory();
     private Color originalColor;
     private AffineTransform originalTransform;
     private Layer layer;
     private Geometry viewportRectangle = null;
-    private InteriorPointFinder interiorPointFinder = new 
InteriorPointFinder();
+    private final InteriorPointFinder interiorPointFinder = new 
InteriorPointFinder();
     private Quadtree labelsDrawn = null;
     private String attribute = LabelStyle.FID_COLUMN;
-    private String angleAttribute = ""; //"" means no angle attribute [Jon 
Aquino]
-    private String heightAttribute = ""; //"" means no height attribute [Jon 
Aquino]
+    private String angleAttribute = ""; // "" means no angle attribute [Jon
+                                        // Aquino]
+    private String heightAttribute = ""; // "" means no height attribute [Jon
+                                         // Aquino]
     private boolean enabled = false;
     private Color color = Color.black;
     private Font font = new Font("Dialog", Font.PLAIN, FONT_BASE_SIZE);
@@ -113,92 +139,105 @@
     private boolean scaling = false;
     private double height = 12;
     private boolean hidingOverlappingLabels = true;
-    public String verticalAlignment  = DEFAULT;
+    public String verticalAlignment = DEFAULT;
     public String horizontalPosition = CENTER;
-    private int horizontalAlignment  = JUSTIFY_CENTER;
-    private boolean outlineShowing   = false;
-    private Color outlineColor       = new Color(230,230,230, 192);
-    private double outlineWidth      = 4d;
-    private Stroke outlineStroke     = new BasicStroke(4f, 
BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);
-    private boolean hideAtScale      = false;
-    private double scaleToHideAt     = 20000d;
-    
-    
-    public LabelStyle() {}
-    
+    private int horizontalAlignment = JUSTIFY_CENTER;
+    private boolean outlineShowing = false;
+    private Color outlineColor = new Color(230, 230, 230, 192);
+    private double outlineWidth = 4d;
+    private Stroke outlineStroke = new BasicStroke(4f, BasicStroke.CAP_BUTT,
+            BasicStroke.JOIN_BEVEL);
+    private boolean hideAtScale = false;
+    private double scaleToHideAt = 20000d;
+
+    public LabelStyle() {
+    }
+
+    @Override
     public void initialize(Layer layer) {
         labelsDrawn = new Quadtree();
         viewportRectangle = null;
         this.layer = layer;
     }
-    
+
+    @Override
     public void paint(Feature f, Graphics2D g, Viewport viewport)
-        throws NoninvertibleTransformException {
+            throws NoninvertibleTransformException {
         // Test scale first to return faster if realScale > scaleToHideAt
-        if (isHidingAtScale()){
-               double scale = height / getFont().getSize2D();
-               if (isScaling()) {
-                       scale *= viewport.getScale();
-               }
-               double realScale = ScreenScale.getHorizontalMapScale(viewport); 
                
-               if (realScale > scaleToHideAt)
-            return;
-        }  
-            
-        Object attributeValue = getAttributeValue(f);
+        if (isHidingAtScale()) {
+            double scale = height / getFont().getSize2D();
+            if (isScaling()) {
+                scale *= viewport.getScale();
+            }
+            final double realScale = ScreenScale
+                    .getHorizontalMapScale(viewport);
+            if (realScale > scaleToHideAt) {
+                return;
+            }
+        }
+
+        final Object attributeValue = getAttributeValue(f);
         String attributeStringValue;
         if ((attributeValue == null)) {
             return;
         } else if (attributeValue instanceof String) {
             // added .trim() 2007-07-13 [mmichaud]
-            attributeStringValue = ((String)attributeValue).trim();
-                       if (attributeStringValue.length() == 0) return;
-               } else if (attributeValue instanceof Date) {
-                       DateFormat dateFormat = 
DateFormat.getDateInstance(DateFormat.DEFAULT);
-                       attributeStringValue = dateFormat.format((Date) 
attributeValue);
-               } else if (attributeValue instanceof Double) {
-                       NumberFormat numberFormat = 
NumberFormat.getNumberInstance();
-                       attributeStringValue = numberFormat.format(((Double) 
attributeValue).doubleValue());
-               } else if (attributeValue instanceof Integer) {
-                       NumberFormat numberFormat = 
NumberFormat.getIntegerInstance();
-                       attributeStringValue = numberFormat.format(((Integer) 
attributeValue).intValue());
-               } else {
-                   attributeStringValue = attributeValue.toString();
-               }
-        
-               // [mmichaud 2012-09-22] Simplify the geometry used to draw the 
label
-               // makes sense for very complex polygons
-               // ex. finnish lake of 282000 pts takes 0.3 s instead of 8 s
-               // TODO : investigate another problem : paint is called 4 times 
after a pan !
-               Geometry geom = f.getGeometry();
-               double pixelSize = 
viewport.getEnvelopeInModelCoordinates().getWidth()/
-                                  viewport.getPanel().getSize().getWidth();
-               if (geom.getNumPoints() > 64) {
-                   geom = DouglasPeuckerSimplifier.simplify(f.getGeometry(), 
pixelSize);
-                   // revert if geometry is empty or invalid
-                   if (geom.isEmpty() || !geom.isValid()) geom = 
f.getGeometry();
-               }
-        
-        Geometry viewportIntersection = intersection(geom, viewport);
+            attributeStringValue = ((String) attributeValue).trim();
+            if (attributeStringValue.length() == 0) {
+                return;
+            }
+        } else if (attributeValue instanceof Date) {
+            final DateFormat dateFormat = DateFormat
+                    .getDateInstance(DateFormat.DEFAULT);
+            attributeStringValue = dateFormat.format((Date) attributeValue);
+        } else if (attributeValue instanceof Double) {
+            final NumberFormat numberFormat = NumberFormat.getNumberInstance();
+            attributeStringValue = numberFormat
+                    .format(((Double) attributeValue).doubleValue());
+        } else if (attributeValue instanceof Integer) {
+            final NumberFormat numberFormat = 
NumberFormat.getIntegerInstance();
+            attributeStringValue = numberFormat
+                    .format(((Integer) attributeValue).intValue());
+        } else {
+            attributeStringValue = attributeValue.toString();
+        }
+
+        // [mmichaud 2012-09-22] Simplify the geometry used to draw the label
+        // makes sense for very complex polygons
+        // ex. finnish lake of 282000 pts takes 0.3 s instead of 8 s
+        // TODO : investigate another problem : paint is called 4 times after a
+        // pan !
+        Geometry geom = f.getGeometry();
+        final double pixelSize = viewport.getEnvelopeInModelCoordinates()
+                .getWidth() / viewport.getPanel().getSize().getWidth();
+        if (geom.getNumPoints() > 64) {
+            geom = DouglasPeuckerSimplifier
+                    .simplify(f.getGeometry(), pixelSize);
+            // revert if geometry is empty or invalid
+            if (geom.isEmpty() || !geom.isValid()) {
+                geom = f.getGeometry();
+            }
+        }
+
+        final Geometry viewportIntersection = intersection(geom, viewport);
         if (viewportIntersection == null || viewportIntersection.isEmpty()) {
             return;
         }
-        ModelSpaceLabelSpec spec = modelSpaceLabelSpec(viewportIntersection);
-        Point2D labelCentreInViewSpace =
-            viewport.toViewPoint(new Point2D.Double(spec.location.x, 
spec.location.y));
-        paint(
-            g,
-            attributeStringValue,
-            viewport,//.getScale(),
-            labelCentreInViewSpace,
-            angle(f, getAngleAttribute(), spec.angle),
-            height(f, getHeightAttribute(), getHeight()),
-            spec.dim);
+        final ModelSpaceLabelSpec spec = 
modelSpaceLabelSpec(viewportIntersection);
+        final Point2D labelCentreInViewSpace = viewport
+                .toViewPoint(new Point2D.Double(spec.location.x,
+                        spec.location.y));
+        paint(g,
+                attributeStringValue,
+                viewport,// .getScale(),
+                labelCentreInViewSpace,
+                angle(f, getAngleAttribute(), spec.angle),
+                height(f, getHeightAttribute(), getHeight()), spec.dim);
     }
 
     /**
-     * Gets the appropriate attribute value, if one exists.
-     * If for some reason the attribute column does not exist, return null
+     * Gets the appropriate attribute value, if one exists. If for some reason
+     * the attribute column does not exist, return null
      *
      * @param f
      * @return the value of the attribute
@@ -205,44 +244,57 @@
      * @return null if the attribute column does not exist
      */
     private Object getAttributeValue(Feature f) {
-      if (getAttribute().equals(LabelStyle.FID_COLUMN))
-        return f.getID() + "";
-      if (! f.getSchema().hasAttribute(getAttribute()))
-          return null;
-      return f.getAttribute(getAttribute());
+        if (getAttribute().equals(LabelStyle.FID_COLUMN)) {
+            return f.getID() + "";
+        }
+        if (!f.getSchema().hasAttribute(getAttribute())) {
+            return null;
+        }
+        return f.getAttribute(getAttribute());
     }
 
-    public static double angle(Feature feature,
-                               String angleAttributeName,
-                               double defaultAngle) {
+    public static double angle(Feature feature, String angleAttributeName,
+            double defaultAngle) {
         if (angleAttributeName.equals("")) {
             return defaultAngle;
         }
-        Object angleAttribute = feature.getAttribute(angleAttributeName);
+        final Object angleAttribute = feature.getAttribute(angleAttributeName);
         if (angleAttribute == null) {
             return defaultAngle;
         }
         try {
-            return 
Angle.toRadians(Double.parseDouble(angleAttribute.toString().trim()));
-        } catch (NumberFormatException e) {
+            return Angle.toRadians(Double.parseDouble(angleAttribute.toString()
+                    .trim()));
+        } catch (final NumberFormatException e) {
             return defaultAngle;
         }
     }
-    
+
     private ModelSpaceLabelSpec modelSpaceLabelSpec(Geometry geometry)
-                                        throws NoninvertibleTransformException 
{
+            throws NoninvertibleTransformException {
         if (geometry.getDimension() == 1) {
             return modelSpaceLabelSpec1D(geometry);
         }
-        if ( geometry.getDimension() == 0) { //LDB: treat points as linear to 
justify them
-               return new ModelSpaceLabelSpec(geometry.getCoordinate(), 0d, 
0); 
+        if (geometry.getDimension() == 0) { // LDB: treat points as linear to
+                                            // justify them
+            // [Giuseppe Aruta 2018-10-29] workaround to keep the label outside
+            // the vertex symbol object
+            if (layer.getVertexStyle().isEnabled()) {
+                final int size = layer.getVertexStyle().size;
+                return new ModelSpaceLabelSpec(findPointForVertexSymbology(
+                        geometry, size), 0, 0);
+            } else {
+                return new ModelSpaceLabelSpec(geometry.getCoordinate(), 0d, 
0);
+            }
         }
-        if (verticalAlignment.equals(ON_LINE) || 
verticalAlignment.equals(DEFAULT)) {
-            return new 
ModelSpaceLabelSpec(interiorPointFinder.findPoint(geometry), 0, 2);      
+        if (verticalAlignment.equals(ON_LINE)
+                || verticalAlignment.equals(DEFAULT)) {
+            return new ModelSpaceLabelSpec(
+                    interiorPointFinder.findPoint(geometry), 0, 2);
         }
         return new ModelSpaceLabelSpec(findPoint(geometry), 0, 2);
     }
-    
+
     /**
      * Find a point at upper-left, upper-center, upper-right, center-left,
      * center, center-right, lower-left, lower-center or lower-right of the
@@ -249,49 +301,86 @@
      * geometry envelope.
      */
     public Coordinate findPoint(Geometry geometry) {
-        if (geometry.isEmpty())
+        if (geometry.isEmpty()) {
             return new Coordinate(0, 0);
-        Envelope envelope = geometry.getEnvelopeInternal();
+        }
+        final Envelope envelope = geometry.getEnvelopeInternal();
         double x = (envelope.getMinX() + envelope.getMaxX()) / 2d;
         double y = (envelope.getMinY() + envelope.getMaxY()) / 2d;
-        if (verticalAlignment.equals(DEFAULT) && geometry.getDimension() != 2)
+        if (verticalAlignment.equals(DEFAULT) && geometry.getDimension() != 2) 
{
             y = envelope.getMaxY();
-        else if (verticalAlignment.equals(ABOVE_LINE))
-               y = envelope.getMaxY();
-        else if (verticalAlignment.equals(BELOW_LINE))
-               y = envelope.getMinY();
-        if (horizontalPosition.equals(LEFT_SIDE))
-               x = envelope.getMinX();
-        else if (horizontalPosition.equals(RIGHT_SIDE))
-               x = envelope.getMaxX();
+        } else if (verticalAlignment.equals(ABOVE_LINE)) {
+            y = envelope.getMaxY();
+        } else if (verticalAlignment.equals(BELOW_LINE)) {
+            y = envelope.getMinY();
+        }
+        if (horizontalPosition.equals(LEFT_SIDE)) {
+            x = envelope.getMinX();
+        } else if (horizontalPosition.equals(RIGHT_SIDE)) {
+            x = envelope.getMaxX();
+        }
         return new Coordinate(x, y);
     }
 
-    
+    /**
+     * [Giuseppe Aruta 2018-10-29] Find a point at upper-left, upper-center,
+     * upper-right, center-left, center, center-right, lower-left, lower-center
+     * or lower-right of the geometry envelope. Find right distance to symbol
+     * size in order to write the label outside the symbol
+     * 
+     * @param geometry
+     * @param int value
+     * @return
+     */
+    public Coordinate findPointForVertexSymbology(Geometry geometry, int 
value) {
+        if (geometry.isEmpty()) {
+            return new Coordinate(0, 0);
+        }
+        final Envelope envelope = new Envelope(geometry.getCoordinate().x
+                - value / 2, geometry.getCoordinate().x + value / 2,
+                geometry.getCoordinate().y - value / 2,
+                geometry.getCoordinate().y + value / 2);
+        double x = (envelope.getMinX() + envelope.getMaxX()) / 2d;
+        double y = (envelope.getMinY() + envelope.getMaxY()) / 2d;
+        if (verticalAlignment.equals(DEFAULT) && geometry.getDimension() != 2) 
{
+            y = envelope.getMaxY();
+        } else if (verticalAlignment.equals(ABOVE_LINE)) {
+            y = envelope.getMaxY();
+        } else if (verticalAlignment.equals(BELOW_LINE)) {
+            y = envelope.getMinY();
+        }
+        if (horizontalPosition.equals(LEFT_SIDE)) {
+            x = envelope.getMinX();
+        } else if (horizontalPosition.equals(RIGHT_SIDE)) {
+            x = envelope.getMaxX();
+        }
+        return new Coordinate(x, y);
+    }
+
     private ModelSpaceLabelSpec modelSpaceLabelSpec1D(Geometry geometry) {
         LineSegment segment;
         if (horizontalPosition.equals(LEFT_SIDE)) {
             segment = endSegment(geometry);
-            return new ModelSpaceLabelSpec(
-                factory.createPoint(segment.p0).getCoordinate(), 
angle(segment), 1);
+            return new ModelSpaceLabelSpec(factory.createPoint(segment.p0)
+                    .getCoordinate(), angle(segment), 1);
         } else if (horizontalPosition.equals(RIGHT_SIDE)) {
             segment = endSegment(geometry);
-            return new ModelSpaceLabelSpec(
-                factory.createPoint(segment.p1).getCoordinate(), 
angle(segment), 1); 
-        } else segment = longestSegment(geometry);
-        //LineSegment longestSegment = longestSegment(geometry);
-        return new ModelSpaceLabelSpec( 
-               (horizontalAlignment == JUSTIFY_CENTER) ?
-                               CoordUtil.average(segment.p0, segment.p1) : 
-                                       (horizontalAlignment == JUSTIFY_LEFT) ? 
-                                                       segment.p0 : segment.p1 
,
-            angle(segment),
-            1);
+            return new ModelSpaceLabelSpec(factory.createPoint(segment.p1)
+                    .getCoordinate(), angle(segment), 1);
+        } else {
+            segment = longestSegment(geometry);
+        }
+        // LineSegment longestSegment = longestSegment(geometry);
+        return new ModelSpaceLabelSpec(
+                (horizontalAlignment == JUSTIFY_CENTER) ? CoordUtil.average(
+                        segment.p0, segment.p1)
+                        : (horizontalAlignment == JUSTIFY_LEFT) ? segment.p0
+                                : segment.p1, angle(segment), 1);
     }
-    
+
     private double angle(LineSegment segment) {
         double angle = Angle.angle(segment.p0, segment.p1);
-        //Don't want upside-down labels! [Jon Aquino]
+        // Don't want upside-down labels! [Jon Aquino]
         if (angle < (-Math.PI / 2d)) {
             angle += Math.PI;
         }
@@ -300,16 +389,18 @@
         }
         return angle;
     }
-    
+
     private LineSegment longestSegment(Geometry geometry) {
         double maxSegmentLength = -1;
         Coordinate c0 = null;
         Coordinate c1 = null;
-        List arrays = CoordinateArrays.toCoordinateArrays(geometry, false);
-        for (Iterator i = arrays.iterator(); i.hasNext();) {
-            Coordinate[] coordinates = (Coordinate[]) i.next();
-            for (int j = 1; j < coordinates.length; j++) { //start 1
-                double length = coordinates[j - 1].distance(coordinates[j]);
+        final List arrays = CoordinateArrays
+                .toCoordinateArrays(geometry, false);
+        for (final Iterator i = arrays.iterator(); i.hasNext();) {
+            final Coordinate[] coordinates = (Coordinate[]) i.next();
+            for (int j = 1; j < coordinates.length; j++) { // start 1
+                final double length = coordinates[j - 1]
+                        .distance(coordinates[j]);
                 if (length > maxSegmentLength) {
                     maxSegmentLength = length;
                     c0 = coordinates[j - 1];
@@ -319,93 +410,89 @@
         }
         return new LineSegment(c0, c1);
     }
-    
+
     private LineSegment endSegment(Geometry geometry) {
-        Coordinate c0 = geometry.getCoordinates()[0];
-        Coordinate c1 = geometry.getCoordinates()[geometry.getNumPoints()-1];
-        //if (geometry.getNumPoints() < 3) return new LineSegment(c0, c1);
+        final Coordinate c0 = geometry.getCoordinates()[0];
+        final Coordinate c1 = 
geometry.getCoordinates()[geometry.getNumPoints() - 1];
+        // if (geometry.getNumPoints() < 3) return new LineSegment(c0, c1);
         if (c0.x <= c1.x && horizontalPosition.equals(LEFT_SIDE)) {
             if (horizontalAlignment == JUSTIFY_RIGHT) {
                 return new LineSegment(c0, new Coordinate(c1.x, c0.y));
+            } else {
+                return new LineSegment(c0, geometry.getCoordinates()[1]);
             }
-            else return new LineSegment(c0, geometry.getCoordinates()[1]);
-        }
-        else if (c0.x <= c1.x && horizontalPosition.equals(RIGHT_SIDE)) {
+        } else if (c0.x <= c1.x && horizontalPosition.equals(RIGHT_SIDE)) {
             if (horizontalAlignment == JUSTIFY_LEFT) {
-                return new LineSegment(c1, new Coordinate(c1.x+1.0, c1.y));
+                return new LineSegment(c1, new Coordinate(c1.x + 1.0, c1.y));
+            } else {
+                return new LineSegment(
+                        geometry.getCoordinates()[geometry.getNumPoints() - 2],
+                        c1);
             }
-            else return new 
LineSegment(geometry.getCoordinates()[geometry.getNumPoints()-2], c1);
-        }
-        else if (c0.x > c1.x && horizontalPosition.equals(LEFT_SIDE)) {
+        } else if (c0.x > c1.x && horizontalPosition.equals(LEFT_SIDE)) {
             if (horizontalAlignment == JUSTIFY_RIGHT) {
-                return new LineSegment(new Coordinate(c1.x-1.0, c1.y), c1);
+                return new LineSegment(new Coordinate(c1.x - 1.0, c1.y), c1);
+            } else {
+                return new LineSegment(c1,
+                        geometry.getCoordinates()[geometry.getNumPoints() - 
2]);
             }
-            else return new LineSegment(c1, 
geometry.getCoordinates()[geometry.getNumPoints()-2]);
-        }
-        else if (c0.x > c1.x && horizontalPosition.equals(RIGHT_SIDE)) {
+        } else if (c0.x > c1.x && horizontalPosition.equals(RIGHT_SIDE)) {
             if (horizontalAlignment == JUSTIFY_LEFT) {
-                return new LineSegment(new Coordinate(c0.x-1, c0.y), c0);
+                return new LineSegment(new Coordinate(c0.x - 1, c0.y), c0);
+            } else {
+                return new LineSegment(geometry.getCoordinates()[1], c0);
             }
-            else return new LineSegment(geometry.getCoordinates()[1], c0);
-        }
-        else {
+        } else {
             return longestSegment(geometry);
         }
     }
-    
-    public static double height(
-        Feature feature,
-        String heightAttributeName,
-        double defaultHeight) {
+
+    public static double height(Feature feature, String heightAttributeName,
+            double defaultHeight) {
         if (heightAttributeName.equals("")) {
             return defaultHeight;
         }
-        Object heightAttribute = feature.getAttribute(heightAttributeName);
+        final Object heightAttribute = feature
+                .getAttribute(heightAttributeName);
         if (heightAttribute == null) {
             return defaultHeight;
         }
         try {
             return Double.parseDouble(heightAttribute.toString().trim());
-        } catch (NumberFormatException e) {
+        } catch (final NumberFormatException e) {
             return defaultHeight;
         }
     }
-    
-    public void paint(Graphics2D g,
-                      String text,
-                      Viewport viewport,
-                      Point2D viewCentre,
-                      double angle,
-                      double height,
-                      int dim) {
+
+    public void paint(Graphics2D g, String text, Viewport viewport,
+            Point2D viewCentre, double angle, double height, int dim) {
         setup(g);
         try {
-               double viewportScale = viewport.getScale();
+            final double viewportScale = viewport.getScale();
             double scale = height / getFont().getSize2D();
             if (isScaling()) {
                 scale *= viewportScale;
             }
-            TextLayout layout = new TextLayout(text, getFont(), 
g.getFontRenderContext());
-            AffineTransform transform = g.getTransform();
+            final TextLayout layout = new TextLayout(text, getFont(),
+                    g.getFontRenderContext());
+            final AffineTransform transform = g.getTransform();
             configureTransform(transform, viewCentre, scale, layout, angle, 
dim);
             g.setTransform(transform);
             if (isHidingOverlappingLabels()) {
-                Area transformedLabelBounds =
-                    new 
Area(layout.getBounds()).createTransformedArea(transform);
-                Envelope transformedLabelBoundsEnvelope =
-                    envelope(transformedLabelBounds);
+                final Area transformedLabelBounds = new 
Area(layout.getBounds())
+                        .createTransformedArea(transform);
+                final Envelope transformedLabelBoundsEnvelope = 
envelope(transformedLabelBounds);
                 if (collidesWithExistingLabel(transformedLabelBounds,
-                    transformedLabelBoundsEnvelope)) {
+                        transformedLabelBoundsEnvelope)) {
                     return;
                 }
-                labelsDrawn.insert(
-                    transformedLabelBoundsEnvelope,
-                    transformedLabelBounds);
+                labelsDrawn.insert(transformedLabelBoundsEnvelope,
+                        transformedLabelBounds);
             }
             if (outlineShowing) {
-                   g.setColor(outlineColor);
-                   g.setStroke(outlineStroke);
-                   g.draw(layout.getOutline(null));
+                g.setColor(outlineColor);
+                g.setStroke(outlineStroke);
+                g.draw(layout.getOutline(null));
             }
             g.setColor(getColor());
             layout.draw(g, 0, 0);
@@ -413,20 +500,20 @@
             cleanup(g);
         }
     }
-    
+
     private Envelope envelope(Shape shape) {
-        Rectangle2D bounds = shape.getBounds2D();
+        final Rectangle2D bounds = shape.getBounds2D();
         return new Envelope(bounds.getMinX(), bounds.getMaxX(),
-                            bounds.getMinY(), bounds.getMaxY());
+                bounds.getMinY(), bounds.getMaxY());
     }
-    
-    private boolean collidesWithExistingLabel(
-        Area transformedLabelBounds,
-        Envelope transformedLabelBoundsEnvelope) {
-        List potentialCollisions = 
labelsDrawn.query(transformedLabelBoundsEnvelope);
-        for (Iterator i = potentialCollisions.iterator(); i.hasNext();) {
-            Area potentialCollision = (Area) i.next();
-            Area intersection = new Area(potentialCollision);
+
+    private boolean collidesWithExistingLabel(Area transformedLabelBounds,
+            Envelope transformedLabelBoundsEnvelope) {
+        final List potentialCollisions = labelsDrawn
+                .query(transformedLabelBoundsEnvelope);
+        for (final Iterator i = potentialCollisions.iterator(); i.hasNext();) {
+            final Area potentialCollision = (Area) i.next();
+            final Area intersection = new Area(potentialCollision);
             intersection.intersect(transformedLabelBounds);
             if (!intersection.isEmpty()) {
                 return true;
@@ -434,98 +521,94 @@
         }
         return false;
     }
-    
+
     private void setup(Graphics2D g) {
         originalTransform = g.getTransform();
         originalColor = g.getColor();
     }
-    
+
     private void cleanup(Graphics2D g) {
         g.setTransform(originalTransform);
         g.setColor(originalColor);
     }
-    
+
     /**
      * Even though a feature's envelope intersects the viewport, the feature
-     * itself may not intersect the viewport. In this case, this method
-     * returns null.
+     * itself may not intersect the viewport. In this case, this method returns
+     * null.
      */
     private Geometry intersection(Geometry geometry, Viewport viewport) {
-       Geometry geo;
-       try {  
-           //LDB: need to catch the NoninvertibleTransformException instead of 
just throwing it
+        Geometry geo;
+        try {
+            // LDB: need to catch the NoninvertibleTransformException instead 
of
+            // just throwing it
             geo = geometry.intersection(viewportRectangle(viewport));
-       } catch (NoninvertibleTransformException e){
-               return null;
-       }
-       if (geo.getNumGeometries() == 0){
-               return null;
-       }
+        } catch (final NoninvertibleTransformException e) {
+            return null;
+        }
+        if (geo.getNumGeometries() == 0) {
+            return null;
+        }
         return geo;
     }
-    
+
     private Geometry viewportRectangle(Viewport viewport)
-        throws NoninvertibleTransformException {
+            throws NoninvertibleTransformException {
         if (viewportRectangle == null) {
-            Envelope e =
-                viewport.toModelEnvelope(
-                    0,
-                    viewport.getPanel().getWidth(),
-                    0,
-                    viewport.getPanel().getHeight());
-            viewportRectangle =
-                factory.createPolygon(
-                    factory.createLinearRing(
-                        new Coordinate[] {
+            final Envelope e = viewport.toModelEnvelope(0, viewport.getPanel()
+                    .getWidth(), 0, viewport.getPanel().getHeight());
+            viewportRectangle = factory.createPolygon(
+                    factory.createLinearRing(new Coordinate[] {
                             new Coordinate(e.getMinX(), e.getMinY()),
                             new Coordinate(e.getMinX(), e.getMaxY()),
                             new Coordinate(e.getMaxX(), e.getMaxY()),
                             new Coordinate(e.getMaxX(), e.getMinY()),
-                            new Coordinate(e.getMinX(), e.getMinY())}),
-                    null);
+                            new Coordinate(e.getMinX(), e.getMinY()) }), null);
         }
         return viewportRectangle;
     }
-    
+
     private void configureTransform(AffineTransform transform,
-                                    Point2D viewCentre,
-                                    double scale,
-                                    TextLayout layout,
-                                    double angle,
-                                    int dim) {
-       
+            Point2D viewCentre, double scale, TextLayout layout, double angle,
+            int dim) {
+
         double xTranslation = viewCentre.getX();
-        double yTranslation = viewCentre.getY() + ((scale * 
GUIUtil.trueAscent(layout)) / 2d);
+        double yTranslation = viewCentre.getY()
+                + ((scale * GUIUtil.trueAscent(layout)) / 2d);
         if (dim == 1) {
-               xTranslation -= horizontalAlignmentOffset(scale * 
layout.getBounds().getWidth());
-            yTranslation -= verticalAlignmentOffset(scale * 
layout.getBounds().getHeight(), dim);
+            xTranslation -= horizontalAlignmentOffset(scale
+                    * layout.getBounds().getWidth());
+            yTranslation -= verticalAlignmentOffset(scale
+                    * layout.getBounds().getHeight(), dim);
+        } else if (dim == 0) {
+            xTranslation -= horizontalPositionOffset(scale
+                    * layout.getBounds().getWidth());
+            yTranslation -= verticalAlignmentOffset(scale
+                    * layout.getBounds().getHeight(), dim);
+        } else {
+            xTranslation -= horizontalAlignmentOffset(scale
+                    * layout.getBounds().getWidth());
+            yTranslation -= verticalAlignmentOffset(scale
+                    * layout.getBounds().getHeight(), dim);
         }
-        else if (dim == 0) {
-               xTranslation -= horizontalPositionOffset(scale * 
layout.getBounds().getWidth());
-            yTranslation -= verticalAlignmentOffset(scale * 
layout.getBounds().getHeight(), dim);
-        }
-        else {
-               xTranslation -= horizontalAlignmentOffset(scale * 
layout.getBounds().getWidth());
-            yTranslation -= verticalAlignmentOffset(scale * 
layout.getBounds().getHeight(), dim);
-        }
-        //Negate the angle because the positive y-axis points downwards.
-        //See the #rotate JavaDoc. [Jon Aquino]
+        // Negate the angle because the positive y-axis points downwards.
+        // See the #rotate JavaDoc. [Jon Aquino]
         transform.rotate(-angle, viewCentre.getX(), viewCentre.getY());
         transform.translate(xTranslation, yTranslation);
         transform.scale(scale, scale);
     }
-    
+
     private double verticalAlignmentOffset(double scaledLabelHeight, int dim) {
-        if (getVerticalAlignment().equals(ON_LINE) ||
-            (getVerticalAlignment().equals(DEFAULT) && dim == 2)) {
+        if (getVerticalAlignment().equals(ON_LINE)
+                || (getVerticalAlignment().equals(DEFAULT) && dim == 2)) {
             return 0;
         }
-        double buffer = 3;
-        double offset = buffer
-            + (layer.getBasicStyle().getLineWidth() / 2d)
-            + (scaledLabelHeight / 2d);
-        if (getVerticalAlignment().equals(ABOVE_LINE) ||
-            (getVerticalAlignment().equals(DEFAULT) && dim != 2)) {
+        final double buffer = 3;
+        final double offset = buffer
+                + (layer.getBasicStyle().getLineWidth() / 2d)
+                + (scaledLabelHeight / 2d);
+        if (getVerticalAlignment().equals(ABOVE_LINE)
+                || (getVerticalAlignment().equals(DEFAULT) && dim != 2)) {
             return offset;
         }
         if (getVerticalAlignment().equals(BELOW_LINE)) {
@@ -534,13 +617,13 @@
         Assert.shouldNeverReachHere();
         return 0;
     }
-    
+
     private double horizontalPositionOffset(double width) {
         if (getHorizontalPosition().equals(LEFT_SIDE)) {
             return width;
         }
         if (getHorizontalPosition().equals(CENTER)) {
-            return width/2d;
+            return width / 2d;
         }
         if (getHorizontalPosition().equals(RIGHT_SIDE)) {
             return 0;
@@ -548,165 +631,206 @@
         Assert.shouldNeverReachHere();
         return 0;
     }
-    
+
     private double horizontalAlignmentOffset(double width) {
-        if (getHorizontalAlignment()==JUSTIFY_CENTER) {
-            return width/2d;
+        if (getHorizontalAlignment() == JUSTIFY_CENTER) {
+            return width / 2d;
         }
-        if (getHorizontalAlignment()==JUSTIFY_LEFT) {
+        if (getHorizontalAlignment() == JUSTIFY_LEFT) {
             return 0;
         }
-        if (getHorizontalAlignment()==JUSTIFY_RIGHT) {
-            return width;  //LDB: see hack in modelSpaceLabelSpec1D
+        if (getHorizontalAlignment() == JUSTIFY_RIGHT) {
+            return width; // LDB: see hack in modelSpaceLabelSpec1D
         }
         Assert.shouldNeverReachHere();
         return 0;
     }
-    
+
     /**
      * @return approximate alignment offset for estimation
      */
     public double getVerticalAlignmentOffset(int dim) {
-       return verticalAlignmentOffset(getHeight(), dim) - getHeight()/2;
+        return verticalAlignmentOffset(getHeight(), dim) - getHeight() / 2;
     }
+
     /**
      * @return approximate alignment offset for estimation
      */
     public double getHorizontalAlignmentOffset(String text) {
-       return horizontalAlignmentOffset(text.length() * getHeight() * 0.6);
+        return horizontalAlignmentOffset(text.length() * getHeight() * 0.6);
     }
+
     public String getAttribute() {
         return attribute;
     }
+
     public String getAngleAttribute() {
         return angleAttribute;
     }
+
     public String getHeightAttribute() {
         return heightAttribute;
     }
+
+    @Override
     public boolean isEnabled() {
         return enabled;
     }
+
     public Color getColor() {
         return color;
     }
+
     public Font getFont() {
         return font;
     }
+
     public boolean isScaling() {
         return scaling;
     }
+
     public double getHeight() {
         return height;
     }
+
     public boolean isHidingOverlappingLabels() {
         return hidingOverlappingLabels;
     }
+
     public boolean isHidingAtScale() {
         return hideAtScale;
     }
+
     public boolean getHideAtScale() {
         return hideAtScale;
     }
+
     public String getVerticalAlignment() {
         return verticalAlignment;
     }
+
     public String getHorizontalPosition() {
         return horizontalPosition;
-    } 
+    }
+
     public int getHorizontalAlignment() {
         return horizontalAlignment;
-    }    
+    }
+
     public boolean getHidingOverlappingLabels() {
         return hidingOverlappingLabels;
     }
-    
-    public boolean getOutlineShowing(){
-       return outlineShowing;
+
+    public boolean getOutlineShowing() {
+        return outlineShowing;
     }
-    public double getOutlineWidth(){
-       return outlineWidth;
+
+    public double getOutlineWidth() {
+        return outlineWidth;
     }
-    public double getScaleToHideAt(){
-       return scaleToHideAt;
+
+    public double getScaleToHideAt() {
+        return scaleToHideAt;
     }
-    public Color getOutlineColor(){
-       return outlineColor;
-    }    
+
+    public Color getOutlineColor() {
+        return outlineColor;
+    }
+
     public void setVerticalAlignment(String verticalAlignment) {
         this.verticalAlignment = verticalAlignment;
     }
+
     public void setHorizontalPosition(String horizontalPosition) {
         this.horizontalPosition = horizontalPosition;
     }
+
     public void setHorizontalAlignment(int horizontalAlignment) {
         this.horizontalAlignment = horizontalAlignment;
     }
+
     public void setAttribute(String attribute) {
         this.attribute = attribute;
     }
+
     public void setAngleAttribute(String angleAttribute) {
         this.angleAttribute = angleAttribute;
     }
+
     public void setHeightAttribute(String heightAttribute) {
         this.heightAttribute = heightAttribute;
     }
+
+    @Override
     public void setEnabled(boolean enabled) {
         this.enabled = enabled;
     }
+
     public void setColor(Color color) {
         this.color = color;
     }
+
     public void setFont(Font font) {
         this.font = font;
     }
+
     public void setScaling(boolean scaling) {
         this.scaling = scaling;
     }
+
     public void setHeight(double height) {
         this.height = height;
     }
+
     public void setHidingOverlappingLabels(boolean hidingOverlappingLabels) {
         this.hidingOverlappingLabels = hidingOverlappingLabels;
     }
-    public void setOutlineShowing( boolean outlineShowing){
-       this.outlineShowing = outlineShowing;
+
+    public void setOutlineShowing(boolean outlineShowing) {
+        this.outlineShowing = outlineShowing;
     }
-    public void setOutlineWidth( double outlineWidth){
-       this.outlineWidth = outlineWidth;
-       this.outlineStroke = new BasicStroke((float) outlineWidth,
-                       BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);
+
+    public void setOutlineWidth(double outlineWidth) {
+        this.outlineWidth = outlineWidth;
+        outlineStroke = new BasicStroke((float) outlineWidth,
+                BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL);
     }
-    public void setScaleToHideAt( double scaleToHideAt){
-       this.scaleToHideAt = scaleToHideAt;
+
+    public void setScaleToHideAt(double scaleToHideAt) {
+        this.scaleToHideAt = scaleToHideAt;
     }
-    public void setOutlineColor( Color outlineColor, int alpha){
-       this.outlineColor = new Color(outlineColor.getRed(),
-                                             outlineColor.getGreen(),
-                                                     outlineColor.getBlue(),
-                                                     alpha);
+
+    public void setOutlineColor(Color outlineColor, int alpha) {
+        this.outlineColor = new Color(outlineColor.getRed(),
+                outlineColor.getGreen(), outlineColor.getBlue(), alpha);
     }
-    public void setOutlineColor( Color outlineColor){
-       if (outlineColor != null) {
-               int alpha = this.outlineColor.getAlpha();
-               setOutlineColor( outlineColor, alpha);
-       }
+
+    public void setOutlineColor(Color outlineColor) {
+        if (outlineColor != null) {
+            final int alpha = this.outlineColor.getAlpha();
+            setOutlineColor(outlineColor, alpha);
+        }
     }
-    public void setHideAtScale( boolean hideAtScale){
-       this.hideAtScale = hideAtScale;
+
+    public void setHideAtScale(boolean hideAtScale) {
+        this.hideAtScale = hideAtScale;
     }
+
+    @Override
     public Object clone() {
         try {
             return super.clone();
-        } catch (CloneNotSupportedException e) {
+        } catch (final CloneNotSupportedException e) {
             Assert.shouldNeverReachHere();
             return null;
         }
     }
+
     private class ModelSpaceLabelSpec {
         public double angle;
         public Coordinate location;
         public int dim;
+
         public ModelSpaceLabelSpec(Coordinate location, double angle, int dim) 
{
             this.location = location;
             this.angle = angle;



_______________________________________________
Jump-pilot-devel mailing list
Jump-pilot-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel

Reply via email to