org.geomajas.plugin.print.component.impl.MapComponentImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.geomajas.plugin.print.component.impl.MapComponentImpl.java

Source

/*
 * This is part of Geomajas, a GIS framework, http://www.geomajas.org/.
 *
 * Copyright 2008-2014 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.plugin.print.component.impl;

import java.awt.Color;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.geomajas.plugin.print.component.LayoutConstraint;
import org.geomajas.plugin.print.component.MapComponent;
import org.geomajas.plugin.print.component.PdfContext;
import org.geomajas.plugin.print.component.PrintComponent;
import org.geomajas.plugin.print.component.PrintComponentVisitor;
import org.geomajas.plugin.print.component.dto.MapComponentInfo;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import com.lowagie.text.Rectangle;
import com.vividsolutions.jts.geom.Coordinate;

/**
 * Map component for inclusion in printed documents.
 *
 * @author Jan De Moerloose
 * 
 * @param <T> DTO object class
 */
@Component()
@Scope(value = "prototype")
public class MapComponentImpl<T extends MapComponentInfo> extends AbstractPrintComponent<T>
        implements MapComponent<T> {

    /**
     * Map id
     */
    private String applicationId;

    /**
     * Map id
     */
    private String mapId;

    /**
     * The lower left corner in map units
     */
    private Coordinate location;

    /**
     * resolution to be used for raster layers (unit = DPI, default = 72, which
     * corresponds to 1 pixel per unit of user space in PDF)
     */
    private double rasterResolution = 72;

    /**
     * The number of points (user space units) per map unit
     */
    private float ppUnit = 1.0f;

    protected MapComponentImpl() {
        getConstraint().setAlignmentX(LayoutConstraint.JUSTIFIED);
        getConstraint().setAlignmentY(LayoutConstraint.JUSTIFIED);
    }

    /**
     * Call back visitor.
     *
     * @param visitor
     */
    public void accept(PrintComponentVisitor visitor) {
        visitor.visit(this);
    }

    @Override
    public void calculateSize(PdfContext context) {
        super.calculateSize(context);
    }

    @Override
    public void layout(PdfContext context) {
        super.layout(context);
    }

    @Override
    public void render(PdfContext context) {
        context.fillRectangle(getSize());
        super.render(context);
        renderViewPorts(context);
        context.strokeRectangle(getSize());
    }

    /* (non-Javadoc)
     * @see org.geomajas.plugin.print.component.impl.MapComponent#getLocation()
     */
    public Coordinate getLocation() {
        return location;
    }

    public void setLocation(Coordinate location) {
        this.location = location;
    }

    /* (non-Javadoc)
     * @see org.geomajas.plugin.print.component.impl.MapComponent#getMapId()
     */
    public String getMapId() {
        return mapId;
    }

    public void setMapId(String mapId) {
        this.mapId = mapId;
    }

    public String getApplicationId() {
        return applicationId;
    }

    public void setApplicationId(String applicationId) {
        this.applicationId = applicationId;
    }

    /* (non-Javadoc)
     * @see org.geomajas.plugin.print.component.impl.MapComponent#getPpUnit()
     */
    public float getPpUnit() {
        return ppUnit;
    }

    public void setPpUnit(float ppUnit) {
        this.ppUnit = ppUnit;
    }

    /* (non-Javadoc)
     * @see org.geomajas.plugin.print.component.impl.MapComponent#getRasterResolution()
     */
    public double getRasterResolution() {
        return rasterResolution;
    }

    public void setRasterResolution(double rasterResolution) {
        this.rasterResolution = rasterResolution;
    }

    public void setFilter(Map<String, String> filters) {
        if (null == filters) {
            return;
        }
        List<PrintComponent<?>> toDelete = new LinkedList<PrintComponent<?>>();

        for (PrintComponent<?> pr : children) {
            if (pr instanceof VectorLayerComponentImpl) {
                VectorLayerComponentImpl comp = (VectorLayerComponentImpl) pr;
                String filter = filters.get(comp.getLayerId());
                if (filter == null) {
                    toDelete.add(pr);
                } else if (!"".equals(filter)) { // "" == no filter needed
                    if (comp.getFilter() == null || "".equals(comp.getFilter())) {
                        comp.setFilter(filter);
                    } else {
                        comp.setFilter(comp.getFilter() + " AND " + filter);
                    }
                }
            }
        }
        if (toDelete.size() > 0) {
            children.removeAll(toDelete);
        }
    }

    // ------------------------------------------------------------------------

    private void renderViewPorts(PdfContext context) {
        for (PrintComponent<?> child : getChildren()) {
            if (child instanceof ViewPortComponentImpl) {
                renderViewPort((ViewPortComponentImpl) child, context);
            }
        }
    }

    private void renderViewPort(ViewPortComponentImpl viewPort, PdfContext context) {
        Coordinate portOrigin = viewPort.getLocation();
        float x = (float) (portOrigin.x - location.x) * getPpUnit();
        float y = (float) (portOrigin.y - location.y) * getPpUnit();
        Rectangle shadowRect = new Rectangle(x, y, x + viewPort.getBounds().getWidth() / viewPort.getZoomScale(),
                y + viewPort.getBounds().getHeight() / viewPort.getZoomScale());
        context.fillRectangle(shadowRect, context.makeTransparent(Color.lightGray, 0.5f));
        context.strokeRectangle(shadowRect, Color.white, 1);
        Rectangle rect = context.toRelative(viewPort.getBounds());
        // connection lines
        float deltaLeft = shadowRect.getLeft() - rect.getLeft();
        float deltaRight = shadowRect.getRight() - rect.getRight();

        float deltaBottom = shadowRect.getBottom() - rect.getBottom();
        float deltaTop = shadowRect.getTop() - rect.getTop();

        if ((deltaLeft <= 0 && deltaBottom >= 0) || (deltaLeft >= 0 && deltaBottom <= 0)) {
            context.drawLine(rect.getLeft(), rect.getBottom(), shadowRect.getLeft(), shadowRect.getBottom(),
                    Color.white, 1);
        }
        if ((deltaLeft >= 0 && deltaTop >= 0) || (deltaLeft <= 0 && deltaTop <= 0)) {
            context.drawLine(rect.getLeft(), rect.getTop(), shadowRect.getLeft(), shadowRect.getTop(), Color.white,
                    1);
        }
        if ((deltaRight <= 0 && deltaBottom <= 0) || (deltaRight >= 0 && deltaBottom >= 0)) {
            context.drawLine(rect.getRight(), rect.getBottom(), shadowRect.getRight(), shadowRect.getBottom(),
                    Color.white, 1);
        }
        if ((deltaRight >= 0 && deltaTop <= 0) || (deltaRight <= 0 && deltaTop >= 0)) {
            context.drawLine(rect.getRight(), rect.getTop(), shadowRect.getRight(), shadowRect.getTop(),
                    Color.white, 1);
        }
    }

    public void clearLayers() {
        List<PrintComponent<?>> layers = new ArrayList<PrintComponent<?>>();
        for (PrintComponent<?> child : children) {
            if (child instanceof VectorLayerComponentImpl || child instanceof RasterLayerComponentImpl) {
                layers.add(child);
            }
        }
        for (PrintComponent<?> layer : layers) {
            removeComponent(layer);
        }
    }

    public void fromDto(T mapInfo) {
        super.fromDto(mapInfo);
        setApplicationId(mapInfo.getApplicationId());
        setMapId(mapInfo.getMapId());
        setLocation(createCoordinate(mapInfo.getLocation()));
        setPpUnit(mapInfo.getPpUnit());
        setRasterResolution(mapInfo.getRasterResolution());
    }

    private Coordinate createCoordinate(org.geomajas.geometry.Coordinate coordinate) {
        return new Coordinate(coordinate.getX(), coordinate.getY());
    }

}