diff gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/DrawControl.java @ 5838:5aa05a7a34b7

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

http://dive4elements.wald.intevation.org