/*
* 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.gwt.example.client.sample.mapwidget;
import java.util.ArrayList;
import java.util.List;
import org.geomajas.configuration.client.ScaleInfo;
import org.geomajas.geometry.Coordinate;
import org.geomajas.gwt.client.Geomajas;
import org.geomajas.gwt.client.controller.AbstractGraphicsController;
import org.geomajas.gwt.client.controller.PanArrowController;
import org.geomajas.gwt.client.controller.PanController;
import org.geomajas.gwt.client.controller.ZoomInAndOutController;
import org.geomajas.gwt.client.controller.ZoomToRectangleOnceController;
import org.geomajas.gwt.client.gfx.paintable.Image;
import org.geomajas.gwt.client.gfx.paintable.mapaddon.MapAddon;
import org.geomajas.gwt.client.gfx.paintable.mapaddon.MapAddonGroup;
import org.geomajas.gwt.client.gfx.paintable.mapaddon.SingleMapAddon;
import org.geomajas.gwt.client.map.MapModel;
import org.geomajas.gwt.client.map.MapView.ZoomOption;
import org.geomajas.gwt.client.util.ImageUtil;
import org.geomajas.gwt.client.util.MapAddonConstants;
import org.geomajas.gwt.client.widget.MapWidget;
import org.geomajas.gwt.example.base.SamplePanel;
import org.geomajas.gwt.example.base.SamplePanelFactory;
import org.geomajas.gwt.example.client.sample.i18n.SampleMessages;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.HumanInputEvent;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.layout.HLayout;
/**
* <p>
* Sample that shows custom {@link MapAddonGroup}s and {@link SingleMapAddon}.
* </p>
*
* @author Emiel Ackermann
*
*/
public class GroupAndSingleAddonSample extends SamplePanel {
/**
* To keep it readable...
*/
private static final Integer PAN_DIA = MapAddonConstants.PAN_DIA;
private static final Integer PAN_MARGIN = MapAddonConstants.PAN_MARGIN;
private static final Integer ARROW_DIA = MapAddonConstants.PAN_ARROW_DIA;
private static final Integer BUTTON_DIA = MapAddonConstants.buttonDia;
private static final Integer ICON_DIA = MapAddonConstants.ADDON_ICON_DIA;
private static final Integer MARGIN = MapAddonConstants.ADDON_MARGIN;
private static final String PAN_ID = "panCollection";
private static final String NORTH = "north";
private static final String EAST = "east";
private static final String SOUTH = "south";
private static final String WEST = "west";
private static final String ZOOM_IN = "zoomIn";
private static final String ZOOM_OUT = "zoomOut";
private static final String ZOOM_IN_AND_OUT = "zoomInAndOut";
private static final String ZOOM_TO_MAX = "zoomToMax";
private static final String ZOOM_TO_RECT = "zoomRect";
private static final String ICON = "Icon";
private static final String EXAMPLE_IMAGE_FOLDER = "geomajas/example/image/mapaddon/";
private static final SampleMessages MESSAGES = GWT
.create(SampleMessages.class);
public static final String TITLE = "GroupAndSingleAddon";
public static final SamplePanelFactory FACTORY = new SamplePanelFactory() {
public SamplePanel createPanel() {
return new GroupAndSingleAddonSample();
}
};
@Override
public Canvas getViewPanel() {
HLayout mapLayout = new HLayout();
mapLayout.setShowEdges(true);
mapLayout.setWidth100();
mapLayout.setHeight100();
// Map with ID mapNoNav is defined in the XML configuration.
final MapWidget mapWidget = new MapWidget("mapNoNav", "gwtExample");
// Set a panning controller on the map:
mapWidget.setController(new PanController(mapWidget));
mapLayout.addMember(mapWidget);
mapWidget.getMapModel().runWhenInitialized(new Runnable() {
public void run() {
// Images of pan controller with internal margins
Image panBg = ImageUtil.createSquareImage("panBg",
Geomajas.getIsomorphicDir() + "geomajas/mapaddon/panbg.png", 0,
0, PAN_DIA);
Image northImage = ImageUtil.createSquareImage(NORTH + ICON,
Geomajas.getIsomorphicDir() + "geomajas/mapaddon/pan_up.gif",
PAN_MARGIN, 0, ARROW_DIA);
Image eastImage = ImageUtil
.createSquareImage(EAST + ICON, Geomajas.getIsomorphicDir()
+ "geomajas/mapaddon/pan_right.gif", PAN_MARGIN * 2,
PAN_MARGIN, ARROW_DIA);
Image southImage = ImageUtil.createSquareImage(SOUTH + ICON,
Geomajas.getIsomorphicDir() + "geomajas/mapaddon/pan_down.gif",
PAN_MARGIN, PAN_MARGIN * 2, ARROW_DIA);
Image westImage = ImageUtil.createSquareImage(WEST + ICON,
Geomajas.getIsomorphicDir() + "geomajas/mapaddon/pan_left.gif",
0, PAN_MARGIN, ARROW_DIA);
// SingleMapAddons or arrows of pan controller
SingleMapAddon north = new SingleMapAddon(NORTH, northImage, mapWidget,
new PanArrowController(mapWidget, new Coordinate(0, 1)));
SingleMapAddon east = new SingleMapAddon(EAST, eastImage, mapWidget,
new PanArrowController(mapWidget, new Coordinate(1, 0)));
SingleMapAddon south = new SingleMapAddon(SOUTH, southImage, mapWidget,
new PanArrowController(mapWidget, new Coordinate(0, -1)));
SingleMapAddon west = new SingleMapAddon(WEST, westImage, mapWidget,
new PanArrowController(mapWidget, new Coordinate(-1, 0)));
// Pan group itself
List<MapAddon> panArrows = new ArrayList<MapAddon>();
panArrows.add(north);
panArrows.add(east);
panArrows.add(south);
panArrows.add(west);
MapAddonGroup pan = new MapAddonGroup(PAN_ID, panArrows, panBg,
mapWidget);
pan.setHorizontalMargin(MARGIN * 2);
pan.setVerticalMargin(MARGIN * 2);
mapWidget.registerMapAddon(pan);
// @extract-start SingleMapAddon, Create a SingleMapAddon
// Default background for following add ons.
Image background = ImageUtil.createSquareImage("background",
Geomajas.getIsomorphicDir() + "geomajas/mapaddon/panbg.png", 0,
0, BUTTON_DIA);
// Zoom in
Image in = ImageUtil.createSquareImage(ZOOM_IN + ICON,
Geomajas.getIsomorphicDir() + "geomajas/osgeo/zoom-in.png",
MARGIN, MARGIN, ICON_DIA);
SingleMapAddon zoomIn = new SingleMapAddon(ZOOM_IN, in, background,
mapWidget, new ZoomInAndOutController(mapWidget, 2));
// @extract-end
// no (internal) margins needed; this addon receives its margins from
// its group
// Zoom out
Image out = ImageUtil.createSquareImage(ZOOM_OUT + ICON,
Geomajas.getIsomorphicDir() + "geomajas/osgeo/zoom-out.png",
MARGIN, MARGIN, ICON_DIA);
SingleMapAddon zoomOut = new SingleMapAddon(ZOOM_OUT, out, background,
mapWidget, new ZoomInAndOutController(mapWidget, 0.5));
// only internal horizontal margin needed
zoomOut.setHorizontalMargin(BUTTON_DIA + MARGIN);
// Zoom in and out group
MapAddonGroup zoomInAndOut = new MapAddonGroup(ZOOM_IN_AND_OUT,
BUTTON_DIA + MARGIN + BUTTON_DIA, BUTTON_DIA, mapWidget);
zoomInAndOut.addAddon(zoomIn);
zoomInAndOut.addAddon(zoomOut);
zoomInAndOut.setHorizontalMargin(MARGIN);
zoomInAndOut.setVerticalMargin(pan.getVerticalMargin() + PAN_DIA + MARGIN);
mapWidget.registerMapAddon(zoomInAndOut);
// Zoom out to maximum scale
Image select = ImageUtil.createSquareImage(ZOOM_TO_MAX + ICON,
Geomajas.getIsomorphicDir() + EXAMPLE_IMAGE_FOLDER
+ "zoomMax.png", MARGIN + 1, MARGIN + 1, ICON_DIA);
SingleMapAddon zoomToMax = new SingleMapAddon(ZOOM_TO_MAX, select,
background, mapWidget,
new AbstractGraphicsController(mapWidget) {
@Override
public void onDown(HumanInputEvent<?> event) {
event.stopPropagation();
}
@Override
public void onUp(HumanInputEvent<?> event) {
MapModel mapModel = mapWidget.getMapModel();
List<ScaleInfo> zoomLevels = mapModel.getMapInfo()
.getScaleConfiguration().getZoomLevels();
// if zoomslider is used uncomment following to align
// its handle without IndexOutOfBounds.
// double scale = 0d;
// for (ScaleInfo si : zoomLevels) {
// scale = si.getPixelPerUnit();
// if
// (mapWidget.getMapModel().getMapView().isResolutionAvailable(1.0
// / scale)) {
// break;
// }
// }
mapModel.getMapView().scale(
zoomLevels.get(0).getPixelPerUnit(),
ZoomOption.EXACT);
event.stopPropagation();
}
@Override
public void onDrag(HumanInputEvent<?> event) {
event.stopPropagation();
}
});
zoomToMax.setHorizontalMargin(MARGIN);
zoomToMax.setVerticalMargin(zoomInAndOut.getVerticalMargin()
+ BUTTON_DIA + MARGIN);
mapWidget.registerMapAddon(zoomToMax);
// Zoom to dragged rectangle
Image rect = ImageUtil.createSquareImage(ZOOM_TO_RECT + ICON,
Geomajas.getIsomorphicDir()
+ "geomajas/osgeo/zoom-selection.png", MARGIN + 3,
MARGIN + 2, ICON_DIA);
SingleMapAddon zoomToRect = new SingleMapAddon(ZOOM_TO_RECT, rect,
background, mapWidget, new ZoomToRectangleOnceController(
mapWidget));
zoomToRect.setHorizontalMargin(MARGIN + BUTTON_DIA + MARGIN);
zoomToRect.setVerticalMargin(zoomInAndOut.getVerticalMargin()
+ BUTTON_DIA + MARGIN);
mapWidget.registerMapAddon(zoomToRect);
}
});
return mapLayout;
}
@Override
public String getDescription() {
return MESSAGES.groupAndSingleDescription();
}
@Override
public String[] getConfigurationFiles() {
return new String[] { "classpath:org/geomajas/gwt/example/context/mapNoNav.xml" };
}
@Override
public String ensureUserLoggedIn() {
return "luc";
}
}