cur = cur.parentNode;
}
}-*/;
+
+ /**
+ * Checks if the given event is either a touch event or caused by the left
+ * mouse button
+ *
+ * @param event
+ * @return true if the event is a touch event or caused by the left mouse
+ * button, false otherwise
+ */
+ public static boolean isTouchEventOrLeftMouseButton(Event event) {
+ int eventType = event.getTypeInt();
+ boolean touchEvent = Util.isTouchEvent(event);
+ return touchEvent || event.getButton() == Event.BUTTON_LEFT;
+ }
}
DOM.appendChild(td, captionContainer);
- DOM.sinkEvents(td, Event.MOUSEEVENTS | Event.TOUCHEVENTS);
+ DOM.sinkEvents(td, Event.MOUSEEVENTS | Event.ONDBLCLICK
+ | Event.ONCONTEXTMENU | Event.TOUCHEVENTS);
setElement(td);
scrollBodyPanel.setFocus(true);
}
handleCaptionEvent(event);
- event.stopPropagation();
- event.preventDefault();
+ boolean stopPropagation = true;
+ if (event.getTypeInt() == Event.ONCONTEXTMENU
+ && !client.hasEventListeners(VScrollTable.this,
+ HEADER_CLICK_EVENT_ID)) {
+ // Prevent showing the browser's context menu only when
+ // there is a header click listener.
+ stopPropagation = false;
+ }
+ if (stopPropagation) {
+ event.stopPropagation();
+ event.preventDefault();
+ }
}
}
}
switch (DOM.eventGetType(event)) {
case Event.ONTOUCHSTART:
case Event.ONMOUSEDOWN:
- if (columnReordering) {
+ if (columnReordering
+ && Util.isTouchEventOrLeftMouseButton(event)) {
if (event.getTypeInt() == Event.ONTOUCHSTART) {
/*
* prevent using this event in e.g. scrolling
case Event.ONMOUSEUP:
case Event.ONTOUCHEND:
case Event.ONTOUCHCANCEL:
- if (columnReordering) {
+ if (columnReordering
+ && Util.isTouchEventOrLeftMouseButton(event)) {
dragging = false;
DOM.releaseCapture(getElement());
if (moved) {
break;
}
break;
- case Event.ONCONTEXTMENU:
- if (client.hasEventListeners(VScrollTable.this,
- HEADER_CLICK_EVENT_ID)) {
- // Prevent showing the browser's context menu when there is
- // a right click listener.
- event.preventDefault();
- }
- break;
case Event.ONDBLCLICK:
fireHeaderClickedEvent(event);
break;
DOM.appendChild(td, captionContainer);
- DOM.sinkEvents(td, Event.MOUSEEVENTS);
+ DOM.sinkEvents(td, Event.MOUSEEVENTS | Event.ONDBLCLICK
+ | Event.ONCONTEXTMENU);
setElement(td);
}
if (DOM.eventGetType(event) == Event.ONMOUSEUP) {
scrollBodyPanel.setFocus(true);
}
- event.stopPropagation();
- event.preventDefault();
+ boolean stopPropagation = true;
+ if (event.getTypeInt() == Event.ONCONTEXTMENU
+ && !client.hasEventListeners(VScrollTable.this,
+ FOOTER_CLICK_EVENT_ID)) {
+ // Show browser context menu if a footer click listener is
+ // not present
+ stopPropagation = false;
+ }
+ if (stopPropagation) {
+ event.stopPropagation();
+ event.preventDefault();
+ }
}
}
* The event to handle
*/
protected void handleCaptionEvent(Event event) {
- if (DOM.eventGetType(event) == Event.ONMOUSEUP) {
+ if (event.getTypeInt() == Event.ONMOUSEUP
+ || event.getTypeInt() == Event.ONDBLCLICK) {
fireFooterClickedEvent(event);
}
}
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head profile="http://selenium-ide.openqa.org/profiles/test-case">
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<link rel="selenium.base" href="" />
+<title>New Test</title>
+</head>
+<body>
+<table cellpadding="1" cellspacing="1" border="1">
+<thead>
+<tr><td rowspan="1" colspan="3">New Test</td></tr>
+</thead><tbody>
+<tr>
+ <td>open</td>
+ <td>/run/com.vaadin.tests.components.table.HeaderFooterClickLeftRightMiddle?restartApplication</td>
+ <td></td>
+</tr>
+<tr>
+ <td>mouseClick</td>
+ <td>vaadin=runcomvaadintestscomponentstableHeaderFooterClickLeftRightMiddle::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[5]/VScrollTable[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[2]</td>
+ <td>59,8</td>
+</tr>
+<tr>
+ <td>assertText</td>
+ <td>vaadin=runcomvaadintestscomponentstableHeaderFooterClickLeftRightMiddle::PID_SLog_row_0</td>
+ <td>1. Click on header col1 using left</td>
+</tr>
+<tr>
+ <td>mouseDownRight</td>
+ <td>vaadin=runcomvaadintestscomponentstableHeaderFooterClickLeftRightMiddle::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[5]/VScrollTable[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[2]</td>
+ <td></td>
+</tr>
+<tr>
+ <td>mouseUpRight</td>
+ <td>vaadin=runcomvaadintestscomponentstableHeaderFooterClickLeftRightMiddle::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[5]/VScrollTable[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[2]</td>
+ <td></td>
+</tr>
+<tr>
+ <td>assertText</td>
+ <td>vaadin=runcomvaadintestscomponentstableHeaderFooterClickLeftRightMiddle::PID_SLog_row_0</td>
+ <td>2. Click on header col1 using right</td>
+</tr>
+<tr>
+ <td>doubleClick</td>
+ <td>vaadin=runcomvaadintestscomponentstableHeaderFooterClickLeftRightMiddle::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[5]/VScrollTable[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[2]</td>
+ <td></td>
+</tr>
+<tr>
+ <td>assertText</td>
+ <td>vaadin=runcomvaadintestscomponentstableHeaderFooterClickLeftRightMiddle::PID_SLog_row_0</td>
+ <td>3. Double click on header col1 using left</td>
+</tr>
+<tr>
+ <td>mouseClick</td>
+ <td>vaadin=runcomvaadintestscomponentstableHeaderFooterClickLeftRightMiddle::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[5]/VScrollTable[0]/domChild[2]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[1]</td>
+ <td>59,8</td>
+</tr>
+<tr>
+ <td>assertText</td>
+ <td>vaadin=runcomvaadintestscomponentstableHeaderFooterClickLeftRightMiddle::PID_SLog_row_0</td>
+ <td>4. Click on footer col2 using left</td>
+</tr>
+<tr>
+ <td>mouseDownRight</td>
+ <td>vaadin=runcomvaadintestscomponentstableHeaderFooterClickLeftRightMiddle::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[5]/VScrollTable[0]/domChild[2]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[1]</td>
+ <td></td>
+</tr>
+<tr>
+ <td>mouseUpRight</td>
+ <td>vaadin=runcomvaadintestscomponentstableHeaderFooterClickLeftRightMiddle::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[5]/VScrollTable[0]/domChild[2]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[1]</td>
+ <td></td>
+</tr>
+<tr>
+ <td>assertText</td>
+ <td>vaadin=runcomvaadintestscomponentstableHeaderFooterClickLeftRightMiddle::PID_SLog_row_0</td>
+ <td>5. Click on footer col2 using right</td>
+</tr>
+<tr>
+ <td>doubleClick</td>
+ <td>vaadin=runcomvaadintestscomponentstableHeaderFooterClickLeftRightMiddle::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[5]/VScrollTable[0]/domChild[2]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[1]</td>
+ <td></td>
+</tr>
+<tr>
+ <td>assertText</td>
+ <td>vaadin=runcomvaadintestscomponentstableHeaderFooterClickLeftRightMiddle::PID_SLog_row_0</td>
+ <td>6. Double click on footer col2 using left</td>
+</tr>
+
+</tbody></table>
+</body>
+</html>
--- /dev/null
+package com.vaadin.tests.components.table;
+
+import com.vaadin.data.Container;
+import com.vaadin.data.Item;
+import com.vaadin.data.Property.ValueChangeEvent;
+import com.vaadin.data.Property.ValueChangeListener;
+import com.vaadin.data.util.IndexedContainer;
+import com.vaadin.tests.components.TestBase;
+import com.vaadin.tests.util.Log;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Button.ClickListener;
+import com.vaadin.ui.CheckBox;
+import com.vaadin.ui.Table;
+import com.vaadin.ui.Table.FooterClickEvent;
+import com.vaadin.ui.Table.FooterClickListener;
+import com.vaadin.ui.Table.HeaderClickEvent;
+import com.vaadin.ui.Table.HeaderClickListener;
+
+public class HeaderFooterClickLeftRightMiddle extends TestBase {
+
+ private Log log = new Log(10);
+
+ @Override
+ protected void setup() {
+ final Table table = new Table();
+ table.setColumnReorderingAllowed(true);
+ table.setContainerDataSource(createContainer());
+ table.setWidth("400px");
+ table.setHeight("400px");
+ table.setImmediate(true);
+ table.setFooterVisible(true);
+
+ CheckBox immediateCheckbox = new CheckBox("Immediate");
+ immediateCheckbox.setImmediate(true);
+ immediateCheckbox.setValue(table.isImmediate());
+ immediateCheckbox.addListener(new ClickListener() {
+
+ public void buttonClick(ClickEvent event) {
+ table.setImmediate(event.getButton().booleanValue());
+ }
+ });
+
+ CheckBox headerClickListenerCheckbox = new CheckBox(
+ "Header click listener");
+ headerClickListenerCheckbox.setImmediate(true);
+ headerClickListenerCheckbox.addListener(new ValueChangeListener() {
+
+ private HeaderClickListener headerClickListener = new HeaderClickListener() {
+
+ public void headerClick(HeaderClickEvent event) {
+ String type = event.isDoubleClick() ? "Double click"
+ : "Click";
+ log.log(type + " on header "
+ + event.getPropertyId().toString() + " using "
+ + event.getButtonName());
+ }
+
+ };
+
+ public void valueChange(ValueChangeEvent event) {
+ if (table.getListeners(HeaderClickEvent.class).isEmpty()) {
+ table.addListener(headerClickListener);
+ } else {
+ table.removeListener(headerClickListener);
+ }
+ }
+ });
+ headerClickListenerCheckbox.setValue(true);
+
+ CheckBox footerClickListenerCheckbox = new CheckBox(
+ "Footer click listener");
+ footerClickListenerCheckbox.setImmediate(true);
+ footerClickListenerCheckbox.addListener(new ValueChangeListener() {
+
+ private FooterClickListener footerClickListener = new FooterClickListener() {
+
+ public void footerClick(FooterClickEvent event) {
+ String type = event.isDoubleClick() ? "Double click"
+ : "Click";
+ log.log(type + " on footer "
+ + event.getPropertyId().toString() + " using "
+ + event.getButtonName());
+ }
+ };
+
+ public void valueChange(ValueChangeEvent event) {
+ if (table.getListeners(FooterClickEvent.class).isEmpty()) {
+ table.addListener(footerClickListener);
+ } else {
+ table.removeListener(footerClickListener);
+ }
+ }
+ });
+ footerClickListenerCheckbox.setValue(true);
+
+ CheckBox sortEnabledCheckbox = new CheckBox("Sortable");
+ sortEnabledCheckbox.setImmediate(true);
+ sortEnabledCheckbox.setValue(!table.isSortDisabled());
+ sortEnabledCheckbox.addListener(new ClickListener() {
+
+ public void buttonClick(ClickEvent event) {
+ table.setSortDisabled(!event.getButton().booleanValue());
+ }
+ });
+
+ CheckBox columnReorderingCheckbox = new CheckBox(
+ "Column reordering allowed");
+ columnReorderingCheckbox.setImmediate(true);
+ columnReorderingCheckbox.setValue(table.isColumnReorderingAllowed());
+ columnReorderingCheckbox.addListener(new ClickListener() {
+
+ public void buttonClick(ClickEvent event) {
+ table.setColumnReorderingAllowed(event.getButton()
+ .booleanValue());
+ }
+ });
+
+ addComponent(immediateCheckbox);
+ addComponent(headerClickListenerCheckbox);
+ addComponent(footerClickListenerCheckbox);
+ addComponent(sortEnabledCheckbox);
+ addComponent(columnReorderingCheckbox);
+ addComponent(table);
+ addComponent(log);
+
+ }
+
+ @Override
+ protected String getDescription() {
+ return "Tests the header click listener";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 4515;
+ }
+
+ private Container createContainer() {
+ IndexedContainer container = new IndexedContainer();
+ container.addContainerProperty("col1", String.class, "");
+ container.addContainerProperty("col2", String.class, "");
+ container.addContainerProperty("col3", String.class, "");
+
+ for (int i = 0; i < 100; i++) {
+ Item item = container.addItem("item " + i);
+ item.getItemProperty("col1").setValue("first" + i);
+ item.getItemProperty("col2").setValue("middle" + i);
+ item.getItemProperty("col3").setValue("last" + i);
+ }
+
+ return container;
+ }
+
+}