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;
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;
private boolean resizing;
+ private boolean resized = false;
+
private int origX;
private int origY;
return;
}
+ clickEventHandler.handleEventHandlerRegistration(client);
+
if (uidl.hasAttribute("style")) {
componentStyleNames = uidl.getStringAttribute("style").split(" ");
} else {
// This is needed at least for cases like #3458 to take
// appearing/disappearing scrollbars into account.
client.runDescendentsLayout(this);
-
+
rendering = false;
}
resizing = false;
break;
}
+ // Only fire click event listeners if the splitter isn't moved
+ if (!resized) {
+ super.onBrowserEvent(event);
+ }
}
public void onMouseDown(Event event) {
final Element trg = DOM.eventGetTarget(event);
if (trg == splitter || trg == DOM.getChild(splitter, 0)) {
resizing = true;
+ resized = false;
if (BrowserInfo.get().isGecko()) {
showDraggingCurtain();
}
}
DOM.setStyleAttribute(splitter, "left", newX + "px");
updateSplitPosition(newX);
+ if (origX != newX) {
+ resized = true;
+ }
}
private void onVerticalMouseMove(int y) {
}
DOM.setStyleAttribute(splitter, "top", newY + "px");
updateSplitPosition(newY);
+ if (origY != newY) {
+ resized = true;
+ }
}
public void onMouseUp(Event event) {
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.
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>.
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);
}
}