/* * This is part of Geomajas, a GIS framework, http://www.geomajas.org/. * * Copyright 2008-2015 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.gwt2.plugin.print.client.template.impl; import java.util.ArrayList; import java.util.List; import org.geomajas.configuration.FontStyleInfo; import org.geomajas.configuration.client.ClientLayerInfo; import org.geomajas.configuration.client.ClientMapInfo; import org.geomajas.geometry.Bbox; import org.geomajas.gwt2.client.GeomajasServerExtension; import org.geomajas.gwt2.client.map.MapPresenter; import org.geomajas.gwt2.client.map.ViewPort; import org.geomajas.gwt2.client.map.layer.Layer; import org.geomajas.gwt2.plugin.print.client.layerbuilder.PrintableLayerBuilder; import org.geomajas.gwt2.plugin.print.client.layerbuilder.PrintableLayersModelBuilder; import org.geomajas.gwt2.plugin.print.client.layerbuilder.PrintableWidgetLayerBuilder; import org.geomajas.gwt2.plugin.print.client.layerbuilder.RasterServerLayerBuilder; import org.geomajas.gwt2.plugin.print.client.layerbuilder.VectorServerLayerBuilder; import org.geomajas.gwt2.plugin.print.client.template.PrintableMapBuilder; import org.geomajas.plugin.rasterizing.command.dto.LegendRasterizingInfo; import org.geomajas.plugin.rasterizing.command.dto.MapRasterizingInfo; import com.google.gwt.user.client.ui.AbsolutePanel; import com.google.gwt.user.client.ui.Widget; /** * Default implementation of {@link org.geomajas.gwt2.plugin.print.client.template.PrintableMapBuilder}. * * @author Jan De Moerloose * @author An Buyle (support for extra layer with e.g. selected geometries) * @author Jan Venstermans */ public class DefaultPrintableMapBuilder implements PrintableMapBuilder { private static List<PrintableLayerBuilder> defaultLayerBuilders = new ArrayList<PrintableLayerBuilder>(); static { registerDefaultLayerBuilder(new RasterServerLayerBuilder()); registerDefaultLayerBuilder(new VectorServerLayerBuilder()); } private List<PrintableLayerBuilder> layerBuilders = new ArrayList<PrintableLayerBuilder>(); public DefaultPrintableMapBuilder() { layerBuilders.addAll(defaultLayerBuilders); } @Override public void registerLayerBuilder(PrintableLayerBuilder layerBuilder) { // prepend to the list take precedence ! layerBuilders.add(0, layerBuilder); } @Override public void build(MapPresenter mapPresenter, Bbox worldBounds, double rasterResolution) { MapRasterizingInfo mapRasterizingInfo = buildMap(mapPresenter); createWidgetPrintLayers(mapPresenter, mapRasterizingInfo, worldBounds, rasterResolution); createModelLayersPrintLayers(mapPresenter, worldBounds, rasterResolution); } public static void registerDefaultLayerBuilder(PrintableLayerBuilder layerBuilder) { // prepend to the list to take precedence ! defaultLayerBuilders.add(0, layerBuilder); } /* private methods */ private MapRasterizingInfo buildMap(MapPresenter mapPresenter) { MapRasterizingInfo mapRasterizingInfo = new MapRasterizingInfo(); ViewPort viewPort = mapPresenter.getViewPort(); mapRasterizingInfo.setBounds(viewPort.getBounds()); mapRasterizingInfo.setScale(1 / viewPort.getResolution()); mapRasterizingInfo.setTransparent(true); LegendRasterizingInfo legendRasterizingInfo = new LegendRasterizingInfo(); legendRasterizingInfo.setTitle("Legend"); FontStyleInfo font = new FontStyleInfo(); font.applyDefaults(); legendRasterizingInfo.setFont(font); mapRasterizingInfo.setLegendRasterizingInfo(legendRasterizingInfo); // Support for selection of layer object : create container for info on selected features; // store the selections layer per layer List<ClientLayerInfo> selectedLayers = new ArrayList<ClientLayerInfo>(); mapRasterizingInfo.setExtraLayers(selectedLayers); ClientMapInfo mapInfo = mapPresenter.getConfiguration().getHintValue(GeomajasServerExtension.MAPINFO); mapInfo.getWidgetInfo().put(MapRasterizingInfo.WIDGET_KEY, mapRasterizingInfo); // Note: mapRasterizingInfo at this time is pretty empty (rastering info for // layers not yet filled in) return mapRasterizingInfo; } private void createWidgetPrintLayers(MapPresenter mapPresenter, MapRasterizingInfo mapRasterizingInfo, Bbox worldBounds, double rasterResolution) { AbsolutePanel mapPresenterAsAbsolutePanel = ((AbsolutePanel) mapPresenter.asWidget()); for (int i = 0 ; i < mapPresenterAsAbsolutePanel.getWidgetCount(); i++) { Widget widget = mapPresenterAsAbsolutePanel.getWidget(i); for (PrintableWidgetLayerBuilder widgetLayerPrintBuilder : getWidgetLayerBuilders()) { if (widgetLayerPrintBuilder.supports(widget)) { mapRasterizingInfo.getExtraLayers().add( widgetLayerPrintBuilder.build(mapPresenter, widget, worldBounds, rasterResolution)); break; } } } } private void createModelLayersPrintLayers(MapPresenter mapPresenter, Bbox worldBounds, double rasterResolution) { List<ClientLayerInfo> clientLayers = new ArrayList<ClientLayerInfo>(); for (int i = 0; i < mapPresenter.getLayersModel().getLayerCount(); i++) { Layer layer = mapPresenter.getLayersModel().getLayer(i); for (PrintableLayersModelBuilder layerBuilder : getLayersModelBuilders()) { if (layerBuilder.supports(layer)) { clientLayers.add(layerBuilder.build(mapPresenter, layer, worldBounds, rasterResolution)); break; } } } ClientMapInfo mapInfo = mapPresenter.getConfiguration().getHintValue(GeomajasServerExtension.MAPINFO); mapInfo.setLayers(clientLayers); } private List<PrintableLayersModelBuilder> getLayersModelBuilders() { List<PrintableLayersModelBuilder> layersModelPrintBuilders = new ArrayList<PrintableLayersModelBuilder>(); for (PrintableLayerBuilder printableLayerBuilder : layerBuilders) { if (printableLayerBuilder instanceof PrintableLayersModelBuilder) { layersModelPrintBuilders.add((PrintableLayersModelBuilder) printableLayerBuilder); } } return layersModelPrintBuilders; } private List<PrintableWidgetLayerBuilder> getWidgetLayerBuilders() { List<PrintableWidgetLayerBuilder> widgetLayerPrintBuilders = new ArrayList<PrintableWidgetLayerBuilder>(); for (PrintableLayerBuilder printableLayerBuilder : layerBuilders) { if (printableLayerBuilder instanceof PrintableWidgetLayerBuilder) { widgetLayerPrintBuilders.add((PrintableWidgetLayerBuilder) printableLayerBuilder); } } return widgetLayerPrintBuilders; } }