aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Alhroos <john.ahlroos@itmill.com>2010-04-14 07:07:02 +0000
committerJohn Alhroos <john.ahlroos@itmill.com>2010-04-14 07:07:02 +0000
commitcf2ec16a3cb585cb3eb70f6d77c3cdf135ec5675 (patch)
tree0a20b06e5f4a2613def2abb6f8a78cd15cae7282
parentaf2c6f3ab2d9378904301a48c13d2cce2a4248c0 (diff)
downloadvaadin-framework-cf2ec16a3cb585cb3eb70f6d77c3cdf135ec5675.tar.gz
vaadin-framework-cf2ec16a3cb585cb3eb70f6d77c3cdf135ec5675.zip
Added header click events #4525
svn changeset:12523/svn branch:6.4
-rw-r--r--src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java15
-rw-r--r--src/com/vaadin/ui/Table.java135
2 files changed, 150 insertions, 0 deletions
diff --git a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java
index c9ed94fd5b..a98b60fe60 100644
--- a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java
+++ b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java
@@ -85,6 +85,7 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler,
public static final String CLASSNAME = "v-table";
public static final String ITEM_CLICK_EVENT_ID = "itemClick";
+ public static final String HEADER_CLICK_EVENT_ID = "handleHeaderClick";
private static final double CACHE_RATE_DEFAULT = 2;
@@ -1174,6 +1175,18 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler,
floatingCopyOfHeaderCell = null;
}
+ private void fireHeaderClickedEvent(Event event) {
+ if (client.hasEventListeners(VScrollTable.this,
+ HEADER_CLICK_EVENT_ID)) {
+ MouseEventDetails details = new MouseEventDetails(event);
+ client.updateVariable(paintableId, "headerClickEvent", details
+ .toString(), false);
+ client
+ .updateVariable(paintableId, "headerClickCID", cid,
+ false);
+ }
+ }
+
protected void handleCaptionEvent(Event event) {
switch (DOM.eventGetType(event)) {
case Event.ONMOUSEDOWN:
@@ -1224,8 +1237,10 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler,
* cache_rate + pageLength));
rowRequestHandler.deferRowFetch();
}
+ fireHeaderClickedEvent(event);
break;
}
+ fireHeaderClickedEvent(event);
break;
case Event.ONMOUSEMOVE:
if (dragging) {
diff --git a/src/com/vaadin/ui/Table.java b/src/com/vaadin/ui/Table.java
index e2c0a0d80f..69b619054c 100644
--- a/src/com/vaadin/ui/Table.java
+++ b/src/com/vaadin/ui/Table.java
@@ -5,6 +5,7 @@
package com.vaadin.ui;
import java.io.Serializable;
+import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
@@ -386,6 +387,8 @@ public class Table extends AbstractSelect implements Action.Container,
private MultiSelectMode multiSelectMode = MultiSelectMode.DEFAULT;
+ private HeaderClickHandler headerClickHandler;
+
/* Table constructors */
/**
@@ -2035,6 +2038,19 @@ public class Table extends AbstractSelect implements Action.Container,
evt));
}
}
+
+ else if (variables.containsKey("headerClickEvent")) {
+
+ MouseEventDetails details = MouseEventDetails
+ .deSerialize((String) variables.get("headerClickEvent"));
+
+ Object cid = variables.get("headerClickCID");
+ Object propertyId = null;
+ if (cid != null) {
+ propertyId = columnIdMap.get(cid.toString());
+ }
+ fireEvent(new HeaderClickEvent(this, propertyId, details));
+ }
}
/**
@@ -3568,4 +3584,123 @@ public class Table extends AbstractSelect implements Action.Container,
}
+ /**
+ * Click event fired when clicking on the Table headers. The event includes
+ * a reference the the Table the event originated from, the property id of
+ * the column which header was pressed and details about the mouse event
+ * itself.
+ */
+ public static class HeaderClickEvent extends Component.Event {
+ public static final Method HEADER_CLICK_METHOD;
+
+ static {
+ try {
+ // Set the header click method
+ HEADER_CLICK_METHOD = HeaderClickHandler.class
+ .getDeclaredMethod("handleHeaderClick",
+ new Class[] { HeaderClickEvent.class });
+ } catch (final java.lang.NoSuchMethodException e) {
+ // This should never happen
+ throw new java.lang.RuntimeException();
+ }
+ }
+
+ // The property id of the column which header was pressed
+ private Object columnPropertyId;
+
+ // The mouse details
+ private MouseEventDetails details;
+
+ public HeaderClickEvent(Component source, Object propertyId,
+ MouseEventDetails details) {
+ super(source);
+ this.details = details;
+ columnPropertyId = propertyId;
+ }
+
+ /**
+ * Gets the property id of the column which header was pressed
+ *
+ * @return The column propety id
+ */
+ public Object getPropertyId() {
+ return columnPropertyId;
+ }
+
+ /**
+ * Returns the details of the mouse event like the mouse coordinates,
+ * button pressed etc.
+ *
+ * @return The mouse details
+ */
+ public MouseEventDetails getEventDetails() {
+ return details;
+ }
+ }
+
+ /**
+ * Interface for the handler listening to column change events. The
+ * handleHeaderClick method is called when the user presses a header column
+ * cell.
+ */
+ public interface HeaderClickHandler {
+
+ /**
+ * Called when a user clicks a header column cell
+ *
+ * @param event
+ * The event which contains information about the column and
+ * the mouse click event
+ */
+ public void handleHeaderClick(HeaderClickEvent event);
+ }
+
+ /**
+ * Sets the header click handler which handles the click events when the
+ * user clicks on a column header cell in the Table.
+ * <p>
+ * The handler will receive events which contains information about which
+ * column was clicked and some details about the mouse event.
+ * </p>
+ *
+ * @param handler
+ * The handler which should handle the header click events.
+ */
+ public void setHeaderClickHandler(HeaderClickHandler handler) {
+ if (headerClickHandler != handler) {
+ if (handler == null && headerClickHandler != null) {
+ // Remove header click handler
+ removeListener(VScrollTable.HEADER_CLICK_EVENT_ID,
+ HeaderClickEvent.class, headerClickHandler);
+
+ headerClickHandler = handler;
+ } else if (headerClickHandler != null) {
+ // Replace header click handler
+ removeListener(VScrollTable.HEADER_CLICK_EVENT_ID,
+ HeaderClickEvent.class, headerClickHandler);
+
+ headerClickHandler = handler;
+
+ addListener(VScrollTable.HEADER_CLICK_EVENT_ID,
+ HeaderClickEvent.class, headerClickHandler,
+ HeaderClickEvent.HEADER_CLICK_METHOD);
+ } else if (handler != null) {
+ // Set a new header click handler
+ headerClickHandler = handler;
+ addListener(VScrollTable.HEADER_CLICK_EVENT_ID,
+ HeaderClickEvent.class, headerClickHandler,
+ HeaderClickEvent.HEADER_CLICK_METHOD);
+ }
+ }
+ }
+
+ /**
+ * Returns the header click handler which receives click events from the
+ * columns header cells when they are clicked on.
+ *
+ * @return
+ */
+ public HeaderClickHandler getHeaderClickHandler() {
+ return headerClickHandler;
+ }
}