]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fixes #3526: SplitPanel collapse and expand with doubleclick
authorJouni Koivuviita <jouni.koivuviita@itmill.com>
Tue, 8 Dec 2009 10:07:23 +0000 (10:07 +0000)
committerJouni Koivuviita <jouni.koivuviita@itmill.com>
Tue, 8 Dec 2009 10:07:23 +0000 (10:07 +0000)
 * Added SplitterClickEvent support for SplitPanel.

svn changeset:10187/svn branch:6.2

src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java
src/com/vaadin/ui/SplitPanel.java

index 28dba93a0443648fb6ae05c601f43bfdf947719b..82839f2f31dfe3c3270b922b333b07c31c2526c7 100644 (file)
@@ -6,6 +6,10 @@ package com.vaadin.terminal.gwt.client.ui;
 
 import java.util.Set;
 
+import com.google.gwt.dom.client.NativeEvent;
+import com.google.gwt.event.dom.client.DomEvent.Type;
+import com.google.gwt.event.shared.EventHandler;
+import com.google.gwt.event.shared.HandlerRegistration;
 import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.DOM;
 import com.google.gwt.user.client.DeferredCommand;
@@ -28,6 +32,25 @@ public class VSplitPanel extends ComplexPanel implements Container,
         ContainerResizedListener {
     public static final String CLASSNAME = "v-splitpanel";
 
+    public static final String SPLITTER_CLICK_EVENT_IDENTIFIER = "sp_click";
+
+    private ClickEventHandler clickEventHandler = new ClickEventHandler(this,
+            SPLITTER_CLICK_EVENT_IDENTIFIER) {
+
+        @Override
+        protected <H extends EventHandler> HandlerRegistration registerHandler(
+                H handler, Type<H> type) {
+            return addDomHandler(handler, type);
+        }
+
+        @Override
+        protected void fireClick(NativeEvent event) {
+            if (splitter.isOrHasChild((Element) event.getEventTarget().cast())) {
+                super.fireClick(event);
+            }
+        }
+    };
+
     public static final int ORIENTATION_HORIZONTAL = 0;
 
     public static final int ORIENTATION_VERTICAL = 1;
@@ -50,6 +73,8 @@ public class VSplitPanel extends ComplexPanel implements Container,
 
     private boolean resizing;
 
+    private boolean resized = false;
+
     private int origX;
 
     private int origY;
@@ -157,6 +182,8 @@ public class VSplitPanel extends ComplexPanel implements Container,
             return;
         }
 
+        clickEventHandler.handleEventHandlerRegistration(client);
+
         if (uidl.hasAttribute("style")) {
             componentStyleNames = uidl.getStringAttribute("style").split(" ");
         } else {
@@ -202,7 +229,7 @@ public class VSplitPanel extends ComplexPanel implements Container,
         // This is needed at least for cases like #3458 to take
         // appearing/disappearing scrollbars into account.
         client.runDescendentsLayout(this);
-        
+
         rendering = false;
 
     }
@@ -353,6 +380,10 @@ public class VSplitPanel extends ComplexPanel implements Container,
             resizing = false;
             break;
         }
+        // Only fire click event listeners if the splitter isn't moved
+        if (!resized) {
+            super.onBrowserEvent(event);
+        }
     }
 
     public void onMouseDown(Event event) {
@@ -362,6 +393,7 @@ public class VSplitPanel extends ComplexPanel implements Container,
         final Element trg = DOM.eventGetTarget(event);
         if (trg == splitter || trg == DOM.getChild(splitter, 0)) {
             resizing = true;
+            resized = false;
             if (BrowserInfo.get().isGecko()) {
                 showDraggingCurtain();
             }
@@ -403,6 +435,9 @@ public class VSplitPanel extends ComplexPanel implements Container,
         }
         DOM.setStyleAttribute(splitter, "left", newX + "px");
         updateSplitPosition(newX);
+        if (origX != newX) {
+            resized = true;
+        }
     }
 
     private void onVerticalMouseMove(int y) {
@@ -416,6 +451,9 @@ public class VSplitPanel extends ComplexPanel implements Container,
         }
         DOM.setStyleAttribute(splitter, "top", newY + "px");
         updateSplitPosition(newY);
+        if (origY != newY) {
+            resized = true;
+        }
     }
 
     public void onMouseUp(Event event) {
index 7d510239e94167f0fc76f5f26f9479c8aa8f532d..17bc0b64c108c788e361d5727785e536c030c7a1 100644 (file)
@@ -4,13 +4,19 @@
 
 package com.vaadin.ui;
 
+import java.lang.reflect.Method;
 import java.util.Iterator;
 import java.util.Map;
 
+import com.vaadin.event.ComponentEventListener;
+import com.vaadin.event.MouseEvents.ClickEvent;
 import com.vaadin.terminal.PaintException;
 import com.vaadin.terminal.PaintTarget;
 import com.vaadin.terminal.Sizeable;
+import com.vaadin.terminal.gwt.client.MouseEventDetails;
+import com.vaadin.terminal.gwt.client.ui.VSplitPanel;
 import com.vaadin.terminal.gwt.client.ui.VSplitPanelHorizontal;
+import com.vaadin.tools.ReflectTools;
 
 /**
  * SplitPanel.
@@ -54,6 +60,8 @@ public class SplitPanel extends AbstractLayout {
 
     private boolean locked = false;
 
+    private static final String SPLITTER_CLICK_EVENT = VSplitPanel.SPLITTER_CLICK_EVENT_IDENTIFIER;
+
     /**
      * Creates a new split panel. The orientation of the panels is
      * <code>ORIENTATION_VERTICAL</code>.
@@ -331,6 +339,58 @@ public class SplitPanel extends AbstractLayout {
             setSplitPosition(newPos, UNITS_PIXELS);
         }
 
+        if (variables.containsKey(SPLITTER_CLICK_EVENT)) {
+            fireClick((Map<String, Object>) variables.get(SPLITTER_CLICK_EVENT));
+        }
+
+    }
+
+    private void fireClick(Map<String, Object> parameters) {
+        MouseEventDetails mouseDetails = MouseEventDetails
+                .deSerialize((String) parameters.get("mouseDetails"));
+
+        fireEvent(new SplitterClickEvent(this, mouseDetails));
+    }
+
+    /**
+     * <code>SplitterClickListener</code> interface for listening for
+     * <code>SplitterClickEvent</code> fired by a <code>SplitPanel</code>.
+     * 
+     * @see SplitterClickEvent
+     * @since 6.2
+     */
+    public interface SplitterClickListener extends ComponentEventListener {
+
+        public static final Method clickMethod = ReflectTools.findMethod(
+                SplitterClickListener.class, "splitterClick",
+                SplitterClickEvent.class);
+
+        /**
+         * SplitPanel splitter has been clicked
+         * 
+         * @param event
+         *            SplitterClickEvent event.
+         */
+        public void splitterClick(SplitterClickEvent event);
+    }
+
+    public class SplitterClickEvent extends ClickEvent {
+
+        public SplitterClickEvent(Component source,
+                MouseEventDetails mouseEventDetails) {
+            super(source, mouseEventDetails);
+        }
+
+    }
+
+    public void addListener(SplitterClickListener listener) {
+        addListener(SPLITTER_CLICK_EVENT, SplitterClickEvent.class, listener,
+                SplitterClickListener.clickMethod);
+    }
+
+    public void removeListener(SplitterClickListener listener) {
+        removeListener(SPLITTER_CLICK_EVENT, SplitterClickListener.class,
+                listener);
     }
 
 }