teichmann@5835: package org.dive4elements.river.client.client.ui.map; ingo@800: ingo@800: import com.google.gwt.core.client.GWT; ingo@800: import com.smartgwt.client.types.SelectionType; ingo@800: import com.smartgwt.client.widgets.ImgButton; ingo@800: import com.smartgwt.client.widgets.events.ClickEvent; ingo@800: import com.smartgwt.client.widgets.events.ClickHandler; ingo@800: import com.smartgwt.client.widgets.form.DynamicForm; christian@4965: import com.smartgwt.client.widgets.form.fields.FormItem; ingo@800: import com.smartgwt.client.widgets.form.fields.SelectItem; ingo@800: import com.smartgwt.client.widgets.form.fields.events.ChangedEvent; ingo@800: import com.smartgwt.client.widgets.form.fields.events.ChangedHandler; ingo@800: import com.smartgwt.client.widgets.layout.HLayout; ingo@800: teichmann@5835: import org.dive4elements.river.client.client.FLYSConstants; teichmann@5835: import org.dive4elements.river.client.client.utils.EnableDisableCmd; christian@4965: christian@4965: import java.util.LinkedHashMap; christian@4965: ingo@800: import org.gwtopenmaps.openlayers.client.Map; ingo@1315: import org.gwtopenmaps.openlayers.client.Style; ingo@800: import org.gwtopenmaps.openlayers.client.control.Control; ingo@800: import org.gwtopenmaps.openlayers.client.control.DrawFeature; ingo@850: import org.gwtopenmaps.openlayers.client.event.VectorFeatureAddedListener; ingo@850: import org.gwtopenmaps.openlayers.client.feature.VectorFeature; ingo@800: import org.gwtopenmaps.openlayers.client.handler.Handler; ingo@800: import org.gwtopenmaps.openlayers.client.handler.PathHandler; ingo@800: import org.gwtopenmaps.openlayers.client.handler.PolygonHandler; ingo@800: import org.gwtopenmaps.openlayers.client.layer.Vector; ingo@850: import org.gwtopenmaps.openlayers.client.util.Attributes; ingo@800: christian@5609: /** christian@5609: * Widget that handles the drawing of pipes and dikes in the DigitizePanel (MapPanel). christian@5609: */ ingo@850: public class DrawControl extends HLayout implements VectorFeatureAddedListener { ingo@800: ingo@800: public static final String BARRIER_PIPE1 = "pipe1"; ingo@800: public static final String BARRIER_PIPE2 = "pipe2"; ingo@800: public static final String BARRIER_DITCH = "ditch"; ingo@800: public static final String BARRIER_DAM = "dam"; ingo@800: public static final String BARRIER_RINGDIKE = "ring_dike"; ingo@800: christian@5609: // FIXME: i18n ingo@882: public static final String BARRIER_PIPE1_VALUE = "Rohr 1"; ingo@882: public static final String BARRIER_PIPE2_VALUE = "Rohr 2"; ingo@882: public static final String BARRIER_DITCH_VALUE = "Graben"; ingo@882: public static final String BARRIER_DAM_VALUE = "Damm"; ingo@882: public static final String BARRIER_RINGDIKE_VALUE = "Ringdeich"; ingo@882: ingo@800: public static final String FIELD_BARRIER_TYPE = "field_barrier_type"; ingo@800: ingo@800: ingo@800: protected FLYSConstants MSG = GWT.create(FLYSConstants.class); ingo@800: ingo@800: protected EnableDisableCmd cmd; ingo@800: ingo@800: protected ImgButton button; ingo@800: protected DynamicForm form; ingo@800: ingo@800: protected Map map; ingo@800: protected Vector layer; ingo@800: ingo@800: protected Control control; ingo@800: ingo@800: ingo@800: public DrawControl(Map map, Vector layer, EnableDisableCmd cmd) { ingo@800: this.map = map; ingo@800: this.layer = layer; ingo@800: this.cmd = cmd; ingo@800: ingo@800: initialize(); ingo@800: } ingo@800: ingo@800: ingo@800: protected void initialize() { ingo@800: setWidth(100); ingo@800: setMembersMargin(0); ingo@800: ingo@800: button = new ImgButton(); ingo@800: christian@5609: final String baseUrl = GWT.getHostPageBaseURL(); ingo@800: button.setSrc(baseUrl + MSG.digitize()); ingo@800: button.setActionType(SelectionType.CHECKBOX); ingo@800: button.setSize(20); ingo@800: button.setShowRollOver(false); ingo@800: button.setSelected(false); ingo@880: button.setTooltip(MSG.digitizeObjects()); ingo@800: ingo@800: button.addClickHandler(new ClickHandler() { christian@4965: @Override ingo@800: public void onClick(ClickEvent e) { ingo@800: if (button.isSelected()) { ingo@800: cmd.enable(); ingo@800: } ingo@800: else { ingo@800: cmd.disable(); ingo@800: } ingo@800: } ingo@800: }); ingo@800: ingo@800: form = new DynamicForm(); ingo@1311: form.setWidth(100); ingo@800: form.setTitlePrefix(""); ingo@800: form.setTitleSuffix(""); ingo@800: christian@5609: final LinkedHashMap map = new LinkedHashMap(); ingo@800: map.put(BARRIER_PIPE1, MSG.getString(BARRIER_PIPE1)); ingo@800: map.put(BARRIER_PIPE2, MSG.getString(BARRIER_PIPE2)); ingo@800: map.put(BARRIER_DITCH, MSG.getString(BARRIER_DITCH)); ingo@800: map.put(BARRIER_DAM, MSG.getString(BARRIER_DAM)); ingo@800: map.put(BARRIER_RINGDIKE, MSG.getString(BARRIER_RINGDIKE)); ingo@800: christian@5609: final LinkedHashMap ics = new LinkedHashMap(); ingo@1311: ics.put(BARRIER_PIPE1, BARRIER_PIPE1); ingo@1311: ics.put(BARRIER_PIPE2, BARRIER_PIPE2); ingo@1311: ics.put(BARRIER_DITCH, BARRIER_DITCH); ingo@1311: ics.put(BARRIER_DAM, BARRIER_DAM); ingo@1311: ics.put(BARRIER_RINGDIKE, BARRIER_RINGDIKE); ingo@1311: christian@5609: final SelectItem box = new SelectItem(FIELD_BARRIER_TYPE); ingo@800: box.setTitle(""); ingo@1311: box.setWidth(100); ingo@800: box.setValueMap(map); ingo@1311: box.setImageURLSuffix(".png"); ingo@1311: box.setValueIcons(ics); ingo@1311: ingo@800: box.addChangedHandler(new ChangedHandler() { christian@4965: @Override ingo@800: public void onChanged(ChangedEvent e) { ingo@800: setSelectedControl(); ingo@800: } ingo@800: }); ingo@800: ingo@800: form.setFields(box); ingo@800: ingo@800: addMember(button); ingo@800: addMember(form); ingo@800: ingo@850: layer.addVectorFeatureAddedListener(this); ingo@850: ingo@800: activate(false); ingo@800: } ingo@800: ingo@800: ingo@800: protected String getSelectedType() { ingo@800: return form.getValueAsString(FIELD_BARRIER_TYPE); ingo@800: } ingo@800: ingo@800: christian@4965: @Override ingo@850: public void onFeatureAdded(FeatureAddedEvent evt) { ingo@850: setCurrentType(evt.getVectorFeature()); ingo@850: } ingo@850: ingo@850: ingo@850: protected void setCurrentType(VectorFeature feature) { christian@5609: final Attributes attrs = feature.getAttributes(); ingo@850: String type = attrs.getAttributeAsString("typ"); ingo@850: ingo@850: if (type == null || type.length() == 0) { ingo@850: type = getSelectedType(); ingo@860: christian@5609: final Style style = FloodMap.getStyle(type); ingo@1315: if (style != null) { ingo@1315: feature.setStyle(style); ingo@1315: } ingo@882: ingo@860: if (type.equals(BARRIER_PIPE1)) { ingo@882: attrs.setAttribute("typ", BARRIER_PIPE1_VALUE); ingo@860: } ingo@860: else if (type.equals(BARRIER_PIPE2)) { ingo@882: attrs.setAttribute("typ", BARRIER_PIPE2_VALUE); ingo@860: } ingo@860: else if (type.equals(BARRIER_DAM)) { ingo@882: attrs.setAttribute("typ", BARRIER_DAM_VALUE); ingo@860: } ingo@860: else if (type.equals(BARRIER_DITCH)) { ingo@882: attrs.setAttribute("typ", BARRIER_DITCH_VALUE); ingo@860: } ingo@860: else if (type.equals(BARRIER_RINGDIKE)) { ingo@882: attrs.setAttribute("typ", BARRIER_RINGDIKE_VALUE); ingo@860: } ingo@882: ingo@882: layer.redraw(); ingo@850: } ingo@850: } ingo@850: ingo@850: ingo@800: protected void removeControl() { ingo@800: if (control != null) { ingo@800: control.deactivate(); ingo@800: map.removeControl(control); ingo@800: } ingo@800: } ingo@800: ingo@800: ingo@800: protected void setSelectedControl() { ingo@800: removeControl(); ingo@800: christian@5609: final String type = getSelectedType(); ingo@800: ingo@800: if (type == null || type.length() == 0) { ingo@800: return; ingo@800: } ingo@800: ingo@800: if (type.equalsIgnoreCase(BARRIER_RINGDIKE)) { ingo@800: control = createDrawPolygonControl(); ingo@800: } ingo@800: else { ingo@800: control = createDrawLineControl(); ingo@800: } ingo@800: ingo@800: map.addControl(control); ingo@800: control.activate(); christian@5609: christian@5609: // Make sure the barrier layer is on top; sometime it looses it z-index... christian@5609: layer.setZIndex(1000); ingo@800: } ingo@800: ingo@800: ingo@800: protected Control createDrawControl(Handler handler) { ingo@800: return new DrawFeature(layer, handler); ingo@800: } ingo@800: ingo@800: ingo@800: protected Control createDrawPolygonControl() { ingo@800: return createDrawControl(new PolygonHandler()); ingo@800: } ingo@800: ingo@800: ingo@800: protected Control createDrawLineControl() { ingo@800: return createDrawControl(new PathHandler()); ingo@800: } ingo@800: ingo@800: ingo@800: public void activate(boolean activate) { christian@5609: final FormItem item = form.getField(FIELD_BARRIER_TYPE); ingo@800: ingo@800: if (activate) { ingo@800: button.select(); ingo@800: item.enable(); ingo@800: setSelectedControl(); ingo@800: } ingo@800: else { ingo@800: removeControl(); ingo@800: button.deselect(); ingo@800: item.disable(); ingo@800: } ingo@800: } ingo@800: } ingo@800: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :