diff gwt-client/src/main/java/org/dive4elements/river/client/client/ui/LinkSelection.java @ 6119:0b9f0d37fe6e

We have a much faster interactive image map! * Image for highlighting rivers in link list instead of CSS manipulation. * Better event handling. * No more hover delay. Some problems still exist: * Sometime when switching the module to 'MINFO' the highlighted river on the image map is not unhighlighted. * The loop to unhighlight rivers when switching modules is called for every river.
author Raimund Renkert <rrenkert@intevation.de>
date Tue, 28 May 2013 15:57:10 +0200
parents 0eab06d5144f
children 2033f86a1863
line wrap: on
line diff
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/LinkSelection.java	Tue May 28 13:49:51 2013 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/LinkSelection.java	Tue May 28 15:57:10 2013 +0200
@@ -16,7 +16,10 @@
 import com.smartgwt.client.types.VerticalAlignment;
 import com.smartgwt.client.widgets.Canvas;
 import com.smartgwt.client.widgets.HTMLPane;
+import com.smartgwt.client.widgets.Img;
 import com.smartgwt.client.widgets.Label;
+import com.smartgwt.client.widgets.events.VisibilityChangedEvent;
+import com.smartgwt.client.widgets.events.VisibilityChangedHandler;
 import com.smartgwt.client.widgets.form.DynamicForm;
 import com.smartgwt.client.widgets.form.fields.LinkItem;
 import com.smartgwt.client.widgets.form.fields.events.ClickEvent;
@@ -42,6 +45,7 @@
  */
 public class LinkSelection
 extends      MapSelection
+implements   VisibilityChangedHandler
 {
 
     private static final long serialVersionUID = -7138270638349711024L;
@@ -51,7 +55,9 @@
 
     /** The selected river*/
     protected Data river;
-    private static Map<String, LinkItem> rivers;
+    private static Map<String, Img> riverHighlight;
+    private static Map<String, HLayout> riverList;
+    private static String selected;
     private static HLayout columns;
 
     private static Trigger trigger;
@@ -95,7 +101,8 @@
     public Canvas create(DataList data) {
         trigger = new Trigger(this);
         createCallback();
-        rivers = new HashMap<String, LinkItem>();
+        riverHighlight = new HashMap<String, Img>();
+        riverList = new HashMap<String, HLayout>();
 
         VLayout v = new VLayout();
         v.setMembersMargin(10);
@@ -182,22 +189,37 @@
 
             int counter = 0;
             for (DataItem item: d.getItems()) {
+                HLayout row = new HLayout();
                 LinkItem link = new LinkItem("river");
+                link.setHoverDelay(0);
                 link.setLinkTitle(item.getLabel());
                 link.setTarget(item.getStringValue());
                 link.setShowTitle(false);
+                Img img = new Img();
+                img.setShowTitle(false);
+                img.setSrc("marker_green.png");
+                img.setWidth(20);
+                img.setHeight(20);
+                img.setVisible(false);
+                Canvas container = new Canvas();
+                container.addChild(img);
+                container.setHeight(20);
+                container.setWidth(20);
                 DynamicForm f = new DynamicForm();
-                rivers.put(item.getStringValue(), link);
-
+                riverList.put(item.getStringValue(), row);
+                riverHighlight.put(item.getStringValue(), img);
                 f.setItems(link);
+                row.addMember(container);
+                row.addMember(f);
+                row.addVisibilityChangedHandler(this);
+                link.setColSpan(20);
                 if (counter < d.getItems().length/2) {
-                    formLayout1.addMember(f);
+                    formLayout1.addMember(row);
                 }
                 else {
-                    formLayout2.addMember(f);
+                    formLayout2.addMember(row);
                 }
                 counter++;
-
                 link.addClickHandler(new ClickHandler() {
                     @Override
                     public void onClick(ClickEvent event) {
@@ -218,27 +240,22 @@
                     @Override
                     public void onItemHover(ItemHoverEvent event) {
                         String river = ((LinkItem)event.getItem()).getLinkTitle();
-                        for (Map.Entry<String, LinkItem> entry: rivers.entrySet()) {
-                            String s = entry.getKey();
-                            LinkItem item = entry.getValue();
-                            if (item.getLinkTitle().equals(river)) {
-                                item.setCellStyle("riverLinkHighlight");
-                                callHighlightRiver(river);
+                        if (riverHighlight.containsKey(river)) {
+                            Img item = riverHighlight.get(river);
+                            item.setVisible(true);
+                            if (selected != null && !selected.equals(river)) {
+                                riverHighlight.get(selected).setVisible(false);
+                                callUnHighlightRiver(selected);
                             }
-                            else {
-                                item.setCellStyle("formCell");
-                                callUnHighlightRiver(s);
-                            }
-                        }
-                        if (columns != null) {
-                            columns.redraw();
+                            callHighlightRiver(river);
+                            selected = river;
                         }
                     }
                 });
             }
 
             if (module != null) {
-                getModuleSelection().setRivers(rivers);
+                getModuleSelection().setRivers(riverList);
             }
             label.setWidth(50);
 
@@ -270,24 +287,31 @@
 
     private native void createCallback() /*-{
         $wnd.highlightRiver = @org.dive4elements.river.client.client.ui.LinkSelection::highlightCallback(Ljava/lang/String;);
+        $wnd.unHighlightRiver = @org.dive4elements.river.client.client.ui.LinkSelection::unHighlightCallback(Ljava/lang/String;);
         $wnd.selectRiver = @org.dive4elements.river.client.client.ui.LinkSelection::selectCallback(Ljava/lang/String;);
         $wnd.availableRiver = @org.dive4elements.river.client.client.ui.LinkSelection::availableRiver(Ljava/lang/String;);
     }-*/;
 
     private static void highlightCallback(String name) {
-        for (Map.Entry<String, LinkItem> entry: rivers.entrySet()) {
-            String s = entry.getKey();
-            LinkItem item = entry.getValue();
-            item.setCellStyle(s.equals(name) ? "riverLinkHighlight" : "formCell");
+        if (riverHighlight.containsKey(name)) {
+            riverHighlight.get(name).setVisible(true);
+            if(selected != null && !selected.equals(name)) {
+                riverHighlight.get(selected).setVisible(false);
+            }
+            selected = name;
         }
-        if (columns != null) {
-            columns.redraw();
+    }
+
+    private static void unHighlightCallback(String name) {
+        if (riverHighlight.containsKey(name)) {
+            riverHighlight.get(name).setVisible(false);
+            selected = null;
         }
     }
 
     private static boolean availableRiver(String river) {
-        LinkItem ri = rivers.get(river);
-        return ri != null && ri.isVisible();
+        HLayout row = riverList.get(river);
+        return row != null && row.isVisible();
     }
 
     private static void selectCallback(String name) {
@@ -303,5 +327,15 @@
     private native void callUnHighlightRiver(String name) /*-{
         $wnd.unHighlight(name);
     }-*/;
+
+
+    @Override
+    public void onVisibilityChanged(VisibilityChangedEvent event) {
+        for (Map.Entry<String, Img> entry: riverHighlight.entrySet()) {
+            entry.getValue().setVisible(false);
+            callUnHighlightRiver(entry.getKey());
+        }
+        selected = null;
+    }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org