From 38d932279fd73eaa6e1dde33136709faaae2155f Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Fri, 15 Jan 2010 18:39:11 +0000 Subject: [PATCH] Merged 6.2.2 fixes from /versions/6.2 svn changeset:10761/svn branch:6.3 --- .../vaadin/data/util/DefaultItemSorter.java | 14 +++++ .../terminal/gwt/client/BrowserInfo.java | 4 ++ .../terminal/gwt/client/ui/VMenuBar.java | 11 +++- .../terminal/gwt/client/ui/VSplitPanel.java | 56 +++++++++++++++---- .../server/AbstractCommunicationManager.java | 3 +- .../gwt/server/PortletApplicationContext.java | 1 - .../com/vaadin/tests/components/TestBase.java | 5 +- .../SplitPanelWithRichTextArea.java | 37 ++++++++++++ .../TextFieldFocusAndBlurListeners.java | 2 +- .../layouts/TestLayoutClickListeners.java | 39 +------------ .../container/TestContainerSorting.java | 25 +++++++++ tests/src/com/vaadin/tests/util/Log.java | 43 ++++++++++++++ 12 files changed, 183 insertions(+), 57 deletions(-) create mode 100644 tests/src/com/vaadin/tests/components/splitpanel/SplitPanelWithRichTextArea.java create mode 100644 tests/src/com/vaadin/tests/util/Log.java diff --git a/src/com/vaadin/data/util/DefaultItemSorter.java b/src/com/vaadin/data/util/DefaultItemSorter.java index 5cec2dc461..aefdbf1cc9 100644 --- a/src/com/vaadin/data/util/DefaultItemSorter.java +++ b/src/com/vaadin/data/util/DefaultItemSorter.java @@ -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], diff --git a/src/com/vaadin/terminal/gwt/client/BrowserInfo.java b/src/com/vaadin/terminal/gwt/client/BrowserInfo.java index 2872ca360e..fe5c6958ed 100644 --- a/src/com/vaadin/terminal/gwt/client/BrowserInfo.java +++ b/src/com/vaadin/terminal/gwt/client/BrowserInfo.java @@ -176,6 +176,10 @@ public class BrowserInfo { return isGecko; } + public boolean isWebkit() { + return isAppleWebKit; + } + public boolean isFF2() { return isGecko && version == 1.8; } diff --git a/src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java b/src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java index 4e17dcb879..0a28fd6b41 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VMenuBar.java @@ -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() { diff --git a/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java b/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java index ffada53252..27fdf9506f 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java @@ -40,12 +40,29 @@ public class VSplitPanel extends ComplexPanel implements Container, @Override protected HandlerRegistration registerHandler( H handler, Type 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 */ diff --git a/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java b/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java index fc7f174a62..72c383b0c1 100644 --- a/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java +++ b/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java @@ -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) { diff --git a/src/com/vaadin/terminal/gwt/server/PortletApplicationContext.java b/src/com/vaadin/terminal/gwt/server/PortletApplicationContext.java index af9ed1b9a6..bbfecb5d65 100644 --- a/src/com/vaadin/terminal/gwt/server/PortletApplicationContext.java +++ b/src/com/vaadin/terminal/gwt/server/PortletApplicationContext.java @@ -24,7 +24,6 @@ import com.vaadin.Application; * @author marc */ @SuppressWarnings( { "serial", "unchecked" }) -@Deprecated public class PortletApplicationContext extends WebApplicationContext implements Serializable { diff --git a/tests/src/com/vaadin/tests/components/TestBase.java b/tests/src/com/vaadin/tests/components/TestBase.java index 62368d1525..b3012b1163 100644 --- a/tests/src/com/vaadin/tests/components/TestBase.java +++ b/tests/src/com/vaadin/tests/components/TestBase.java @@ -2,7 +2,6 @@ package com.vaadin.tests.components; import com.vaadin.ui.Component; import com.vaadin.ui.Label; -import com.vaadin.ui.Layout; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.Window; @@ -26,13 +25,13 @@ public abstract class TestBase extends AbstractTestCase { } private Window window; - private Layout layout; + private VerticalLayout layout; public TestBase() { } - protected Layout getLayout() { + protected VerticalLayout getLayout() { return layout; } 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 index 0000000000..f5e5435d45 --- /dev/null +++ b/tests/src/com/vaadin/tests/components/splitpanel/SplitPanelWithRichTextArea.java @@ -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; + } + +} diff --git a/tests/src/com/vaadin/tests/components/textfield/TextFieldFocusAndBlurListeners.java b/tests/src/com/vaadin/tests/components/textfield/TextFieldFocusAndBlurListeners.java index 77cc587915..98f3e546f5 100644 --- a/tests/src/com/vaadin/tests/components/textfield/TextFieldFocusAndBlurListeners.java +++ b/tests/src/com/vaadin/tests/components/textfield/TextFieldFocusAndBlurListeners.java @@ -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 diff --git a/tests/src/com/vaadin/tests/layouts/TestLayoutClickListeners.java b/tests/src/com/vaadin/tests/layouts/TestLayoutClickListeners.java index 9a7dca7e30..386608f01f 100644 --- a/tests/src/com/vaadin/tests/layouts/TestLayoutClickListeners.java +++ b/tests/src/com/vaadin/tests/layouts/TestLayoutClickListeners.java @@ -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