From cf2ec16a3cb585cb3eb70f6d77c3cdf135ec5675 Mon Sep 17 00:00:00 2001 From: John Alhroos Date: Wed, 14 Apr 2010 07:07:02 +0000 Subject: [PATCH] Added header click events #4525 svn changeset:12523/svn branch:6.4 --- .../terminal/gwt/client/ui/VScrollTable.java | 15 ++ src/com/vaadin/ui/Table.java | 135 ++++++++++++++++++ 2 files changed, 150 insertions(+) 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. + *

+ * The handler will receive events which contains information about which + * column was clicked and some details about the mouse event. + *

+ * + * @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; + } } -- 2.39.5