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@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@800: public static final String MARK_TO_DELETE = "mark.delete"; ingo@800: 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@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@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: position = createMousePosition(wrapper); ingo@800: drawControl = createDrawControl(); ingo@800: selectButton = createSelectFeatureControl(); ingo@800: removeButton = createRemoveFeatureControl(); ingo@802: measureControl = createMeasureControl(); ingo@799: ingo@799: addMember(zoomToMaxButton); ingo@799: addMember(zoomBoxButton); ingo@799: addMember(zoomOutButton); ingo@799: addMember(panButton); ingo@800: addMember(drawControl); ingo@800: addMember(selectButton); ingo@800: addMember(removeButton); 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@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@800: 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@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@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@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@800: Attributes attr = feature.getAttributes(); ingo@800: attr.setAttribute(MARK_TO_DELETE, 1); ingo@800: } ingo@800: }); ingo@800: ingo@800: opts.onUnSelect(new SelectFeature.UnselectFeatureListener() { ingo@800: public void onFeatureUnselected(VectorFeature feature) { ingo@800: Attributes attr = feature.getAttributes(); ingo@800: attr.setAttribute(MARK_TO_DELETE, 0); 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@800: } ingo@800: }; ingo@800: ingo@800: ImgButton button = createToggleButton(MSG.selectFeature(), cmd); 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@800: int del = attr.getAttributeAsInt(MARK_TO_DELETE); 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@800: return remove; ingo@800: } ingo@799: ingo@800: 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 :