Package org.geotools.swt.action

Source Code of org.geotools.swt.action.DrawShapeAction

/*
*    GeoTools - The Open Source Java GIS Toolkit
*    http://geotools.org
*
*    (C) 2002-2011, Open Source Geospatial Foundation (OSGeo)
*
*    This library is free software; you can redistribute it and/or
*    modify it under the terms of the GNU Lesser General Public
*    License as published by the Free Software Foundation;
*    version 2.1 of the License.
*
*    This library is distributed in the hope that it will be useful,
*    but WITHOUT ANY WARRANTY; without even the implied warranty of
*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
*    Lesser General Public License for more details.
*/
package org.geotools.swt.action;

import java.awt.geom.AffineTransform;

import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.PaletteData;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.geotools.map.event.MapBoundsEvent;
import org.geotools.map.event.MapBoundsListener;
import org.geotools.swt.SwtMapPane;
import org.geotools.swt.tool.InfoTool;
import org.geotools.swt.utils.ImageCache;

/**
* Action that activates the Info tool for the current {@link SwtMapPane map pane}.
*
* @author Andrea Antonello (www.hydrologis.com)
*
*
*
* @source $URL$
*/
public class DrawShapeAction extends MapAction implements MapBoundsListener {

    public DrawShapeAction() {
        super("Drawshape@D", InfoTool.TOOL_TIP, ImageCache.getInstance().getImage(ImageCache.IMAGE_INFO));

    }

    private static boolean odd = true;
    private static boolean first = true;
    /**
     * Called when the associated control is activated. Leads to the
     * map pane's cursor tool being set to a PanTool object
     *
     * @param ev the event (not used)
     */
    public void run() {
        if (first) {
            getMapPane().getMapContent().addMapBoundsListener(this);
            first = false;
        }

        Rectangle visibleRect = getMapPane().getVisibleRect();
        ReferencedEnvelope displayArea = getMapPane().getDisplayArea();
        drawShapes(visibleRect, displayArea, false);

        /*
         * to switch of drawing, simply do
         */
        // getMapPane().setOverlay(null, null, false);
        // getMapPane().redraw();
    }

    /**
     * Draws shapes on the map.
     *
     * @param visibleRect the rectangle in teh screen space.
     * @param areaOfInterest the area of interest in world coordinates.
     */
    private void drawShapes( Rectangle visibleRect, ReferencedEnvelope areaOfInterest, boolean boundsChanged ) {
        Display display = Display.getDefault();

        /*
         * create an image with transparent color (this can be done better?)
         */
        Color white = display.getSystemColor(SWT.COLOR_WHITE);
        PaletteData palette = new PaletteData(new RGB[]{white.getRGB()});
        final ImageData sourceData = new ImageData(visibleRect.width, visibleRect.height, 1, palette);
        sourceData.transparentPixel = 0;

        // create the image to draw on
        Image img = new Image(display, sourceData);
        GC gc = new GC(img);
        gc.setAntialias(SWT.ON);

        // example lat/long coordinates to draw
        double[] worldCoords;
        if (odd) {
            worldCoords = new double[]{10.0, 40.0, 11.2, 43.3, 11.3, 45.2, 11.4, 46.5};
        } else {
            worldCoords = new double[]{11.0, 41.0, 12.2, 44.3, 11.3, 45.2, 11.4, 46.5};
        }
        odd = !odd;

        // get the world to screen transform
        double[] screenCoords = new double[8];
        AffineTransform worldToScreenTransform = getMapPane().getWorldToScreenTransform();
        // do the transform
        worldToScreenTransform.transform(worldCoords, 0, screenCoords, 0, worldCoords.length / 2);

        // draw lines
        gc.setForeground(display.getSystemColor(SWT.COLOR_MAGENTA));
        gc.setLineWidth(2);
        gc.drawLine((int) screenCoords[0], (int) screenCoords[1], (int) screenCoords[2], (int) screenCoords[3]);
        gc.drawLine((int) screenCoords[2], (int) screenCoords[3], (int) screenCoords[4], (int) screenCoords[5]);

        // draw dots
        int size = 10;
        gc.setBackground(display.getSystemColor(SWT.COLOR_RED));
        gc.fillOval((int) screenCoords[0] - size / 2, (int) screenCoords[1] - size / 2, size, size);
        gc.fillOval((int) screenCoords[2] - size / 2, (int) screenCoords[3] - size / 2, size, size);
        gc.fillOval((int) screenCoords[4] - size / 2, (int) screenCoords[5] - size / 2, size, size);
        gc.setForeground(display.getSystemColor(SWT.COLOR_BLACK));
        gc.drawOval((int) screenCoords[0] - size / 2, (int) screenCoords[1] - size / 2, size, size);
        gc.drawOval((int) screenCoords[2] - size / 2, (int) screenCoords[3] - size / 2, size, size);
        gc.drawOval((int) screenCoords[4] - size / 2, (int) screenCoords[5] - size / 2, size, size);

        gc.setAntialias(SWT.OFF);
        gc.dispose();

        // overlay the image
        getMapPane().setOverlay(img, areaOfInterest, false, boundsChanged);
    }

    public void selectionChanged( IAction action, ISelection selection ) {
    }

    public void mapBoundsChanged( MapBoundsEvent event ) {
        /*
         * every time the bounds change (zoom, etc...), the drawing
         * has to occurr again on the new bounds
         */
        ReferencedEnvelope newAreaOfInterest = event.getNewAreaOfInterest();
        Rectangle visibleRect = getMapPane().getVisibleRect();
        drawShapes(visibleRect, newAreaOfInterest, true);
    }
}
TOP

Related Classes of org.geotools.swt.action.DrawShapeAction

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.