]> source.dussan.org Git - vaadin-framework.git/commitdiff
Merged 6.2.2 fixes from /versions/6.2
authorArtur Signell <artur.signell@itmill.com>
Fri, 15 Jan 2010 18:39:11 +0000 (18:39 +0000)
committerArtur Signell <artur.signell@itmill.com>
Fri, 15 Jan 2010 18:39:11 +0000 (18:39 +0000)
svn changeset:10761/svn branch:6.3

12 files changed:
src/com/vaadin/data/util/DefaultItemSorter.java
src/com/vaadin/terminal/gwt/client/BrowserInfo.java
src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java
src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java
src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java
src/com/vaadin/terminal/gwt/server/PortletApplicationContext.java
tests/src/com/vaadin/tests/components/TestBase.java
tests/src/com/vaadin/tests/components/splitpanel/SplitPanelWithRichTextArea.java [new file with mode: 0644]
tests/src/com/vaadin/tests/components/textfield/TextFieldFocusAndBlurListeners.java
tests/src/com/vaadin/tests/layouts/TestLayoutClickListeners.java
tests/src/com/vaadin/tests/server/container/TestContainerSorting.java
tests/src/com/vaadin/tests/util/Log.java [new file with mode: 0644]

index 5cec2dc461971876d62f2efa083eef346834a864..aefdbf1cc91dd9fd65db1a40f3e056a705d7aea7 100644 (file)
@@ -62,6 +62,20 @@ public class DefaultItemSorter implements ItemSorter {
         Item item1 = container.getItem(o1);
         Item item2 = container.getItem(o2);
 
+        /*
+         * Items can be null if the container is filtered. Null is considered
+         * "less" than not-null.
+         */
+        if (item1 == null) {
+            if (item2 == null) {
+                return 0;
+            } else {
+                return 1;
+            }
+        } else if (item2 == null) {
+            return -1;
+        }
+
         for (int i = 0; i < sortPropertyIds.length; i++) {
 
             int result = compareProperty(sortPropertyIds[i], sortDirections[i],
index 2872ca360e1815cea17f8f32ec29a7cd2b695b15..fe5c6958ed654a2bdea2ba2a93e310e9223df5e7 100644 (file)
@@ -176,6 +176,10 @@ public class BrowserInfo {
         return isGecko;
     }
 
+    public boolean isWebkit() {
+        return isAppleWebKit;
+    }
+
     public boolean isFF2() {
         return isGecko && version == 1.8;
     }
index 4e17dcb8798d27ef47625ffe977d51e6bf7472f2..0a28fd6b41f65532895d2808601cd31c960201db 100644 (file)
@@ -57,6 +57,8 @@ public class VMenuBar extends Widget implements Paintable,
 
     private Timer layoutTimer;
 
+    private boolean enabled = true;
+
     public VMenuBar() {
         // Create an empty horizontal menubar
         this(false);
@@ -107,6 +109,7 @@ public class VMenuBar extends Widget implements Paintable,
         if (client.updateComponent(this, uidl, true)) {
             return;
         }
+        this.enabled = !uidl.getBooleanAttribute("disabled");
 
         // For future connections
         this.client = client;
@@ -371,13 +374,13 @@ public class VMenuBar extends Widget implements Paintable,
             switch (DOM.eventGetType(e)) {
 
             case Event.ONCLICK:
-                if (targetItem.isEnabled()) {
+                if (isEnabled() && targetItem.isEnabled()) {
                     itemClick(targetItem);
                 }
                 break;
 
             case Event.ONMOUSEOVER:
-                if (targetItem.isEnabled()) {
+                if (isEnabled() && targetItem.isEnabled()) {
                     itemOver(targetItem);
                 }
                 break;
@@ -389,6 +392,10 @@ public class VMenuBar extends Widget implements Paintable,
         }
     }
 
+    private boolean isEnabled() {
+        return enabled;
+    }
+
     private void requestLayout() {
         if (layoutTimer == null) {
             layoutTimer = new Timer() {
index ffada5325263eee3c49e79deea936fd6e2cb4e93..27fdf9506fa4511a7b181c0f80034fb30b6927d4 100644 (file)
@@ -40,12 +40,29 @@ public class VSplitPanel extends ComplexPanel implements Container,
         @Override
         protected <H extends EventHandler> HandlerRegistration registerHandler(
                 H handler, Type<H> type) {
-            return addDomHandler(handler, type);
+            if ((Event.getEventsSunk(splitter) & Event.getTypeInt(type
+                    .getName())) != 0) {
+                // If we are already sinking the event for the splitter we do
+                // not want to additionally sink it for the root element
+                return addHandler(handler, type);
+            } else {
+                return addDomHandler(handler, type);
+            }
         }
 
+        @Override
+        public void onContextMenu(
+                com.google.gwt.event.dom.client.ContextMenuEvent event) {
+            Element target = event.getNativeEvent().getEventTarget().cast();
+            if (splitter.isOrHasChild(target)) {
+                super.onContextMenu(event);
+            }
+        };
+
         @Override
         protected void fireClick(NativeEvent event) {
-            if (splitter.isOrHasChild((Element) event.getEventTarget().cast())) {
+            Element target = event.getEventTarget().cast();
+            if (splitter.isOrHasChild(target)) {
                 super.fireClick(event);
             }
         }
@@ -127,7 +144,6 @@ public class VSplitPanel extends ComplexPanel implements Container,
         setHeight(MIN_SIZE + "px");
         constructDom();
         setOrientation(orientation);
-        DOM.sinkEvents(splitter, (Event.MOUSEEVENTS));
         DOM.sinkEvents(getElement(), (Event.MOUSEEVENTS));
     }
 
@@ -183,7 +199,6 @@ public class VSplitPanel extends ComplexPanel implements Container,
         }
 
         clickEventHandler.handleEventHandlerRegistration(client);
-
         if (uidl.hasAttribute("style")) {
             componentStyleNames = uidl.getStringAttribute("style").split(" ");
         } else {
@@ -371,6 +386,14 @@ public class VSplitPanel extends ComplexPanel implements Container,
         case Event.ONMOUSEDOWN:
             onMouseDown(event);
             break;
+        case Event.ONMOUSEOUT:
+            // Dragging curtain interferes with click events if added in
+            // mousedown so we add it only when needed i.e., if the mouse moves
+            // outside the splitter.
+            if (resizing) {
+                showDraggingCurtain();
+            }
+            break;
         case Event.ONMOUSEUP:
             if (resizing) {
                 onMouseUp(event);
@@ -383,6 +406,10 @@ public class VSplitPanel extends ComplexPanel implements Container,
         // Only fire click event listeners if the splitter isn't moved
         if (!resized) {
             super.onBrowserEvent(event);
+        } else if (DOM.eventGetType(event) == Event.ONMOUSEUP) {
+            // Reset the resized flag after a mouseup has occured so the next
+            // mousedown/mouseup can be interpreted as a click.
+            resized = false;
         }
     }
 
@@ -393,10 +420,6 @@ public class VSplitPanel extends ComplexPanel implements Container,
         final Element trg = DOM.eventGetTarget(event);
         if (trg == splitter || trg == DOM.getChild(splitter, 0)) {
             resizing = true;
-            resized = false;
-            if (BrowserInfo.get().isGecko()) {
-                showDraggingCurtain();
-            }
             DOM.setCapture(getElement());
             origX = DOM.getElementPropertyInt(splitter, "offsetLeft");
             origY = DOM.getElementPropertyInt(splitter, "offsetTop");
@@ -456,9 +479,7 @@ public class VSplitPanel extends ComplexPanel implements Container,
 
     public void onMouseUp(Event event) {
         DOM.releaseCapture(getElement());
-        if (BrowserInfo.get().isGecko()) {
-            hideDraggingCurtain();
-        }
+        hideDraggingCurtain();
         resizing = false;
         onMouseMove(event);
         updateSplitPositionToServer();
@@ -469,6 +490,9 @@ public class VSplitPanel extends ComplexPanel implements Container,
      * iframe.
      */
     private void showDraggingCurtain() {
+        if (!isDraggingCurtainRequired()) {
+            return;
+        }
         if (draggingCurtain == null) {
             draggingCurtain = DOM.createDiv();
             DOM.setStyleAttribute(draggingCurtain, "position", "absolute");
@@ -478,10 +502,20 @@ public class VSplitPanel extends ComplexPanel implements Container,
             DOM.setStyleAttribute(draggingCurtain, "height", "100%");
             DOM.setStyleAttribute(draggingCurtain, "zIndex", ""
                     + VOverlay.Z_INDEX);
+
             DOM.appendChild(RootPanel.getBodyElement(), draggingCurtain);
         }
     }
 
+    /**
+     * A dragging curtain is required in Gecko and Webkit.
+     * 
+     * @return true if the browser requires a dragging curtain
+     */
+    private boolean isDraggingCurtainRequired() {
+        return (BrowserInfo.get().isGecko() || BrowserInfo.get().isWebkit());
+    }
+
     /**
      * Hides dragging curtain
      */
index fc7f174a6290a45d3e63005a046872d4275c9c38..72c383b0c117fc491ac7ba21345aa7dc7d810e9a 100644 (file)
@@ -383,7 +383,8 @@ public abstract class AbstractCommunicationManager implements
                 if (item.isFormField()) {
                     // ignored, upload requests contains only files
                 } else {
-                    final String pid = name.split("_")[0];
+                    int separatorPos = name.lastIndexOf("_");
+                    final String pid = name.substring(0, separatorPos);
                     final Upload uploadComponent = (Upload) idPaintableMap
                             .get(pid);
                     if (uploadComponent == null) {
index af9ed1b9a65aee96dcb622d5fd4709e4adaff5b7..bbfecb5d65756009127fa32b6a1a40a69e6b7ed9 100644 (file)
@@ -24,7 +24,6 @@ import com.vaadin.Application;
  * @author marc\r
  */\r
 @SuppressWarnings( { "serial", "unchecked" })\r
-@Deprecated\r
 public class PortletApplicationContext extends WebApplicationContext implements\r
         Serializable {\r
 \r
index 62368d15251b3517f408bd493586474be180d045..b3012b1163ffd15c6f43e8d32f66368f4b10668f 100644 (file)
@@ -2,7 +2,6 @@ package com.vaadin.tests.components;
 \r
 import com.vaadin.ui.Component;\r
 import com.vaadin.ui.Label;\r
-import com.vaadin.ui.Layout;\r
 import com.vaadin.ui.VerticalLayout;\r
 import com.vaadin.ui.Window;\r
 \r
@@ -26,13 +25,13 @@ public abstract class TestBase extends AbstractTestCase {
     }\r
 \r
     private Window window;\r
-    private Layout layout;\r
+    private VerticalLayout layout;\r
 \r
     public TestBase() {\r
 \r
     }\r
 \r
-    protected Layout getLayout() {\r
+    protected VerticalLayout getLayout() {\r
         return layout;\r
     }\r
 \r
diff --git a/tests/src/com/vaadin/tests/components/splitpanel/SplitPanelWithRichTextArea.java b/tests/src/com/vaadin/tests/components/splitpanel/SplitPanelWithRichTextArea.java
new file mode 100644 (file)
index 0000000..f5e5435
--- /dev/null
@@ -0,0 +1,37 @@
+package com.vaadin.tests.components.splitpanel;
+
+import com.vaadin.tests.components.TestBase;
+import com.vaadin.ui.Label;
+import com.vaadin.ui.RichTextArea;
+import com.vaadin.ui.SplitPanel;
+
+public class SplitPanelWithRichTextArea extends TestBase {
+
+    @Override
+    protected void setup() {
+        SplitPanel sp = new SplitPanel();
+        sp.setSizeFull();
+        RichTextArea rta = new RichTextArea();
+        rta.setSizeFull();
+        Label label = new Label("One side of the panel");
+
+        sp.setFirstComponent(label);
+        sp.setSecondComponent(rta);
+
+        addComponent(sp);
+        sp.setSizeFull();
+        getLayout().setSizeFull();
+
+    }
+
+    @Override
+    protected String getDescription() {
+        return "Dragging the splitter should work even if the cursor happens to move over the RichTextArea because of slow updates.";
+    }
+
+    @Override
+    protected Integer getTicketNumber() {
+        return 3792;
+    }
+
+}
index 77cc5879154a7a0e3e29bb189480d53f231ba667..98f3e546f5124a77be5efa54ac142b9284890965 100644 (file)
@@ -7,7 +7,7 @@ import com.vaadin.event.FieldEvents.BlurListener;
 import com.vaadin.event.FieldEvents.FocusEvent;
 import com.vaadin.event.FieldEvents.FocusListener;
 import com.vaadin.tests.components.TestBase;
-import com.vaadin.tests.layouts.TestLayoutClickListeners.Log;
+import com.vaadin.tests.util.Log;
 import com.vaadin.ui.TextField;
 
 public class TextFieldFocusAndBlurListeners extends TestBase implements
index 9a7dca7e30ef30f96e37d78888bae1a9693a1c07..386608f01fbb4c3fd3a2c1d65ffcfab8a9e7a948 100644 (file)
@@ -1,11 +1,9 @@
 package com.vaadin.tests.layouts;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import com.vaadin.event.LayoutEvents.LayoutClickEvent;
 import com.vaadin.event.LayoutEvents.LayoutClickListener;
 import com.vaadin.tests.components.AbstractTestCase;
+import com.vaadin.tests.util.Log;
 import com.vaadin.ui.AbsoluteLayout;
 import com.vaadin.ui.Button;
 import com.vaadin.ui.Component;
@@ -22,41 +20,6 @@ public class TestLayoutClickListeners extends AbstractTestCase {
 
     private Log log = new Log(5);
 
-    public static class Log extends VerticalLayout {
-        List<Label> eventLabels = new ArrayList<Label>();
-
-        public Log(int nr) {
-            for (int i = 0; i < nr; i++) {
-                Label l = createEventLabel();
-                eventLabels.add(l);
-                addComponent(l);
-            }
-
-            setCaption("Events:");
-        }
-
-        public void clear() {
-            for (Label l : eventLabels) {
-                l.setValue("");
-            }
-        }
-
-        public void log(String event) {
-            int nr = eventLabels.size();
-            for (int i = nr - 1; i > 0; i--) {
-                eventLabels.get(i).setValue(eventLabels.get(i - 1).getValue());
-            }
-            eventLabels.get(0).setValue(event);
-        }
-
-        private Label createEventLabel() {
-            Label l = new Label("&nbsp;", Label.CONTENT_XHTML);
-            l.setWidth(null);
-            return l;
-        }
-
-    }
-
     @Override
     public void init() {
         Window w = new Window("main window");
index e51bb25072b434e179fd17a1335d6cf1111faea2..d1960899e68617f9a622eab5d64bb7d91a95c4d4 100644 (file)
@@ -32,6 +32,31 @@ public class TestContainerSorting extends TestCase {
         super.setUp();\r
     }\r
 \r
+    public void testEmptyFilteredIndexedContainer() {\r
+        IndexedContainer ic = new IndexedContainer();\r
+\r
+        addProperties(ic);\r
+        populate(ic);\r
+\r
+        ic.addContainerFilter(PROPERTY_STRING_ID, "aasdfasdfasdf", true, false);\r
+        ic.sort(new Object[] { PROPERTY_STRING_ID }, new boolean[] { true });\r
+\r
+    }\r
+\r
+    public void testFilteredIndexedContainer() {\r
+        IndexedContainer ic = new IndexedContainer();\r
+\r
+        addProperties(ic);\r
+        populate(ic);\r
+\r
+        ic.addContainerFilter(PROPERTY_STRING_ID, "a", true, false);\r
+        ic.sort(new Object[] { PROPERTY_STRING_ID }, new boolean[] { true });\r
+        verifyOrder(ic,\r
+                new String[] { ITEM_ANOTHER_NULL, ITEM_DATA_MINUS1,\r
+                        ITEM_DATA_MINUS1_NULL, ITEM_DATA_MINUS2,\r
+                        ITEM_DATA_MINUS2_NULL, });\r
+    }\r
+\r
     public void testIndexedContainer() {\r
         IndexedContainer ic = new IndexedContainer();\r
 \r
diff --git a/tests/src/com/vaadin/tests/util/Log.java b/tests/src/com/vaadin/tests/util/Log.java
new file mode 100644 (file)
index 0000000..75ac5d2
--- /dev/null
@@ -0,0 +1,43 @@
+package com.vaadin.tests.util;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import com.vaadin.ui.Label;\r
+import com.vaadin.ui.VerticalLayout;\r
+\r
+public class Log extends VerticalLayout {\r
+    List<Label> eventLabels = new ArrayList<Label>();\r
+\r
+    public Log(int nr) {\r
+        for (int i = 0; i < nr; i++) {\r
+            Label l = createEventLabel();\r
+            eventLabels.add(l);\r
+            addComponent(l);\r
+        }\r
+\r
+        setCaption("Events:");\r
+    }\r
+\r
+    public void clear() {\r
+        for (Label l : eventLabels) {\r
+            l.setValue("");\r
+        }\r
+    }\r
+\r
+    public void log(String event) {\r
+        int nr = eventLabels.size();\r
+        for (int i = nr - 1; i > 0; i--) {\r
+            eventLabels.get(i).setValue(eventLabels.get(i - 1).getValue());\r
+        }\r
+        eventLabels.get(0).setValue(event);\r
+        System.out.println(event);\r
+    }\r
+\r
+    private Label createEventLabel() {\r
+        Label l = new Label("&nbsp;", Label.CONTENT_XHTML);\r
+        l.setWidth(null);\r
+        return l;\r
+    }\r
+\r
+}\r