/* * 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.plugin.editing.gwt.example.client.widget; import org.geomajas.geometry.Coordinate; import org.geomajas.geometry.Geometry; import org.geomajas.gwt.client.map.layer.VectorLayer; import org.geomajas.gwt.client.util.WidgetLayout; import org.geomajas.gwt.client.widget.MapWidget; import org.geomajas.plugin.editing.client.operation.GeometryOperationFailedException; import org.geomajas.plugin.editing.client.service.GeometryEditState; import org.geomajas.plugin.editing.client.service.GeometryIndex; import org.geomajas.plugin.editing.client.service.GeometryIndexType; import org.geomajas.plugin.editing.gwt.client.GeometryEditor; import org.geomajas.plugin.editing.gwt.client.handler.InfoDragLineHandlerShowingWindow; import org.geomajas.plugin.editing.gwt.client.handler.LabelDragLineHandler; import org.geomajas.plugin.editing.gwt.example.client.event.GeometryEditSuspendResumeHandler; import com.google.gwt.event.shared.EventBus; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.event.shared.SimpleEventBus; import com.google.gwt.user.client.Window; import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.events.ClickEvent; import com.smartgwt.client.widgets.menu.Menu; import com.smartgwt.client.widgets.menu.MenuItem; import com.smartgwt.client.widgets.menu.MenuItemStringFunction; import com.smartgwt.client.widgets.menu.events.ClickHandler; import com.smartgwt.client.widgets.menu.events.MenuItemClickEvent; import com.smartgwt.client.widgets.toolbar.ToolStrip; import com.smartgwt.client.widgets.toolbar.ToolStripButton; import com.smartgwt.client.widgets.toolbar.ToolStripMenuButton; /** * The editing toolbar used within this sample application. * * @author Pieter De Graef */ public class MenuBar extends ToolStrip { private GeometryEditor editor; private MapWidget map; private EventBus eventBus; private SnappingOptionWindow wnd; private VectorLayer geometrySaveLayer; public MenuBar(GeometryEditor editor) { this.editor = editor; eventBus = new SimpleEventBus(); map = editor.getMapWidget(); setWidth100(); setHeight(36); // Add creation options: addMenuButton(getNewGeometryButton()); addMenuButton(getEditGeometryButton()); addMenuButton(getInfoButton()); addSeparator(); // Add buttons to help the editing process: addButton(new CancelEditingBtn(editor.getEditService())); UndoBtn undoBtn = new UndoBtn(editor.getEditService()); addGeometryEditSuspensionHandler(undoBtn); addButton(undoBtn); RedoBtn redoBtn = new RedoBtn(editor.getEditService()); addGeometryEditSuspensionHandler(redoBtn); addButton(redoBtn); SuspendBtn suspendBtn = new SuspendBtn(editor.getEditService()); addButton(suspendBtn); addSeparator(); AddRingBtn addRingBtn = new AddRingBtn(editor.getEditService()); addGeometryEditSuspensionHandler(addRingBtn); addButton(addRingBtn); addButton(new DeleteRingBtn(this, editor.getEditService(), editor.getRenderer())); addSeparator(); ToolStripButton snappingBtn = new ToolStripButton("Snapping options"); snappingBtn.setHeight(32); snappingBtn.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() { public void onClick(ClickEvent event) { if (wnd == null) { wnd = new SnappingOptionWindow(MenuBar.this.editor); } wnd.show(); } }); addButton(snappingBtn); } public HandlerRegistration addGeometryEditSuspensionHandler(GeometryEditSuspendResumeHandler handler) { return eventBus.addHandler(GeometryEditSuspendResumeHandler.TYPE, handler); } public EventBus getEventBus() { return eventBus; } protected ToolStripMenuButton getNewGeometryButton() { Menu menu = new Menu(); menu.setShowShadow(true); menu.setShadowDepth(3); MenuItem pointItem = new MenuItem("Draw Point", "[ISOMORPHIC]/geomajas/osgeo/point-create.png"); pointItem.addClickHandler(new ClickHandler() { public void onClick(MenuItemClickEvent event) { stopEditingServiceIfStarted() ; Geometry point = new Geometry(Geometry.POINT, 0, 0); GeometryIndex index = editor.getEditService().getIndexService() .create(GeometryIndexType.TYPE_VERTEX, 0); editor.getEditService().start(point); editor.getEditService().setInsertIndex(index); editor.getEditService().setEditingState(GeometryEditState.INSERTING); } }); MenuItem lineItem = new MenuItem("Draw Line", "[ISOMORPHIC]/geomajas/osgeo/line-create.png"); lineItem.addClickHandler(new ClickHandler() { public void onClick(MenuItemClickEvent event) { stopEditingServiceIfStarted(); Geometry line = new Geometry(Geometry.LINE_STRING, 0, 0); GeometryIndex index = editor.getEditService().getIndexService() .create(GeometryIndexType.TYPE_VERTEX, 0); editor.getEditService().start(line); editor.getEditService().setInsertIndex(index); editor.getEditService().setEditingState(GeometryEditState.INSERTING); } }); MenuItem polyItem = new MenuItem("Draw Polygon", "[ISOMORPHIC]/geomajas/osgeo/polygon-create.png"); polyItem.addClickHandler(new ClickHandler() { public void onClick(MenuItemClickEvent event) { stopEditingServiceIfStarted(); Geometry polygon = new Geometry(Geometry.POLYGON, 0, 0); editor.getEditService().start(polygon); try { GeometryIndex index = editor.getEditService().addEmptyChild(); editor.getEditService().setInsertIndex( editor.getEditService().getIndexService() .addChildren(index, GeometryIndexType.TYPE_VERTEX, 0)); editor.getEditService().setEditingState(GeometryEditState.INSERTING); } catch (GeometryOperationFailedException e) { editor.getEditService().stop(); Window.alert("Exception during editing: " + e.getMessage()); } } }); menu.setItems(pointItem, lineItem, polyItem); ToolStripMenuButton menuButton = new ToolStripMenuButton("Free drawing", menu); menuButton.setWidth(100); menuButton.setHeight(32); return menuButton; } private void stopEditingServiceIfStarted() { if (editor.getEditService().isStarted()) { saveGeometry(editor.getEditService().stop()); } } protected ToolStripMenuButton getEditGeometryButton() { Menu menu = new Menu(); menu.setShowShadow(true); menu.setShadowDepth(3); MenuItem pointItem = new MenuItem("Point", "[ISOMORPHIC]/geomajas/osgeo/point.png"); pointItem.addClickHandler(new ClickHandler() { public void onClick(MenuItemClickEvent event) { Geometry point = new Geometry(Geometry.POINT, 0, 0); point.setCoordinates(new Coordinate[] { map.getMapModel().getMapView().getBounds().getCenterPoint() }); editor.getEditService().start(point); } }); MenuItem lineItem = new MenuItem("LineString", "[ISOMORPHIC]/geomajas/osgeo/line.png"); lineItem.addClickHandler(new ClickHandler() { public void onClick(MenuItemClickEvent event) { Geometry line = new Geometry(Geometry.LINE_STRING, 0, 0); Coordinate origin = map.getMapModel().getMapView().getBounds().getOrigin(); Coordinate center = map.getMapModel().getMapView().getBounds().getCenterPoint(); double deltaX = center.getX() - origin.getX(); double deltaY = center.getY() - origin.getY(); Coordinate c1 = new Coordinate(center.getX() - deltaX / 2, center.getY() - deltaY / 2); Coordinate c2 = new Coordinate(center.getX(), center.getY() - deltaY / 2); Coordinate c3 = new Coordinate(center.getX() + deltaX / 2, center.getY() - deltaY / 2); Coordinate c4 = new Coordinate(center.getX() + deltaX / 2, center.getY()); Coordinate c5 = new Coordinate(center.getX() + deltaX / 2, center.getY() + deltaY / 2); line.setCoordinates(new Coordinate[]{c1, c2, c3, c4, c5}); editor.getEditService().start(line); } }); MenuItem rectItem = new MenuItem("Rectangle (polygon)", "[ISOMORPHIC]/geomajas/silk/square.png"); rectItem.addClickHandler(new ClickHandler() { public void onClick(MenuItemClickEvent event) { Geometry polgon = new Geometry(Geometry.POLYGON, 0, 0); Coordinate origin = map.getMapModel().getMapView().getBounds().getOrigin(); Coordinate center = map.getMapModel().getMapView().getBounds().getCenterPoint(); double deltaX = center.getX() - origin.getX(); double deltaY = center.getY() - origin.getY(); Coordinate c1 = new Coordinate(center.getX() - deltaX / 2, center.getY() - deltaY / 2); Coordinate c2 = new Coordinate(center.getX() + deltaX / 2, center.getY() - deltaY / 2); Coordinate c3 = new Coordinate(center.getX() + deltaX / 2, center.getY() + deltaY / 2); Coordinate c4 = new Coordinate(center.getX() - deltaX / 2, center.getY() + deltaY / 2); Coordinate c5 = new Coordinate(center.getX() - deltaX / 2, center.getY() - deltaY / 2); Geometry shell = new Geometry(Geometry.LINEAR_RING, 0, 0); shell.setCoordinates(new Coordinate[] { c1, c2, c3, c4, c5 }); polgon.setGeometries(new Geometry[]{shell}); editor.getEditService().start(polgon); } }); MenuItem donutItem = new MenuItem("Donut (polygon)", "[ISOMORPHIC]/geomajas/osgeo/ring.png"); donutItem.addClickHandler(new ClickHandler() { public void onClick(MenuItemClickEvent event) { Geometry polygon = new Geometry(Geometry.POLYGON, 0, 0); Coordinate origin = map.getMapModel().getMapView().getBounds().getOrigin(); Coordinate center = map.getMapModel().getMapView().getBounds().getCenterPoint(); double deltaX = center.getX() - origin.getX(); double deltaY = center.getY() - origin.getY(); Coordinate c1 = new Coordinate(center.getX() - deltaX / 2, center.getY() - deltaY / 2); Coordinate c2 = new Coordinate(center.getX() + deltaX / 2, center.getY() - deltaY / 2); Coordinate c3 = new Coordinate(center.getX() + deltaX / 2, center.getY() + deltaY / 2); Coordinate c4 = new Coordinate(center.getX() - deltaX / 2, center.getY() + deltaY / 2); Coordinate c5 = new Coordinate(center.getX() - deltaX / 2, center.getY() - deltaY / 2); Geometry shell = new Geometry(Geometry.LINEAR_RING, 0, 0); shell.setCoordinates(new Coordinate[] { c1, c2, c3, c4, c5 }); Coordinate c11 = new Coordinate(center.getX() - deltaX / 4, center.getY() - deltaY / 4); Coordinate c12 = new Coordinate(center.getX() + deltaX / 4, center.getY() - deltaY / 4); Coordinate c13 = new Coordinate(center.getX() + deltaX / 4, center.getY() + deltaY / 4); Coordinate c14 = new Coordinate(center.getX() - deltaX / 4, center.getY() + deltaY / 4); Coordinate c15 = new Coordinate(center.getX() - deltaX / 4, center.getY() - deltaY / 4); Geometry hole = new Geometry(Geometry.LINEAR_RING, 0, 0); hole.setCoordinates(new Coordinate[] { c11, c12, c13, c14, c15 }); polygon.setGeometries(new Geometry[] { shell, hole }); editor.getEditService().start(polygon); } }); menu.setItems(pointItem, lineItem, rectItem, donutItem); ToolStripMenuButton menuButton = new ToolStripMenuButton("New shape...", menu); menuButton.setWidth(100); menuButton.setHeight(32); return menuButton; } protected ToolStripMenuButton getInfoButton() { Menu menu = new Menu(); menu.setShowShadow(true); menu.setShadowDepth(3); final InfoDragLineHandlerShowingWindow infoHandler = new InfoDragLineHandlerShowingWindow( editor.getMapWidget(), editor.getEditService()); final LabelDragLineHandler labelHandler = new LabelDragLineHandler(editor.getMapWidget(), editor.getEditService()); final MenuItem infoItem = new MenuItem("Show infopanel", WidgetLayout.iconInfo); infoItem.setDynamicTitleFunction(new MenuItemStringFunction() { @Override public String execute(Canvas target, Menu menu, MenuItem item) { return infoHandler.isRegistered() ? "Hide infopanel" : "Show infopanel"; } }); infoItem.addClickHandler(new ClickHandler() { public void onClick(MenuItemClickEvent event) { if (infoHandler.isRegistered()) { infoHandler.unregister(); } else { infoHandler.register(); } } }); final MenuItem labelItem = new MenuItem("Show drag labels", "[ISOMORPHIC]/geomajas/osgeo/line-edit.png"); labelItem.setDynamicTitleFunction(new MenuItemStringFunction() { @Override public String execute(Canvas target, Menu menu, MenuItem item) { return labelHandler.isRegistered() ? "Hide drag labels" : "Show drag labels"; } }); labelItem.addClickHandler(new ClickHandler() { public void onClick(MenuItemClickEvent event) { if (labelHandler.isRegistered()) { labelHandler.unregister(); } else { labelHandler.register(); } editor.getStyleService().setCloseRingWhileInserting(labelHandler.isRegistered()); } }); menu.setItems(infoItem, labelItem); ToolStripMenuButton menuButton = new ToolStripMenuButton("Extras", menu); menuButton.setWidth(100); menuButton.setHeight(32); return menuButton; } /** * add geometry to a vectorlayer * * @param geometry geometry to process */ private void saveGeometry(Geometry geometry) { if (null != geometry) { // how to save the geometry? } } }