ingo@799: package de.intevation.flys.client.client.ui.map; ingo@799: ingo@799: import com.google.gwt.core.client.GWT; ingo@799: ingo@799: import com.smartgwt.client.types.SelectionType; ingo@1315: import com.smartgwt.client.util.SC; ingo@800: import com.smartgwt.client.widgets.Canvas; ingo@799: import com.smartgwt.client.widgets.ImgButton; ingo@799: import com.smartgwt.client.widgets.events.ClickEvent; ingo@799: import com.smartgwt.client.widgets.events.ClickHandler; ingo@799: import com.smartgwt.client.widgets.layout.HLayout; ingo@799: ingo@799: import org.gwtopenmaps.openlayers.client.Map; ingo@799: import org.gwtopenmaps.openlayers.client.control.DragPan; ingo@800: import org.gwtopenmaps.openlayers.client.control.SelectFeature; ingo@800: import org.gwtopenmaps.openlayers.client.control.SelectFeatureOptions; ingo@799: import org.gwtopenmaps.openlayers.client.control.ZoomBox; ingo@800: import org.gwtopenmaps.openlayers.client.feature.VectorFeature; ingo@800: import org.gwtopenmaps.openlayers.client.layer.Vector; ingo@800: import org.gwtopenmaps.openlayers.client.util.Attributes; ingo@799: ingo@799: import de.intevation.flys.client.client.FLYSConstants; ingo@800: import de.intevation.flys.client.client.utils.EnableDisableCmd; ingo@799: ingo@799: ingo@799: /** ingo@799: * @author Ingo Weinzierl ingo@799: */ ingo@799: public class MapToolbar extends HLayout { ingo@799: ingo@799: protected FLYSConstants MSG = GWT.create(FLYSConstants.class); ingo@799: ingo@800: protected FloodMap floodMap; ingo@800: protected DragPan pan; ingo@800: protected ZoomBox zoomBox; ingo@800: protected SelectFeature selectFeature; ingo@799: ingo@799: protected ImgButton zoomToMaxButton; ingo@799: protected ImgButton zoomBoxButton; ingo@799: protected ImgButton zoomOutButton; ingo@799: protected ImgButton panButton; ingo@800: protected ImgButton selectButton; ingo@800: protected ImgButton removeButton; ingo@1315: protected ImgButton elevationButton; ingo@800: ingo@802: protected DrawControl drawControl; ingo@802: protected MeasureControl measureControl; ingo@800: ingo@800: protected Canvas position; ingo@799: ingo@799: ingo@800: public MapToolbar(FloodMap floodMap, Canvas wrapper) { ingo@833: this(floodMap, wrapper, true); ingo@833: } ingo@833: ingo@833: ingo@833: public MapToolbar(FloodMap floodMap, Canvas wrapper, boolean digitize) { ingo@799: super(); ingo@799: ingo@799: setWidth100(); ingo@799: setHeight(30); ingo@799: setMembersMargin(10); ingo@799: setPadding(5); ingo@799: setBorder("1px solid black"); ingo@799: ingo@799: this.floodMap = floodMap; ingo@799: ingo@800: Canvas spacer = new Canvas(); ingo@800: spacer.setWidth("*"); ingo@800: ingo@799: zoomToMaxButton = createMaxExtentControl(); ingo@799: zoomBoxButton = createZoomBoxControl(); ingo@799: zoomOutButton = createZoomOutControl(); ingo@799: panButton = createPanControl(); ingo@800: drawControl = createDrawControl(); ingo@800: selectButton = createSelectFeatureControl(); ingo@833: measureControl = createMeasureControl(); ingo@833: position = createMousePosition(wrapper); ingo@800: removeButton = createRemoveFeatureControl(); ingo@1315: elevationButton = createElevationControl(); ingo@799: ingo@799: addMember(zoomToMaxButton); ingo@799: addMember(zoomBoxButton); ingo@799: addMember(zoomOutButton); ingo@799: addMember(panButton); ingo@833: ingo@833: if (digitize) { ingo@833: addMember(drawControl); ingo@833: addMember(selectButton); ingo@833: addMember(removeButton); ingo@1315: addMember(elevationButton); ingo@833: } ingo@833: ingo@802: addMember(measureControl); ingo@800: addMember(spacer); ingo@800: addMember(position); ingo@799: } ingo@799: ingo@799: ingo@799: protected Map getMap() { ingo@799: return floodMap.getMap(); ingo@799: } ingo@799: ingo@799: ingo@799: protected void activatePan(boolean activate) { ingo@799: if (activate) { ingo@799: panButton.select(); ingo@799: pan.activate(); ingo@799: } ingo@799: else { ingo@799: panButton.deselect(); ingo@799: pan.deactivate(); ingo@799: } ingo@799: } ingo@799: ingo@799: ingo@799: protected void activateZoomBox(boolean activate) { ingo@799: if (activate) { ingo@799: zoomBoxButton.select(); ingo@799: zoomBox.activate(); ingo@799: } ingo@799: else { ingo@799: zoomBoxButton.deselect(); ingo@799: zoomBox.deactivate(); ingo@799: } ingo@799: } ingo@799: ingo@799: ingo@800: protected void activateDrawFeature(boolean activate) { ingo@800: drawControl.activate(activate); ingo@800: } ingo@800: ingo@800: ingo@800: protected void activateSelectFeature(boolean activate) { ingo@800: if (activate) { ingo@800: selectButton.select(); ingo@800: selectFeature.activate(); ingo@800: } ingo@800: else { ingo@800: selectButton.deselect(); ingo@800: selectFeature.deactivate(); ingo@800: } ingo@800: } ingo@800: ingo@800: ingo@802: protected void activateMeasureControl(boolean activate) { ingo@802: measureControl.activate(activate); ingo@802: } ingo@802: ingo@802: ingo@800: protected ImgButton createButton(String img, ClickHandler handler) { ingo@800: ImgButton btn = new ImgButton(); ingo@799: ingo@799: String baseUrl = GWT.getHostPageBaseURL(); ingo@800: btn.setSrc(baseUrl + img); ingo@800: btn.setWidth(20); ingo@800: btn.setHeight(20); ingo@800: btn.setShowDown(false); ingo@800: btn.setShowRollOver(false); ingo@800: btn.setShowDisabled(false); ingo@800: btn.setShowDisabledIcon(true); ingo@800: btn.setShowDownIcon(false); ingo@800: btn.setShowFocusedIcon(false); ingo@799: ingo@800: if (handler != null) { ingo@800: btn.addClickHandler(handler); ingo@800: } ingo@800: ingo@800: return btn; ingo@800: } ingo@800: ingo@800: ingo@800: protected ImgButton createToggleButton( ingo@800: String img, ingo@800: final EnableDisableCmd cmd ingo@800: ) { ingo@800: final ImgButton btn = new ImgButton(); ingo@800: ingo@800: String baseUrl = GWT.getHostPageBaseURL(); ingo@800: btn.setSrc(baseUrl + img); ingo@800: btn.setActionType(SelectionType.CHECKBOX); ingo@800: btn.setSize(20); ingo@800: btn.setShowRollOver(false); ingo@800: btn.setSelected(false); ingo@800: btn.addClickHandler(new ClickHandler() { ingo@800: public void onClick(ClickEvent e) { ingo@800: if (btn.isSelected()) { ingo@800: cmd.enable(); ingo@800: } ingo@800: else { ingo@800: cmd.disable(); ingo@800: } ingo@800: } ingo@800: }); ingo@800: ingo@800: return btn; ingo@800: } ingo@800: ingo@800: ingo@800: protected ImgButton createMaxExtentControl() { ingo@800: ImgButton zoomToMax = createButton(MSG.zoom_all(), new ClickHandler() { ingo@799: public void onClick(ClickEvent event) { ingo@799: floodMap.getMap().zoomToMaxExtent(); ingo@799: } ingo@799: }); ingo@799: ingo@880: zoomToMax.setTooltip(MSG.zoomMaxExtent()); ingo@880: ingo@799: return zoomToMax; ingo@799: } ingo@799: ingo@799: ingo@799: protected ImgButton createZoomBoxControl() { ingo@799: zoomBox = new ZoomBox(); ingo@799: ingo@800: EnableDisableCmd cmd = new EnableDisableCmd() { ingo@800: public void enable() { ingo@800: activateZoomBox(true); ingo@800: activatePan(false); ingo@800: activateDrawFeature(false); ingo@800: activateSelectFeature(false); ingo@802: activateMeasureControl(false); ingo@800: } ingo@799: ingo@800: public void disable() { ingo@800: activateZoomBox(false); ingo@799: } ingo@800: }; ingo@799: ingo@800: ImgButton button = createToggleButton(MSG.zoom_in(), cmd); ingo@880: button.setTooltip(MSG.zoomIn()); ingo@880: ingo@880: Map map = getMap(); ingo@799: map.addControl(zoomBox); ingo@799: ingo@799: return button; ingo@799: } ingo@799: ingo@799: ingo@799: protected ImgButton createZoomOutControl() { ingo@800: ImgButton zoomOut = createButton(MSG.zoom_out(), new ClickHandler() { ingo@799: public void onClick(ClickEvent event) { ingo@799: Map map = floodMap.getMap(); ingo@799: int level = map.getZoom(); ingo@799: ingo@799: if (level > 1) { ingo@799: map.zoomTo(level-1); ingo@799: } ingo@799: } ingo@799: }); ingo@799: ingo@880: zoomOut.setTooltip(MSG.zoomOut()); ingo@880: ingo@799: return zoomOut; ingo@799: } ingo@799: ingo@799: ingo@799: protected ImgButton createPanControl() { ingo@799: pan = new DragPan(); ingo@800: getMap().addControl(pan); ingo@799: ingo@800: EnableDisableCmd cmd = new EnableDisableCmd() { ingo@800: public void enable() { ingo@800: activateZoomBox(false); ingo@800: activatePan(true); ingo@800: activateDrawFeature(false); ingo@800: activateSelectFeature(false); ingo@802: activateMeasureControl(false); ingo@800: } ingo@799: ingo@800: public void disable() { ingo@800: activatePan(false); ingo@800: } ingo@800: }; ingo@800: ingo@800: final ImgButton button = createToggleButton(MSG.pan(), cmd); ingo@880: button.setTooltip(MSG.moveMap()); ingo@800: ingo@800: return button; ingo@800: } ingo@800: ingo@800: ingo@800: protected DrawControl createDrawControl() { ingo@800: EnableDisableCmd cmd = new EnableDisableCmd() { ingo@800: public void enable() { ingo@800: activateZoomBox(false); ingo@800: activatePan(false); ingo@800: activateDrawFeature(true); ingo@800: activateSelectFeature(false); ingo@802: activateMeasureControl(false); ingo@800: } ingo@800: ingo@800: public void disable() { ingo@800: activateDrawFeature(false); ingo@800: } ingo@800: }; ingo@800: return new DrawControl(getMap(), floodMap.getBarrierLayer(), cmd); ingo@800: } ingo@800: ingo@800: ingo@800: protected ImgButton createSelectFeatureControl() { ingo@800: SelectFeatureOptions opts = new SelectFeatureOptions(); ingo@825: opts.setBox(true); ingo@800: ingo@800: // VectorFeatures selected by the SelectFeature control are manually ingo@800: // marked with the string "mark.delete". The control to remove selected ingo@800: // features makes use of this string to determine if the feature should ingo@800: // be deleted (is marked) or not. Actually, we would like to use the ingo@800: // OpenLayers native mechanism to select features, but for some reason ingo@800: // this doesn't work here. After a feature has been selected, the layer ingo@800: // still has no selected features. ingo@800: opts.onSelect(new SelectFeature.SelectFeatureListener() { ingo@800: public void onFeatureSelected(VectorFeature feature) { ingo@1317: floodMap.selectFeature(feature); ingo@800: } ingo@800: }); ingo@800: ingo@800: opts.onUnSelect(new SelectFeature.UnselectFeatureListener() { ingo@800: public void onFeatureUnselected(VectorFeature feature) { ingo@1317: floodMap.disableFeature(feature); ingo@800: } ingo@800: }); ingo@800: ingo@800: selectFeature = new SelectFeature(floodMap.getBarrierLayer(), opts); ingo@800: getMap().addControl(selectFeature); ingo@800: ingo@800: EnableDisableCmd cmd = new EnableDisableCmd() { ingo@800: public void enable() { ingo@800: activateDrawFeature(false); ingo@800: activatePan(false); ingo@800: activateZoomBox(false); ingo@800: activateSelectFeature(true); ingo@802: activateMeasureControl(false); ingo@800: } ingo@800: ingo@800: public void disable() { ingo@800: activateSelectFeature(false); ingo@1317: floodMap.disableFeatures(); ingo@800: } ingo@800: }; ingo@800: ingo@800: ImgButton button = createToggleButton(MSG.selectFeature(), cmd); ingo@880: button.setTooltip(MSG.selectObject()); ingo@800: ingo@800: return button; ingo@800: } ingo@800: ingo@800: ingo@800: protected ImgButton createRemoveFeatureControl() { ingo@800: ImgButton remove = createButton(MSG.removeFeature(),new ClickHandler() { ingo@800: public void onClick(ClickEvent event) { ingo@800: Vector barriers = floodMap.getBarrierLayer(); ingo@800: VectorFeature[] features = barriers.getFeatures(); ingo@800: ingo@800: if (features == null || features.length == 0) { ingo@800: return; ingo@799: } ingo@800: ingo@800: for (int i = features.length-1; i >= 0; i--) { ingo@800: VectorFeature feature = features[i]; ingo@800: ingo@800: Attributes attr = feature.getAttributes(); ingo@1315: int del = attr.getAttributeAsInt(FloodMap.MARK_SELECTED); ingo@800: ingo@800: if (del == 1) { ingo@800: barriers.removeFeature(feature); ingo@800: feature.destroy(); ingo@800: } ingo@799: } ingo@799: } ingo@799: }); ingo@799: ingo@880: remove.setTooltip(MSG.removeObject()); ingo@880: ingo@800: return remove; ingo@800: } ingo@799: ingo@800: ingo@1315: protected ImgButton createElevationControl() { ingo@1315: ImgButton btn = createButton(MSG.adjustElevation(), new ClickHandler() { ingo@1315: public void onClick(ClickEvent evt) { ingo@1315: Vector barriers = floodMap.getBarrierLayer(); ingo@1315: VectorFeature[] features = barriers.getFeatures(); ingo@1315: ingo@1315: VectorFeature feature = null; ingo@1315: ingo@1315: if (features == null || features.length == 0) { ingo@1317: SC.warn(MSG.error_no_feature_selected()); ingo@1315: return; ingo@1315: } ingo@1315: ingo@1317: boolean multipleFeatures = false; ingo@1317: ingo@1315: for (VectorFeature f: features) { ingo@1315: Attributes attr = f.getAttributes(); ingo@1315: if (attr.getAttributeAsInt(FloodMap.MARK_SELECTED) == 1) { ingo@1315: if (feature == null) { ingo@1315: feature = f; ingo@1315: } ingo@1315: else { ingo@1317: multipleFeatures = true; ingo@1315: } ingo@1315: } ingo@1315: } ingo@1315: ingo@1317: if (feature == null) { ingo@1317: SC.warn(MSG.error_no_feature_selected()); ingo@1317: return; ingo@1317: } ingo@1317: ingo@1315: new ElevationWindow(floodMap, feature).show(); ingo@1317: ingo@1317: if (multipleFeatures) { ingo@1317: SC.warn(MSG.warning_use_first_feature()); ingo@1317: } ingo@1315: } ingo@1315: }); ingo@1315: ingo@1315: btn.setTooltip(MSG.adjustElevationTooltip()); ingo@1315: ingo@1315: return btn; ingo@1315: } ingo@1315: ingo@1315: ingo@800: protected Canvas createMousePosition(Canvas mapWrapper) { ingo@800: return new MapPositionPanel(floodMap.getMapWidget(), mapWrapper); ingo@799: } ingo@802: ingo@802: ingo@802: protected MeasureControl createMeasureControl() { ingo@802: EnableDisableCmd cmd = new EnableDisableCmd() { ingo@802: public void enable() { ingo@802: activateDrawFeature(false); ingo@802: activatePan(false); ingo@802: activateZoomBox(false); ingo@802: activateSelectFeature(false); ingo@802: } ingo@802: ingo@802: public void disable() { ingo@802: // do nothing ingo@802: } ingo@802: }; ingo@802: ingo@802: return new MeasureControl(floodMap, cmd); ingo@802: } ingo@799: } ingo@799: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :