changeset 4329:c9dcce9448f2

Added a new control 'show legend' to the map's toolbar. This control opens a window that displays the legends of all activated layers. Currently, the row in that window has a fixed size of 400x150. The size is fixed, because there are problems with SmartGWT to build panels with auto height/width :-/
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Tue, 30 Oct 2012 12:16:26 +0100
parents 25157125f4a0
children 93e023131546
files flys-client/src/main/java/de/intevation/flys/client/client/ui/map/LegendWindow.java flys-client/src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java flys-client/src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java
diffstat 3 files changed, 165 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-client/src/main/java/de/intevation/flys/client/client/ui/map/LegendWindow.java	Tue Oct 30 12:16:26 2012 +0100
@@ -0,0 +1,100 @@
+package de.intevation.flys.client.client.ui.map;
+
+import java.util.List;
+
+import com.smartgwt.client.types.ImageStyle;
+import com.smartgwt.client.types.VerticalAlignment;
+import com.smartgwt.client.widgets.Canvas;
+import com.smartgwt.client.widgets.Img;
+import com.smartgwt.client.widgets.Label;
+import com.smartgwt.client.widgets.Window;
+import com.smartgwt.client.widgets.layout.HLayout;
+import com.smartgwt.client.widgets.layout.VLayout;
+
+import de.intevation.flys.client.shared.MapUtils;
+import de.intevation.flys.client.shared.model.AttributedTheme;
+import de.intevation.flys.client.shared.model.Theme;
+import de.intevation.flys.client.shared.model.ThemeList;
+
+
+public class LegendWindow extends Window {
+
+    private ThemeList themeList;
+
+    private VLayout legendContainer;
+
+    public LegendWindow(ThemeList themeList) {
+        this.themeList = themeList;
+        this.legendContainer = new VLayout();
+
+        init();
+    }
+
+    public void update(ThemeList themeList) {
+        this.themeList = themeList;
+
+        Canvas[] legends = legendContainer.getMembers();
+        legendContainer.removeMembers(legends);
+
+        addLegends();
+    }
+
+    private void addLegends() {
+        List<Theme> themes = themeList.getActiveThemes();
+
+        for (Theme theme : themes) {
+            if (theme.getActive() == 0) {
+                continue;
+            }
+
+            if (theme instanceof AttributedTheme) {
+                legendContainer
+                    .addMember(createLegendGraphicsRow((AttributedTheme) theme));
+            }
+        }
+    }
+
+    private Canvas createLegendGraphicsRow(AttributedTheme at) {
+        Label label = new Label(at.getDescription());
+        Img img = createLegendGraphics(at);
+
+        HLayout row = new HLayout();
+        row.addMember(label);
+        row.addMember(img);
+
+        row.setHeight(150);
+        row.setWidth(400);
+
+        return row;
+    }
+
+    private Img createLegendGraphics(AttributedTheme at) {
+        String imgUrl = MapUtils.getLegendGraphicUrl(at.getAttr("url"),
+            at.getAttr("layers"));
+
+        Img img = new Img(imgUrl);
+        img.setImageType(ImageStyle.CENTER);
+        img.setAutoFit(true);
+
+        return img;
+    }
+
+    private void init() {
+        legendContainer.setAutoHeight();
+        legendContainer.setLayoutAlign(VerticalAlignment.TOP);
+        legendContainer.setAlign(VerticalAlignment.CENTER);
+
+        setTitle("WMS Legend");
+        setAutoSize(true);
+        setCanDragResize(true);
+        setIsModal(false);
+        setShowModalMask(false);
+        setLayoutAlign(VerticalAlignment.TOP);
+        setAlign(VerticalAlignment.TOP);
+
+        addItem(legendContainer);
+        addLegends();
+
+        centerInPage();
+    }
+}
--- a/flys-client/src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java	Tue Oct 30 13:05:26 2012 +0100
+++ b/flys-client/src/main/java/de/intevation/flys/client/client/ui/map/MapOutputTab.java	Tue Oct 30 12:16:26 2012 +0100
@@ -15,6 +15,8 @@
 
 import de.intevation.flys.client.client.Config;
 import de.intevation.flys.client.client.FLYSConstants;
+import de.intevation.flys.client.client.event.OutputParameterChangeEvent;
+import de.intevation.flys.client.client.event.OutputParameterChangeHandler;
 import de.intevation.flys.client.client.event.RedrawRequestEvent;
 import de.intevation.flys.client.client.event.RedrawRequestHandler;
 import de.intevation.flys.client.client.services.LoadArtifactService;
@@ -59,7 +61,7 @@
 
 public class MapOutputTab
 extends      OutputTab
-implements   RedrawRequestHandler, ExternalWMSWindow.LayerLoader, TabSelectedHandler {
+implements   RedrawRequestHandler, ExternalWMSWindow.LayerLoader, TabSelectedHandler, OutputParameterChangeHandler {
 
     public static final String DEFAULT_SRID = "4326";
 
@@ -457,7 +459,7 @@
             new MapThemePanel.ActivateCallback() {
                 @Override
                 public void activate(Theme theme, boolean active) {
-                    activateTheme(theme, active);
+                    fireActivateTheme(theme, active);
                 }
             },
             new MapThemePanel.ThemeMovedCallback() {
@@ -496,12 +498,18 @@
             }
         );
         themePanel.addRedrawRequestHandler(this);
+        themePanel.addOutputParameterChangeHandler(this);
         c.addChild(themePanel);
 
         return c;
     }
 
 
+    private void fireActivateTheme(Theme theme, boolean active) {
+        activateTheme(theme, active);
+    }
+
+
     protected void activateTheme(Theme theme, boolean active) {
         AttributedTheme at = (AttributedTheme) theme;
 
@@ -568,5 +576,12 @@
         this.themePanelCanvas.setSize(themePanelCanvas.getWidthAsString(),
                                        themePanelCanvas.getHeightAsString());
     }
+
+
+    @Override
+    public void onOutputParameterChanged(OutputParameterChangeEvent evt) {
+        GWT.log("OutputParameterChanged");
+        controlPanel.updateThemes(getThemePanel().getThemeList());
+    }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- a/flys-client/src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java	Tue Oct 30 13:05:26 2012 +0100
+++ b/flys-client/src/main/java/de/intevation/flys/client/client/ui/map/MapToolbar.java	Tue Oct 30 12:16:26 2012 +0100
@@ -1,7 +1,17 @@
 package de.intevation.flys.client.client.ui.map;
 
+import org.gwtopenmaps.openlayers.client.Bounds;
+import org.gwtopenmaps.openlayers.client.Map;
+import org.gwtopenmaps.openlayers.client.control.DragPan;
+import org.gwtopenmaps.openlayers.client.control.SelectFeature;
+import org.gwtopenmaps.openlayers.client.control.SelectFeatureOptions;
+import org.gwtopenmaps.openlayers.client.control.ZoomBox;
+import org.gwtopenmaps.openlayers.client.event.MapZoomListener;
+import org.gwtopenmaps.openlayers.client.feature.VectorFeature;
+import org.gwtopenmaps.openlayers.client.layer.Vector;
+import org.gwtopenmaps.openlayers.client.util.Attributes;
+
 import com.google.gwt.core.client.GWT;
-
 import com.smartgwt.client.types.Alignment;
 import com.smartgwt.client.types.SelectionType;
 import com.smartgwt.client.util.SC;
@@ -18,17 +28,7 @@
 import de.intevation.flys.client.client.ui.Toolbar;
 import de.intevation.flys.client.client.utils.EnableDisableCmd;
 import de.intevation.flys.client.shared.model.Collection;
-
-import org.gwtopenmaps.openlayers.client.Bounds;
-import org.gwtopenmaps.openlayers.client.Map;
-import org.gwtopenmaps.openlayers.client.control.DragPan;
-import org.gwtopenmaps.openlayers.client.control.SelectFeature;
-import org.gwtopenmaps.openlayers.client.control.SelectFeatureOptions;
-import org.gwtopenmaps.openlayers.client.control.ZoomBox;
-import org.gwtopenmaps.openlayers.client.event.MapZoomListener;
-import org.gwtopenmaps.openlayers.client.feature.VectorFeature;
-import org.gwtopenmaps.openlayers.client.layer.Vector;
-import org.gwtopenmaps.openlayers.client.util.Attributes;
+import de.intevation.flys.client.shared.model.ThemeList;
 
 
 /**
@@ -48,6 +48,7 @@
 
     protected Button manageThemesButton;
     protected Button datacageButton;
+    protected Button legendButton;
 
     protected ImgButton addWMSButton;
     protected ImgButton zoomToMaxButton;
@@ -65,6 +66,8 @@
     protected DrawControl    drawControl;
     protected MeasureControl measureControl;
 
+    protected LegendWindow legendWindow;
+
     protected Canvas position;
 
 
@@ -112,6 +115,9 @@
             datacageButton = createDatacageControl();
             addMember(datacageButton);
 
+            legendButton = createLegendControl();
+            addMember(legendButton);
+
             addWMSButton = createWMSControl();
             addMember(addWMSButton);
 
@@ -562,6 +568,29 @@
     }
 
 
+    protected Button createLegendControl() {
+        Button btn = new Button(MSG.legend());
+        btn.addClickHandler(new ClickHandler() {
+            @Override
+            public void onClick(ClickEvent event) {
+                openLegendWindow();
+            }
+        });
+
+        return btn;
+    }
+
+
+    protected void openLegendWindow() {
+        if (legendWindow == null) {
+            MapOutputTab tab = (MapOutputTab) getOutputTab();
+            legendWindow = new LegendWindow(tab.getThemePanel().getThemeList());
+        }
+
+        legendWindow.show();
+    }
+
+
     protected ImgButton createGetFeatureInfo() {
         MapOutputTab ot = (MapOutputTab) getOutputTab();
         if (ot == null) {
@@ -678,5 +707,12 @@
 
         return url;
     }
+
+
+    public void updateThemes(ThemeList themeList) {
+        if (legendWindow != null) {
+            legendWindow.update(themeList);
+        }
+    }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org