From 60bb5b1d4d74103aa43de3987e969fdfe8698b49 Mon Sep 17 00:00:00 2001 From: Jouni Koivuviita Date: Tue, 8 Dec 2009 10:07:23 +0000 Subject: [PATCH] Fixes #3526: SplitPanel collapse and expand with doubleclick * Added SplitterClickEvent support for SplitPanel. svn changeset:10187/svn branch:6.2 --- .../terminal/gwt/client/ui/VSplitPanel.java | 40 ++++++++++++- src/com/vaadin/ui/SplitPanel.java | 60 +++++++++++++++++++ 2 files changed, 99 insertions(+), 1 deletion(-) diff --git a/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java b/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java index 28dba93a04..82839f2f31 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java @@ -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 HandlerRegistration registerHandler( + H handler, Type 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) { diff --git a/src/com/vaadin/ui/SplitPanel.java b/src/com/vaadin/ui/SplitPanel.java index 7d510239e9..17bc0b64c1 100644 --- a/src/com/vaadin/ui/SplitPanel.java +++ b/src/com/vaadin/ui/SplitPanel.java @@ -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 * ORIENTATION_VERTICAL. @@ -331,6 +339,58 @@ public class SplitPanel extends AbstractLayout { setSplitPosition(newPos, UNITS_PIXELS); } + if (variables.containsKey(SPLITTER_CLICK_EVENT)) { + fireClick((Map) variables.get(SPLITTER_CLICK_EVENT)); + } + + } + + private void fireClick(Map parameters) { + MouseEventDetails mouseDetails = MouseEventDetails + .deSerialize((String) parameters.get("mouseDetails")); + + fireEvent(new SplitterClickEvent(this, mouseDetails)); + } + + /** + * SplitterClickListener interface for listening for + * SplitterClickEvent fired by a SplitPanel. + * + * @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); } } -- 2.39.5