diff options
author | Jouni Koivuviita <jouni.koivuviita@itmill.com> | 2009-12-08 10:07:23 +0000 |
---|---|---|
committer | Jouni Koivuviita <jouni.koivuviita@itmill.com> | 2009-12-08 10:07:23 +0000 |
commit | 60bb5b1d4d74103aa43de3987e969fdfe8698b49 (patch) | |
tree | 30db0ac29ab191c27eaad0a4e2329180720d2bbc /src/com/vaadin | |
parent | 59529c477e91f8cf633245b33f44fd6f783e9970 (diff) | |
download | vaadin-framework-60bb5b1d4d74103aa43de3987e969fdfe8698b49.tar.gz vaadin-framework-60bb5b1d4d74103aa43de3987e969fdfe8698b49.zip |
Fixes #3526: SplitPanel collapse and expand with doubleclick
* Added SplitterClickEvent support for SplitPanel.
svn changeset:10187/svn branch:6.2
Diffstat (limited to 'src/com/vaadin')
-rw-r--r-- | src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java | 40 | ||||
-rw-r--r-- | src/com/vaadin/ui/SplitPanel.java | 60 |
2 files changed, 99 insertions, 1 deletions
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 <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) { 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 * <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); } } |