]> source.dussan.org Git - vaadin-framework.git/commitdiff
#8284, #8336 Fixed header and footer click for right and middle click. Browser contex...
authorArtur Signell <artur.signell@itmill.com>
Fri, 3 Feb 2012 15:00:39 +0000 (15:00 +0000)
committerArtur Signell <artur.signell@itmill.com>
Fri, 3 Feb 2012 15:00:39 +0000 (15:00 +0000)
svn changeset:22887/svn branch:6.7

src/com/vaadin/terminal/gwt/client/Util.java
src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java
tests/testbench/com/vaadin/tests/components/table/HeaderFooterClickLeftRightMiddle.html [new file with mode: 0644]
tests/testbench/com/vaadin/tests/components/table/HeaderFooterClickLeftRightMiddle.java [new file with mode: 0644]

index 3dbbd22329c2091a668d5f85f229d0487907e83f..60afcc28392f67cdef588aecff5177f8a31a07fc 100644 (file)
@@ -1321,4 +1321,18 @@ public class Util {
           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;
+    }
 }
index f7d23d44534be07fd83686ba71ba7c9440a870a3..cff25e00bfba9fe439b6460131a933b09158870d 100644 (file)
@@ -2338,7 +2338,8 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler,
 
             DOM.appendChild(td, captionContainer);
 
-            DOM.sinkEvents(td, Event.MOUSEEVENTS | Event.TOUCHEVENTS);
+            DOM.sinkEvents(td, Event.MOUSEEVENTS | Event.ONDBLCLICK
+                    | Event.ONCONTEXTMENU | Event.TOUCHEVENTS);
 
             setElement(td);
 
@@ -2455,8 +2456,18 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler,
                         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();
+                    }
                 }
             }
         }
@@ -2513,7 +2524,8 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler,
             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
@@ -2532,7 +2544,8 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler,
             case Event.ONMOUSEUP:
             case Event.ONTOUCHEND:
             case Event.ONTOUCHCANCEL:
-                if (columnReordering) {
+                if (columnReordering
+                        && Util.isTouchEventOrLeftMouseButton(event)) {
                     dragging = false;
                     DOM.releaseCapture(getElement());
                     if (moved) {
@@ -2592,14 +2605,6 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler,
                     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;
@@ -3338,7 +3343,8 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler,
 
             DOM.appendChild(td, captionContainer);
 
-            DOM.sinkEvents(td, Event.MOUSEEVENTS);
+            DOM.sinkEvents(td, Event.MOUSEEVENTS | Event.ONDBLCLICK
+                    | Event.ONCONTEXTMENU);
 
             setElement(td);
         }
@@ -3523,8 +3529,18 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler,
                 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();
+                }
             }
         }
 
@@ -3535,7 +3551,8 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler,
          *            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);
             }
         }
diff --git a/tests/testbench/com/vaadin/tests/components/table/HeaderFooterClickLeftRightMiddle.html b/tests/testbench/com/vaadin/tests/components/table/HeaderFooterClickLeftRightMiddle.html
new file mode 100644 (file)
index 0000000..1ab1c61
--- /dev/null
@@ -0,0 +1,92 @@
+<?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>
diff --git a/tests/testbench/com/vaadin/tests/components/table/HeaderFooterClickLeftRightMiddle.java b/tests/testbench/com/vaadin/tests/components/table/HeaderFooterClickLeftRightMiddle.java
new file mode 100644 (file)
index 0000000..642067d
--- /dev/null
@@ -0,0 +1,154 @@
+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;
+    }
+
+}