aboutsummaryrefslogtreecommitdiffstats
path: root/src/com/vaadin
diff options
context:
space:
mode:
authorJouni Koivuviita <jouni.koivuviita@itmill.com>2009-12-08 10:07:23 +0000
committerJouni Koivuviita <jouni.koivuviita@itmill.com>2009-12-08 10:07:23 +0000
commit60bb5b1d4d74103aa43de3987e969fdfe8698b49 (patch)
tree30db0ac29ab191c27eaad0a4e2329180720d2bbc /src/com/vaadin
parent59529c477e91f8cf633245b33f44fd6f783e9970 (diff)
downloadvaadin-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.java40
-rw-r--r--src/com/vaadin/ui/SplitPanel.java60
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);
}
}