From 9b17bc12f8116e33468e81d3b397ca81d8fea530 Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Thu, 3 May 2012 15:02:57 +0000 Subject: New helper class handling touch scrolling either natively or with TouchScrollDelegate, depending on platform capabilities svn changeset:23671/svn branch:6.8 --- .../gwt/client/ui/TouchScrollDelegate.java | 47 +++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java b/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java index 8b2248aff6..a2a94489e4 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java +++ b/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java @@ -15,10 +15,12 @@ import com.google.gwt.dom.client.Style; import com.google.gwt.dom.client.Touch; import com.google.gwt.event.dom.client.ScrollHandler; import com.google.gwt.event.dom.client.TouchStartEvent; +import com.google.gwt.event.dom.client.TouchStartHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.Event.NativePreviewEvent; import com.google.gwt.user.client.Event.NativePreviewHandler; +import com.google.gwt.user.client.ui.Widget; import com.vaadin.terminal.gwt.client.BrowserInfo; import com.vaadin.terminal.gwt.client.VConsole; @@ -86,6 +88,49 @@ public class TouchScrollDelegate implements NativePreviewHandler { private static final boolean androidWithBrokenScrollTop = BrowserInfo.get() .isAndroidWithBrokenScrollTop(); + public static class TouchScrollHandler implements TouchStartHandler { + + private final TouchScrollDelegate delegate; + private final boolean requiresDelegate = BrowserInfo.get() + .requiresTouchScrollDelegate(); + + public TouchScrollHandler(Widget widget, Element... scrollables) { + if (requiresDelegate) { + delegate = new TouchScrollDelegate(); + widget.addDomHandler(this, TouchStartEvent.getType()); + } else { + delegate = null; + widget.addDomHandler(new TouchStartHandler() { + + public void onTouchStart(TouchStartEvent event) { + // TODO Auto-generated method stub + + } + }, TouchStartEvent.getType()); + } + setElements(scrollables); + } + + public void onTouchStart(TouchStartEvent event) { + VConsole.log("TouchScrollHandler onTouchStart"); + assert delegate != null; + delegate.onTouchStart(event); + } + + public void setElements(Element... scrollables) { + if (requiresDelegate) { + delegate.setElements(scrollables); + } else if (BrowserInfo.get().isTouchDevice()) { + for (Element e : scrollables) { + e.getStyle().setProperty("overflow", "auto"); + e.getStyle().setProperty("-webkit-overflow-scrolling", + "touch"); + e.getStyle().setProperty("-webkit-user-select", "none"); + } + } + } + } + public TouchScrollDelegate(Element... elements) { scrollableElements = elements; } @@ -535,7 +580,7 @@ public class TouchScrollDelegate implements NativePreviewHandler { } } - public void setElements(com.google.gwt.user.client.Element[] elements) { + public void setElements(Element[] elements) { scrollableElements = elements; } -- cgit v1.2.3 From 16d1f5b07ee217c5e30656796357ed8ee1c316d4 Mon Sep 17 00:00:00 2001 From: Automerge Date: Thu, 3 May 2012 17:06:26 +0000 Subject: [merge from 6.7] Fixed #8589: Permit XHTML content in UserError svn changeset:23673/svn branch:6.8 --- src/com/vaadin/terminal/UserError.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/UserError.java b/src/com/vaadin/terminal/UserError.java index 170d76610b..678e936dec 100644 --- a/src/com/vaadin/terminal/UserError.java +++ b/src/com/vaadin/terminal/UserError.java @@ -77,7 +77,7 @@ public class UserError implements ErrorMessage { public UserError(String message, int contentMode, int errorLevel) { // Check the parameters - if (contentMode < 0 || contentMode > 2) { + if (contentMode < 0 || contentMode > 3) { throw new java.lang.IllegalArgumentException( "Unsupported content mode: " + contentMode); } -- cgit v1.2.3 From 295e0f391131d5a9fa9d2f2b08dcc6418e42d484 Mon Sep 17 00:00:00 2001 From: Automerge Date: Fri, 4 May 2012 13:19:50 +0000 Subject: [merge from 6.7] Fix #7136: Opening a modal subwindow when there are visible notifications prevented the notifications from fading svn changeset:23678/svn branch:6.8 --- .../terminal/gwt/client/ui/VNotification.java | 19 ++++++++++ src/com/vaadin/terminal/gwt/client/ui/VWindow.java | 1 + .../notification/NotificationsAndModalWindow.html | 42 ++++++++++++++++++++++ .../notification/NotificationsAndModalWindow.java | 42 ++++++++++++++++++++++ 4 files changed, 104 insertions(+) create mode 100644 tests/testbench/com/vaadin/tests/components/notification/NotificationsAndModalWindow.html create mode 100644 tests/testbench/com/vaadin/tests/components/notification/NotificationsAndModalWindow.java (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VNotification.java b/src/com/vaadin/terminal/gwt/client/ui/VNotification.java index 2ee66d01ca..4166148a25 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VNotification.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VNotification.java @@ -41,6 +41,8 @@ public class VNotification extends VOverlay { public static final String STYLE_SYSTEM = "system"; private static final int FADE_ANIMATION_INTERVAL = 50; // == 20 fps + private static final ArrayList notifications = new ArrayList(); + private int startOpacity = 90; private int fadeMsec = 400; private int delayMsec = 1000; @@ -150,6 +152,7 @@ public class VNotification extends VOverlay { addStyleDependentName(style); } super.show(); + notifications.add(this); setPosition(position); /** * Android 4 fails to render notifications correctly without a little @@ -171,6 +174,7 @@ public class VNotification extends VOverlay { temporaryStyle = null; } super.hide(); + notifications.remove(this); fireEvent(new HideEvent(this)); } @@ -421,4 +425,19 @@ public class VNotification extends VOverlay { public interface EventListener extends java.util.EventListener { public void notificationHidden(HideEvent event); } + + /** + * Moves currently visible notifications to the top of the event preview + * stack. Can be called when opening other overlays such as subwindows to + * ensure the notifications receive the events they need and don't linger + * indefinitely. See #7136. + * + * TODO Should this be a generic Overlay feature instead? + */ + public static void bringNotificationsToFront() { + for (VNotification notification : notifications) { + DOM.removeEventPreview(notification); + DOM.addEventPreview(notification); + } + } } diff --git a/src/com/vaadin/terminal/gwt/client/ui/VWindow.java b/src/com/vaadin/terminal/gwt/client/ui/VWindow.java index 103979927a..2355a9c65a 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VWindow.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VWindow.java @@ -520,6 +520,7 @@ public class VWindow extends VOverlay implements Container, Scheduler.get().scheduleFinally(new Command() { public void execute() { doServerSideOrdering(); + VNotification.bringNotificationsToFront(); } }); } diff --git a/tests/testbench/com/vaadin/tests/components/notification/NotificationsAndModalWindow.html b/tests/testbench/com/vaadin/tests/components/notification/NotificationsAndModalWindow.html new file mode 100644 index 0000000000..35d22da46e --- /dev/null +++ b/tests/testbench/com/vaadin/tests/components/notification/NotificationsAndModalWindow.html @@ -0,0 +1,42 @@ + + + + + + +NotificationsAndModalWindow + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NotificationsAndModalWindow
open/run/com.vaadin.tests.components.notification.NotificationsAndModalWindow?restartApplication
clickvaadin=runcomvaadintestscomponentsnotificationNotificationsAndModalWindow::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0]
closeNotificationvaadin=runcomvaadintestscomponentsnotificationNotificationsAndModalWindow::Root/VNotification[1]0,0
closeNotificationvaadin=runcomvaadintestscomponentsnotificationNotificationsAndModalWindow::Root/VNotification[0]0,0
assertElementNotPresentvaadin=runcomvaadintestscomponentsnotificationNotificationsAndModalWindow::Root/VNotification[0]
+ + diff --git a/tests/testbench/com/vaadin/tests/components/notification/NotificationsAndModalWindow.java b/tests/testbench/com/vaadin/tests/components/notification/NotificationsAndModalWindow.java new file mode 100644 index 0000000000..562e8095f2 --- /dev/null +++ b/tests/testbench/com/vaadin/tests/components/notification/NotificationsAndModalWindow.java @@ -0,0 +1,42 @@ +package com.vaadin.tests.components.notification; + +import com.vaadin.tests.components.TestBase; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Window; +import com.vaadin.ui.Window.Notification; + +public class NotificationsAndModalWindow extends TestBase { + + @Override + protected void setup() { + getMainWindow().showNotification("Notification 1", + Notification.TYPE_WARNING_MESSAGE); + getMainWindow().showNotification("Notification 2", + Notification.TYPE_WARNING_MESSAGE); + + Button b = new Button("Button"); + b.addListener(new Button.ClickListener() { + + public void buttonClick(ClickEvent event) { + + Window w = new Window("This is a window"); + w.setModal(true); + getMainWindow().addWindow(w); + } + + }); + addComponent(b); + } + + @Override + protected String getDescription() { + return "Press the button when both two notifications are visible to add a modal window to the app. When the modal window is visible, the notifications should disappear normally."; + } + + @Override + protected Integer getTicketNumber() { + return 7136; + } + +} -- cgit v1.2.3 From 4599ecaf627974d225380dddeb6baa92a549df8e Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Fri, 4 May 2012 13:41:04 +0000 Subject: Improved TouchScrollHandler helper svn changeset:23679/svn branch:6.8 --- .../gwt/client/ui/TouchScrollDelegate.java | 23 ++++++++-------------- 1 file changed, 8 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java b/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java index a2a94489e4..ac9527e3ef 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java +++ b/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java @@ -100,37 +100,30 @@ public class TouchScrollDelegate implements NativePreviewHandler { widget.addDomHandler(this, TouchStartEvent.getType()); } else { delegate = null; - widget.addDomHandler(new TouchStartHandler() { - - public void onTouchStart(TouchStartEvent event) { - // TODO Auto-generated method stub - - } - }, TouchStartEvent.getType()); } setElements(scrollables); } public void onTouchStart(TouchStartEvent event) { - VConsole.log("TouchScrollHandler onTouchStart"); assert delegate != null; delegate.onTouchStart(event); } public void setElements(Element... scrollables) { + for (Element scrollable : scrollables) { + scrollable.addClassName("v-scrollable"); + } if (requiresDelegate) { delegate.setElements(scrollables); - } else if (BrowserInfo.get().isTouchDevice()) { - for (Element e : scrollables) { - e.getStyle().setProperty("overflow", "auto"); - e.getStyle().setProperty("-webkit-overflow-scrolling", - "touch"); - e.getStyle().setProperty("-webkit-user-select", "none"); - } } } } + public static TouchScrollHandler enableTouchScrolling(Widget widget, + Element... scrollables) { + return new TouchScrollHandler(widget, scrollables); + } + public TouchScrollDelegate(Element... elements) { scrollableElements = elements; } -- cgit v1.2.3 From 33e3dc600c990bf8e93f0ac88af26e5e95b79965 Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Fri, 4 May 2012 13:51:15 +0000 Subject: #8716 Use TouchScrollDelegate.enableTouchScrolling() instead of a TouchScrollDelegate instance directly svn changeset:23680/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VPanel.java | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VPanel.java b/src/com/vaadin/terminal/gwt/client/ui/VPanel.java index 036f4f0600..f754addcf3 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VPanel.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VPanel.java @@ -9,8 +9,6 @@ import java.util.Set; import com.google.gwt.dom.client.DivElement; import com.google.gwt.dom.client.Document; import com.google.gwt.event.dom.client.DomEvent.Type; -import com.google.gwt.event.dom.client.TouchStartEvent; -import com.google.gwt.event.dom.client.TouchStartHandler; import com.google.gwt.event.shared.EventHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.DOM; @@ -90,7 +88,6 @@ public class VPanel extends SimplePanel implements Container, return addDomHandler(handler, type); } }; - private TouchScrollDelegate touchScrollDelegate; public VPanel() { super(); @@ -120,11 +117,8 @@ public class VPanel extends SimplePanel implements Container, DOM.sinkEvents(contentNode, Event.ONSCROLL | Event.TOUCHEVENTS); contentNode.getStyle().setProperty("position", "relative"); getElement().getStyle().setProperty("overflow", "hidden"); - addHandler(new TouchStartHandler() { - public void onTouchStart(TouchStartEvent event) { - getTouchScrollDelegate().onTouchStart(event); - } - }, TouchStartEvent.getType()); + + TouchScrollDelegate.enableTouchScrolling(this, contentNode); } /** @@ -438,14 +432,6 @@ public class VPanel extends SimplePanel implements Container, } } - protected TouchScrollDelegate getTouchScrollDelegate() { - if (touchScrollDelegate == null) { - touchScrollDelegate = new TouchScrollDelegate(contentNode); - } - return touchScrollDelegate; - - } - @Override public void setHeight(String height) { this.height = height; -- cgit v1.2.3 From c3bba747205792447d67b3ac0c1ecf91ec6f87ca Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Fri, 4 May 2012 14:44:22 +0000 Subject: #8720 Use TouchScrollDelegate.enableTouchScrolling() instead of a TouchScrollDelegate instance directly svn changeset:23681/svn branch:6.8 --- .../terminal/gwt/client/ui/VTabsheetPanel.java | 36 ++++------------------ 1 file changed, 6 insertions(+), 30 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VTabsheetPanel.java b/src/com/vaadin/terminal/gwt/client/ui/VTabsheetPanel.java index 126b0ebea1..f1dbea18b2 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VTabsheetPanel.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VTabsheetPanel.java @@ -4,16 +4,13 @@ package com.vaadin.terminal.gwt.client.ui; -import com.google.gwt.dom.client.Node; -import com.google.gwt.dom.client.NodeList; -import com.google.gwt.event.dom.client.TouchStartEvent; -import com.google.gwt.event.dom.client.TouchStartHandler; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.ComplexPanel; import com.google.gwt.user.client.ui.Widget; import com.vaadin.terminal.gwt.client.Util; +import com.vaadin.terminal.gwt.client.ui.TouchScrollDelegate.TouchScrollHandler; /** * A panel that displays all of its child widgets in a 'deck', where only one @@ -27,7 +24,8 @@ import com.vaadin.terminal.gwt.client.Util; public class VTabsheetPanel extends ComplexPanel { private Widget visibleWidget; - private TouchScrollDelegate touchScrollDelegate; + + private TouchScrollHandler touchScrollHandler; /** * Creates an empty tabsheet panel. @@ -35,30 +33,8 @@ public class VTabsheetPanel extends ComplexPanel { public VTabsheetPanel() { setElement(DOM.createDiv()); sinkEvents(Event.TOUCHEVENTS); - addDomHandler(new TouchStartHandler() { - public void onTouchStart(TouchStartEvent event) { - /* - * All container elements needs to be scrollable by one finger. - * Update the scrollable element list of touch delegate on each - * touch start. - */ - NodeList childNodes = getElement().getChildNodes(); - Element[] elements = new Element[childNodes.getLength()]; - for (int i = 0; i < elements.length; i++) { - elements[i] = (Element) childNodes.getItem(i); - } - getTouchScrollDelegate().setElements(elements); - getTouchScrollDelegate().onTouchStart(event); - } - }, TouchStartEvent.getType()); - } - - protected TouchScrollDelegate getTouchScrollDelegate() { - if (touchScrollDelegate == null) { - touchScrollDelegate = new TouchScrollDelegate(); - } - return touchScrollDelegate; + touchScrollHandler = TouchScrollDelegate.enableTouchScrolling(this); } /** @@ -77,7 +53,6 @@ public class VTabsheetPanel extends ComplexPanel { private Element createContainerElement() { Element el = DOM.createDiv(); DOM.setStyleAttribute(el, "position", "absolute"); - DOM.setStyleAttribute(el, "overflow", "auto"); hide(el); return el; } @@ -142,6 +117,8 @@ public class VTabsheetPanel extends ComplexPanel { } visibleWidget = newVisible; unHide(DOM.getParent(visibleWidget.getElement())); + touchScrollHandler.setElements(visibleWidget.getElement() + .getParentElement()); } } @@ -199,7 +176,6 @@ public class VTabsheetPanel extends ComplexPanel { Util.runWebkitOverflowAutoFix(DOM.getParent(visibleWidget .getElement())); } - } public void replaceComponent(Widget oldComponent, Widget newComponent) { -- cgit v1.2.3 From a810ce9ce0bafce6d9b437582e706175f4c8827a Mon Sep 17 00:00:00 2001 From: Leif Åstrand Date: Mon, 7 May 2012 13:16:13 +0000 Subject: Don't assume there's always an application (#8694) svn changeset:23684/svn branch:6.8 --- .../vaadin/terminal/gwt/server/AbstractApplicationPortlet.java | 8 +++++--- .../vaadin/terminal/gwt/server/AbstractApplicationServlet.java | 7 ++++--- 2 files changed, 9 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java b/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java index 1741ec5e7f..2ac574c2de 100644 --- a/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java +++ b/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java @@ -495,9 +495,11 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet } } finally { - requestTimer - .stop((AbstractWebApplicationContext) application - .getContext()); + PortletSession session = request + .getPortletSession(false); + if (session != null) { + requestTimer.stop(getApplicationContext(session)); + } } } } diff --git a/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java b/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java index d42b2142fe..68089e18e0 100644 --- a/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java +++ b/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java @@ -552,9 +552,10 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements .onRequestEnd(request, response); } } finally { - requestTimer - .stop((AbstractWebApplicationContext) application - .getContext()); + HttpSession session = request.getSession(false); + if (session != null) { + requestTimer.stop(getApplicationContext(session)); + } } } -- cgit v1.2.3 From 97df7ebc178ae8aa5f6105822cfa10340b232867 Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Mon, 7 May 2012 13:20:37 +0000 Subject: #8763 requiresTouchScrollDelegate now returns false for iOS5; the default return value is now true instead of false. svn changeset:23686/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/BrowserInfo.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/BrowserInfo.java b/src/com/vaadin/terminal/gwt/client/BrowserInfo.java index 8ec610c089..5e496bd05d 100644 --- a/src/com/vaadin/terminal/gwt/client/BrowserInfo.java +++ b/src/com/vaadin/terminal/gwt/client/BrowserInfo.java @@ -445,15 +445,13 @@ public class BrowserInfo { if (!isTouchDevice()) { return false; } - - if (isAndroid() && isWebkit() && getWebkitVersion() < 534) { - return true; + if (isAndroid() && isWebkit() && getWebkitVersion() >= 534) { + return false; } - // if (isIOS() && isWebkit() && getWebkitVersion() < ???) { - // return true; - // } - - return false; + if (isIOS() && isWebkit() && getWebkitVersion() >= 534) { + return false; + } + return true; } /** -- cgit v1.2.3 From 62c36174ce0d63aca7bab3936226d01734bb9b12 Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Mon, 7 May 2012 13:22:39 +0000 Subject: #8763 Use Set instead of an array in TouchScrollDelegate to allow dynamic adding and removing scrollable elements svn changeset:23687/svn branch:6.8 --- .../gwt/client/ui/TouchScrollDelegate.java | 27 +++++++++++++--------- 1 file changed, 16 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java b/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java index ac9527e3ef..65d8029593 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java +++ b/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java @@ -4,6 +4,8 @@ package com.vaadin.terminal.gwt.client.ui; import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; import com.google.gwt.animation.client.Animation; import com.google.gwt.core.client.Duration; @@ -70,7 +72,7 @@ public class TouchScrollDelegate implements NativePreviewHandler { private static final double DECELERATION = 0.002; private static final int MAX_DURATION = 1500; private int origY; - private Element[] scrollableElements; + private HashSet scrollableElements; private Element scrolledElement; private int origScrollTop; private HandlerRegistration handlerRegistration; @@ -101,7 +103,9 @@ public class TouchScrollDelegate implements NativePreviewHandler { } else { delegate = null; } - setElements(scrollables); + for (Element scrollable : scrollables) { + addElement(scrollable); + } } public void onTouchStart(TouchStartEvent event) { @@ -109,12 +113,17 @@ public class TouchScrollDelegate implements NativePreviewHandler { delegate.onTouchStart(event); } - public void setElements(Element... scrollables) { - for (Element scrollable : scrollables) { - scrollable.addClassName("v-scrollable"); + public void addElement(Element scrollable) { + scrollable.addClassName("v-scrollable"); + if (requiresDelegate) { + delegate.scrollableElements.add(scrollable); } + } + + public void removeElement(Element scrollable) { + scrollable.removeClassName("v-scrollable"); if (requiresDelegate) { - delegate.setElements(scrollables); + delegate.scrollableElements.remove(scrollable); } } } @@ -125,7 +134,7 @@ public class TouchScrollDelegate implements NativePreviewHandler { } public TouchScrollDelegate(Element... elements) { - scrollableElements = elements; + scrollableElements = new HashSet(Arrays.asList(elements)); } public void setScrollHandler(ScrollHandler scrollHandler) { @@ -573,10 +582,6 @@ public class TouchScrollDelegate implements NativePreviewHandler { } } - public void setElements(Element[] elements) { - scrollableElements = elements; - } - /** * long calcucation are not very efficient in GWT, so this helper method * returns timestamp in double. -- cgit v1.2.3 From ff05bab8e8d21a9fa13295f05e5cd1f9fbe60bda Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Mon, 7 May 2012 13:24:18 +0000 Subject: #8722 Make subwindows touch scrollable svn changeset:23688/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VWindow.java | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VWindow.java b/src/com/vaadin/terminal/gwt/client/ui/VWindow.java index 2355a9c65a..d756eaf8b0 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VWindow.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VWindow.java @@ -205,6 +205,9 @@ public class VWindow extends VOverlay implements Container, contentPanel.addKeyDownHandler(this); contentPanel.addFocusHandler(this); contentPanel.addBlurHandler(this); + + TouchScrollDelegate.enableTouchScrolling(this, getContainerElement() + .getFirstChildElement()); } public void bringToFront() { -- cgit v1.2.3 From 8cfb84d9ec1570f7b14890edadebdf43a474be8c Mon Sep 17 00:00:00 2001 From: Automerge Date: Tue, 8 May 2012 09:06:50 +0000 Subject: [merge from 6.7] Don't activate tab when clicking close element (#7686) svn changeset:23690/svn branch:6.8 --- .../vaadin/terminal/gwt/client/ui/VTabsheet.java | 13 +++++++- .../tabsheet/TabSheetWithDisappearingContent.html | 36 ++++++++++++++++++++++ .../tabsheet/TabSheetWithDisappearingContent.java | 34 ++++++++++++++++++++ 3 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 tests/testbench/com/vaadin/tests/components/tabsheet/TabSheetWithDisappearingContent.html create mode 100644 tests/testbench/com/vaadin/tests/components/tabsheet/TabSheetWithDisappearingContent.java (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VTabsheet.java b/src/com/vaadin/terminal/gwt/client/ui/VTabsheet.java index f1a5b31379..d3836bb177 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VTabsheet.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VTabsheet.java @@ -350,6 +350,10 @@ public class VTabsheet extends VTabsheetBase implements Focusable, } return width; } + public Element getCloseButton() { + return closeButton; + } + } static class TabBar extends ComplexPanel implements ClickHandler, @@ -412,7 +416,14 @@ public class VTabsheet extends VTabsheetBase implements Focusable, } public void onClick(ClickEvent event) { - Widget caption = (Widget) event.getSource(); + TabCaption caption = (TabCaption) event.getSource(); + Element targetElement = event.getNativeEvent().getEventTarget() + .cast(); + // the tab should not be focused if the close button was clicked + if (targetElement == caption.getCloseButton()) { + return; + } + int index = getWidgetIndex(caption.getParent()); // IE needs explicit focus() if (BrowserInfo.get().isIE()) { diff --git a/tests/testbench/com/vaadin/tests/components/tabsheet/TabSheetWithDisappearingContent.html b/tests/testbench/com/vaadin/tests/components/tabsheet/TabSheetWithDisappearingContent.html new file mode 100644 index 0000000000..b01a4a16ae --- /dev/null +++ b/tests/testbench/com/vaadin/tests/components/tabsheet/TabSheetWithDisappearingContent.html @@ -0,0 +1,36 @@ + + + + + + +TabSheetWithDisappearingContent + + + + + + + + + + + + + + + + + + + + + + + + + + +
TabSheetWithDisappearingContent
open/run/com.vaadin.tests.components.tabsheet.TabSheetWithDisappearingContent?restartApplication
mouseClickvaadin=runcomvaadintestscomponentstabsheetTabSheetWithDisappearingContent::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[2]/domChild[0]/domChild[0]/domChild[1]14,7
assertTextvaadin=runcomvaadintestscomponentstabsheetTabSheetWithDisappearingContent::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VLabel[0]Content 1
assertVisiblevaadin=runcomvaadintestscomponentstabsheetTabSheetWithDisappearingContent::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VLabel[0]
+ + diff --git a/tests/testbench/com/vaadin/tests/components/tabsheet/TabSheetWithDisappearingContent.java b/tests/testbench/com/vaadin/tests/components/tabsheet/TabSheetWithDisappearingContent.java new file mode 100644 index 0000000000..aed273dd64 --- /dev/null +++ b/tests/testbench/com/vaadin/tests/components/tabsheet/TabSheetWithDisappearingContent.java @@ -0,0 +1,34 @@ +package com.vaadin.tests.components.tabsheet; + +import com.vaadin.tests.components.TestBase; +import com.vaadin.ui.Label; +import com.vaadin.ui.TabSheet; +import com.vaadin.ui.TabSheet.Tab; +import com.vaadin.ui.VerticalLayout; + +public class TabSheetWithDisappearingContent extends TestBase { + + @Override + protected void setup() { + final TabSheet t = new TabSheet(); + + for (int i = 1; i < 4; i++) { + VerticalLayout v = new VerticalLayout(); + v.addComponent(new Label("Content " + i)); + Tab tab = t.addTab(v, "Tab " + i); + tab.setClosable(true); + } + addComponent(t); + } + + @Override + protected String getDescription() { + return "In some browsers, when trying to close the last tab of a tabsheet an IndexOutOfBoundException happens. After that, although an other tab is visually active, no contents are shown."; + } + + @Override + protected Integer getTicketNumber() { + return 7686; + } + +} -- cgit v1.2.3 From 2f9e56f46e59152d9bed498eb72586fb3f9e15dd Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Wed, 9 May 2012 11:44:20 +0000 Subject: TouchScrollHandler: added debug info, restored setElements() svn changeset:23697/svn branch:6.8 --- .../gwt/client/ui/TouchScrollDelegate.java | 29 ++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java b/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java index 65d8029593..580313f433 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java +++ b/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java @@ -98,11 +98,20 @@ public class TouchScrollDelegate implements NativePreviewHandler { public TouchScrollHandler(Widget widget, Element... scrollables) { if (requiresDelegate) { + VConsole.log("REQUIRES DELEGATE"); delegate = new TouchScrollDelegate(); widget.addDomHandler(this, TouchStartEvent.getType()); } else { + VConsole.log("DOES NOT REQUIRE DELEGATE"); delegate = null; } + VConsole.log(BrowserInfo.getBrowserString()); + BrowserInfo bi = BrowserInfo.get(); + VConsole.log("Is Android: " + bi.isAndroid()); + VConsole.log("Is Android with broken scrolltop: " + + bi.isAndroidWithBrokenScrollTop()); + VConsole.log("Is IOS: " + bi.isIOS()); + VConsole.log("Is Webkit: " + bi.isWebkit()); for (Element scrollable : scrollables) { addElement(scrollable); } @@ -113,11 +122,22 @@ public class TouchScrollDelegate implements NativePreviewHandler { delegate.onTouchStart(event); } + public void debug(Element e) { + VConsole.log("Classes: " + e.getClassName() + " overflow: " + + e.getStyle().getProperty("overflow") + " w-o-s: " + + e.getStyle().getProperty("-webkit-overflow-scrolling")); + } + public void addElement(Element scrollable) { scrollable.addClassName("v-scrollable"); + scrollable.getStyle().setProperty("-webkit-overflow-scrolling", + "touch"); + scrollable.getStyle().setProperty("overflow-y", "auto"); + scrollable.getStyle().setProperty("overflow-x", "hidden"); if (requiresDelegate) { delegate.scrollableElements.add(scrollable); } + VConsole.log("Added scrollable: " + scrollable.getClassName()); } public void removeElement(Element scrollable) { @@ -126,6 +146,15 @@ public class TouchScrollDelegate implements NativePreviewHandler { delegate.scrollableElements.remove(scrollable); } } + + public void setElements(Element... scrollables) { + if (requiresDelegate) { + delegate.scrollableElements.clear(); + } + for (Element e : scrollables) { + addElement(e); + } + } } public static TouchScrollHandler enableTouchScrolling(Widget widget, -- cgit v1.2.3 From d53b654e2539a4c0728aba77b77efa01aa4a2c7d Mon Sep 17 00:00:00 2001 From: Leif Åstrand Date: Thu, 10 May 2012 08:33:27 +0000 Subject: Use   in empty table footers to make them render properly (#7718) svn changeset:23701/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java index a022a2bd83..f0874a5d18 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java @@ -3425,6 +3425,10 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, * The text in the footer */ public void setText(String footerText) { + if (footerText == null || footerText.equals("")) { + footerText = " "; + } + DOM.setInnerHTML(captionContainer, footerText); } -- cgit v1.2.3 From f6bfd75b703aa199d2ef7e956d5ec7422a507d85 Mon Sep 17 00:00:00 2001 From: Automerge Date: Thu, 10 May 2012 09:10:01 +0000 Subject: [merge from 6.7] Send VView size instead of window size (#7931) svn changeset:23703/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VView.java | 33 +++++++++++++++--------- 1 file changed, 21 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VView.java b/src/com/vaadin/terminal/gwt/client/ui/VView.java index c03652f259..8f8a6ab4b3 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VView.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VView.java @@ -61,11 +61,12 @@ public class VView extends SimplePanel implements Container, ResizeHandler, private ShortcutActionHandler actionHandler; - /** stored width for IE resize optimization */ - private int width; + /** stored size for IE resize optimization */ + private int windowWidth; + private int windowHeight; - /** stored height for IE resize optimization */ - private int height; + private int viewWidth; + private int viewHeight; private ApplicationConnection connection; @@ -134,15 +135,15 @@ public class VView extends SimplePanel implements Container, ResizeHandler, */ protected void windowSizeMaybeChanged(int newWidth, int newHeight) { boolean changed = false; - if (width != newWidth) { - width = newWidth; + if (windowWidth != newWidth) { + windowWidth = newWidth; changed = true; - VConsole.log("New window width: " + width); + VConsole.log("New window width: " + windowWidth); } - if (height != newHeight) { - height = newHeight; + if (windowHeight != newHeight) { + windowHeight = newHeight; changed = true; - VConsole.log("New window height: " + height); + VConsole.log("New window height: " + windowHeight); } if (changed) { VConsole.log("Running layout functions due to window resize"); @@ -492,8 +493,16 @@ public class VView extends SimplePanel implements Container, ResizeHandler, * Send new dimensions to the server. */ private void sendClientResized() { - connection.updateVariable(id, "height", height, false); - connection.updateVariable(id, "width", width, immediate); + int newViewHeight = getElement().getClientHeight(); + int newViewWidth = getElement().getClientWidth(); + + // Send the view dimensions if they have changed + if (newViewHeight != viewHeight || newViewWidth != viewWidth) { + viewHeight = newViewHeight; + viewWidth = newViewWidth; + connection.updateVariable(id, "height", newViewHeight, false); + connection.updateVariable(id, "width", newViewWidth, immediate); + } } public native static void goTo(String url) -- cgit v1.2.3 From c8a4ca73ac23373683cab03cb8aa46ca5ea6fa7c Mon Sep 17 00:00:00 2001 From: Automerge Date: Thu, 10 May 2012 13:07:21 +0000 Subject: [merge from 6.7] Tweaks to #7931 based on review. svn changeset:23708/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VView.java | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VView.java b/src/com/vaadin/terminal/gwt/client/ui/VView.java index 8f8a6ab4b3..d500c56e52 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VView.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VView.java @@ -61,10 +61,18 @@ public class VView extends SimplePanel implements Container, ResizeHandler, private ShortcutActionHandler actionHandler; - /** stored size for IE resize optimization */ + /* + * Last known window size used to detect whether VView should be layouted + * again. Detection must be based on window size, because the VView size + * might be fixed and thus not automatically adapt to changed window sizes. + */ private int windowWidth; private int windowHeight; + /* + * Last know view size used to detect whether new dimensions should be sent + * to the server. + */ private int viewWidth; private int viewHeight; @@ -146,6 +154,13 @@ public class VView extends SimplePanel implements Container, ResizeHandler, VConsole.log("New window height: " + windowHeight); } if (changed) { + /* + * If the window size has changed, layout the VView again and send + * new size to the server if the size changed. (Just checking VView + * size would cause us to ignore cases when a relatively sized VView + * should shrink as the content's size is fixed and would thus not + * automatically shrink.) + */ VConsole.log("Running layout functions due to window resize"); connection.runDescendentsLayout(VView.this); Util.runWebkitOverflowAutoFix(getElement()); @@ -493,8 +508,9 @@ public class VView extends SimplePanel implements Container, ResizeHandler, * Send new dimensions to the server. */ private void sendClientResized() { - int newViewHeight = getElement().getClientHeight(); - int newViewWidth = getElement().getClientWidth(); + Element parentElement = getElement().getParentElement(); + int newViewHeight = parentElement.getClientHeight(); + int newViewWidth = parentElement.getClientWidth(); // Send the view dimensions if they have changed if (newViewHeight != viewHeight || newViewWidth != viewWidth) { -- cgit v1.2.3 From 8383bddc03cc07bd0ae682af182784ca3415d505 Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Fri, 11 May 2012 10:56:06 +0000 Subject: camelCasify CSS property names svn changeset:23715/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java b/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java index 580313f433..171ec2838d 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java +++ b/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java @@ -125,15 +125,15 @@ public class TouchScrollDelegate implements NativePreviewHandler { public void debug(Element e) { VConsole.log("Classes: " + e.getClassName() + " overflow: " + e.getStyle().getProperty("overflow") + " w-o-s: " - + e.getStyle().getProperty("-webkit-overflow-scrolling")); + + e.getStyle().getProperty("WebkitOverflowScrolling")); } public void addElement(Element scrollable) { scrollable.addClassName("v-scrollable"); - scrollable.getStyle().setProperty("-webkit-overflow-scrolling", + scrollable.getStyle().setProperty("WebkitOverflowScrolling", "touch"); - scrollable.getStyle().setProperty("overflow-y", "auto"); - scrollable.getStyle().setProperty("overflow-x", "hidden"); + scrollable.getStyle().setProperty("overflowY", "auto"); + scrollable.getStyle().setProperty("overflowX", "auto"); if (requiresDelegate) { delegate.scrollableElements.add(scrollable); } -- cgit v1.2.3 From bb486ff26ad6f43197aba42d5af53508bf2c5235 Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Fri, 11 May 2012 12:42:04 +0000 Subject: #8723 Add touch scrolling support to Accordion svn changeset:23716/svn branch:6.8 --- .../vaadin/terminal/gwt/client/ui/VAccordion.java | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VAccordion.java b/src/com/vaadin/terminal/gwt/client/ui/VAccordion.java index 4d0776a5f9..73d7eba2d6 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VAccordion.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VAccordion.java @@ -24,6 +24,7 @@ import com.vaadin.terminal.gwt.client.RenderSpace; import com.vaadin.terminal.gwt.client.UIDL; import com.vaadin.terminal.gwt.client.Util; import com.vaadin.terminal.gwt.client.VCaption; +import com.vaadin.terminal.gwt.client.ui.TouchScrollDelegate.TouchScrollHandler; public class VAccordion extends VTabsheetBase implements ContainerResizedListener { @@ -48,12 +49,16 @@ public class VAccordion extends VTabsheetBase implements private RenderInformation renderInformation = new RenderInformation(); + private final TouchScrollHandler touchScrollHandler; + public VAccordion() { super(CLASSNAME); // IE6 needs this to calculate offsetHeight correctly if (BrowserInfo.get().isIE6()) { DOM.setStyleAttribute(getElement(), "zoom", "1"); } + + touchScrollHandler = TouchScrollDelegate.enableTouchScrolling(this); } @Override @@ -198,7 +203,6 @@ public class VAccordion extends VTabsheetBase implements } } } - if (!alreadyOpen) { item.open(); activeTabIndex = itemIndex; @@ -442,11 +446,15 @@ public class VAccordion extends VTabsheetBase implements DOM.appendChild(captionNode, caption.getElement()); DOM.appendChild(getElement(), captionNode); DOM.appendChild(getElement(), content); - setStyleName(CLASSNAME + "-item"); - DOM.setElementProperty(content, "className", CLASSNAME - + "-item-content"); - DOM.setElementProperty(captionNode, "className", CLASSNAME - + "-item-caption"); + + getElement().addClassName(CLASSNAME + "-item"); + captionNode.addClassName(CLASSNAME + "-item-caption"); + content.addClassName(CLASSNAME + "-item-content"); + + touchScrollHandler.addElement(getContainerElement()); + + sinkEvents(Event.TOUCHEVENTS | Event.MOUSEEVENTS); + close(); } @@ -640,6 +648,8 @@ public class VAccordion extends VTabsheetBase implements protected void removeTab(int index) { StackItem item = getStackItem(index); remove(item); + + touchScrollHandler.addElement(item.getContainerElement()); } @Override -- cgit v1.2.3 From f560e8e20bdcc8035d17c494d31d961d440a60c2 Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Fri, 11 May 2012 14:26:52 +0000 Subject: #8725 Use TouchScrollDelegate.enableTouchScrolling() instead of TouchScrollDelegate instance directly; rewrite CSS class handling a bit to prevent overwriting v-scrollable svn changeset:23719/svn branch:6.8 --- .../vaadin/terminal/gwt/client/ui/VSplitPanel.java | 72 +++++++--------------- 1 file changed, 23 insertions(+), 49 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java b/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java index 51e378cc0c..173bd02151 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java @@ -122,7 +122,7 @@ public class VSplitPanel extends ComplexPanel implements Container, private boolean positionReversed = false; - private String[] componentStyleNames; + private String[] componentStyleNames = new String[0]; private Element draggingCurtain; @@ -150,8 +150,6 @@ public class VSplitPanel extends ComplexPanel implements Container, protected int origScrollTop; - private TouchScrollDelegate touchScrollDelegate; - public VSplitPanel() { this(ORIENTATION_HORIZONTAL); } @@ -175,6 +173,9 @@ public class VSplitPanel extends ComplexPanel implements Container, setOrientation(orientation); sinkEvents(Event.MOUSEEVENTS); + TouchScrollDelegate.enableTouchScrolling(this, firstContainer, + secondContainer); + addDomHandler(new TouchCancelHandler() { public void onTouchCancel(TouchCancelEvent event) { // TODO When does this actually happen?? @@ -186,11 +187,8 @@ public class VSplitPanel extends ComplexPanel implements Container, Node target = event.getTouches().get(0).getTarget().cast(); if (splitter.isOrHasChild(target)) { onMouseDown(Event.as(event.getNativeEvent())); - } else { - getTouchScrollDelegate().onTouchStart(event); } } - }, TouchStartEvent.getType()); addDomHandler(new TouchMoveHandler() { public void onTouchMove(TouchMoveEvent event) { @@ -209,14 +207,6 @@ public class VSplitPanel extends ComplexPanel implements Container, } - private TouchScrollDelegate getTouchScrollDelegate() { - if (touchScrollDelegate == null) { - touchScrollDelegate = new TouchScrollDelegate(firstContainer, - secondContainer); - } - return touchScrollDelegate; - } - protected void constructDom() { DOM.appendChild(splitter, DOM.createDiv()); // for styling DOM.appendChild(getElement(), wrapper); @@ -231,9 +221,7 @@ public class VSplitPanel extends ComplexPanel implements Container, DOM.setStyleAttribute(splitter, "position", "absolute"); DOM.setStyleAttribute(secondContainer, "position", "absolute"); - DOM.setStyleAttribute(firstContainer, "overflow", "auto"); - DOM.setStyleAttribute(secondContainer, "overflow", "auto"); - + setStylenames(); } private void setOrientation(int orientation) { @@ -249,11 +237,6 @@ public class VSplitPanel extends ComplexPanel implements Container, DOM.setStyleAttribute(firstContainer, "width", "100%"); DOM.setStyleAttribute(secondContainer, "width", "100%"); } - - DOM.setElementProperty(firstContainer, "className", CLASSNAME - + "-first-container"); - DOM.setElementProperty(secondContainer, "className", CLASSNAME - + "-second-container"); } public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { @@ -320,7 +303,6 @@ public class VSplitPanel extends ComplexPanel implements Container, client.runDescendentsLayout(this); rendering = false; - } @Override @@ -475,7 +457,6 @@ public class VSplitPanel extends ComplexPanel implements Container, // fixes scrollbars issues on webkit based browsers Util.runWebkitOverflowAutoFix(secondContainer); Util.runWebkitOverflowAutoFix(firstContainer); - } private void setFirstWidget(Widget w) { @@ -815,31 +796,24 @@ public class VSplitPanel extends ComplexPanel implements Container, } private void setStylenames() { - final String splitterSuffix = (orientation == ORIENTATION_HORIZONTAL ? "-hsplitter" - : "-vsplitter"); - final String firstContainerSuffix = "-first-container"; - final String secondContainerSuffix = "-second-container"; - String lockedSuffix = ""; - - String splitterStyle = CLASSNAME + splitterSuffix; - String firstStyle = CLASSNAME + firstContainerSuffix; - String secondStyle = CLASSNAME + secondContainerSuffix; - - if (locked) { - splitterStyle = CLASSNAME + splitterSuffix + "-locked"; - lockedSuffix = "-locked"; - } - for (int i = 0; i < componentStyleNames.length; i++) { - splitterStyle += " " + CLASSNAME + splitterSuffix + "-" - + componentStyleNames[i] + lockedSuffix; - firstStyle += " " + CLASSNAME + firstContainerSuffix + "-" - + componentStyleNames[i]; - secondStyle += " " + CLASSNAME + secondContainerSuffix + "-" - + componentStyleNames[i]; - } - DOM.setElementProperty(splitter, "className", splitterStyle); - DOM.setElementProperty(firstContainer, "className", firstStyle); - DOM.setElementProperty(secondContainer, "className", secondStyle); + final String splitterClass = CLASSNAME + + (orientation == ORIENTATION_HORIZONTAL ? "-hsplitter" + : "-vsplitter"); + final String firstContainerClass = CLASSNAME + "-first-container"; + final String secondContainerClass = CLASSNAME + "-second-container"; + final String lockedSuffix = locked ? "-locked" : ""; + + splitter.addClassName(splitterClass); + firstContainer.addClassName(firstContainerClass); + secondContainer.addClassName(secondContainerClass); + + for (String styleName : componentStyleNames) { + splitter.addClassName(splitterClass + "-" + styleName + + lockedSuffix); + firstContainer.addClassName(firstContainerClass + "-" + styleName); + secondContainer + .addClassName(secondContainerClass + "-" + styleName); + } } public void setEnabled(boolean enabled) { -- cgit v1.2.3 From 16c9142f252110d732fd74a3f0d8cd82217d8b33 Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Fri, 11 May 2012 14:29:48 +0000 Subject: #8723 Oops, call removeElement(), not addElement(), in removeTab() svn changeset:23720/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VAccordion.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VAccordion.java b/src/com/vaadin/terminal/gwt/client/ui/VAccordion.java index 73d7eba2d6..1b089af931 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VAccordion.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VAccordion.java @@ -648,8 +648,7 @@ public class VAccordion extends VTabsheetBase implements protected void removeTab(int index) { StackItem item = getStackItem(index); remove(item); - - touchScrollHandler.addElement(item.getContainerElement()); + touchScrollHandler.removeElement(item.getContainerElement()); } @Override -- cgit v1.2.3 From b50dcc33d6dcf16d562953ae21c194b1f3775d02 Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Fri, 11 May 2012 15:08:46 +0000 Subject: #8720 Improve handling of tab container scrolling svn changeset:23721/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VTabsheetPanel.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VTabsheetPanel.java b/src/com/vaadin/terminal/gwt/client/ui/VTabsheetPanel.java index f1dbea18b2..d8ab30a1e1 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VTabsheetPanel.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VTabsheetPanel.java @@ -6,7 +6,6 @@ package com.vaadin.terminal.gwt.client.ui; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Element; -import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.ComplexPanel; import com.google.gwt.user.client.ui.Widget; import com.vaadin.terminal.gwt.client.Util; @@ -25,15 +24,13 @@ public class VTabsheetPanel extends ComplexPanel { private Widget visibleWidget; - private TouchScrollHandler touchScrollHandler; + private final TouchScrollHandler touchScrollHandler; /** * Creates an empty tabsheet panel. */ public VTabsheetPanel() { setElement(DOM.createDiv()); - sinkEvents(Event.TOUCHEVENTS); - touchScrollHandler = TouchScrollDelegate.enableTouchScrolling(this); } @@ -54,6 +51,7 @@ public class VTabsheetPanel extends ComplexPanel { Element el = DOM.createDiv(); DOM.setStyleAttribute(el, "position", "absolute"); hide(el); + touchScrollHandler.addElement(el); return el; } @@ -97,6 +95,7 @@ public class VTabsheetPanel extends ComplexPanel { if (parent != null) { DOM.removeChild(getElement(), parent); } + touchScrollHandler.removeElement(parent); } return removed; } @@ -117,8 +116,6 @@ public class VTabsheetPanel extends ComplexPanel { } visibleWidget = newVisible; unHide(DOM.getParent(visibleWidget.getElement())); - touchScrollHandler.setElements(visibleWidget.getElement() - .getParentElement()); } } -- cgit v1.2.3 From 95e0de3166a1cfcf832ab708e5449ffce48cefed Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Fri, 11 May 2012 15:09:50 +0000 Subject: #8721 Make VView touch scrollable svn changeset:23722/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VView.java | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VView.java b/src/com/vaadin/terminal/gwt/client/ui/VView.java index d500c56e52..597d40cf29 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VView.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VView.java @@ -131,6 +131,7 @@ public class VView extends SimplePanel implements Container, ResizeHandler, // Allow focusing the view by using the focus() method, the view // should not be in the document focus flow getElement().setTabIndex(-1); + TouchScrollDelegate.enableTouchScrolling(this, getElement()); } /** -- cgit v1.2.3 From 716de2f65ea070ffc2335b07af6fa793b4a948f9 Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Fri, 11 May 2012 15:31:16 +0000 Subject: #8722 Move handling of scrolling from VWindow to FocusableScrollPanel svn changeset:23723/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/FocusableScrollPanel.java | 5 +++-- src/com/vaadin/terminal/gwt/client/ui/VWindow.java | 3 --- 2 files changed, 3 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/FocusableScrollPanel.java b/src/com/vaadin/terminal/gwt/client/ui/FocusableScrollPanel.java index 460c474e66..60f58fb37e 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/FocusableScrollPanel.java +++ b/src/com/vaadin/terminal/gwt/client/ui/FocusableScrollPanel.java @@ -34,8 +34,8 @@ public class FocusableScrollPanel extends SimpleFocusablePanel implements public FocusableScrollPanel() { // Prevent IE standard mode bug when a AbsolutePanel is contained. + TouchScrollDelegate.enableTouchScrolling(this, getElement()); Style style = getElement().getStyle(); - style.setOverflow(Overflow.AUTO); style.setProperty("zoom", "1"); style.setPosition(Position.RELATIVE); } @@ -162,7 +162,8 @@ public class FocusableScrollPanel extends SimpleFocusablePanel implements * the new vertical scroll position, in pixels */ public void setScrollPosition(int position) { - if (BrowserInfo.get().isAndroidWithBrokenScrollTop()) { + if (BrowserInfo.get().isAndroidWithBrokenScrollTop() + && BrowserInfo.get().requiresTouchScrollDelegate()) { ArrayList elements = TouchScrollDelegate .getElements(getElement()); for (com.google.gwt.dom.client.Element el : elements) { diff --git a/src/com/vaadin/terminal/gwt/client/ui/VWindow.java b/src/com/vaadin/terminal/gwt/client/ui/VWindow.java index d756eaf8b0..2355a9c65a 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VWindow.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VWindow.java @@ -205,9 +205,6 @@ public class VWindow extends VOverlay implements Container, contentPanel.addKeyDownHandler(this); contentPanel.addFocusHandler(this); contentPanel.addBlurHandler(this); - - TouchScrollDelegate.enableTouchScrolling(this, getContainerElement() - .getFirstChildElement()); } public void bringToFront() { -- cgit v1.2.3 From ac20081a91417ad45c6770ffdac6f4c1ae903058 Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Fri, 11 May 2012 15:38:58 +0000 Subject: #8724 Preliminary native touch scroll support for Table svn changeset:23724/svn branch:6.8 --- .../terminal/gwt/client/ui/VScrollTable.java | 214 +++++++++++++++++++-- 1 file changed, 194 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java index f0874a5d18..0ab200ccf4 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java @@ -44,8 +44,6 @@ import com.google.gwt.event.dom.client.KeyUpEvent; import com.google.gwt.event.dom.client.KeyUpHandler; import com.google.gwt.event.dom.client.ScrollEvent; import com.google.gwt.event.dom.client.ScrollHandler; -import com.google.gwt.event.dom.client.TouchStartEvent; -import com.google.gwt.event.dom.client.TouchStartHandler; import com.google.gwt.event.logical.shared.CloseEvent; import com.google.gwt.event.logical.shared.CloseHandler; import com.google.gwt.user.client.Command; @@ -212,6 +210,9 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, private boolean enableDebug = false; + private final static boolean requiresTouchScrollDelegate = BrowserInfo + .get().requiresTouchScrollDelegate(); + /** * Represents a select range of rows */ @@ -467,12 +468,12 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, public VScrollTable() { setMultiSelectMode(MULTISELECT_MODE_DEFAULT); - scrollBodyPanel.setStyleName(CLASSNAME + "-body-wrapper"); + scrollBodyPanel.addStyleName(CLASSNAME + "-body-wrapper"); scrollBodyPanel.addFocusHandler(this); scrollBodyPanel.addBlurHandler(this); scrollBodyPanel.addScrollHandler(this); - scrollBodyPanel.setStyleName(CLASSNAME + "-body"); + scrollBodyPanel.addStyleName(CLASSNAME + "-body"); /* * Firefox auto-repeat works correctly only if we use a key press @@ -487,11 +488,6 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, scrollBodyPanel.addKeyUpHandler(navKeyUpHandler); scrollBodyPanel.sinkEvents(Event.TOUCHEVENTS); - scrollBodyPanel.addDomHandler(new TouchStartHandler() { - public void onTouchStart(TouchStartEvent event) { - getTouchScrollDelegate().onTouchStart(event); - } - }, TouchStartEvent.getType()); scrollBodyPanel.sinkEvents(Event.ONCONTEXTMENU); scrollBodyPanel.addDomHandler(new ContextMenuHandler() { @@ -509,16 +505,6 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, rowRequestHandler = new RowRequestHandler(); } - protected TouchScrollDelegate getTouchScrollDelegate() { - if (touchScrollDelegate == null) { - touchScrollDelegate = new TouchScrollDelegate( - scrollBodyPanel.getElement()); - touchScrollDelegate.setScrollHandler(this); - } - return touchScrollDelegate; - - } - private void handleBodyContextMenu(ContextMenuEvent event) { if (enabled && bodyActionKeys != null) { int left = Util.getTouchOrMouseClientX(event.getNativeEvent()); @@ -4068,7 +4054,7 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, DOM.appendChild(container, preSpacer); DOM.appendChild(container, table); DOM.appendChild(container, postSpacer); - if (BrowserInfo.get().isTouchDevice()) { + if (BrowserInfo.get().requiresTouchScrollDelegate()) { NodeList childNodes = container.getChildNodes(); for (int i = 0; i < childNodes.getLength(); i++) { Element item = (Element) childNodes.getItem(i); @@ -4638,6 +4624,7 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, + "-row-odd"; private static final int TOUCH_CONTEXT_MENU_TIMEOUT = 500; private Timer contextTouchTimeout; + private Timer dragTouchTimeout; private int touchStartY; private int touchStartX; @@ -5050,11 +5037,198 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, } } + private boolean wasSignificantMove = false; + private boolean isDragging = false; + + /** + * Special handler for touch devices + * + * @param event + */ + public void onTouchBrowserEvent(final Event event) { + VConsole.log("-- START ONTOUCHBROWSEREVENT"); + if (enabled) { + final Element targetTdOrTr = getEventTargetTdOrTr(event); + final int type = event.getTypeInt(); + + switch (type) { + case Event.ONCONTEXTMENU: + showContextMenu(event); + if (enabled + && (actionKeys != null || client + .hasEventListeners(VScrollTable.this, + ITEM_CLICK_EVENT_ID))) { + /* + * Prevent browser context menu only if there are + * action handlers or item click listeners + * registered + */ + event.stopPropagation(); + event.preventDefault(); + } + break; + case Event.ONTOUCHSTART: + touchStart = event; + isDragging = false; + wasSignificantMove = false; + Touch touch = event.getChangedTouches().get(0); + // save position to fields, touches in events are same + // instance during the operation. + touchStartX = touch.getClientX(); + touchStartY = touch.getClientY(); + + if (dragmode != 0) { + if (dragTouchTimeout == null) { + dragTouchTimeout = new Timer() { + @Override + public void run() { + if (touchStart != null) { + VConsole.log("DRAGGING"); + isDragging = true; + } + } + }; + VConsole.log("START DRAG TIMEOUT"); + dragTouchTimeout.schedule(TOUCHSCROLL_TIMEOUT); + } + } + + if (actionKeys != null) { + if (contextTouchTimeout == null) { + contextTouchTimeout = new Timer() { + @Override + public void run() { + if (touchStart != null) { + VConsole.log("SHOW CONTEXT"); + showContextMenu(touchStart); + event.preventDefault(); + touchStart = null; + + } + } + }; + VConsole.log("START CONTEXT TIMEOUT"); + + contextTouchTimeout.cancel(); + contextTouchTimeout + .schedule(TOUCH_CONTEXT_MENU_TIMEOUT); + } + } + break; + case Event.ONTOUCHMOVE: + if (isSignificantMove(event)) { + wasSignificantMove = true; + if (contextTouchTimeout != null) { + contextTouchTimeout.cancel(); + } + if (!isDragging && dragTouchTimeout != null) { + VConsole.log("CANCEL DRAG TIMEOUT"); + dragTouchTimeout.cancel(); + dragTouchTimeout = null; + } + if (isDragging) { + if (dragmode != 0 && touchStart != null) { + event.preventDefault(); + event.stopPropagation(); + VConsole.log("START DRAG"); + startRowDrag(touchStart, type, targetTdOrTr); + } + isDragging = false; + } + touchStart = null; + } + break; + case Event.ONTOUCHEND: + case Event.ONTOUCHCANCEL: + VConsole.log("ONTOUCHEND"); + if (contextTouchTimeout != null) { + VConsole.log("CANCEL CONTEXT TIMEOUT"); + contextTouchTimeout.cancel(); + } + if (dragTouchTimeout != null) { + VConsole.log("CANCEL DRAG TIMEOUT"); + dragTouchTimeout.cancel(); + } + if (touchStart != null) { + event.preventDefault(); + event.stopPropagation(); + touchStart = null; + } + isDragging = false; + VConsole.log("END ONTOUCHEND"); + break; + case Event.ONMOUSEDOWN: + VConsole.log("ONMOUSEDOWN"); + if (targetTdOrTr != null) { + setRowFocus(this); + ensureFocus(); + if (dragmode != 0 + && (event.getButton() == NativeEvent.BUTTON_LEFT)) { + startRowDrag(event, event.getTypeInt(), + targetTdOrTr); + } else { + event.stopPropagation(); + } + + event.preventDefault(); + } + break; + case Event.ONMOUSEOUT: + VConsole.log("ONMOUSEOUT"); + break; + case Event.ONMOUSEUP: + VConsole.log("ONMOUSEUP"); + if (targetTdOrTr != null) { + if (isSelectable()) { + boolean currentlyJustThisRowSelected = selectedRowKeys + .size() == 1 + && selectedRowKeys.contains(getKey()); + + if (!currentlyJustThisRowSelected) { + if (isSingleSelectMode() + || isMultiSelectModeDefault()) { + deselectAll(); + } + toggleSelection(); + } else if ((isSingleSelectMode() || isMultiSelectModeSimple()) + && nullSelectionAllowed) { + toggleSelection(); + } + + selectionRangeStart = this; + setRowFocus(this); + + event.preventDefault(); + event.stopPropagation(); + } + } + + break; + case Event.ONDBLCLICK: + if (targetTdOrTr != null) { + handleClickEvent(event, targetTdOrTr, true); + } + break; + default: + } + } + VConsole.log("-- SUPER ONBROWSEREVENT"); + + super.onBrowserEvent(event); + VConsole.log("-- END ONTOUCHBROWSEREVENT"); + } + /* * React on click that occur on content cells only */ @Override public void onBrowserEvent(final Event event) { + + if (!requiresTouchScrollDelegate) { + onTouchBrowserEvent(event); + return; + } + if (enabled) { final int type = event.getTypeInt(); final Element targetTdOrTr = getEventTargetTdOrTr(event); -- cgit v1.2.3 From 3826313b3485dc944e2ab40867936331374fa93d Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Mon, 14 May 2012 08:57:13 +0000 Subject: #8716 Rewrite some CSS classname handling code to prevent overwriting v-scrollable svn changeset:23728/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VPanel.java | 55 ++++++++++------------- 1 file changed, 23 insertions(+), 32 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VPanel.java b/src/com/vaadin/terminal/gwt/client/ui/VPanel.java index f754addcf3..1b5c48283b 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VPanel.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VPanel.java @@ -8,6 +8,7 @@ import java.util.Set; import com.google.gwt.dom.client.DivElement; import com.google.gwt.dom.client.Document; +import com.google.gwt.dom.client.Style; import com.google.gwt.event.dom.client.DomEvent.Type; import com.google.gwt.event.shared.EventHandler; import com.google.gwt.event.shared.HandlerRegistration; @@ -159,44 +160,33 @@ public class VPanel extends SimplePanel implements Container, if (!uidl.hasAttribute("cached")) { // Handle caption displaying and style names, prior generics. - // Affects size - // calculations + // Affects size calculations + + final boolean hasCaption = uidl.hasAttribute("caption") + && !uidl.getStringAttribute("caption").equals(""); + + setCaption(hasCaption ? uidl.getStringAttribute("caption") : ""); // Restore default stylenames - contentNode.setClassName(CLASSNAME + "-content"); - bottomDecoration.setClassName(CLASSNAME + "-deco"); - captionNode.setClassName(CLASSNAME + "-caption"); - boolean hasCaption = false; - if (uidl.hasAttribute("caption") - && !uidl.getStringAttribute("caption").equals("")) { - setCaption(uidl.getStringAttribute("caption")); - hasCaption = true; - } else { - setCaption(""); - captionNode.setClassName(CLASSNAME + "-nocaption"); - } + final String captionBaseClass = CLASSNAME + + (hasCaption ? "-caption" : "-nocaption"); + final String contentBaseClass = CLASSNAME + "-content"; + final String decoBaseClass = CLASSNAME + "-deco"; + + captionNode.addClassName(captionBaseClass); + contentNode.addClassName(contentBaseClass); + bottomDecoration.addClassName(decoBaseClass); // Add proper stylenames for all elements. This way we can prevent // unwanted CSS selector inheritance. if (uidl.hasAttribute("style")) { final String[] styles = uidl.getStringAttribute("style").split( " "); - final String captionBaseClass = CLASSNAME - + (hasCaption ? "-caption" : "-nocaption"); - final String contentBaseClass = CLASSNAME + "-content"; - final String decoBaseClass = CLASSNAME + "-deco"; - String captionClass = captionBaseClass; - String contentClass = contentBaseClass; - String decoClass = decoBaseClass; - for (int i = 0; i < styles.length; i++) { - captionClass += " " + captionBaseClass + "-" + styles[i]; - contentClass += " " + contentBaseClass + "-" + styles[i]; - decoClass += " " + decoBaseClass + "-" + styles[i]; + for (String style : styles) { + captionNode.addClassName(captionBaseClass + "-" + style); + contentNode.addClassName(contentBaseClass + "-" + style); + bottomDecoration.addClassName(decoBaseClass + "-" + style); } - captionNode.setClassName(captionClass); - contentNode.setClassName(contentClass); - bottomDecoration.setClassName(decoClass); - } } // Ensure correct implementation @@ -509,12 +499,13 @@ public class VPanel extends SimplePanel implements Container, } private void detectContainerBorders() { - DOM.setStyleAttribute(contentNode, "overflow", "hidden"); + Style contentStyle = contentNode.getStyle(); + String overflow = contentStyle.getProperty("overflow"); + contentStyle.setProperty("overflow", "hidden"); borderPaddingHorizontal = Util.measureHorizontalBorder(contentNode); borderPaddingVertical = Util.measureVerticalBorder(contentNode); - - DOM.setStyleAttribute(contentNode, "overflow", "auto"); + contentStyle.setProperty("overflow", overflow); captionPaddingHorizontal = Util.measureHorizontalPaddingAndBorder( captionNode, 26); -- cgit v1.2.3 From 321b403c95ce067db25b67b91c531a5e082c38eb Mon Sep 17 00:00:00 2001 From: Automerge Date: Mon, 14 May 2012 09:11:31 +0000 Subject: [merge from 6.7] #5521 portlet body should fill portlet content e.g. in Liferay freeform layout, related manual test application svn changeset:23729/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VView.java | 38 +++++++++++++++++++++- ...tletSizeInLiferayFreeformLayoutApplication.java | 30 +++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 tests/testbench/com/vaadin/tests/integration/PortletSizeInLiferayFreeformLayoutApplication.java (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VView.java b/src/com/vaadin/terminal/gwt/client/ui/VView.java index 597d40cf29..abebf0ea4a 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VView.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VView.java @@ -318,8 +318,15 @@ public class VView extends SimplePanel implements Container, ResizeHandler, layout = lo; } + boolean childLayoutCached = childUidl.getBooleanAttribute("cached"); + + if (!childLayoutCached) { + // Liferay #5521: update portlet-body element size + updateLiferayPortletBodySize(childUidl); + } + layout.updateFromUIDL(childUidl, client); - if (!childUidl.getBooleanAttribute("cached")) { + if (!childLayoutCached) { updateParentFrameSize(); } @@ -420,6 +427,35 @@ public class VView extends SimplePanel implements Container, ResizeHandler, rendering = false; } + private void updateLiferayPortletBodySize(UIDL childUidl) { + // Liferay #5521: update portlet-body element size + Element parentOfVApp = getElement().getParentElement() + .getParentElement(); + if (parentOfVApp != null + && parentOfVApp.getClassName().contains("portlet-body")) { + // portlet-body needs to get size 100% if e.g. in a freeform + // layout or otherwise in a situation where the application + // layout size is specified as a percentage + for (String direction : new String[] { "height", "width" }) { + if (childUidl.hasAttribute(direction) + && childUidl.getStringAttribute(direction) + .contains("%")) { + // if layout has a percentual size, set portlet body size + // as percentual + if ("".equals(parentOfVApp.getStyle() + .getProperty(direction))) { + parentOfVApp.getStyle().setProperty(direction, "100%"); + } + } else if (parentOfVApp.getStyle().getHeight().contains("%")) { + // if layout size is undefined or fixed and we have set a + // percentual size for portlet-body, remove size setting on + // portlet body + parentOfVApp.getStyle().setProperty(direction, ""); + } + } + } + } + /** * Tries to scroll paintable referenced from given UIDL snippet to be * visible. diff --git a/tests/testbench/com/vaadin/tests/integration/PortletSizeInLiferayFreeformLayoutApplication.java b/tests/testbench/com/vaadin/tests/integration/PortletSizeInLiferayFreeformLayoutApplication.java new file mode 100644 index 0000000000..1687bd588a --- /dev/null +++ b/tests/testbench/com/vaadin/tests/integration/PortletSizeInLiferayFreeformLayoutApplication.java @@ -0,0 +1,30 @@ +package com.vaadin.tests.integration; + +import com.vaadin.Application; +import com.vaadin.ui.Label; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +/** + * On Liferay in a freeform layout, this application should get its height from + * the height of the portlet container in the Liferay layout. + * + * See ticket #5521. + */ +public class PortletSizeInLiferayFreeformLayoutApplication extends Application { + @Override + public void init() { + Window mainWindow = new Window("Portlet5521 Application"); + ((VerticalLayout) mainWindow.getContent()).setMargin(false); + ((VerticalLayout) mainWindow.getContent()).setSizeFull(); + // ((VerticalLayout) mainWindow.getContent()).setHeight("200px"); + Label label = new Label("Hello Vaadin user"); + mainWindow.addComponent(label); + for (int i = 0; i < 50; ++i) { + mainWindow.addComponent(new Label("Label " + i)); + } + mainWindow.setSizeFull(); + setMainWindow(mainWindow); + } + +} -- cgit v1.2.3 From 9ae6ce60f0965a17886b532d52de6ecdc42a173e Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Mon, 14 May 2012 09:19:52 +0000 Subject: #8763 Disable native touch scrolling on iOS 5 devices until #8792 is resolved svn changeset:23730/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/BrowserInfo.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/BrowserInfo.java b/src/com/vaadin/terminal/gwt/client/BrowserInfo.java index 5e496bd05d..c8caab6829 100644 --- a/src/com/vaadin/terminal/gwt/client/BrowserInfo.java +++ b/src/com/vaadin/terminal/gwt/client/BrowserInfo.java @@ -448,9 +448,10 @@ public class BrowserInfo { if (isAndroid() && isWebkit() && getWebkitVersion() >= 534) { return false; } - if (isIOS() && isWebkit() && getWebkitVersion() >= 534) { - return false; - } + // Cannot enable native touch scrolling on iOS 5 until #8792 is resolved + // if (isIOS() && isWebkit() && getWebkitVersion() >= 534) { + // return false; + // } return true; } -- cgit v1.2.3 From 22652ba707768ab4955f1632d0d98d1f35fe6256 Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Mon, 14 May 2012 09:57:39 +0000 Subject: #8763 Removed debug messages, added Javadoc to TouchScrollHandler svn changeset:23731/svn branch:6.8 --- .../gwt/client/ui/TouchScrollDelegate.java | 61 ++++++++++++++++------ 1 file changed, 45 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java b/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java index 171ec2838d..4e19f66b14 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java +++ b/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java @@ -90,28 +90,34 @@ public class TouchScrollDelegate implements NativePreviewHandler { private static final boolean androidWithBrokenScrollTop = BrowserInfo.get() .isAndroidWithBrokenScrollTop(); + /** + * A helper class for making a widget scrollable. Uses native scrolling if + * supported by the browser, otherwise registers a touch start handler + * delegating to a TouchScrollDelegate instance. + */ public static class TouchScrollHandler implements TouchStartHandler { + private static final String SCROLLABLE_CLASSNAME = "v-scrollable"; + private final TouchScrollDelegate delegate; private final boolean requiresDelegate = BrowserInfo.get() .requiresTouchScrollDelegate(); + /** + * Constructs a scroll handler for the given widget. + * + * @param widget + * The widget that contains scrollable elements + * @param scrollables + * The elements of the widget that should be scrollable. + */ public TouchScrollHandler(Widget widget, Element... scrollables) { if (requiresDelegate) { - VConsole.log("REQUIRES DELEGATE"); delegate = new TouchScrollDelegate(); widget.addDomHandler(this, TouchStartEvent.getType()); } else { - VConsole.log("DOES NOT REQUIRE DELEGATE"); delegate = null; } - VConsole.log(BrowserInfo.getBrowserString()); - BrowserInfo bi = BrowserInfo.get(); - VConsole.log("Is Android: " + bi.isAndroid()); - VConsole.log("Is Android with broken scrolltop: " - + bi.isAndroidWithBrokenScrollTop()); - VConsole.log("Is IOS: " + bi.isIOS()); - VConsole.log("Is Webkit: " + bi.isWebkit()); for (Element scrollable : scrollables) { addElement(scrollable); } @@ -128,27 +134,40 @@ public class TouchScrollDelegate implements NativePreviewHandler { + e.getStyle().getProperty("WebkitOverflowScrolling")); } + /** + * Registers the given element as scrollable. + */ public void addElement(Element scrollable) { - scrollable.addClassName("v-scrollable"); - scrollable.getStyle().setProperty("WebkitOverflowScrolling", - "touch"); - scrollable.getStyle().setProperty("overflowY", "auto"); - scrollable.getStyle().setProperty("overflowX", "auto"); + scrollable.addClassName(SCROLLABLE_CLASSNAME); if (requiresDelegate) { delegate.scrollableElements.add(scrollable); } - VConsole.log("Added scrollable: " + scrollable.getClassName()); } + /** + * Unregisters the given element as scrollable. Should be called when a + * previously-registered element is removed from the DOM to prevent + * memory leaks. + */ public void removeElement(Element scrollable) { - scrollable.removeClassName("v-scrollable"); + scrollable.removeClassName(SCROLLABLE_CLASSNAME); if (requiresDelegate) { delegate.scrollableElements.remove(scrollable); } } + /** + * Registers the given elements as scrollable, removing previously + * registered scrollables from this handler. + * + * @param scrollables + * The elements that should be scrollable + */ public void setElements(Element... scrollables) { if (requiresDelegate) { + for (Element e : delegate.scrollableElements) { + e.removeClassName(SCROLLABLE_CLASSNAME); + } delegate.scrollableElements.clear(); } for (Element e : scrollables) { @@ -157,6 +176,16 @@ public class TouchScrollDelegate implements NativePreviewHandler { } } + /** + * Makes the given elements scrollable, either natively or by using a + * TouchScrollDelegate, depending on platform capabilities. + * + * @param widget + * The widget that contains scrollable elements + * @param scrollables + * The elements inside the widget that should be scrollable + * @return A scroll handler for the given widget. + */ public static TouchScrollHandler enableTouchScrolling(Widget widget, Element... scrollables) { return new TouchScrollHandler(widget, scrollables); -- cgit v1.2.3 From c03c497eeb4f1f368e36ee2dfa72d33ef4b22a23 Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Mon, 14 May 2012 10:32:48 +0000 Subject: #8724 Erroneously called onTouchBrowserEvent with non-touch platforms svn changeset:23732/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java index 0ab200ccf4..bcd66c13f8 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java @@ -210,8 +210,9 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, private boolean enableDebug = false; - private final static boolean requiresTouchScrollDelegate = BrowserInfo - .get().requiresTouchScrollDelegate(); + private static final boolean hasNativeTouchScrolling = BrowserInfo.get() + .isTouchDevice() + && !BrowserInfo.get().requiresTouchScrollDelegate(); /** * Represents a select range of rows @@ -5224,7 +5225,7 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, @Override public void onBrowserEvent(final Event event) { - if (!requiresTouchScrollDelegate) { + if (hasNativeTouchScrolling) { onTouchBrowserEvent(event); return; } -- cgit v1.2.3 From 0ec34926cc165bba52fd52526f2b99bba6b9d603 Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Mon, 14 May 2012 11:50:40 +0000 Subject: #8723 Do not sink touch events in Accordion svn changeset:23733/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VAccordion.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VAccordion.java b/src/com/vaadin/terminal/gwt/client/ui/VAccordion.java index 1b089af931..4ff70d1668 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VAccordion.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VAccordion.java @@ -453,7 +453,7 @@ public class VAccordion extends VTabsheetBase implements touchScrollHandler.addElement(getContainerElement()); - sinkEvents(Event.TOUCHEVENTS | Event.MOUSEEVENTS); + sinkEvents(Event.MOUSEEVENTS); close(); } -- cgit v1.2.3 From 8b064167bbf42f1e0788e854bd7450a87fc480a2 Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Tue, 15 May 2012 07:48:46 +0000 Subject: #8716 #8725 Fix regressions introduced by CSS class handling changes svn changeset:23736/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VPanel.java | 15 +++++++++++---- src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java | 16 +++++++++++----- 2 files changed, 22 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VPanel.java b/src/com/vaadin/terminal/gwt/client/ui/VPanel.java index 1b5c48283b..56bc779fbc 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VPanel.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VPanel.java @@ -27,6 +27,7 @@ import com.vaadin.terminal.gwt.client.RenderSpace; import com.vaadin.terminal.gwt.client.UIDL; import com.vaadin.terminal.gwt.client.Util; import com.vaadin.terminal.gwt.client.ui.ShortcutActionHandler.ShortcutActionHandlerOwner; +import com.vaadin.terminal.gwt.client.ui.TouchScrollDelegate.TouchScrollHandler; public class VPanel extends SimplePanel implements Container, ShortcutActionHandlerOwner, Focusable { @@ -80,6 +81,8 @@ public class VPanel extends SimplePanel implements Container, private String previousStyleName; + private final TouchScrollHandler touchScrollHandler; + private ClickEventHandler clickEventHandler = new ClickEventHandler(this, CLICK_EVENT_IDENTIFIER) { @@ -119,7 +122,8 @@ public class VPanel extends SimplePanel implements Container, contentNode.getStyle().setProperty("position", "relative"); getElement().getStyle().setProperty("overflow", "hidden"); - TouchScrollDelegate.enableTouchScrolling(this, contentNode); + touchScrollHandler = TouchScrollDelegate.enableTouchScrolling(this, + contentNode); } /** @@ -173,9 +177,9 @@ public class VPanel extends SimplePanel implements Container, final String contentBaseClass = CLASSNAME + "-content"; final String decoBaseClass = CLASSNAME + "-deco"; - captionNode.addClassName(captionBaseClass); - contentNode.addClassName(contentBaseClass); - bottomDecoration.addClassName(decoBaseClass); + captionNode.setClassName(captionBaseClass); + contentNode.setClassName(contentBaseClass); + bottomDecoration.setClassName(decoBaseClass); // Add proper stylenames for all elements. This way we can prevent // unwanted CSS selector inheritance. @@ -188,6 +192,9 @@ public class VPanel extends SimplePanel implements Container, bottomDecoration.addClassName(decoBaseClass + "-" + style); } } + + // Ensure panel is still scrollable + touchScrollHandler.addElement(contentNode); } // Ensure correct implementation if (client.updateComponent(this, uidl, false)) { diff --git a/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java b/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java index 173bd02151..5a996954a0 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java @@ -36,6 +36,7 @@ import com.vaadin.terminal.gwt.client.RenderSpace; import com.vaadin.terminal.gwt.client.UIDL; import com.vaadin.terminal.gwt.client.Util; import com.vaadin.terminal.gwt.client.VConsole; +import com.vaadin.terminal.gwt.client.ui.TouchScrollDelegate.TouchScrollHandler; public class VSplitPanel extends ComplexPanel implements Container, ContainerResizedListener { @@ -146,6 +147,8 @@ public class VSplitPanel extends ComplexPanel implements Container, /* The current position of the split handle in either percentages or pixels */ private String position; + private final TouchScrollHandler touchScrollHandler; + protected Element scrolledContainer; protected int origScrollTop; @@ -173,8 +176,8 @@ public class VSplitPanel extends ComplexPanel implements Container, setOrientation(orientation); sinkEvents(Event.MOUSEEVENTS); - TouchScrollDelegate.enableTouchScrolling(this, firstContainer, - secondContainer); + touchScrollHandler = TouchScrollDelegate.enableTouchScrolling(this, + firstContainer, secondContainer); addDomHandler(new TouchCancelHandler() { public void onTouchCancel(TouchCancelEvent event) { @@ -265,6 +268,9 @@ public class VSplitPanel extends ComplexPanel implements Container, setStylenames(); + // Ensure panels are still scrollable + touchScrollHandler.setElements(firstContainer, secondContainer); + position = uidl.getStringAttribute("position"); setSplitPosition(position); @@ -803,9 +809,9 @@ public class VSplitPanel extends ComplexPanel implements Container, final String secondContainerClass = CLASSNAME + "-second-container"; final String lockedSuffix = locked ? "-locked" : ""; - splitter.addClassName(splitterClass); - firstContainer.addClassName(firstContainerClass); - secondContainer.addClassName(secondContainerClass); + splitter.setClassName(splitterClass + lockedSuffix); + firstContainer.setClassName(firstContainerClass); + secondContainer.setClassName(secondContainerClass); for (String styleName : componentStyleNames) { splitter.addClassName(splitterClass + "-" + styleName -- cgit v1.2.3 From a21464620881742f28b233864bf8c35f74728ad0 Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Tue, 15 May 2012 08:14:45 +0000 Subject: #8763 Re-added TouchScrollDelegate#setElements() svn changeset:23737/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java b/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java index 4e19f66b14..7302f9f2ac 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java +++ b/src/com/vaadin/terminal/gwt/client/ui/TouchScrollDelegate.java @@ -118,9 +118,7 @@ public class TouchScrollDelegate implements NativePreviewHandler { } else { delegate = null; } - for (Element scrollable : scrollables) { - addElement(scrollable); - } + setElements(scrollables); } public void onTouchStart(TouchStartEvent event) { @@ -192,7 +190,7 @@ public class TouchScrollDelegate implements NativePreviewHandler { } public TouchScrollDelegate(Element... elements) { - scrollableElements = new HashSet(Arrays.asList(elements)); + setElements(elements); } public void setScrollHandler(ScrollHandler scrollHandler) { @@ -640,6 +638,10 @@ public class TouchScrollDelegate implements NativePreviewHandler { } } + public void setElements(Element[] elements) { + scrollableElements = new HashSet(Arrays.asList(elements)); + } + /** * long calcucation are not very efficient in GWT, so this helper method * returns timestamp in double. -- cgit v1.2.3 From b5486bce95d754a3fd1ff169679c4714c42154ee Mon Sep 17 00:00:00 2001 From: Automerge Date: Tue, 15 May 2012 09:09:09 +0000 Subject: [merge from 6.7] #5521 fixed condition that was always checking for height, not width svn changeset:23740/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VView.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VView.java b/src/com/vaadin/terminal/gwt/client/ui/VView.java index abebf0ea4a..ec4c5d9cba 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VView.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VView.java @@ -446,7 +446,8 @@ public class VView extends SimplePanel implements Container, ResizeHandler, .getProperty(direction))) { parentOfVApp.getStyle().setProperty(direction, "100%"); } - } else if (parentOfVApp.getStyle().getHeight().contains("%")) { + } else if (parentOfVApp.getStyle().getProperty(direction) + .contains("%")) { // if layout size is undefined or fixed and we have set a // percentual size for portlet-body, remove size setting on // portlet body -- cgit v1.2.3 From 531e592760c2f2fe065ff203b120cba3f6950da3 Mon Sep 17 00:00:00 2001 From: Automerge Date: Tue, 15 May 2012 13:06:42 +0000 Subject: [merge from 6.7] Remove invalid import used by javadocs svn changeset:23745/svn branch:6.8 --- src/com/vaadin/ui/TreeTable.java | 1 - 1 file changed, 1 deletion(-) (limited to 'src') diff --git a/src/com/vaadin/ui/TreeTable.java b/src/com/vaadin/ui/TreeTable.java index 43bc7a80fe..19ca27133b 100644 --- a/src/com/vaadin/ui/TreeTable.java +++ b/src/com/vaadin/ui/TreeTable.java @@ -13,7 +13,6 @@ import java.util.List; import java.util.Map; import java.util.logging.Logger; -import com.google.gwt.user.client.ui.Tree; import com.vaadin.data.Container; import com.vaadin.data.Container.Hierarchical; import com.vaadin.data.Container.ItemSetChangeEvent; -- cgit v1.2.3 From 41f5328ef5600ce61bb323814f605cc6e77cbca2 Mon Sep 17 00:00:00 2001 From: Automerge Date: Tue, 15 May 2012 17:11:36 +0000 Subject: [merge from 6.7] Take viewport scrolling into account when calculating drop position (#6021) svn changeset:23749/svn branch:6.8 --- .../vaadin/terminal/gwt/client/ui/dd/DDUtil.java | 17 ++++-- .../tests/dd/ScrolledDropTarget.html.disabled | 0 .../com/vaadin/tests/dd/ScrolledDropTarget.java | 67 ++++++++++++++++++++++ 3 files changed, 79 insertions(+), 5 deletions(-) create mode 100644 tests/testbench/com/vaadin/tests/dd/ScrolledDropTarget.html.disabled create mode 100644 tests/testbench/com/vaadin/tests/dd/ScrolledDropTarget.java (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/DDUtil.java b/src/com/vaadin/terminal/gwt/client/ui/dd/DDUtil.java index 02c1fe5061..225770b62b 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/DDUtil.java +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/DDUtil.java @@ -5,6 +5,7 @@ package com.vaadin.terminal.gwt.client.ui.dd; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.user.client.Element; +import com.google.gwt.user.client.Window; import com.vaadin.terminal.gwt.client.Util; public class DDUtil { @@ -43,8 +44,11 @@ public class DDUtil { public static VerticalDropLocation getVerticalDropLocation(Element element, int offsetHeight, int clientY, double topBottomRatio) { - int absoluteTop = element.getAbsoluteTop(); - int fromTop = clientY - absoluteTop; + // Event coordinates are relative to the viewport, element absolute + // position is relative to the document. Make element position relative + // to viewport by adjusting for viewport scrolling. See #6021 + int elementTop = element.getAbsoluteTop() - Window.getScrollTop(); + int fromTop = clientY - elementTop; float percentageFromTop = (fromTop / (float) offsetHeight); if (percentageFromTop < topBottomRatio) { @@ -74,11 +78,14 @@ public class DDUtil { public static HorizontalDropLocation getHorizontalDropLocation( Element element, int clientX, double leftRightRatio) { - int absoluteLeft = element.getAbsoluteLeft(); + // Event coordinates are relative to the viewport, element absolute + // position is relative to the document. Make element position relative + // to viewport by adjusting for viewport scrolling. See #6021 + int elementLeft = element.getAbsoluteLeft() - Window.getScrollLeft(); int offsetWidth = element.getOffsetWidth(); - int fromTop = clientX - absoluteLeft; + int fromLeft = clientX - elementLeft; - float percentageFromTop = (fromTop / (float) offsetWidth); + float percentageFromTop = (fromLeft / (float) offsetWidth); if (percentageFromTop < leftRightRatio) { return HorizontalDropLocation.LEFT; } else if (percentageFromTop > 1 - leftRightRatio) { diff --git a/tests/testbench/com/vaadin/tests/dd/ScrolledDropTarget.html.disabled b/tests/testbench/com/vaadin/tests/dd/ScrolledDropTarget.html.disabled new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/testbench/com/vaadin/tests/dd/ScrolledDropTarget.java b/tests/testbench/com/vaadin/tests/dd/ScrolledDropTarget.java new file mode 100644 index 0000000000..093e12f84a --- /dev/null +++ b/tests/testbench/com/vaadin/tests/dd/ScrolledDropTarget.java @@ -0,0 +1,67 @@ +package com.vaadin.tests.dd; + +import com.vaadin.event.dd.DragAndDropEvent; +import com.vaadin.event.dd.DropHandler; +import com.vaadin.event.dd.acceptcriteria.AcceptCriterion; +import com.vaadin.terminal.gwt.client.ui.dd.VerticalDropLocation; +import com.vaadin.tests.components.TestBase; +import com.vaadin.tests.util.Log; +import com.vaadin.ui.AbstractSelect.AbstractSelectTargetDetails; +import com.vaadin.ui.AbstractSelect.VerticalLocationIs; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Table; +import com.vaadin.ui.Table.TableDragMode; + +public class ScrolledDropTarget extends TestBase { + private final Log log = new Log(5); + + @Override + protected void setup() { + + Table table = new Table(); + table.addContainerProperty("A", String.class, ""); + for (int i = 0; i < 100; i++) { + table.addItem(new Object[] { Integer.toString(i) }, + Integer.valueOf(i)); + } + + table.setDragMode(TableDragMode.ROW); + table.setDropHandler(new DropHandler() { + public AcceptCriterion getAcceptCriterion() { + return VerticalLocationIs.MIDDLE; + } + + public void drop(DragAndDropEvent event) { + AbstractSelectTargetDetails targetDetails = (AbstractSelectTargetDetails) event + .getTargetDetails(); + VerticalDropLocation dropLocation = targetDetails + .getDropLocation(); + log.log("Drop at " + dropLocation + " relative to " + + targetDetails.getItemIdOver()); + } + }); + + addComponent(table); + addComponent(new Button("Scroll body", new Button.ClickListener() { + public void buttonClick(ClickEvent event) { + getMainWindow().executeJavaScript( + "document.body.style.overflow = 'auto';" + + "document.body.style.height = '200%';" + + "window.scrollTo(0,18)"); + } + })); + addComponent(log); + } + + @Override + protected String getDescription() { + return "Vertical location for drags should work even when the browser window is scrolled"; + } + + @Override + protected Integer getTicketNumber() { + return Integer.valueOf(6021); + } + +} -- cgit v1.2.3 From a9aeab18b267ea1bc8e454d01ce5adeea94f917d Mon Sep 17 00:00:00 2001 From: Automerge Date: Wed, 16 May 2012 09:07:19 +0000 Subject: [merge from 6.7] Rename illogical local variable svn changeset:23752/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/dd/DDUtil.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/dd/DDUtil.java b/src/com/vaadin/terminal/gwt/client/ui/dd/DDUtil.java index 225770b62b..97f5eb86fd 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/dd/DDUtil.java +++ b/src/com/vaadin/terminal/gwt/client/ui/dd/DDUtil.java @@ -85,10 +85,10 @@ public class DDUtil { int offsetWidth = element.getOffsetWidth(); int fromLeft = clientX - elementLeft; - float percentageFromTop = (fromLeft / (float) offsetWidth); - if (percentageFromTop < leftRightRatio) { + float percentageFromLeft = (fromLeft / (float) offsetWidth); + if (percentageFromLeft < leftRightRatio) { return HorizontalDropLocation.LEFT; - } else if (percentageFromTop > 1 - leftRightRatio) { + } else if (percentageFromLeft > 1 - leftRightRatio) { return HorizontalDropLocation.RIGHT; } else { return HorizontalDropLocation.CENTER; -- cgit v1.2.3 From 55f69ec8a203137d6bc1acfdb385da96a2f09b47 Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Fri, 18 May 2012 07:52:44 +0000 Subject: [merge from 6.7] #8793 Retain all tab metadata, not just caption and icon, in TabSheet.replaceComponent() svn changeset:23761/svn branch:6.8 --- src/com/vaadin/ui/TabSheet.java | 78 +++++++++++++++++------------------------ 1 file changed, 32 insertions(+), 46 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/ui/TabSheet.java b/src/com/vaadin/ui/TabSheet.java index 09d1002b48..6ada797570 100644 --- a/src/com/vaadin/ui/TabSheet.java +++ b/src/com/vaadin/ui/TabSheet.java @@ -725,25 +725,6 @@ public class TabSheet extends AbstractComponentContainer implements Focusable, Tab newTab = tabs.get(newComponent); Tab oldTab = tabs.get(oldComponent); - // Gets the captions - String oldCaption = null; - Resource oldIcon = null; - String newCaption = null; - Resource newIcon = null; - - if (oldTab != null) { - oldCaption = oldTab.getCaption(); - oldIcon = oldTab.getIcon(); - } - - if (newTab != null) { - newCaption = newTab.getCaption(); - newIcon = newTab.getIcon(); - } else { - newCaption = newComponent.getCaption(); - newIcon = newComponent.getIcon(); - } - // Gets the locations int oldLocation = -1; int newLocation = -1; @@ -765,35 +746,21 @@ public class TabSheet extends AbstractComponentContainer implements Focusable, addComponent(newComponent); } else if (newLocation == -1) { removeComponent(oldComponent); - keyMapper.remove(oldComponent); - newTab = addTab(newComponent); - components.remove(newComponent); - components.add(oldLocation, newComponent); - newTab.setCaption(oldCaption); - newTab.setIcon(oldIcon); + newTab = addTab(newComponent, oldLocation); + // Copy all relevant metadata to the new tab (#8793) + // TODO Should reuse the old tab instance instead? + copyTabMetadata(oldTab, newTab); } else { - if (oldLocation > newLocation) { - components.remove(oldComponent); - components.add(newLocation, oldComponent); - components.remove(newComponent); - components.add(oldLocation, newComponent); - } else { - components.remove(newComponent); - components.add(oldLocation, newComponent); - components.remove(oldComponent); - components.add(newLocation, oldComponent); - } + components.set(oldLocation, newComponent); + components.set(newLocation, oldComponent); - if (newTab != null) { - // This should always be true - newTab.setCaption(oldCaption); - newTab.setIcon(oldIcon); - } - if (oldTab != null) { - // This should always be true - oldTab.setCaption(newCaption); - oldTab.setIcon(newIcon); - } + // Tab associations are not changed, but metadata is swapped between + // the instances + // TODO Should reassociate the instances instead? + Tab tmp = new TabSheetTabImpl(null, null); + copyTabMetadata(newTab, tmp); + copyTabMetadata(oldTab, newTab); + copyTabMetadata(tmp, oldTab); requestRepaint(); } @@ -1303,4 +1270,23 @@ public class TabSheet extends AbstractComponentContainer implements Focusable, removeListener(FocusEvent.EVENT_ID, FocusEvent.class, listener); } + + /** + * Copies properties from one Tab to another. + * + * @param from + * The tab whose data to copy. + * @param to + * The tab to which copy the data. + */ + private static void copyTabMetadata(Tab from, Tab to) { + to.setCaption(from.getCaption()); + to.setIcon(from.getIcon()); + to.setDescription(from.getDescription()); + to.setVisible(from.isVisible()); + to.setEnabled(from.isEnabled()); + to.setClosable(from.isClosable()); + to.setStyleName(from.getStyleName()); + to.setComponentError(from.getComponentError()); + } } -- cgit v1.2.3 From b4eb8571aba35b90df5cf70ad1f4a8ca3f67556d Mon Sep 17 00:00:00 2001 From: Automerge Date: Fri, 18 May 2012 08:44:57 +0000 Subject: [merge from 6.7] #8805 fix flickering of partial first row in table, related manual test svn changeset:23762/svn branch:6.8 --- src/com/vaadin/ui/Table.java | 7 ++ .../components/table/TableFirstRowFlicker.java | 85 ++++++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 tests/testbench/com/vaadin/tests/components/table/TableFirstRowFlicker.java (limited to 'src') diff --git a/src/com/vaadin/ui/Table.java b/src/com/vaadin/ui/Table.java index 7828fdb734..db0809fbd5 100644 --- a/src/com/vaadin/ui/Table.java +++ b/src/com/vaadin/ui/Table.java @@ -1458,6 +1458,13 @@ public class Table extends AbstractSelect implements Action.Container, } } else { // initial load + + // #8805 send one extra row in the beginning in case a partial + // row is shown on the UI + if (firstIndex > 0) { + firstIndex = firstIndex - 1; + rows = rows + 1; + } firstToBeRenderedInClient = firstIndex; } if (totalRows > 0) { diff --git a/tests/testbench/com/vaadin/tests/components/table/TableFirstRowFlicker.java b/tests/testbench/com/vaadin/tests/components/table/TableFirstRowFlicker.java new file mode 100644 index 0000000000..776e7956bf --- /dev/null +++ b/tests/testbench/com/vaadin/tests/components/table/TableFirstRowFlicker.java @@ -0,0 +1,85 @@ +package com.vaadin.tests.components.table; + +import com.vaadin.Application; +import com.vaadin.data.Container; +import com.vaadin.data.util.IndexedContainer; +import com.vaadin.ui.Label; +import com.vaadin.ui.ProgressIndicator; +import com.vaadin.ui.Table; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; + +public class TableFirstRowFlicker extends Application { + + Table t; + + @Override + public void init() { + Window mainWindow = new Window("Table Row Flicker"); + mainWindow.getContent().setSizeFull(); + setMainWindow(mainWindow); + + t = new Table(); + t.setSizeFull(); + t.setSelectable(true); + t.setContainerDataSource(buildContainer()); + mainWindow.addComponent(t); + ((VerticalLayout) mainWindow.getContent()).setExpandRatio(t, 1); + + // Button button = new Button("Refresh"); + // button.addListener(new Button.ClickListener() { + // public void buttonClick(ClickEvent event) { + // t.refreshRowCache(); + // } + // }); + // mainWindow.addComponent(button); + + ProgressIndicator pi = new ProgressIndicator(); + pi.setPollingInterval(1000); + pi.setIndeterminate(true); + mainWindow.addComponent(pi); + + Thread r = new Thread() { + @Override + public void run() { + while (t != null) { + synchronized (t.getApplication()) { + int firstId = t.getCurrentPageFirstItemIndex(); + Object selected = t.getValue(); + t.setContainerDataSource(buildContainer()); + t.setValue(selected); + t.setCurrentPageFirstItemIndex(firstId); + // lighter alternative for all of above + // t.refreshRowCache(); + } + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println("Table update thread stopped"); + } + }; + r.start(); + } + + @Override + public void close() { + t = null; + super.close(); + } + + private Container buildContainer() { + IndexedContainer cont = new IndexedContainer(); + cont.addContainerProperty("name", Label.class, null); + for (int i = 0; i < 10000; i++) { + cont.addItem(i); + Label l = new Label("Item " + i); + l.setHeight("50px"); + cont.getContainerProperty(i, "name").setValue(l); + } + return cont; + } + +} \ No newline at end of file -- cgit v1.2.3 From 7f8bcc2638e5fe97e3a362e86a3b7953c0663e8e Mon Sep 17 00:00:00 2001 From: Automerge Date: Fri, 18 May 2012 08:45:02 +0000 Subject: [merge from 6.7] Fix #8810 - only animate row expansion if there are child rows to animate svn changeset:23763/svn branch:6.8 --- .../vaadin/terminal/gwt/client/ui/VTreeTable.java | 11 +++- .../tests/components/treetable/RowAnimation.html | 77 ++++++++++++++++++++++ 2 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 tests/testbench/com/vaadin/tests/components/treetable/RowAnimation.html (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VTreeTable.java b/src/com/vaadin/terminal/gwt/client/ui/VTreeTable.java index 8e55400f31..13a60c74b9 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VTreeTable.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VTreeTable.java @@ -496,8 +496,11 @@ public class VTreeTable extends VScrollTable { int firstIndex, int rows) { List insertedRows = insertAndReindexRows(rowData, firstIndex, rows); - RowExpandAnimation anim = new RowExpandAnimation(insertedRows); - anim.run(150); + if (!insertedRows.isEmpty()) { + // Only animate if there's something to animate (#8810) + RowExpandAnimation anim = new RowExpandAnimation(insertedRows); + anim.run(150); + } return insertedRows; } @@ -620,6 +623,10 @@ public class VTreeTable extends VScrollTable { private Element cloneTable; private AnimationPreparator preparator; + /** + * @param rows + * List of rows to animate. Must not be empty. + */ public RowExpandAnimation(List rows) { this.rows = rows; buildAndInsertAnimatingDiv(); diff --git a/tests/testbench/com/vaadin/tests/components/treetable/RowAnimation.html b/tests/testbench/com/vaadin/tests/components/treetable/RowAnimation.html new file mode 100644 index 0000000000..64ff061c13 --- /dev/null +++ b/tests/testbench/com/vaadin/tests/components/treetable/RowAnimation.html @@ -0,0 +1,77 @@ + + + + + + +TestAnimatedExpandCollapse + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TestAnimatedExpandCollapse
open/run/com.vaadin.tests.components.treetable.TreeTableTest?restartApplication
mouseClickvaadin=runcomvaadintestscomponentstreetableTreeTableTest::PID_Smenu#item038,10
mouseClickvaadin=runcomvaadintestscomponentstreetableTreeTableTest::Root/VOverlay[0]/VMenuBar[0]#item035,5
mouseClickvaadin=runcomvaadintestscomponentstreetableTreeTableTest::Root/VOverlay[1]/VMenuBar[0]#item730,12
mouseClickvaadin=runcomvaadintestscomponentstreetableTreeTableTest::PID_StestComponent/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]12,7
mouseClickvaadin=runcomvaadintestscomponentstreetableTreeTableTest::PID_StestComponent/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[0]/domChild[0]31,7
mouseClickvaadin=runcomvaadintestscomponentstreetableTreeTableTest::PID_StestComponent/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[2]/domChild[0]/domChild[0]/domChild[0]29,8
mouseClickvaadin=runcomvaadintestscomponentstreetableTreeTableTest::PID_StestComponent/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[3]/domChild[0]/domChild[0]/domChild[0]30,6
assertTextvaadin=runcomvaadintestscomponentstreetableTreeTableTest::PID_StestComponent/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[0]Item 4,1
assertTextvaadin=runcomvaadintestscomponentstreetableTreeTableTest::PID_StestComponent/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[2]/domChild[0]/domChild[0]Item 5,1
assertTextvaadin=runcomvaadintestscomponentstreetableTreeTableTest::PID_StestComponent/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[3]/domChild[0]/domChild[0]Item 6,1
assertTextvaadin=runcomvaadintestscomponentstreetableTreeTableTest::PID_StestComponent/domChild[1]/domChild[0]/domChild[1]/domChild[0]/domChild[4]/domChild[0]/domChild[0]Item 7,1
+ + -- cgit v1.2.3 From 2041e6273e0dfb2e4e38b00ec1470e691ea115b8 Mon Sep 17 00:00:00 2001 From: Automerge Date: Fri, 18 May 2012 08:45:07 +0000 Subject: [merge from 6.7] #8810 Fix row collapse animation as well svn changeset:23764/svn branch:6.8 --- .../vaadin/terminal/gwt/client/ui/VTreeTable.java | 33 ++++++++++++++-------- 1 file changed, 21 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VTreeTable.java b/src/com/vaadin/terminal/gwt/client/ui/VTreeTable.java index 13a60c74b9..324efcb67d 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VTreeTable.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VTreeTable.java @@ -478,18 +478,23 @@ public class VTreeTable extends VScrollTable { rowsToDelete.add(row); } } - RowCollapseAnimation anim = new RowCollapseAnimation(rowsToDelete) { - @Override - protected void onComplete() { - super.onComplete(); - // Actually unlink the rows and update the cache after the - // animation is done. - unlinkAndReindexRows(firstIndex, rows); - discardRowsOutsideCacheWindow(); - ensureCacheFilled(); - } - }; - anim.run(150); + if (!rowsToDelete.isEmpty()) { + // #8810 Only animate if there's something to animate + RowCollapseAnimation anim = new RowCollapseAnimation( + rowsToDelete) { + @Override + protected void onComplete() { + super.onComplete(); + // Actually unlink the rows and update the cache after + // the + // animation is done. + unlinkAndReindexRows(firstIndex, rows); + discardRowsOutsideCacheWindow(); + ensureCacheFilled(); + } + }; + anim.run(150); + } } protected List insertRowsAnimated(UIDL rowData, @@ -747,6 +752,10 @@ public class VTreeTable extends VScrollTable { private final List rows; + /** + * @param rows + * List of rows to animate. Must not be empty. + */ public RowCollapseAnimation(List rows) { super(rows); this.rows = rows; -- cgit v1.2.3 From 879e9aef4d6374ce89565460e0a979731f5da71f Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Mon, 21 May 2012 13:10:49 +0000 Subject: #8723 Remove superfluous sinkEvents() call svn changeset:23772/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VAccordion.java | 2 -- 1 file changed, 2 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VAccordion.java b/src/com/vaadin/terminal/gwt/client/ui/VAccordion.java index 4ff70d1668..20030d2d46 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VAccordion.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VAccordion.java @@ -453,8 +453,6 @@ public class VAccordion extends VTabsheetBase implements touchScrollHandler.addElement(getContainerElement()); - sinkEvents(Event.MOUSEEVENTS); - close(); } -- cgit v1.2.3 From 9b52497261f0063b5a2d0431b8d7d61930a46161 Mon Sep 17 00:00:00 2001 From: Automerge Date: Mon, 21 May 2012 13:19:35 +0000 Subject: [merge from 6.7] Don't trigger actions if space or enter is pressed with Button focused (#7191) svn changeset:23774/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VButton.java | 37 +++++-------- src/com/vaadin/ui/Button.java | 3 -- .../button/ButtonEnterWithWindowShortcut.html | 62 ++++++++++++++++++++++ .../button/ButtonEnterWithWindowShortcut.java | 55 +++++++++++++++++++ 4 files changed, 129 insertions(+), 28 deletions(-) create mode 100644 tests/testbench/com/vaadin/tests/components/button/ButtonEnterWithWindowShortcut.html create mode 100644 tests/testbench/com/vaadin/tests/components/button/ButtonEnterWithWindowShortcut.java (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VButton.java b/src/com/vaadin/terminal/gwt/client/ui/VButton.java index 98103dc41e..e77ad710b1 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VButton.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VButton.java @@ -77,7 +77,9 @@ public class VButton extends FocusWidget implements Paintable, ClickHandler, private boolean isCapturing; /** - * If true, this widget has focus with the space bar down. + * If true, this widget has focus with the space bar down. This + * means that we will get events when the button is released, but we should + * trigger the button only if the button is still focused at that point. */ private boolean isFocusing; @@ -91,8 +93,6 @@ public class VButton extends FocusWidget implements Paintable, ClickHandler, private HandlerRegistration focusHandlerRegistration; private HandlerRegistration blurHandlerRegistration; - private int clickShortcut = 0; - /** * If caption should be rendered in HTML */ @@ -174,10 +174,6 @@ public class VButton extends FocusWidget implements Paintable, ClickHandler, icon = null; } } - - if (uidl.hasAttribute("keycode")) { - clickShortcut = uidl.getIntAttribute("keycode"); - } } public void setText(String text) { @@ -316,37 +312,28 @@ public class VButton extends FocusWidget implements Paintable, ClickHandler, if ((event.getTypeInt() & Event.KEYEVENTS) != 0) { switch (type) { case Event.ONKEYDOWN: + // Stop propagation when the user starts pressing a button that + // we are handling to prevent actions from getting triggered if (event.getKeyCode() == 32 /* space */) { isFocusing = true; event.preventDefault(); + event.stopPropagation(); + } else if (event.getKeyCode() == KeyCodes.KEY_ENTER) { + event.stopPropagation(); } break; case Event.ONKEYUP: if (isFocusing && event.getKeyCode() == 32 /* space */) { isFocusing = false; - - /* - * If click shortcut is space then the shortcut handler will - * take care of the click. - */ - if (clickShortcut != 32 /* space */) { - onClick(); - } - + onClick(); + event.stopPropagation(); event.preventDefault(); } break; case Event.ONKEYPRESS: if (event.getKeyCode() == KeyCodes.KEY_ENTER) { - - /* - * If click shortcut is enter then the shortcut handler will - * take care of the click. - */ - if (clickShortcut != KeyCodes.KEY_ENTER) { - onClick(); - } - + onClick(); + event.stopPropagation(); event.preventDefault(); } break; diff --git a/src/com/vaadin/ui/Button.java b/src/com/vaadin/ui/Button.java index fdaef046e5..0032db1752 100644 --- a/src/com/vaadin/ui/Button.java +++ b/src/com/vaadin/ui/Button.java @@ -158,9 +158,6 @@ public class Button extends AbstractField implements FieldEvents.BlurNotifier, if (isDisableOnClick()) { target.addAttribute(VButton.ATTR_DISABLE_ON_CLICK, true); } - if (clickShortcut != null) { - target.addAttribute("keycode", clickShortcut.getKeyCode()); - } if (isHtmlContentAllowed()) { target.addAttribute("html-caption", true); diff --git a/tests/testbench/com/vaadin/tests/components/button/ButtonEnterWithWindowShortcut.html b/tests/testbench/com/vaadin/tests/components/button/ButtonEnterWithWindowShortcut.html new file mode 100644 index 0000000000..5ec33f09fa --- /dev/null +++ b/tests/testbench/com/vaadin/tests/components/button/ButtonEnterWithWindowShortcut.html @@ -0,0 +1,62 @@ + + + + + + +New Test + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
New Test
open/run/com.vaadin.tests.components.button.ButtonEnterWithWindowShortcut?restartApplication
pressSpecialKeyvaadin=runcomvaadintestscomponentsbuttonButtonEnterWithWindowShortcut::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]enter
assertTextvaadin=runcomvaadintestscomponentsbuttonButtonEnterWithWindowShortcut::PID_SLog_row_01. button click listener fired
pressSpecialKeyvaadin=runcomvaadintestscomponentsbuttonButtonEnterWithWindowShortcut::enter
assertTextvaadin=runcomvaadintestscomponentsbuttonButtonEnterWithWindowShortcut::PID_SLog_row_02. enter pressed in window
+ + diff --git a/tests/testbench/com/vaadin/tests/components/button/ButtonEnterWithWindowShortcut.java b/tests/testbench/com/vaadin/tests/components/button/ButtonEnterWithWindowShortcut.java new file mode 100644 index 0000000000..7efd40ca5d --- /dev/null +++ b/tests/testbench/com/vaadin/tests/components/button/ButtonEnterWithWindowShortcut.java @@ -0,0 +1,55 @@ +package com.vaadin.tests.components.button; + +import com.vaadin.event.Action; +import com.vaadin.event.Action.Handler; +import com.vaadin.event.ShortcutAction; +import com.vaadin.tests.components.TestBase; +import com.vaadin.tests.util.Log; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Button.ClickListener; + +public class ButtonEnterWithWindowShortcut extends TestBase { + Log log = new Log(5); + + @Override + protected void setup() { + getMainWindow().addActionHandler(new Handler() { + private static final long serialVersionUID = -4976129418325394913L; + + public void handleAction(Action action, Object sender, Object target) { + log.log(action.getCaption() + " pressed in window"); + } + + public Action[] getActions(Object target, Object sender) { + ShortcutAction enter = new ShortcutAction("enter", + ShortcutAction.KeyCode.ENTER, null); + ShortcutAction space = new ShortcutAction("space", + ShortcutAction.KeyCode.SPACEBAR, null); + return new Action[] { enter, space }; + } + }); + + Button button = new Button("Focus me and press enter", + new ClickListener() { + public void buttonClick(ClickEvent event) { + log.log("button click listener fired"); + } + }); + button.focus(); + + addComponent(log); + addComponent(button); + } + + @Override + protected String getDescription() { + return "Pressing enter or space with the button focused should trigger the button click listener and not the shortcut action on the window."; + } + + @Override + protected Integer getTicketNumber() { + return Integer.valueOf(5433); + } + +} -- cgit v1.2.3 From 233afce911a8f3c80ce86d9f46254a9c03c305d8 Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Mon, 21 May 2012 13:53:47 +0000 Subject: #8724 Factored away duplicate code in native/non-native touch handling, removed unused variables, removed debug messages, added comments svn changeset:23775/svn branch:6.8 --- .../terminal/gwt/client/ui/VScrollTable.java | 148 +++++---------------- 1 file changed, 33 insertions(+), 115 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java index bcd66c13f8..9e65889f44 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java @@ -4617,7 +4617,6 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, private String[] actionKeys = null; private final TableRowElement rowElement; - private boolean mDown; private int index; private Event touchStart; private static final String ROW_CLASSNAME_EVEN = CLASSNAME + "-row"; @@ -4628,6 +4627,7 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, private Timer dragTouchTimeout; private int touchStartY; private int touchStartX; + private boolean isDragging = false; private VScrollTableRow(int rowKey) { this.rowKey = rowKey; @@ -5038,40 +5038,24 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, } } - private boolean wasSignificantMove = false; - private boolean isDragging = false; - /** - * Special handler for touch devices + * Special handler for touch devices that support native scrolling * - * @param event + * @return Whether the event was handled by this method. */ - public void onTouchBrowserEvent(final Event event) { - VConsole.log("-- START ONTOUCHBROWSEREVENT"); - if (enabled) { + private boolean handleTouchEvent(final Event event) { + + boolean touchEventHandled = false; + + if (enabled && hasNativeTouchScrolling) { final Element targetTdOrTr = getEventTargetTdOrTr(event); final int type = event.getTypeInt(); switch (type) { - case Event.ONCONTEXTMENU: - showContextMenu(event); - if (enabled - && (actionKeys != null || client - .hasEventListeners(VScrollTable.this, - ITEM_CLICK_EVENT_ID))) { - /* - * Prevent browser context menu only if there are - * action handlers or item click listeners - * registered - */ - event.stopPropagation(); - event.preventDefault(); - } - break; case Event.ONTOUCHSTART: + touchEventHandled = true; touchStart = event; isDragging = false; - wasSignificantMove = false; Touch touch = event.getChangedTouches().get(0); // save position to fields, touches in events are same // instance during the operation. @@ -5084,14 +5068,14 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, @Override public void run() { if (touchStart != null) { - VConsole.log("DRAGGING"); + // Start a drag if a finger is held + // in place long enough, then moved isDragging = true; } } }; - VConsole.log("START DRAG TIMEOUT"); - dragTouchTimeout.schedule(TOUCHSCROLL_TIMEOUT); } + dragTouchTimeout.schedule(TOUCHSCROLL_TIMEOUT); } if (actionKeys != null) { @@ -5100,54 +5084,51 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, @Override public void run() { if (touchStart != null) { - VConsole.log("SHOW CONTEXT"); + // Open the context menu if finger + // is held in place long enough. showContextMenu(touchStart); event.preventDefault(); - touchStart = null; - } } }; - VConsole.log("START CONTEXT TIMEOUT"); - - contextTouchTimeout.cancel(); - contextTouchTimeout - .schedule(TOUCH_CONTEXT_MENU_TIMEOUT); } + contextTouchTimeout + .schedule(TOUCH_CONTEXT_MENU_TIMEOUT); } break; case Event.ONTOUCHMOVE: + touchEventHandled = true; if (isSignificantMove(event)) { - wasSignificantMove = true; if (contextTouchTimeout != null) { + // Moved finger before the context menu timer + // expired, so let the browser handle this as a + // scroll. contextTouchTimeout.cancel(); + contextTouchTimeout = null; } if (!isDragging && dragTouchTimeout != null) { - VConsole.log("CANCEL DRAG TIMEOUT"); + // Moved finger before the drag timer expired, + // so let the browser handle this as a scroll. dragTouchTimeout.cancel(); dragTouchTimeout = null; } - if (isDragging) { - if (dragmode != 0 && touchStart != null) { - event.preventDefault(); - event.stopPropagation(); - VConsole.log("START DRAG"); - startRowDrag(touchStart, type, targetTdOrTr); - } - isDragging = false; + + if (dragmode != 0 && touchStart != null + && isDragging) { + event.preventDefault(); + event.stopPropagation(); + startRowDrag(touchStart, type, targetTdOrTr); } touchStart = null; } break; case Event.ONTOUCHEND: case Event.ONTOUCHCANCEL: - VConsole.log("ONTOUCHEND"); + touchEventHandled = true; if (contextTouchTimeout != null) { - VConsole.log("CANCEL CONTEXT TIMEOUT"); contextTouchTimeout.cancel(); } if (dragTouchTimeout != null) { - VConsole.log("CANCEL DRAG TIMEOUT"); dragTouchTimeout.cancel(); } if (touchStart != null) { @@ -5156,67 +5137,10 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, touchStart = null; } isDragging = false; - VConsole.log("END ONTOUCHEND"); break; - case Event.ONMOUSEDOWN: - VConsole.log("ONMOUSEDOWN"); - if (targetTdOrTr != null) { - setRowFocus(this); - ensureFocus(); - if (dragmode != 0 - && (event.getButton() == NativeEvent.BUTTON_LEFT)) { - startRowDrag(event, event.getTypeInt(), - targetTdOrTr); - } else { - event.stopPropagation(); - } - - event.preventDefault(); - } - break; - case Event.ONMOUSEOUT: - VConsole.log("ONMOUSEOUT"); - break; - case Event.ONMOUSEUP: - VConsole.log("ONMOUSEUP"); - if (targetTdOrTr != null) { - if (isSelectable()) { - boolean currentlyJustThisRowSelected = selectedRowKeys - .size() == 1 - && selectedRowKeys.contains(getKey()); - - if (!currentlyJustThisRowSelected) { - if (isSingleSelectMode() - || isMultiSelectModeDefault()) { - deselectAll(); - } - toggleSelection(); - } else if ((isSingleSelectMode() || isMultiSelectModeSimple()) - && nullSelectionAllowed) { - toggleSelection(); - } - - selectionRangeStart = this; - setRowFocus(this); - - event.preventDefault(); - event.stopPropagation(); - } - } - - break; - case Event.ONDBLCLICK: - if (targetTdOrTr != null) { - handleClickEvent(event, targetTdOrTr, true); - } - break; - default: } } - VConsole.log("-- SUPER ONBROWSEREVENT"); - - super.onBrowserEvent(event); - VConsole.log("-- END ONTOUCHBROWSEREVENT"); + return touchEventHandled; } /* @@ -5225,12 +5149,9 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, @Override public void onBrowserEvent(final Event event) { - if (hasNativeTouchScrolling) { - onTouchBrowserEvent(event); - return; - } + final boolean touchEventHandled = handleTouchEvent(event); - if (enabled) { + if (enabled && !touchEventHandled) { final int type = event.getTypeInt(); final Element targetTdOrTr = getEventTargetTdOrTr(event); if (type == Event.ONCONTEXTMENU) { @@ -5263,7 +5184,6 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, break; case Event.ONMOUSEUP: if (targetCellOrRowFound) { - mDown = false; /* * Queue here, send at the same time as the * corresponding value change event - see #7127 @@ -5507,7 +5427,6 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, break; case Event.ONMOUSEOUT: if (targetCellOrRowFound) { - mDown = false; } break; default: @@ -5538,7 +5457,6 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, protected void startRowDrag(Event event, final int type, Element targetTdOrTr) { - mDown = true; VTransferable transferable = new VTransferable(); transferable.setDragSource(VScrollTable.this); transferable.setData("itemId", "" + rowKey); -- cgit v1.2.3 From ac7031059125b41aef98d7920670022befeb55a6 Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Mon, 21 May 2012 13:55:39 +0000 Subject: Removed an empty if() {} MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit svn changeset:23776/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java | 2 -- 1 file changed, 2 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java index 9e65889f44..9aeeffe1f0 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java @@ -5426,8 +5426,6 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, } break; case Event.ONMOUSEOUT: - if (targetCellOrRowFound) { - } break; default: break; -- cgit v1.2.3 From 12e35f034db98f5351c58c03b5277d4657e2ab28 Mon Sep 17 00:00:00 2001 From: Automerge Date: Mon, 21 May 2012 17:06:20 +0000 Subject: [merge from 6.7] Remove duplicate code in constructor svn changeset:23779/svn branch:6.8 --- src/com/vaadin/terminal/ClassResource.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/ClassResource.java b/src/com/vaadin/terminal/ClassResource.java index fa196e90d9..e7419576f1 100644 --- a/src/com/vaadin/terminal/ClassResource.java +++ b/src/com/vaadin/terminal/ClassResource.java @@ -60,13 +60,7 @@ public class ClassResource implements ApplicationResource, Serializable { * the application this resource will be added to. */ public ClassResource(String resourceName, Application application) { - associatedClass = application.getClass(); - this.resourceName = resourceName; - this.application = application; - if (resourceName == null) { - throw new NullPointerException(); - } - application.addResource(this); + this(application.getClass(), resourceName, application); } /** -- cgit v1.2.3 From bec62403a7b56f093f5ee9829fea20ba3dee4628 Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Tue, 22 May 2012 11:24:41 +0000 Subject: #8724 Properly generate simulated click events from touch events on iOS 5 svn changeset:23784/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java index 9aeeffe1f0..38c0ccce11 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java @@ -5088,6 +5088,7 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, // is held in place long enough. showContextMenu(touchStart); event.preventDefault(); + touchStart = null; } } }; @@ -5134,6 +5135,10 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, if (touchStart != null) { event.preventDefault(); event.stopPropagation(); + if (!BrowserInfo.get().isAndroid()) { + Util.simulateClickFromTouchEvent(touchStart, + this); + } touchStart = null; } isDragging = false; -- cgit v1.2.3 From e085efa41793fc68d455fa5d718bbfc1309296b9 Mon Sep 17 00:00:00 2001 From: Leif Åstrand Date: Tue, 22 May 2012 12:53:06 +0000 Subject: Make browser window size available in Window (#5655) svn changeset:23790/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VView.java | 31 +++++++------- src/com/vaadin/ui/Window.java | 49 ++++++++++++++++++++++ .../vaadin/tests/integration/EmbedSizeTest.java | 6 ++- 3 files changed, 68 insertions(+), 18 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VView.java b/src/com/vaadin/terminal/gwt/client/ui/VView.java index ec4c5d9cba..e544a56190 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VView.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VView.java @@ -47,6 +47,10 @@ import com.vaadin.terminal.gwt.client.ui.ShortcutActionHandler.ShortcutActionHan public class VView extends SimplePanel implements Container, ResizeHandler, Window.ClosingHandler, ShortcutActionHandlerOwner, Focusable { + public static final String BROWSER_HEIGHT_VAR = "browserHeight"; + + public static final String BROWSER_WIDTH_VAR = "browserWidth"; + private static final String CLASSNAME = "v-view"; public static final String NOTIFICATION_HTML_CONTENT_NOT_ALLOWED = "useplain"; @@ -69,13 +73,6 @@ public class VView extends SimplePanel implements Container, ResizeHandler, private int windowWidth; private int windowHeight; - /* - * Last know view size used to detect whether new dimensions should be sent - * to the server. - */ - private int viewWidth; - private int viewHeight; - private ApplicationConnection connection; /** @@ -547,16 +544,18 @@ public class VView extends SimplePanel implements Container, ResizeHandler, */ private void sendClientResized() { Element parentElement = getElement().getParentElement(); - int newViewHeight = parentElement.getClientHeight(); - int newViewWidth = parentElement.getClientWidth(); + int viewHeight = parentElement.getClientHeight(); + int viewWidth = parentElement.getClientWidth(); - // Send the view dimensions if they have changed - if (newViewHeight != viewHeight || newViewWidth != viewWidth) { - viewHeight = newViewHeight; - viewWidth = newViewWidth; - connection.updateVariable(id, "height", newViewHeight, false); - connection.updateVariable(id, "width", newViewWidth, immediate); - } + connection.updateVariable(id, "height", viewHeight, false); + connection.updateVariable(id, "width", viewWidth, false); + + int windowWidth = Window.getClientWidth(); + int windowHeight = Window.getClientHeight(); + + connection.updateVariable(id, BROWSER_WIDTH_VAR, windowWidth, false); + connection.updateVariable(id, BROWSER_HEIGHT_VAR, windowHeight, + immediate); } public native static void goTo(String url) diff --git a/src/com/vaadin/ui/Window.java b/src/com/vaadin/ui/Window.java index 5f6c29f182..f20090fead 100644 --- a/src/com/vaadin/ui/Window.java +++ b/src/com/vaadin/ui/Window.java @@ -223,6 +223,10 @@ public class Window extends Panel implements URIHandler, ParameterHandler, */ private Component scrollIntoView; + private int browserWindowWidth = -1; + + private int browserWindowHeight = -1; + /** * Creates a new unnamed window with a default layout. */ @@ -1081,6 +1085,20 @@ public class Window extends Panel implements URIHandler, ParameterHandler, .get("width") != getWidth())) { sizeHasChanged = true; } + Integer browserHeightVar = (Integer) variables + .get(VView.BROWSER_HEIGHT_VAR); + if (browserHeightVar != null + && browserHeightVar.intValue() != browserWindowHeight) { + browserWindowHeight = browserHeightVar.intValue(); + sizeHasChanged = true; + } + Integer browserWidthVar = (Integer) variables + .get(VView.BROWSER_WIDTH_VAR); + if (browserWidthVar != null + && browserWidthVar.intValue() != browserWindowWidth) { + browserWindowWidth = browserWidthVar.intValue(); + sizeHasChanged = true; + } super.changeVariables(source, variables); @@ -2380,4 +2398,35 @@ public class Window extends Panel implements URIHandler, ParameterHandler, } } + /** + * Gets the height of the viewport area of the browser window where this + * window is displayed. + * + * @return the browser viewport height in pixels + */ + public int getBrowserWindowHeight() { + // Size only reported by VView -> data only available from application + // level window + if (getParent() != null) { + return (getParent()).getBrowserWindowHeight(); + } + + return browserWindowHeight; + } + + /** + * Gets the width of the viewport area of the browser window where this + * window is displayed. + * + * @return the browser viewport width in pixels + */ + public int getBrowserWindowWidth() { + // Size only reported by VView -> data only available from application + // level window + if (getParent() != null) { + return (getParent()).getBrowserWindowWidth(); + } + + return browserWindowWidth; + } } diff --git a/tests/testbench/com/vaadin/tests/integration/EmbedSizeTest.java b/tests/testbench/com/vaadin/tests/integration/EmbedSizeTest.java index 479af4aa87..3524b3fce3 100644 --- a/tests/testbench/com/vaadin/tests/integration/EmbedSizeTest.java +++ b/tests/testbench/com/vaadin/tests/integration/EmbedSizeTest.java @@ -36,8 +36,10 @@ public class EmbedSizeTest extends TestBase { mainWindow.addListener(new Window.ResizeListener() { public void windowResized(ResizeEvent e) { Window window = e.getWindow(); - log.log("Resize event: " + window.getWidth() + " x " - + window.getHeight()); + log.log("App: " + window.getWidth() + " x " + + window.getHeight() + ", Browser window: " + + window.getBrowserWindowWidth() + " x " + + window.getBrowserWindowHeight()); } }); } -- cgit v1.2.3 From e7f31596e7a13c297988ec5c687e1b681420b243 Mon Sep 17 00:00:00 2001 From: Leif Åstrand Date: Tue, 22 May 2012 13:07:32 +0000 Subject: Remove clientHeight/Width from WebBrowser (#5655) svn changeset:23792/svn branch:6.8 --- .../gwt/server/AbstractApplicationPortlet.java | 2 - .../gwt/server/AbstractApplicationServlet.java | 3 +- src/com/vaadin/terminal/gwt/server/WebBrowser.java | 44 ++-------------------- .../tests/application/WebBrowserSizeTest.java | 6 ++- 4 files changed, 8 insertions(+), 47 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java b/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java index 2ac574c2de..0a8e9530f0 100644 --- a/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java +++ b/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java @@ -578,8 +578,6 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet browser.updateClientSideDetails( getHTTPRequestParameter(request, "sw"), getHTTPRequestParameter(request, "sh"), - getHTTPRequestParameter(request, "cw"), - getHTTPRequestParameter(request, "ch"), getHTTPRequestParameter(request, "tzo"), getHTTPRequestParameter(request, "rtzo"), getHTTPRequestParameter(request, "dstd"), diff --git a/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java b/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java index 68089e18e0..54ea4a94ed 100644 --- a/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java +++ b/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java @@ -603,8 +603,7 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements request.getHeader("user-agent")); if (request.getParameter("repaintAll") != null) { browser.updateClientSideDetails(request.getParameter("sw"), - request.getParameter("sh"), request.getParameter("cw"), - request.getParameter("ch"), request.getParameter("tzo"), + request.getParameter("sh"), request.getParameter("tzo"), request.getParameter("rtzo"), request.getParameter("dstd"), request.getParameter("dston"), request.getParameter("curdate"), diff --git a/src/com/vaadin/terminal/gwt/server/WebBrowser.java b/src/com/vaadin/terminal/gwt/server/WebBrowser.java index a57a4c65d2..9182ebdc03 100644 --- a/src/com/vaadin/terminal/gwt/server/WebBrowser.java +++ b/src/com/vaadin/terminal/gwt/server/WebBrowser.java @@ -22,8 +22,6 @@ public class WebBrowser implements Terminal { private int screenHeight = 0; private int screenWidth = 0; - private int clientHeight = 0; - private int clientWidth = 0; private String browserApplication = null; private Locale locale; private String address; @@ -64,30 +62,6 @@ public class WebBrowser implements Terminal { return screenWidth; } - /** - * Gets the height of the client (browser window). - *

- * Note that the client size is only updated on a full repaint, not when the - * browser window size changes - * - * @return The height of the client or 0 if unknown. - */ - public int getClientHeight() { - return clientHeight; - } - - /** - * Gets the width of the client (browser window) - *

- * Note that the client size is only updated on a full repaint, not when the - * browser window size changes - * - * @return The width of the client or 0 if unknown. - */ - public int getClientWidth() { - return clientWidth; - } - /** * Get the browser user-agent string. * @@ -338,10 +312,6 @@ public class WebBrowser implements Terminal { * Screen width * @param sh * Screen height - * @param cw - * Client width - * @param ch - * Client height * @param tzo * TimeZone offset in minutes from GMT * @param rtzo @@ -354,9 +324,9 @@ public class WebBrowser implements Terminal { * the current date in milliseconds since the epoch * @param touchDevice */ - void updateClientSideDetails(String sw, String sh, String cw, String ch, - String tzo, String rtzo, String dstSavings, String dstInEffect, - String curDate, boolean touchDevice) { + void updateClientSideDetails(String sw, String sh, String tzo, String rtzo, + String dstSavings, String dstInEffect, String curDate, + boolean touchDevice) { if (sw != null) { try { screenHeight = Integer.parseInt(sh); @@ -365,14 +335,6 @@ public class WebBrowser implements Terminal { screenHeight = screenWidth = 0; } } - if (cw != null) { - try { - clientHeight = Integer.parseInt(ch); - clientWidth = Integer.parseInt(cw); - } catch (final NumberFormatException e) { - clientHeight = clientWidth = 0; - } - } if (tzo != null) { try { // browser->java conversion: min->ms, reverse sign diff --git a/tests/testbench/com/vaadin/tests/application/WebBrowserSizeTest.java b/tests/testbench/com/vaadin/tests/application/WebBrowserSizeTest.java index eacf2a0e53..a3f11f2cd3 100644 --- a/tests/testbench/com/vaadin/tests/application/WebBrowserSizeTest.java +++ b/tests/testbench/com/vaadin/tests/application/WebBrowserSizeTest.java @@ -21,8 +21,10 @@ public class WebBrowserSizeTest extends TestBase { public void buttonClick(ClickEvent event) { screenSizeLabel.setValue(getBrowser().getScreenWidth() + " x " + getBrowser().getScreenHeight()); - browserSizeLabel.setValue(getBrowser().getClientWidth() + " x " - + getBrowser().getClientHeight()); + browserSizeLabel.setValue(getMainWindow() + .getBrowserWindowWidth() + + " x " + + getMainWindow().getBrowserWindowHeight()); } }); -- cgit v1.2.3 From 35b979139f4fbb6e6bbc19728951277adce394b7 Mon Sep 17 00:00:00 2001 From: Automerge Date: Tue, 22 May 2012 17:07:33 +0000 Subject: [merge from 6.7] #8305 extend Liferay session when the user interacts with a Vaadin portlet svn changeset:23802/svn branch:6.8 --- .../terminal/gwt/client/ApplicationConnection.java | 27 ++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ApplicationConnection.java b/src/com/vaadin/terminal/gwt/client/ApplicationConnection.java index dcf52827ed..4448c047c2 100644 --- a/src/com/vaadin/terminal/gwt/client/ApplicationConnection.java +++ b/src/com/vaadin/terminal/gwt/client/ApplicationConnection.java @@ -330,6 +330,25 @@ public class ApplicationConnection { } }-*/; + /** + * If on Liferay and logged in, ask the client side session management + * JavaScript to extend the session duration. + * + * Otherwise, Liferay client side JavaScript will explicitly expire the + * session even though the server side considers the session to be active. + * See ticket #8305 for more information. + */ + protected native void extendLiferaySession() + /*-{ + if ($wnd.Liferay && $wnd.Liferay.Session) { + $wnd.Liferay.Session.extend(); + // if the extend banner is visible, hide it + if ($wnd.Liferay.Session.banner) { + $wnd.Liferay.Session.banner.remove(); + } + } + }-*/; + /** * Get the active Console for writing debug messages. May return an actual * logging console, or the NullConsole if debugging is not turned on. @@ -819,6 +838,14 @@ public class ApplicationConnection { public void execute() { if (!hasActiveRequest()) { hideLoadingIndicator(); + + // If on Liferay and session expiration management is in + // use, extend session duration on each request. + // Doing it here rather than before the request to improve + // responsiveness. + // Postponed until the end of the next request if other + // requests still pending. + extendLiferaySession(); } } }); -- cgit v1.2.3 From e8844544fcf3f62e9b8a9226e235b90a7106d881 Mon Sep 17 00:00:00 2001 From: Automerge Date: Tue, 22 May 2012 17:07:43 +0000 Subject: [merge from 6.7] Recalculate column widths if scrollbar has changed (#6039) svn changeset:23804/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java index 38c0ccce11..39492d8731 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java @@ -2112,6 +2112,9 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, return true; } } else { + if (scrollBody == null) { + return false; + } int fakeheight = (int) Math.round(scrollBody.getRowHeight() * totalRows); int availableHeight = scrollBodyPanel.getElement().getPropertyInt( @@ -6213,10 +6216,15 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, @Override public void setHeight(String height) { + boolean hadScrollbars = willHaveScrollbars(); this.height = height; super.setHeight(height); setContainerHeight(); + if (hadScrollbars != willHaveScrollbars()) { + triggerLazyColumnAdjustment(true); + } + if (initializedAndAttached) { updatePageLength(); } -- cgit v1.2.3 From e8a652c91e9e02079180a854789afd5accffce7b Mon Sep 17 00:00:00 2001 From: Leif Åstrand Date: Wed, 23 May 2012 08:06:06 +0000 Subject: Table: Make some columns uncollapsable (#7495) svn changeset:23811/svn branch:6.8 --- .../terminal/gwt/client/ui/VScrollTable.java | 27 ++++++- src/com/vaadin/ui/Table.java | 46 ++++++++++++ .../table/TableWithNoncollapsibleColumns.html | 82 +++++++++++++++++++++ .../table/TableWithNoncollapsibleColumns.java | 83 ++++++++++++++++++++++ .../com/vaadin/tests/components/table/Tables.java | 11 +++ 5 files changed, 247 insertions(+), 2 deletions(-) create mode 100644 tests/testbench/com/vaadin/tests/components/table/TableWithNoncollapsibleColumns.html create mode 100644 tests/testbench/com/vaadin/tests/components/table/TableWithNoncollapsibleColumns.java (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java index 39492d8731..c5ca16925b 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java @@ -214,6 +214,8 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, .isTouchDevice() && !BrowserInfo.get().requiresTouchScrollDelegate(); + private Set noncollapsibleColumns; + /** * Represents a select range of rows */ @@ -1086,6 +1088,10 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, updateHeader(uidl.getStringArrayAttribute("vcolorder")); updateFooter(uidl.getStringArrayAttribute("vcolorder")); + if (uidl.hasVariable("noncollapsiblecolumns")) { + noncollapsibleColumns = uidl + .getStringArrayVariableAsSet("noncollapsiblecolumns"); + } } private void updateCollapsedColumns(UIDL uidl) { @@ -3244,6 +3250,7 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, String colKey; private boolean collapsed; + private boolean noncollapsible = false; private VScrollTableRow currentlyFocusedRow; public VisibleColumnAction(String colKey) { @@ -3255,6 +3262,9 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, @Override public void execute() { + if (noncollapsible) { + return; + } client.getContextMenu().hide(); // toggle selected column if (collapsedColumns.contains(colKey)) { @@ -3278,17 +3288,27 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, collapsed = b; } + public void setNoncollapsible(boolean b) { + noncollapsible = b; + } + /** * Override default method to distinguish on/off columns */ @Override public String getHTML() { final StringBuffer buf = new StringBuffer(); + buf.append(""); + buf.append("v-off"); } else { - buf.append(""); + buf.append("v-on"); + } + if (noncollapsible) { + buf.append(" v-disabled"); } + buf.append("\">"); + buf.append(super.getHTML()); buf.append(""); @@ -3330,6 +3350,9 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, if (!c.isEnabled()) { a.setCollapsed(true); } + if (noncollapsibleColumns.contains(cid)) { + a.setNoncollapsible(true); + } actions[i] = a; } return actions; diff --git a/src/com/vaadin/ui/Table.java b/src/com/vaadin/ui/Table.java index db0809fbd5..a2db89cabb 100644 --- a/src/com/vaadin/ui/Table.java +++ b/src/com/vaadin/ui/Table.java @@ -229,6 +229,11 @@ public class Table extends AbstractSelect implements Action.Container, */ private LinkedList visibleColumns = new LinkedList(); + /** + * Holds noncollapsible columns. + */ + private HashSet noncollapsibleColumns = new HashSet(); + /** * Holds propertyIds of currently collapsed columns. */ @@ -1139,6 +1144,9 @@ public class Table extends AbstractSelect implements Action.Container, if (!isColumnCollapsingAllowed()) { throw new IllegalStateException("Column collapsing not allowed!"); } + if (collapsed && noncollapsibleColumns.contains(propertyId)) { + throw new IllegalStateException("The column is noncollapsible!"); + } if (collapsed) { collapsedColumns.add(propertyId); @@ -1177,6 +1185,34 @@ public class Table extends AbstractSelect implements Action.Container, refreshRenderedCells(); } + /** + * Sets whether a column can be collapsed or not. + * + * @param propertyId + * the propertyID identifying the column. + * @param collapsible + * the desired collapsibleness + */ + public void setColumnNoncollapsible(Object propertyId, + boolean noncollapsible) { + if (noncollapsible) { + noncollapsibleColumns.add(propertyId); + collapsedColumns.remove(propertyId); + } else { + noncollapsibleColumns.remove(propertyId); + } + refreshRowCache(); + } + + /** + * Checks if the column can be collapsed. + * + * @return true if the column can be collapsed; false otherwise. + */ + public boolean isColumnNoncollapsible(Object propertyId) { + return noncollapsibleColumns.contains(propertyId); + } + /** * Checks if column reordering is allowed. * @@ -2996,7 +3032,17 @@ public class Table extends AbstractSelect implements Action.Container, } } target.addVariable(this, "collapsedcolumns", collapsedKeys); + + final String[] noncollapsibleKeys = new String[noncollapsibleColumns + .size()]; + nextColumn = 0; + for (Object colId : noncollapsibleColumns) { + noncollapsibleKeys[nextColumn++] = columnIdMap.key(colId); + } + target.addVariable(this, "noncollapsiblecolumns", + noncollapsibleKeys); } + } private void paintActions(PaintTarget target, final Set actionSet) diff --git a/tests/testbench/com/vaadin/tests/components/table/TableWithNoncollapsibleColumns.html b/tests/testbench/com/vaadin/tests/components/table/TableWithNoncollapsibleColumns.html new file mode 100644 index 0000000000..e3c9a8423b --- /dev/null +++ b/tests/testbench/com/vaadin/tests/components/table/TableWithNoncollapsibleColumns.html @@ -0,0 +1,82 @@ + + + + + + +TableWithNoncollapsibleColumns + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TableWithNoncollapsibleColumns
open/run/com.vaadin.tests.components.table.TableWithNoncollapsibleColumns?restartApplication
clickvaadin=runcomvaadintestscomponentstableTableWithNoncollapsibleColumns::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[3]/VButton[0]/domChild[0]/domChild[0]
screenCapturecolumn-3-collapsed
clickvaadin=runcomvaadintestscomponentstableTableWithNoncollapsibleColumns::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[4]/VButton[0]/domChild[0]/domChild[0]
screenCapturecolumn-3-noncollapsible
clickvaadin=runcomvaadintestscomponentstableTableWithNoncollapsibleColumns::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[1]/VButton[0]/domChild[0]/domChild[0]
clickvaadin=runcomvaadintestscomponentstableTableWithNoncollapsibleColumns::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[2]/VButton[0]/domChild[0]/domChild[0]
clickvaadin=runcomvaadintestscomponentstableTableWithNoncollapsibleColumns::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[3]/VButton[0]/domChild[0]/domChild[0]
mouseClickvaadin=runcomvaadintestscomponentstableTableWithNoncollapsibleColumns::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VScrollTable[0]/domChild[0]/domChild[1]9,7
screenCapturecolumn-menu-after-collapsing-all-columns
mouseClickvaadin=runcomvaadintestscomponentstableTableWithNoncollapsibleColumns::Root/VContextMenu[0]#option293,4
mouseClickvaadin=runcomvaadintestscomponentstableTableWithNoncollapsibleColumns::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VScrollTable[0]/domChild[0]/domChild[1]7,10
screenCapturecolumn-menu-after-expanding-column-2
+ + diff --git a/tests/testbench/com/vaadin/tests/components/table/TableWithNoncollapsibleColumns.java b/tests/testbench/com/vaadin/tests/components/table/TableWithNoncollapsibleColumns.java new file mode 100644 index 0000000000..9e8c201452 --- /dev/null +++ b/tests/testbench/com/vaadin/tests/components/table/TableWithNoncollapsibleColumns.java @@ -0,0 +1,83 @@ +package com.vaadin.tests.components.table; + +import com.vaadin.tests.components.TestBase; +import com.vaadin.ui.Button; +import com.vaadin.ui.Button.ClickEvent; +import com.vaadin.ui.Table; +import com.vaadin.ui.VerticalLayout; + +public class TableWithNoncollapsibleColumns extends TestBase { + + @Override + protected void setup() { + VerticalLayout layout = new VerticalLayout(); + layout.setSizeFull(); + addComponent(layout); + + final Table table = new Table(); + table.setWidth("100%"); + table.setHeight("300px"); + table.setColumnCollapsingAllowed(true); + + table.addContainerProperty("Column 1 - noncollapsible", String.class, + null); + table.addContainerProperty("Column 2 - collapsible", String.class, null); + table.addContainerProperty("Column 3 - toggle collapsing", + String.class, null); + + table.setColumnNoncollapsible("Column 1 - noncollapsible", true); + layout.addComponent(table); + + final Button button1 = new Button("Column 1: collapse/show", + new Button.ClickListener() { + public void buttonClick(ClickEvent event) { + table.setColumnCollapsed( + "Column 1 - noncollapsible", + !table.isColumnCollapsed("Column 1 - noncollapsible")); + } + }); + final Button button2 = new Button("Column 2: collapse/show", + new Button.ClickListener() { + public void buttonClick(ClickEvent event) { + table.setColumnCollapsed( + "Column 2 - collapsible", + !table.isColumnCollapsed("Column 2 - collapsible")); + } + }); + + final Button button3 = new Button("Column 3: collapse/show", + new Button.ClickListener() { + public void buttonClick(ClickEvent event) { + table.setColumnCollapsed( + "Column 3 - toggle collapsing", + !table.isColumnCollapsed("Column 3 - toggle collapsing")); + } + }); + final Button button4 = new Button( + "Column 3: make noncollapsible/collapsible", + new Button.ClickListener() { + public void buttonClick(ClickEvent event) { + table.setColumnNoncollapsible( + "Column 3 - toggle collapsing", + !table.isColumnNoncollapsible("Column 3 - toggle collapsing")); + } + }); + + layout.addComponent(button1); + layout.addComponent(button2); + layout.addComponent(button3); + layout.addComponent(button4); + + } + + @Override + protected String getDescription() { + return "Often a table has one column that identifies the row better than any other and it would not make sense to collapse that one. Make it possible from the server side api to disable collapsing for some properties. These properties could appear as grayed out in the collapse drop down menu."; + } + + @Override + protected Integer getTicketNumber() { + return 7495; + } + +} diff --git a/tests/testbench/com/vaadin/tests/components/table/Tables.java b/tests/testbench/com/vaadin/tests/components/table/Tables.java index 3f37a178b6..5c55ea87b2 100644 --- a/tests/testbench/com/vaadin/tests/components/table/Tables.java +++ b/tests/testbench/com/vaadin/tests/components/table/Tables.java @@ -73,6 +73,14 @@ public class Tables extends AbstractSelectTestCase } }; + private Command columnNonCollapsibleCommand = new Command() { + + public void execute(T c, Boolean noncollapsible, Object propertyId) { + c.setColumnNoncollapsible(propertyId, noncollapsible); + + } + }; + protected Command columnResizeListenerCommand = new Command() { public void execute(Table c, Boolean value, Object data) { @@ -644,6 +652,9 @@ public class Tables extends AbstractSelectTestCase createSelectAction("Expand ratio", category, expandOptions, "- remove -", columnExpandRatioCommand, propertyId); t.log("Expand"); + createBooleanAction("Noncollapsible", category, false, + columnNonCollapsibleCommand, propertyId); + // Footer text (move) // Header text (move) -- cgit v1.2.3 From edf451f67f4d50d5baeb4ae9ceaa6746eb6fa10c Mon Sep 17 00:00:00 2001 From: Tapio Aali Date: Wed, 23 May 2012 09:01:22 +0000 Subject: Fixed styles that were left lingering while changing the orientation of a slider (#7002). svn changeset:23813/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VSlider.java | 11 +++- .../tests/components/slider/SliderOrientation.html | 72 ++++++++++++++++++++++ 2 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 tests/testbench/com/vaadin/tests/components/slider/SliderOrientation.html (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VSlider.java b/src/com/vaadin/terminal/gwt/client/ui/VSlider.java index 4a46346613..e605c6fe12 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VSlider.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VSlider.java @@ -200,8 +200,12 @@ public class VSlider extends SimpleFocusablePanel implements Paintable, Field, private void buildBase() { final String styleAttribute = vertical ? "height" : "width"; + final String oppositeStyleAttribute = vertical ? "width" : "height"; final String domProperty = vertical ? "offsetHeight" : "offsetWidth"; + // clear unnecessary opposite style attribute + DOM.setStyleAttribute(base, oppositeStyleAttribute, ""); + final Element p = DOM.getParent(getElement()); if (DOM.getElementPropertyInt(p, domProperty) > 50) { if (vertical) { @@ -235,10 +239,15 @@ public class VSlider extends SimpleFocusablePanel implements Paintable, Field, private void buildHandle() { final String styleAttribute = vertical ? "height" : "width"; final String handleAttribute = vertical ? "marginTop" : "marginLeft"; + final String oppositeHandleAttribute = vertical ? "marginLeft" + : "marginTop"; final String domProperty = vertical ? "offsetHeight" : "offsetWidth"; DOM.setStyleAttribute(handle, handleAttribute, "0"); + // clear unnecessary opposite handle attribute + DOM.setStyleAttribute(handle, oppositeHandleAttribute, ""); + if (scrollbarStyle) { // Only stretch the handle if scrollbar style is set. int s = (int) (Double.parseDouble(DOM.getElementProperty(base, @@ -356,7 +365,7 @@ public class VSlider extends SimpleFocusablePanel implements Paintable, Field, } else if (DOM.eventGetType(event) == Event.ONMOUSEDOWN) { feedbackPopup.show(); } - if(Util.isTouchEvent(event)) { + if (Util.isTouchEvent(event)) { event.preventDefault(); // avoid simulated events event.stopPropagation(); } diff --git a/tests/testbench/com/vaadin/tests/components/slider/SliderOrientation.html b/tests/testbench/com/vaadin/tests/components/slider/SliderOrientation.html new file mode 100644 index 0000000000..174ddca016 --- /dev/null +++ b/tests/testbench/com/vaadin/tests/components/slider/SliderOrientation.html @@ -0,0 +1,72 @@ + + + + + + +SliderOrientation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SliderOrientation
open/run/com.vaadin.tests.components.slider.SliderTest?restartApplication
mouseClickvaadin=runcomvaadintestscomponentssliderSliderTest::PID_Smenu#item05,6
mouseClickvaadin=runcomvaadintestscomponentssliderSliderTest::Root/VOverlay[0]/VMenuBar[0]#item441,7
mouseClickvaadin=runcomvaadintestscomponentssliderSliderTest::Root/VOverlay[1]/VMenuBar[0]#item337,3
mouseClickvaadin=runcomvaadintestscomponentssliderSliderTest::Root/VOverlay[2]/VMenuBar[0]#item119,7
screenCapturechange-orientation-to-vertical
mouseClickvaadin=runcomvaadintestscomponentssliderSliderTest::PID_Smenu#item033,1
mouseClickvaadin=runcomvaadintestscomponentssliderSliderTest::Root/VOverlay[0]/VMenuBar[0]#item463,11
mouseClickvaadin=runcomvaadintestscomponentssliderSliderTest::Root/VOverlay[1]/VMenuBar[0]#item330,1
mouseClickvaadin=runcomvaadintestscomponentssliderSliderTest::Root/VOverlay[2]/VMenuBar[0]#item010,10
screenCapturechange-orientation-to-horizontal
+ + -- cgit v1.2.3 From cb20a6b202937c4b2fa96cc23db6cf4301097203 Mon Sep 17 00:00:00 2001 From: Henri Sara Date: Thu, 24 May 2012 09:53:02 +0000 Subject: Merged VView changes to 6.8 (#8799). svn changeset:23820/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VView.java | 121 ++++++++++++++++++----- 1 file changed, 99 insertions(+), 22 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VView.java b/src/com/vaadin/terminal/gwt/client/ui/VView.java index e544a56190..350c4b206b 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VView.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VView.java @@ -55,6 +55,8 @@ public class VView extends SimplePanel implements Container, ResizeHandler, public static final String NOTIFICATION_HTML_CONTENT_NOT_ALLOWED = "useplain"; + private static int MONITOR_PARENT_TIMER_INTERVAL = 1000; + private String theme; private Paintable layout; @@ -67,8 +69,8 @@ public class VView extends SimplePanel implements Container, ResizeHandler, /* * Last known window size used to detect whether VView should be layouted - * again. Detection must be based on window size, because the VView size - * might be fixed and thus not automatically adapt to changed window sizes. + * again. Detection must check window size, because the VView size might be + * fixed and thus not automatically adapt to changed window sizes. */ private int windowWidth; private int windowHeight; @@ -76,13 +78,19 @@ public class VView extends SimplePanel implements Container, ResizeHandler, private ApplicationConnection connection; /** - * We are postponing resize process with IE. IE bugs with scrollbars in some - * situations, that causes false onWindowResized calls. With Timer we will - * give IE some time to decide if it really wants to keep current size - * (scrollbars). + * Keep track of possible parent size changes when an embedded application. + * + * Uses {@link #parentWidth} and {@link #parentHeight} as an optimization to + * keep track of when there is a real change. */ private Timer resizeTimer; + /** stored width of parent for embedded application auto-resize */ + private int parentWidth; + + /** stored height of parent for embedded application auto-resize */ + private int parentHeight; + private int scrollTop; private int scrollLeft; @@ -115,8 +123,7 @@ public class VView extends SimplePanel implements Container, ResizeHandler, private VLazyExecutor delayedResizeExecutor = new VLazyExecutor(200, new ScheduledCommand() { public void execute() { - windowSizeMaybeChanged(Window.getClientWidth(), - Window.getClientHeight()); + performSizeCheck(); } }); @@ -129,28 +136,75 @@ public class VView extends SimplePanel implements Container, ResizeHandler, // should not be in the document focus flow getElement().setTabIndex(-1); TouchScrollDelegate.enableTouchScrolling(this, getElement()); + + if (isMonitoringParentSize()) { + resizeTimer = new Timer() { + @Override + public void run() { + // trigger check to see if parent size has changed, + // recalculate layouts + performSizeCheck(); + resizeTimer.schedule(MONITOR_PARENT_TIMER_INTERVAL); + } + }; + resizeTimer.schedule(MONITOR_PARENT_TIMER_INTERVAL); + } } /** - * Called when the window might have been resized. + * Called when the window or parent div might have been resized. * - * @param newWidth + * This immediately checks the sizes of the window and the parent div (if + * monitoring it) and triggers layout recalculation if they have changed. + */ + protected void performSizeCheck() { + windowSizeMaybeChanged(Window.getClientWidth(), + Window.getClientHeight()); + } + + /** + * Called when the window or parent div might have been resized. + * + * This immediately checks the sizes of the window and the parent div (if + * monitoring it) and triggers layout recalculation if they have changed. + * + * @param newWindowWidth * The new width of the window - * @param newHeight + * @param newWindowHeight * The new height of the window + * + * @deprecated use {@link #performSizeCheck()} */ - protected void windowSizeMaybeChanged(int newWidth, int newHeight) { + @Deprecated + protected void windowSizeMaybeChanged(int newWindowWidth, + int newWindowHeight) { boolean changed = false; - if (windowWidth != newWidth) { - windowWidth = newWidth; + if (windowWidth != newWindowWidth) { + windowWidth = newWindowWidth; changed = true; VConsole.log("New window width: " + windowWidth); } - if (windowHeight != newHeight) { - windowHeight = newHeight; + if (windowHeight != newWindowHeight) { + windowHeight = newWindowHeight; changed = true; VConsole.log("New window height: " + windowHeight); } + Element parentElement = getElement().getParentElement(); + if (isMonitoringParentSize() && parentElement != null) { + // check also for parent size changes + int newParentWidth = parentElement.getClientWidth(); + int newParentHeight = parentElement.getClientHeight(); + if (parentWidth != newParentWidth) { + parentWidth = newParentWidth; + changed = true; + VConsole.log("New parent width: " + parentWidth); + } + if (parentHeight != newParentHeight) { + parentHeight = newParentHeight; + changed = true; + VConsole.log("New parent height: " + parentHeight); + } + } if (changed) { /* * If the window size has changed, layout the VView again and send @@ -159,10 +213,19 @@ public class VView extends SimplePanel implements Container, ResizeHandler, * should shrink as the content's size is fixed and would thus not * automatically shrink.) */ - VConsole.log("Running layout functions due to window resize"); + VConsole.log("Running layout functions due to window or parent resize"); + connection.runDescendentsLayout(VView.this); Util.runWebkitOverflowAutoFix(getElement()); + // update size to avoid (most) redundant re-layout passes + // there can still be an extra layout recalculation if webkit + // overflow fix updates the size in a deferred block + if (isMonitoringParentSize() && parentElement != null) { + parentWidth = parentElement.getClientWidth(); + parentHeight = parentElement.getClientHeight(); + } + sendClientResized(); } } @@ -206,6 +269,17 @@ public class VView extends SimplePanel implements Container, ResizeHandler, .contains(ApplicationConnection.GENERATED_BODY_CLASSNAME); } + /** + * Returns true if the size of the parent should be checked periodically and + * the application should react to its changes. + * + * @return true if size of parent should be tracked + */ + protected boolean isMonitoringParentSize() { + // could also perform a more specific check (Liferay portlet) + return isEmbedded(); + } + public void updateFromUIDL(final UIDL uidl, ApplicationConnection client) { rendering = true; @@ -400,7 +474,7 @@ public class VView extends SimplePanel implements Container, ResizeHandler, Window.addResizeHandler(this); } - onResize(); + triggerSizeChangeCheck(); // finally set scroll position from UIDL if (uidl.hasVariable("scrollTop")) { @@ -510,13 +584,17 @@ public class VView extends SimplePanel implements Container, ResizeHandler, * .gwt.event.logical.shared.ResizeEvent) */ public void onResize(ResizeEvent event) { - onResize(); + triggerSizeChangeCheck(); } /** * Called when a resize event is received. + * + * This may trigger a lazy refresh or perform the size check immediately + * depending on the browser used and whether the server side requests + * resizes to be lazy. */ - private void onResize() { + private void triggerSizeChangeCheck() { /* * IE (pre IE9 at least) will give us some false resize events due to * problems with scrollbars. Firefox 3 might also produce some extra @@ -534,8 +612,7 @@ public class VView extends SimplePanel implements Container, ResizeHandler, if (lazy) { delayedResizeExecutor.trigger(); } else { - windowSizeMaybeChanged(Window.getClientWidth(), - Window.getClientHeight()); + performSizeCheck(); } } -- cgit v1.2.3 From ce78aaeb78cf7e48e91a8e76ecb5f48531baea6c Mon Sep 17 00:00:00 2001 From: Automerge Date: Thu, 24 May 2012 11:06:04 +0000 Subject: [merge from 6.7] #8801 Recompute VFilterSelect textbox width if popup opener width has changed eg. due to a style/theme change svn changeset:23823/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VFilterSelect.java | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VFilterSelect.java b/src/com/vaadin/terminal/gwt/client/ui/VFilterSelect.java index 8362d6fbec..4ecb42d920 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VFilterSelect.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VFilterSelect.java @@ -1237,6 +1237,12 @@ public class VFilterSelect extends Composite implements Paintable, Field, updateRootWidth(); } + // Popup opener width may have changed due to a style change (#8801) + if (!readonly && popupWidth != Util.getRequiredWidth(popupOpener)) { + popupWidth = Util.getRequiredWidth(popupOpener); + updateRootWidth(); + } + // Focus dependent style names are lost during the update, so we add // them here back again if (focused) { -- cgit v1.2.3 From 20ba0f58a0649702cfa5442d7c192c74d03b6a36 Mon Sep 17 00:00:00 2001 From: Henri Sara Date: Thu, 24 May 2012 13:16:02 +0000 Subject: Manual merge from 6.7 to 6.8 for #8799 timer unregistration. svn changeset:23825/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VView.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VView.java b/src/com/vaadin/terminal/gwt/client/ui/VView.java index 350c4b206b..6fdacc9607 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VView.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VView.java @@ -136,7 +136,14 @@ public class VView extends SimplePanel implements Container, ResizeHandler, // should not be in the document focus flow getElement().setTabIndex(-1); TouchScrollDelegate.enableTouchScrolling(this, getElement()); + } + /** + * Start to periodically monitor for parent element resizes if embedded + * application (e.g. portlet). + */ + protected void onLoad() { + super.onLoad(); if (isMonitoringParentSize()) { resizeTimer = new Timer() { @Override @@ -151,6 +158,18 @@ public class VView extends SimplePanel implements Container, ResizeHandler, } } + /** + * Stop monitoring for parent element resizes. + */ + @Override + protected void onUnload() { + if (resizeTimer != null) { + resizeTimer.cancel(); + resizeTimer = null; + } + super.onUnload(); + } + /** * Called when the window or parent div might have been resized. * -- cgit v1.2.3 From cac340e3dda0c4ec68af5294df84d428ffd5d30d Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Fri, 25 May 2012 12:35:28 +0000 Subject: #7911 Added a common CSS class "v-touch" for all touch devices svn changeset:23828/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/BrowserInfo.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/BrowserInfo.java b/src/com/vaadin/terminal/gwt/client/BrowserInfo.java index c8caab6829..4b9f3eacab 100644 --- a/src/com/vaadin/terminal/gwt/client/BrowserInfo.java +++ b/src/com/vaadin/terminal/gwt/client/BrowserInfo.java @@ -33,6 +33,9 @@ public class BrowserInfo { private static final String OS_ANDROID = "android"; private static final String OS_IOS = "ios"; + // Common CSS class for all touch devices + private static final String UI_TOUCH = "touch"; + private static BrowserInfo instance; private static String cssClass = null; @@ -171,7 +174,9 @@ public class BrowserInfo { if (osClass != null) { cssClass = cssClass + " " + prefix + osClass; } - + if (isTouchDevice()) { + cssClass = cssClass + " " + prefix + UI_TOUCH; + } } return cssClass; -- cgit v1.2.3 From 60c1b8b4c379a5d526c660eb3931e38ece859eb0 Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Fri, 25 May 2012 14:00:45 +0000 Subject: #8625 Fixed a regression caused by #8720 changes (touch scroll support) svn changeset:23832/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VTabsheet.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VTabsheet.java b/src/com/vaadin/terminal/gwt/client/ui/VTabsheet.java index d3836bb177..9161cb798d 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VTabsheet.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VTabsheet.java @@ -350,6 +350,7 @@ public class VTabsheet extends VTabsheetBase implements Focusable, } return width; } + public Element getCloseButton() { return closeButton; } @@ -1274,7 +1275,7 @@ public class VTabsheet extends VTabsheetBase implements Focusable, */ if (BrowserInfo.get().isFirefox() || BrowserInfo.get().isIE9()) { Util.setStyleTemporarily((Element) tp.getElement() - .getFirstChildElement(), "overflow", ""); + .getFirstChildElement(), "overflow", "hidden"); } return false; } else { -- cgit v1.2.3 From 8e5b52a1bd24de51f9a08ebbe6618094400078d2 Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Tue, 29 May 2012 10:57:48 +0000 Subject: Made Table serializable when using column width for row header (#8428) svn changeset:23834/svn branch:6.8 --- src/com/vaadin/ui/Table.java | 3 +- src/com/vaadin/ui/UniqueSerializable.java | 35 ++++++++++++++++++++++ .../server/component/table/TableSerialization.java | 24 +++++++++++++++ .../vaadin/tests/util/UniqueSerializableTest.java | 33 ++++++++++++++++++++ 4 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 src/com/vaadin/ui/UniqueSerializable.java create mode 100644 tests/server-side/com/vaadin/tests/server/component/table/TableSerialization.java create mode 100644 tests/server-side/com/vaadin/tests/util/UniqueSerializableTest.java (limited to 'src') diff --git a/src/com/vaadin/ui/Table.java b/src/com/vaadin/ui/Table.java index a2db89cabb..564aa24991 100644 --- a/src/com/vaadin/ui/Table.java +++ b/src/com/vaadin/ui/Table.java @@ -205,7 +205,8 @@ public class Table extends AbstractSelect implements Action.Container, private static final double CACHE_RATE_DEFAULT = 2; private static final String ROW_HEADER_COLUMN_KEY = "0"; - private static final Object ROW_HEADER_FAKE_PROPERTY_ID = new Object(); + private static final Object ROW_HEADER_FAKE_PROPERTY_ID = new UniqueSerializable() { + }; /* Private table extensions to Select */ diff --git a/src/com/vaadin/ui/UniqueSerializable.java b/src/com/vaadin/ui/UniqueSerializable.java new file mode 100644 index 0000000000..f6f354ef58 --- /dev/null +++ b/src/com/vaadin/ui/UniqueSerializable.java @@ -0,0 +1,35 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ +package com.vaadin.ui; + +import java.io.Serializable; + +/** + * A base class for generating an unique object that is serializable. + *

+ * This class is abstract but has no abstract methods to force users to create + * an anonymous inner class. Otherwise each instance will not be unique. + * + * @author Vaadin Ltd + * @version @VERSION@ + * @since 7.0 + * + */ +public abstract class UniqueSerializable implements Serializable { + + public static UniqueSerializable create() { + return new UniqueSerializable() { + }; + } + + @Override + public int hashCode() { + return getClass().hashCode(); + } + + @Override + public boolean equals(Object obj) { + return getClass() == obj.getClass(); + } +} diff --git a/tests/server-side/com/vaadin/tests/server/component/table/TableSerialization.java b/tests/server-side/com/vaadin/tests/server/component/table/TableSerialization.java new file mode 100644 index 0000000000..44dcd60fa5 --- /dev/null +++ b/tests/server-side/com/vaadin/tests/server/component/table/TableSerialization.java @@ -0,0 +1,24 @@ +package com.vaadin.tests.server.component.table; + +import junit.framework.TestCase; + +import org.apache.commons.lang.SerializationUtils; + +import com.vaadin.ui.Table; + +public class TableSerialization extends TestCase { + + public void testSerialization() { + Table t = new Table(); + byte[] ser = SerializationUtils.serialize(t); + Table t2 = (Table) SerializationUtils.deserialize(ser); + + } + public void testSerializationWithRowHeaders() { + Table t = new Table(); + t.setRowHeaderMode(Table.ROW_HEADER_MODE_EXPLICIT); + t.setColumnWidth(null, 100); + byte[] ser = SerializationUtils.serialize(t); + Table t2 = (Table) SerializationUtils.deserialize(ser); + } +} diff --git a/tests/server-side/com/vaadin/tests/util/UniqueSerializableTest.java b/tests/server-side/com/vaadin/tests/util/UniqueSerializableTest.java new file mode 100644 index 0000000000..578d983c4d --- /dev/null +++ b/tests/server-side/com/vaadin/tests/util/UniqueSerializableTest.java @@ -0,0 +1,33 @@ +/* +@VaadinApache2LicenseForJavaFiles@ + */ +package com.vaadin.tests.util; + +import java.io.Serializable; + +import junit.framework.TestCase; + +import org.apache.commons.lang.SerializationUtils; + +import com.vaadin.ui.UniqueSerializable; + +public class UniqueSerializableTest extends TestCase implements Serializable { + + public void testUniqueness() { + UniqueSerializable o1 = new UniqueSerializable() { + }; + UniqueSerializable o2 = new UniqueSerializable() { + }; + assertFalse(o1 == o2); + assertFalse(o1.equals(o2)); + } + + public void testSerialization() { + UniqueSerializable o1 = new UniqueSerializable() { + }; + UniqueSerializable d1 = (UniqueSerializable) SerializationUtils + .deserialize(SerializationUtils.serialize(o1)); + assertTrue(d1.equals(o1)); + } + +} -- cgit v1.2.3 From 16554478a54c556bc11f1c7f43800c69685772ca Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Tue, 29 May 2012 11:05:39 +0000 Subject: Removed non-working/unneeded code (#8428) svn changeset:23835/svn branch:6.8 --- src/com/vaadin/ui/UniqueSerializable.java | 5 ----- 1 file changed, 5 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/ui/UniqueSerializable.java b/src/com/vaadin/ui/UniqueSerializable.java index f6f354ef58..828b285538 100644 --- a/src/com/vaadin/ui/UniqueSerializable.java +++ b/src/com/vaadin/ui/UniqueSerializable.java @@ -18,11 +18,6 @@ import java.io.Serializable; */ public abstract class UniqueSerializable implements Serializable { - public static UniqueSerializable create() { - return new UniqueSerializable() { - }; - } - @Override public int hashCode() { return getClass().hashCode(); -- cgit v1.2.3 From bc630f6f294a24f5224c053634aa0ec3a6ccc7d5 Mon Sep 17 00:00:00 2001 From: Automerge Date: Tue, 29 May 2012 13:09:19 +0000 Subject: [merge from 6.7] Revert last attempt of fix for (#6039) as it doesn't fix all problems svn changeset:23839/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java | 8 -------- 1 file changed, 8 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java index c5ca16925b..9bfd013603 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java @@ -2118,9 +2118,6 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, return true; } } else { - if (scrollBody == null) { - return false; - } int fakeheight = (int) Math.round(scrollBody.getRowHeight() * totalRows); int availableHeight = scrollBodyPanel.getElement().getPropertyInt( @@ -6239,15 +6236,10 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, @Override public void setHeight(String height) { - boolean hadScrollbars = willHaveScrollbars(); this.height = height; super.setHeight(height); setContainerHeight(); - if (hadScrollbars != willHaveScrollbars()) { - triggerLazyColumnAdjustment(true); - } - if (initializedAndAttached) { updatePageLength(); } -- cgit v1.2.3 From 616387587d1377d0088a87d6831d984667f8eb3a Mon Sep 17 00:00:00 2001 From: Automerge Date: Wed, 30 May 2012 09:09:06 +0000 Subject: [merge from 6.7] Make ClickEventHandler fire clicks only if mousedown and mouseup match (#4120) svn changeset:23846/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/Util.java | 16 +++ .../terminal/gwt/client/ui/ClickEventHandler.java | 79 ++++++++++++- .../orderedlayout/LayoutClickListenerTest.html | 29 +++-- .../PanelClickListenerRelativeCoordinates.html | 6 +- .../tests/layouts/TestLayoutClickListeners.html | 128 ++++++++++++++++++++- 5 files changed, 233 insertions(+), 25 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/Util.java b/src/com/vaadin/terminal/gwt/client/Util.java index cb2539daa5..1a9991bb80 100644 --- a/src/com/vaadin/terminal/gwt/client/Util.java +++ b/src/com/vaadin/terminal/gwt/client/Util.java @@ -1156,6 +1156,22 @@ public class Util { } } + /** + * Find the element corresponding to the coordinates in the passed mouse + * event. Please note that this is not always the same as the target of the + * element e.g. if event capture is used. + * + * @param event + * the mouse event to get coordinates from + * @return the element at the coordinates of the event + */ + public static Element getElementUnderMouse(NativeEvent event) { + int pageX = getTouchOrMouseClientX(event); + int pageY = getTouchOrMouseClientY(event); + + return getElementFromPoint(pageX, pageY); + } + /** * A helper method to return the client position from an event. Returns * position from either first changed touch (if touch event) or from the diff --git a/src/com/vaadin/terminal/gwt/client/ui/ClickEventHandler.java b/src/com/vaadin/terminal/gwt/client/ui/ClickEventHandler.java index 3deb140d30..79ae5167fc 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/ClickEventHandler.java +++ b/src/com/vaadin/terminal/gwt/client/ui/ClickEventHandler.java @@ -6,33 +6,79 @@ package com.vaadin.terminal.gwt.client.ui; import java.util.HashMap; import java.util.Map; +import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.event.dom.client.ContextMenuEvent; import com.google.gwt.event.dom.client.ContextMenuHandler; import com.google.gwt.event.dom.client.DomEvent; import com.google.gwt.event.dom.client.DoubleClickEvent; import com.google.gwt.event.dom.client.DoubleClickHandler; +import com.google.gwt.event.dom.client.MouseDownEvent; +import com.google.gwt.event.dom.client.MouseDownHandler; import com.google.gwt.event.dom.client.MouseUpEvent; import com.google.gwt.event.dom.client.MouseUpHandler; import com.google.gwt.event.shared.EventHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.Element; +import com.google.gwt.user.client.Event; +import com.google.gwt.user.client.Event.NativePreviewEvent; +import com.google.gwt.user.client.Event.NativePreviewHandler; import com.google.gwt.user.client.ui.Widget; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.MouseEventDetails; import com.vaadin.terminal.gwt.client.Paintable; +import com.vaadin.terminal.gwt.client.Util; public abstract class ClickEventHandler implements DoubleClickHandler, - ContextMenuHandler, MouseUpHandler { + ContextMenuHandler, MouseUpHandler, MouseDownHandler { private HandlerRegistration doubleClickHandlerRegistration; private HandlerRegistration mouseUpHandlerRegistration; + private HandlerRegistration mouseDownHandlerRegistration; private HandlerRegistration contextMenuHandlerRegistration; protected String clickEventIdentifier; protected Paintable paintable; private ApplicationConnection client; + /** + * The element where the last mouse down event was registered. + */ + private JavaScriptObject lastMouseDownTarget; + + /** + * Set to true by {@link #mouseUpPreviewHandler} if it gets a mouseup at the + * same element as {@link #lastMouseDownTarget}. + */ + private boolean mouseUpPreviewMatched = false; + + private HandlerRegistration mouseUpEventPreviewRegistration; + + /** + * Previews events after a mousedown to detect where the following mouseup + * hits. + */ + private final NativePreviewHandler mouseUpPreviewHandler = new NativePreviewHandler() { + public void onPreviewNativeEvent(NativePreviewEvent event) { + if (event.getTypeInt() == Event.ONMOUSEUP) { + mouseUpEventPreviewRegistration.removeHandler(); + + // Event's reported target not always correct if event + // capture is in use + Element elementUnderMouse = Util.getElementUnderMouse(event + .getNativeEvent()); + if (lastMouseDownTarget != null + && elementUnderMouse.cast() == lastMouseDownTarget) { + mouseUpPreviewMatched = true; + } else { + System.out.println("Ignoring mouseup from " + + elementUnderMouse + " when mousedown was on " + + lastMouseDownTarget); + } + } + } + }; + public ClickEventHandler(Paintable paintable, String clickEventIdentifier) { this.paintable = paintable; this.clickEventIdentifier = clickEventIdentifier; @@ -46,6 +92,8 @@ public abstract class ClickEventHandler implements DoubleClickHandler, if (mouseUpHandlerRegistration == null) { mouseUpHandlerRegistration = registerHandler(this, MouseUpEvent.getType()); + mouseDownHandlerRegistration = registerHandler(this, + MouseDownEvent.getType()); contextMenuHandlerRegistration = registerHandler(this, ContextMenuEvent.getType()); doubleClickHandlerRegistration = registerHandler(this, @@ -56,10 +104,12 @@ public abstract class ClickEventHandler implements DoubleClickHandler, // Remove existing handlers doubleClickHandlerRegistration.removeHandler(); mouseUpHandlerRegistration.removeHandler(); + mouseDownHandlerRegistration.removeHandler(); contextMenuHandlerRegistration.removeHandler(); contextMenuHandlerRegistration = null; mouseUpHandlerRegistration = null; + mouseDownHandlerRegistration = null; doubleClickHandlerRegistration = null; } @@ -101,14 +151,33 @@ public abstract class ClickEventHandler implements DoubleClickHandler, } + public void onMouseDown(MouseDownEvent event) { + /* + * When getting a mousedown event, we must detect where the + * corresponding mouseup event if it's on a different part of the page. + */ + lastMouseDownTarget = event.getNativeEvent().getEventTarget(); + mouseUpPreviewMatched = false; + mouseUpEventPreviewRegistration = Event + .addNativePreviewHandler(mouseUpPreviewHandler); + } + public void onMouseUp(MouseUpEvent event) { - // TODO For perfect accuracy we should check that a mousedown has - // occured on this element before this mouseup and that no mouseup - // has occured anywhere after that. - if (hasEventListener()) { + /* + * Only fire a click if the mouseup hits the same element as the + * corresponding mousedown. This is first checked in the event preview + * but we can't fire the even there as the event might get canceled + * before it gets here. + */ + if (hasEventListener() + && mouseUpPreviewMatched + && lastMouseDownTarget != null + && Util.getElementUnderMouse(event.getNativeEvent()) == lastMouseDownTarget) { // "Click" with left, right or middle button fireClick(event.getNativeEvent()); } + mouseUpPreviewMatched = false; + lastMouseDownTarget = null; } public void onDoubleClick(DoubleClickEvent event) { diff --git a/tests/testbench/com/vaadin/tests/components/orderedlayout/LayoutClickListenerTest.html b/tests/testbench/com/vaadin/tests/components/orderedlayout/LayoutClickListenerTest.html index 6b850fb52a..4d33294dca 100644 --- a/tests/testbench/com/vaadin/tests/components/orderedlayout/LayoutClickListenerTest.html +++ b/tests/testbench/com/vaadin/tests/components/orderedlayout/LayoutClickListenerTest.html @@ -19,74 +19,73 @@ mouseClick vaadin=runcomvaadintestscomponentsorderedlayoutLayoutClickListenerTest::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[0]/VTextField[0] - + 5,5 mouseClick vaadin=runcomvaadintestscomponentsorderedlayoutLayoutClickListenerTest::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[1]/VLink[0]/domChild[0]/domChild[0] - + 5,5 mouseClick vaadin=runcomvaadintestscomponentsorderedlayoutLayoutClickListenerTest::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[2]/VFilterSelect[0]/domChild[0] - + 5,5 mouseClick vaadin=runcomvaadintestscomponentsorderedlayoutLayoutClickListenerTest::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[3]/VTabsheet[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[1]/domChild[0] - + 5,5 mouseClick vaadin=runcomvaadintestscomponentsorderedlayoutLayoutClickListenerTest::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[3]/VTabsheet[0]/VTabsheetPanel[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VLabel[0] - + 5,5 mouseClick vaadin=runcomvaadintestscomponentsorderedlayoutLayoutClickListenerTest::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[3]/VTabsheet[0]/VTabsheetPanel[0]/VVerticalLayout[0]/ChildComponentContainer[1]/VTextField[0] - + 5,5 mouseClick vaadin=runcomvaadintestscomponentsorderedlayoutLayoutClickListenerTest::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[3]/VTabsheet[0]/VTabsheetPanel[0]/VVerticalLayout[0]/ChildComponentContainer[2]/VLink[0]/domChild[0]/domChild[0] - + 5,5 mouseClick - vaadin=runcomvaadintestscomponentsorderedlayoutLayoutClickListenerTest::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[3]/VTabsheet[0]/VTabsheetPanel[0]/VVerticalLayout[0]/domChild[0]/domChild[1] - + vaadin=runcomvaadintestscomponentsorderedlayoutLayoutClickListenerTest::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[3]/VTabsheet[0]/VTabsheetPanel[0]/VVerticalLayout[0] + 396,87 mouseClick vaadin=runcomvaadintestscomponentsorderedlayoutLayoutClickListenerTest::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[4]/VVerticalLayout[0]/ChildComponentContainer[0]/VLabel[0] - + 5,5 mouseClick vaadin=runcomvaadintestscomponentsorderedlayoutLayoutClickListenerTest::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[4]/VVerticalLayout[0]/ChildComponentContainer[1]/VTextField[0] - + 5,5 mouseClick vaadin=runcomvaadintestscomponentsorderedlayoutLayoutClickListenerTest::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[4]/VVerticalLayout[0]/ChildComponentContainer[2]/VLink[0]/domChild[0]/domChild[0] - + 5,5 mouseClick vaadin=runcomvaadintestscomponentsorderedlayoutLayoutClickListenerTest::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[4]/VVerticalLayout[0]/ChildComponentContainer[3]/VHorizontalLayout[0]/ChildComponentContainer[0]/VLabel[0] - + 5,5 mouseClick vaadin=runcomvaadintestscomponentsorderedlayoutLayoutClickListenerTest::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VGridLayout[0]/domChild[0]/domChild[0] - + 1135,146 screenCapture everything_clicked - diff --git a/tests/testbench/com/vaadin/tests/components/panel/PanelClickListenerRelativeCoordinates.html b/tests/testbench/com/vaadin/tests/components/panel/PanelClickListenerRelativeCoordinates.html index eb40765d03..4b71c5a9a9 100644 --- a/tests/testbench/com/vaadin/tests/components/panel/PanelClickListenerRelativeCoordinates.html +++ b/tests/testbench/com/vaadin/tests/components/panel/PanelClickListenerRelativeCoordinates.html @@ -28,10 +28,10 @@ mouseClick - vaadin=runcomvaadintestscomponentspanelPanelClickListenerRelativeCoordinates::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VPanel[0] - 287,25 + vaadin=runcomvaadintestscomponentspanelPanelClickListenerRelativeCoordinates::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VPanel[0]/VVerticalLayout[0] + 287,6 - + + drag + vaadin=runcomvaadintestslayoutsTestLayoutClickListeners::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[1]/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[0]/VLabel[0] + 40,8 + + + drop + vaadin=runcomvaadintestslayoutsTestLayoutClickListeners::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[1]/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[0]/VLabel[0] + 40,8 + + + assertText + vaadin=runcomvaadintestslayoutsTestLayoutClickListeners::PID_SLog_row_0 + exact:GridLayout: left click on This is label 1 + + + drag + vaadin=runcomvaadintestslayoutsTestLayoutClickListeners::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[1]/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[0]/VLabel[0] + 24,7 + + + drop + vaadin=runcomvaadintestslayoutsTestLayoutClickListeners::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[0]/VVerticalLayout[0]/ChildComponentContainer[1]/VGridLayout[0]/AbsolutePanel[0]/ChildComponentContainer[4]/VTextField[0] + 46,13 + + + assertText + vaadin=runcomvaadintestslayoutsTestLayoutClickListeners::PID_SLog_row_0 + exact:GridLayout: left click on This is label 1 + + + + drag + vaadin=runcomvaadintestslayoutsTestLayoutClickListeners::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[4]/VTextField[0] + 25,9 + + + drop + vaadin=runcomvaadintestslayoutsTestLayoutClickListeners::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[4]/VTextField[0] + 25,9 + + + assertText + vaadin=runcomvaadintestslayoutsTestLayoutClickListeners::PID_SLog_row_0 + exact:VerticalLayout: left click on This is tf5 + + + drag + vaadin=runcomvaadintestslayoutsTestLayoutClickListeners::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/domChild[0]/domChild[8]/domChild[0]/domChild[0] + 28,11 + + + drop + vaadin=runcomvaadintestslayoutsTestLayoutClickListeners::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[8]/VTextField[0] + 39,7 + + + assertText + vaadin=runcomvaadintestslayoutsTestLayoutClickListeners::PID_SLog_row_0 + exact:VerticalLayout: left click on This is tf5 + + + + drag + vaadin=runcomvaadintestslayoutsTestLayoutClickListeners::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[2]/VAbsoluteLayout[0]/domChild[0]/domChild[0]/domChild[1]/domChild[0] + 21,9 + + + drop + vaadin=runcomvaadintestslayoutsTestLayoutClickListeners::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[2]/VAbsoluteLayout[0]/domChild[0]/domChild[0]/domChild[1]/domChild[0] + 21,9 + + + assertText + vaadin=runcomvaadintestslayoutsTestLayoutClickListeners::PID_SLog_row_0 + exact:AbsoluteLayout: left click on This is its caption + + + drag + vaadin=runcomvaadintestslayoutsTestLayoutClickListeners::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[2]/VAbsoluteLayout[0]/VAbsoluteLayout$AbsoluteWrapper[0]/VTextField[0] + 54,7 + + + drop + vaadin=runcomvaadintestslayoutsTestLayoutClickListeners::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[2]/VAbsoluteLayout[0]/VAbsoluteLayout$AbsoluteWrapper[1]/VTextField[0] + 52,10 + + + assertText + vaadin=runcomvaadintestslayoutsTestLayoutClickListeners::PID_SLog_row_0 + exact:AbsoluteLayout: left click on This is its caption + + + + drag + vaadin=runcomvaadintestslayoutsTestLayoutClickListeners::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[3]/VCssLayout[0]/VCssLayout$FlowPane[0]/VTextField[0] + 51,7 + + + drop + vaadin=runcomvaadintestslayoutsTestLayoutClickListeners::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[3]/VCssLayout[0]/VCssLayout$FlowPane[0]/VTextField[0] + 51,7 + + + assertText + vaadin=runcomvaadintestslayoutsTestLayoutClickListeners::PID_SLog_row_0 + exact:CSSLayout: left click on This is its caption + + + drag + vaadin=runcomvaadintestslayoutsTestLayoutClickListeners::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[3]/VCssLayout[0]/domChild[0]/domChild[0]/domChild[2]/domChild[0] + 31,7 + + + drop + vaadin=runcomvaadintestslayoutsTestLayoutClickListeners::/VVerticalLayout[0]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[3]/VCssLayout[0]/VCssLayout$FlowPane[0]/VTextField[1] + 33,7 + + + assertText + vaadin=runcomvaadintestslayoutsTestLayoutClickListeners::PID_SLog_row_0 + exact:CSSLayout: left click on This is its caption + -- cgit v1.2.3 From e3c2e2efbed6452a365483aadfc147c4ae6ffdad Mon Sep 17 00:00:00 2001 From: Tapio Aali Date: Wed, 30 May 2012 10:02:29 +0000 Subject: Added options for setting maximum and minimum split positions to SplitPanel (#1744). svn changeset:23850/svn branch:6.8 --- .../vaadin/terminal/gwt/client/ui/VSplitPanel.java | 119 +++++++-- src/com/vaadin/ui/AbstractSplitPanel.java | 110 +++++++- .../SplitPanelWithMinimumAndMaximum.html | 207 ++++++++++++++++ .../SplitPanelWithMinimumAndMaximum.java | 276 +++++++++++++++++++++ 4 files changed, 691 insertions(+), 21 deletions(-) create mode 100644 tests/testbench/com/vaadin/tests/components/splitpanel/SplitPanelWithMinimumAndMaximum.html create mode 100644 tests/testbench/com/vaadin/tests/components/splitpanel/SplitPanelWithMinimumAndMaximum.java (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java b/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java index 5a996954a0..4cb183917f 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java @@ -147,6 +147,10 @@ public class VSplitPanel extends ComplexPanel implements Container, /* The current position of the split handle in either percentages or pixels */ private String position; + private String maximumPosition; + + private String minimumPosition; + private final TouchScrollHandler touchScrollHandler; protected Element scrolledContainer; @@ -272,6 +276,10 @@ public class VSplitPanel extends ComplexPanel implements Container, touchScrollHandler.setElements(firstContainer, secondContainer); position = uidl.getStringAttribute("position"); + + minimumPosition = uidl.getStringAttribute("minimumPosition"); + maximumPosition = uidl.getStringAttribute("maximumPosition"); + setSplitPosition(position); final Paintable newFirstChild = client.getPaintable(uidl @@ -346,11 +354,100 @@ public class VSplitPanel extends ComplexPanel implements Container, } } + /** + * Converts given split position string (in pixels or percentage) to a + * floating point pixel value. + * + * @param pos + * @return + */ + private float convertToPixels(String pos) { + float posAsFloat; + if (pos.indexOf("%") > 0) { + posAsFloat = Math.round(Float.parseFloat(pos.substring(0, + pos.length() - 1)) + / 100 + * (orientation == ORIENTATION_HORIZONTAL ? getOffsetWidth() + : getOffsetHeight())); + } else { + posAsFloat = Float.parseFloat(pos.substring(0, pos.length() - 2)); + } + return posAsFloat; + } + + /** + * Converts given split position string (in pixels or percentage) to a float + * percentage value. + * + * @param pos + * @return + */ + private float convertToPercentage(String pos) { + float posAsFloat = 0; + + if (pos.indexOf("px") > 0) { + int posAsInt = Integer.parseInt(pos.substring(0, pos.length() - 2)); + int offsetLength = orientation == ORIENTATION_HORIZONTAL ? getOffsetWidth() + : getOffsetHeight(); + + // 100% needs special handling + if (posAsInt + getSplitterSize() >= offsetLength) { + posAsInt = offsetLength; + } + // Reversed position + if (positionReversed) { + posAsInt = offsetLength - posAsInt - getSplitterSize(); + } + posAsFloat = ((float) posAsInt / (float) getOffsetWidth() * 100); + + } else { + posAsFloat = Float.parseFloat(pos.substring(0, pos.length() - 1)); + } + return posAsFloat; + } + + private String checkSplitPositionLimits(String pos) { + float positionAsFloat = convertToPixels(pos); + float maximumAsFloat = convertToPixels(maximumPosition); + float minimumAsFloat = convertToPixels(minimumPosition); + + if (maximumAsFloat < positionAsFloat) { + pos = maximumPosition; + } else if (minimumAsFloat > positionAsFloat) { + pos = minimumPosition; + } + return pos; + } + + /** + * Converts given string to the same units as the split position is. + * + * @param pos + * position to be converted + * @return converted position string + */ + private String convertToPositionUnits(String pos) { + if (position.indexOf("%") != -1 && pos.indexOf("%") == -1) { + // position is in percentage, pos in pixels + pos = convertToPercentage(pos) + "%"; + } else if (position.indexOf("px") > 0 && pos.indexOf("px") == -1) { + // position is in pixels and pos in percentage + pos = convertToPixels(pos) + "px"; + } + + return pos; + } + private void setSplitPosition(String pos) { if (pos == null) { return; } + pos = checkSplitPositionLimits(pos); + if (!pos.equals(position)) { + position = convertToPositionUnits(pos); + } + // Convert percentage values to pixels if (pos.indexOf("%") > 0) { pos = Float.parseFloat(pos.substring(0, pos.length() - 1)) @@ -564,16 +661,7 @@ public class VSplitPanel extends ComplexPanel implements Container, } if (position.indexOf("%") > 0) { - float pos = newX; - // 100% needs special handling - if (newX + getSplitterSize() >= getOffsetWidth()) { - pos = getOffsetWidth(); - } - // Reversed position - if (positionReversed) { - pos = getOffsetWidth() - pos - getSplitterSize(); - } - position = (pos / getOffsetWidth() * 100) + "%"; + position = convertToPositionUnits(newX + "px"); } else { // Reversed position if (positionReversed) { @@ -606,16 +694,7 @@ public class VSplitPanel extends ComplexPanel implements Container, } if (position.indexOf("%") > 0) { - float pos = newY; - // 100% needs special handling - if (newY + getSplitterSize() >= getOffsetHeight()) { - pos = getOffsetHeight(); - } - // Reversed position - if (positionReversed) { - pos = getOffsetHeight() - pos - getSplitterSize(); - } - position = pos / getOffsetHeight() * 100 + "%"; + position = convertToPositionUnits(newY + "px"); } else { // Reversed position if (positionReversed) { diff --git a/src/com/vaadin/ui/AbstractSplitPanel.java b/src/com/vaadin/ui/AbstractSplitPanel.java index b507b88478..ebdee17de2 100644 --- a/src/com/vaadin/ui/AbstractSplitPanel.java +++ b/src/com/vaadin/ui/AbstractSplitPanel.java @@ -22,7 +22,7 @@ import com.vaadin.tools.ReflectTools; * AbstractSplitPanel. * * AbstractSplitPanel is base class for a component container that - * can contain two components. The comopnents are split by a divider element. + * can contain two components. The components are split by a divider element. * * @author Vaadin Ltd. * @version @@ -41,6 +41,14 @@ public abstract class AbstractSplitPanel extends AbstractLayout { private boolean posReversed = false; + private int posMin = 0; + + private int posMinUnit = UNITS_PERCENTAGE; + + private int posMax = 100; + + private int posMaxUnit = UNITS_PERCENTAGE; + private boolean locked = false; private static final String SPLITTER_CLICK_EVENT = VSplitPanel.SPLITTER_CLICK_EVENT_IDENTIFIER; @@ -210,8 +218,12 @@ public abstract class AbstractSplitPanel extends AbstractLayout { super.paintContent(target); final String position = pos + UNIT_SYMBOLS[posUnit]; + final String minimumPosition = posMin + UNIT_SYMBOLS[posMinUnit]; + final String maximumPosition = posMax + UNIT_SYMBOLS[posMaxUnit]; target.addAttribute("position", position); + target.addAttribute("minimumPosition", minimumPosition); + target.addAttribute("maximumPosition", maximumPosition); if (isLocked()) { target.addAttribute("locked", true); @@ -322,6 +334,102 @@ public abstract class AbstractSplitPanel extends AbstractLayout { return posUnit; } + /** + * Sets the minimum split position to the given position and unit. If the + * split position is reversed, maximum and minimum are also reversed. + * + * @param pos + * the minimum position of the split + * @param unit + * the unit (from {@link Sizeable}) in which the size is given. + * Allowed units are UNITS_PERCENTAGE and UNITS_PIXELS + */ + public void setMinimumSplitPosition(int pos, int unit) { + setSplitPositionLimits(pos, unit, posMax, posMaxUnit); + } + + /** + * Returns the current minimum position of the splitter, in + * {@link #getMinSplitPositionUnit()} units. + * + * @return the minimum position of the splitter + */ + public int getMinSplitPosition() { + return posMin; + } + + /** + * Returns the unit of the minimum position of the splitter. + * + * @return the unit of the minimum position of the splitter + */ + public int getMinSplitPositionUnit() { + return posMinUnit; + } + + /** + * Sets the maximum split position to the given position and unit. If the + * split position is reversed, maximum and minimum are also reversed. + * + * @param pos + * the maximum position of the split + * @param unit + * the unit (from {@link Sizeable}) in which the size is given. + * Allowed units are UNITS_PERCENTAGE and UNITS_PIXELS + */ + public void setMaxSplitPosition(int pos, int unit) { + setSplitPositionLimits(posMin, posMinUnit, pos, unit); + } + + /** + * Returns the current maximum position of the splitter, in + * {@link #getMaxSplitPositionUnit()} units. + * + * @return the maximum position of the splitter + */ + public int getMaxSplitPosition() { + return posMax; + } + + /** + * Returns the unit of the maximum position of the splitter + * + * @return the unit of the maximum position of the splitter + */ + public int getMaxSplitPositionUnit() { + return posMaxUnit; + } + + /** + * Sets the maximum and minimum position of the splitter. If the split + * position is reversed, maximum and minimum are also reversed. + * + * @param minPos + * the new minimum position + * @param minPosUnit + * the unit (from {@link Sizeable}) in which the minimum position + * is given. + * @param maxPos + * the new maximum position + * @param maxPosUnit + * the unit (from {@link Sizeable}) in which the maximum position + * is given. + */ + private void setSplitPositionLimits(int minPos, int minPosUnit, int maxPos, + int maxPosUnit) { + if ((minPosUnit != UNITS_PERCENTAGE && minPosUnit != UNITS_PIXELS) + || (maxPosUnit != UNITS_PERCENTAGE && maxPosUnit != UNITS_PIXELS)) { + throw new IllegalArgumentException( + "Only percentage and pixel units are allowed"); + } + + posMin = minPos; + posMinUnit = minPosUnit; + posMax = maxPos; + posMaxUnit = maxPosUnit; + requestRepaint(); + } + /** * Moves the position of the splitter. * diff --git a/tests/testbench/com/vaadin/tests/components/splitpanel/SplitPanelWithMinimumAndMaximum.html b/tests/testbench/com/vaadin/tests/components/splitpanel/SplitPanelWithMinimumAndMaximum.html new file mode 100644 index 0000000000..3aefedeff3 --- /dev/null +++ b/tests/testbench/com/vaadin/tests/components/splitpanel/SplitPanelWithMinimumAndMaximum.html @@ -0,0 +1,207 @@ + + + + + + +SplitPanelWithMinimumAndMaximum + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SplitPanelWithMinimumAndMaximum
open/run/com.vaadin.tests.components.splitpanel.SplitPanelWithMinimumAndMaximum?restartApplication
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VSplitPanelHorizontal[0]/domChild[0]/domChild[2]/domChild[0]-239,0
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VVerticalLayout[0]/ChildComponentContainer[1]/VSplitPanelHorizontal[0]/domChild[0]/domChild[2]/domChild[0]-340,0
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VVerticalLayout[0]/ChildComponentContainer[2]/VSplitPanelHorizontal[0]/domChild[0]/domChild[2]/domChild[0]-300,0
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VVerticalLayout[0]/ChildComponentContainer[3]/VSplitPanelHorizontal[0]/domChild[0]/domChild[2]/domChild[0]-79,0
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VVerticalLayout[0]/ChildComponentContainer[4]/VSplitPanelHorizontal[0]/domChild[0]/domChild[2]/domChild[0]-179,0
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VVerticalLayout[0]/ChildComponentContainer[5]/VSplitPanelHorizontal[0]/domChild[0]/domChild[2]/domChild[0]-78,0
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VVerticalLayout[0]/ChildComponentContainer[6]/VSplitPanelHorizontal[0]/domChild[0]/domChild[2]/domChild[0]-150,0
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VVerticalLayout[0]/ChildComponentContainer[7]/VSplitPanelHorizontal[0]/domChild[0]/domChild[2]/domChild[0]-371,0
screenCapturehorizontal-splits-left
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VVerticalLayout[0]/ChildComponentContainer[0]/VSplitPanelHorizontal[0]/domChild[0]/domChild[2]/domChild[0]418,0
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VVerticalLayout[0]/ChildComponentContainer[1]/VSplitPanelHorizontal[0]/domChild[0]/domChild[2]/domChild[0]418,0
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VVerticalLayout[0]/ChildComponentContainer[2]/VSplitPanelHorizontal[0]/domChild[0]/domChild[2]/domChild[0]450,0
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VVerticalLayout[0]/ChildComponentContainer[3]/VSplitPanelHorizontal[0]/domChild[0]/domChild[2]/domChild[0]450,0
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VVerticalLayout[0]/ChildComponentContainer[4]/VSplitPanelHorizontal[0]/domChild[0]/domChild[2]/domChild[0]418,0
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VVerticalLayout[0]/ChildComponentContainer[5]/VSplitPanelHorizontal[0]/domChild[0]/domChild[2]/domChild[0]418,0
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VVerticalLayout[0]/ChildComponentContainer[6]/VSplitPanelHorizontal[0]/domChild[0]/domChild[2]/domChild[0]450,0
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VVerticalLayout[0]/ChildComponentContainer[7]/VSplitPanelHorizontal[0]/domChild[0]/domChild[2]/domChild[0]450,0
screenCapturehorizontal-splits-right
mouseClickvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[1]/domChild[0]/domChild[0]/domChild[0]44,2
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VHorizontalLayout[0]/ChildComponentContainer[0]/VSplitPanelVertical[0]/domChild[0]/domChild[2]/domChild[0]0,-206
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VHorizontalLayout[0]/ChildComponentContainer[1]/VSplitPanelVertical[0]/domChild[0]/domChild[2]/domChild[0]0,-348
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VHorizontalLayout[0]/ChildComponentContainer[2]/VSplitPanelVertical[0]/domChild[0]/domChild[2]/domChild[0]0,-300
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VHorizontalLayout[0]/ChildComponentContainer[3]/VSplitPanelVertical[0]/domChild[0]/domChild[2]/domChild[0]0,-55
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VHorizontalLayout[0]/ChildComponentContainer[4]/VSplitPanelVertical[0]/domChild[0]/domChild[2]/domChild[0]0,-155
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VHorizontalLayout[0]/ChildComponentContainer[5]/VSplitPanelVertical[0]/domChild[0]/domChild[2]/domChild[0]0,-13
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VHorizontalLayout[0]/ChildComponentContainer[7]/VSplitPanelVertical[0]/domChild[0]/domChild[2]/domChild[0]0,-300
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VHorizontalLayout[0]/ChildComponentContainer[6]/VSplitPanelVertical[0]/domChild[0]/domChild[2]/domChild[0]0,-300
screenCapturevertical-splits-up
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VHorizontalLayout[0]/ChildComponentContainer[0]/VSplitPanelVertical[0]/domChild[0]/domChild[2]/domChild[0]0,361
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VHorizontalLayout[0]/ChildComponentContainer[1]/VSplitPanelVertical[0]/domChild[0]/domChild[2]/domChild[0]0,361
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VHorizontalLayout[0]/ChildComponentContainer[2]/VSplitPanelVertical[0]/domChild[0]/domChild[2]/domChild[0]0,350
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VHorizontalLayout[0]/ChildComponentContainer[3]/VSplitPanelVertical[0]/domChild[0]/domChild[2]/domChild[0]0,350
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VHorizontalLayout[0]/ChildComponentContainer[4]/VSplitPanelVertical[0]/domChild[0]/domChild[2]/domChild[0]0,361
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VHorizontalLayout[0]/ChildComponentContainer[5]/VSplitPanelVertical[0]/domChild[0]/domChild[2]/domChild[0]0,361
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VHorizontalLayout[0]/ChildComponentContainer[6]/VSplitPanelVertical[0]/domChild[0]/domChild[2]/domChild[0]0,300
dragAndDropvaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VHorizontalLayout[0]/ChildComponentContainer[7]/VSplitPanelVertical[0]/domChild[0]/domChild[2]/domChild[0]0,300
screenCapturevertical-splits-down
+ + diff --git a/tests/testbench/com/vaadin/tests/components/splitpanel/SplitPanelWithMinimumAndMaximum.java b/tests/testbench/com/vaadin/tests/components/splitpanel/SplitPanelWithMinimumAndMaximum.java new file mode 100644 index 0000000000..9fa6fc18a3 --- /dev/null +++ b/tests/testbench/com/vaadin/tests/components/splitpanel/SplitPanelWithMinimumAndMaximum.java @@ -0,0 +1,276 @@ +package com.vaadin.tests.components.splitpanel; + +import com.vaadin.terminal.Sizeable; +import com.vaadin.tests.components.TestBase; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.HorizontalSplitPanel; +import com.vaadin.ui.Label; +import com.vaadin.ui.TabSheet; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.VerticalSplitPanel; + +public class SplitPanelWithMinimumAndMaximum extends TestBase { + + @Override + protected void setup() { + TabSheet tabs = new TabSheet(); + + VerticalLayout horizontalSplitsLayout = new VerticalLayout(); + horizontalSplitsLayout.setCaption("Horizontal splits"); + + HorizontalSplitPanel percentagePositionWithPercentageLimitsHorizontal = new HorizontalSplitPanel(); + percentagePositionWithPercentageLimitsHorizontal + .setMinimumSplitPosition(10, Sizeable.UNITS_PERCENTAGE); + percentagePositionWithPercentageLimitsHorizontal.setMaxSplitPosition( + 80, Sizeable.UNITS_PERCENTAGE); + percentagePositionWithPercentageLimitsHorizontal + .setFirstComponent(new Label("Min 10 % - 50 % position")); + percentagePositionWithPercentageLimitsHorizontal + .setSecondComponent(new Label("Max 80 %")); + percentagePositionWithPercentageLimitsHorizontal.setSplitPosition(50, + Sizeable.UNITS_PERCENTAGE); + horizontalSplitsLayout + .addComponent(percentagePositionWithPercentageLimitsHorizontal); + + HorizontalSplitPanel pixelPositionWithPercentageLimitsHorizontal = new HorizontalSplitPanel(); + pixelPositionWithPercentageLimitsHorizontal.setMinimumSplitPosition(10, + Sizeable.UNITS_PERCENTAGE); + pixelPositionWithPercentageLimitsHorizontal.setMaxSplitPosition(80, + Sizeable.UNITS_PERCENTAGE); + pixelPositionWithPercentageLimitsHorizontal + .setFirstComponent(new Label("Min 10 % - 400 px position")); + pixelPositionWithPercentageLimitsHorizontal + .setSecondComponent(new Label("Max 80 %")); + pixelPositionWithPercentageLimitsHorizontal.setSplitPosition(400, + Sizeable.UNITS_PIXELS); + horizontalSplitsLayout + .addComponent(pixelPositionWithPercentageLimitsHorizontal); + + HorizontalSplitPanel pixelPositionWithPixelLimitsHorizontal = new HorizontalSplitPanel(); + pixelPositionWithPixelLimitsHorizontal.setMinimumSplitPosition(100, + Sizeable.UNITS_PIXELS); + pixelPositionWithPixelLimitsHorizontal.setMaxSplitPosition(550, + Sizeable.UNITS_PIXELS); + pixelPositionWithPixelLimitsHorizontal.setFirstComponent(new Label( + "Min 100 px - 400 px position")); + pixelPositionWithPixelLimitsHorizontal.setSecondComponent(new Label( + "Max 550 px")); + pixelPositionWithPixelLimitsHorizontal.setSplitPosition(400, + Sizeable.UNITS_PIXELS); + horizontalSplitsLayout + .addComponent(pixelPositionWithPixelLimitsHorizontal); + + HorizontalSplitPanel percentagePositionWithPixelLimitsHorizontal = new HorizontalSplitPanel(); + percentagePositionWithPixelLimitsHorizontal.setMinimumSplitPosition( + 100, Sizeable.UNITS_PIXELS); + percentagePositionWithPixelLimitsHorizontal.setMaxSplitPosition(550, + Sizeable.UNITS_PIXELS); + percentagePositionWithPixelLimitsHorizontal + .setFirstComponent(new Label("Min 100 px - 30 % position")); + percentagePositionWithPixelLimitsHorizontal + .setSecondComponent(new Label("Max 550 px")); + percentagePositionWithPixelLimitsHorizontal.setSplitPosition(30, + Sizeable.UNITS_PERCENTAGE); + horizontalSplitsLayout + .addComponent(percentagePositionWithPixelLimitsHorizontal); + + HorizontalSplitPanel percentagePositionWithPercentageLimitsHorizontalResersed = new HorizontalSplitPanel(); + percentagePositionWithPercentageLimitsHorizontalResersed + .setMinimumSplitPosition(10, Sizeable.UNITS_PERCENTAGE); + percentagePositionWithPercentageLimitsHorizontalResersed + .setMaxSplitPosition(80, Sizeable.UNITS_PERCENTAGE); + percentagePositionWithPercentageLimitsHorizontalResersed + .setFirstComponent(new Label( + "Max 80 % - Reversed 50 % position")); + percentagePositionWithPercentageLimitsHorizontalResersed + .setSecondComponent(new Label("Min 10 %")); + percentagePositionWithPercentageLimitsHorizontalResersed + .setSplitPosition(50, Sizeable.UNITS_PERCENTAGE, true); + horizontalSplitsLayout + .addComponent(percentagePositionWithPercentageLimitsHorizontalResersed); + + HorizontalSplitPanel pixelPositionWithPercentageLimitsHorizontalResersed = new HorizontalSplitPanel(); + pixelPositionWithPercentageLimitsHorizontalResersed + .setMinimumSplitPosition(10, Sizeable.UNITS_PERCENTAGE); + pixelPositionWithPercentageLimitsHorizontalResersed + .setMaxSplitPosition(80, Sizeable.UNITS_PERCENTAGE); + pixelPositionWithPercentageLimitsHorizontalResersed + .setFirstComponent(new Label( + "Max 80 % - Reversed 400 px position")); + pixelPositionWithPercentageLimitsHorizontalResersed + .setSecondComponent(new Label("Min 10 %")); + pixelPositionWithPercentageLimitsHorizontalResersed.setSplitPosition( + 400, Sizeable.UNITS_PIXELS, true); + horizontalSplitsLayout + .addComponent(pixelPositionWithPercentageLimitsHorizontalResersed); + + HorizontalSplitPanel pixelPositionWithPixelLimitsHorizontalResersed = new HorizontalSplitPanel(); + pixelPositionWithPixelLimitsHorizontalResersed.setMinimumSplitPosition( + 100, Sizeable.UNITS_PIXELS); + pixelPositionWithPixelLimitsHorizontalResersed.setMaxSplitPosition(550, + Sizeable.UNITS_PIXELS); + pixelPositionWithPixelLimitsHorizontalResersed + .setFirstComponent(new Label( + "Max 550 px - Reversed 400 px position")); + pixelPositionWithPixelLimitsHorizontalResersed + .setSecondComponent(new Label("Min 100 px")); + pixelPositionWithPixelLimitsHorizontalResersed.setSplitPosition(400, + Sizeable.UNITS_PIXELS, true); + horizontalSplitsLayout + .addComponent(pixelPositionWithPixelLimitsHorizontalResersed); + + HorizontalSplitPanel percentagePositionWithPixelLimitsHorizontalResersed = new HorizontalSplitPanel(); + percentagePositionWithPixelLimitsHorizontalResersed + .setMinimumSplitPosition(100, Sizeable.UNITS_PIXELS); + percentagePositionWithPixelLimitsHorizontalResersed + .setMaxSplitPosition(550, Sizeable.UNITS_PIXELS); + percentagePositionWithPixelLimitsHorizontalResersed + .setFirstComponent(new Label( + "Max 550 px - Reversed 30 % position")); + percentagePositionWithPixelLimitsHorizontalResersed + .setSecondComponent(new Label("Min 100 px")); + percentagePositionWithPixelLimitsHorizontalResersed.setSplitPosition( + 30, Sizeable.UNITS_PERCENTAGE, true); + horizontalSplitsLayout + .addComponent(percentagePositionWithPixelLimitsHorizontalResersed); + + horizontalSplitsLayout.setSizeFull(); + tabs.addComponent(horizontalSplitsLayout); + + HorizontalLayout verticalSplitsLayout = new HorizontalLayout(); + verticalSplitsLayout.setCaption("Vertical splits"); + + VerticalSplitPanel percentagePositionWithPercentageLimitsVertical = new VerticalSplitPanel(); + percentagePositionWithPercentageLimitsVertical.setMinimumSplitPosition( + 10, Sizeable.UNITS_PERCENTAGE); + percentagePositionWithPercentageLimitsVertical.setMaxSplitPosition(80, + Sizeable.UNITS_PERCENTAGE); + percentagePositionWithPercentageLimitsVertical + .setFirstComponent(new Label("Min 10 % - 50 % position")); + percentagePositionWithPercentageLimitsVertical + .setSecondComponent(new Label("Max 80 %")); + percentagePositionWithPercentageLimitsVertical.setSplitPosition(50, + Sizeable.UNITS_PERCENTAGE); + verticalSplitsLayout + .addComponent(percentagePositionWithPercentageLimitsVertical); + + VerticalSplitPanel pixelPositionWithPercentageLimitsVertical = new VerticalSplitPanel(); + pixelPositionWithPercentageLimitsVertical.setMinimumSplitPosition(10, + Sizeable.UNITS_PERCENTAGE); + pixelPositionWithPercentageLimitsVertical.setMaxSplitPosition(80, + Sizeable.UNITS_PERCENTAGE); + pixelPositionWithPercentageLimitsVertical.setFirstComponent(new Label( + "Min 10 % - 400 px position")); + pixelPositionWithPercentageLimitsVertical.setSecondComponent(new Label( + "Max 80 %")); + pixelPositionWithPercentageLimitsVertical.setSplitPosition(400, + Sizeable.UNITS_PIXELS); + verticalSplitsLayout + .addComponent(pixelPositionWithPercentageLimitsVertical); + + VerticalSplitPanel pixelPositionWithPixelLimitsVertical = new VerticalSplitPanel(); + pixelPositionWithPixelLimitsVertical.setMinimumSplitPosition(100, + Sizeable.UNITS_PIXELS); + pixelPositionWithPixelLimitsVertical.setMaxSplitPosition(450, + Sizeable.UNITS_PIXELS); + pixelPositionWithPixelLimitsVertical.setFirstComponent(new Label( + "Min 100 px - 400 px position")); + pixelPositionWithPixelLimitsVertical.setSecondComponent(new Label( + "Max 450 px")); + pixelPositionWithPixelLimitsVertical.setSplitPosition(400, + Sizeable.UNITS_PIXELS); + verticalSplitsLayout.addComponent(pixelPositionWithPixelLimitsVertical); + + VerticalSplitPanel percentagePositionWithPixelLimitsVertical = new VerticalSplitPanel(); + percentagePositionWithPixelLimitsVertical.setMinimumSplitPosition(100, + Sizeable.UNITS_PIXELS); + percentagePositionWithPixelLimitsVertical.setMaxSplitPosition(450, + Sizeable.UNITS_PIXELS); + percentagePositionWithPixelLimitsVertical.setFirstComponent(new Label( + "Min 100 px - 30 % position")); + percentagePositionWithPixelLimitsVertical.setSecondComponent(new Label( + "Max 450 px")); + percentagePositionWithPixelLimitsVertical.setSplitPosition(30, + Sizeable.UNITS_PERCENTAGE); + verticalSplitsLayout + .addComponent(percentagePositionWithPixelLimitsVertical); + + VerticalSplitPanel percentagePositionWithPercentageLimitsVerticalReversed = new VerticalSplitPanel(); + percentagePositionWithPercentageLimitsVerticalReversed + .setMinimumSplitPosition(10, Sizeable.UNITS_PERCENTAGE); + percentagePositionWithPercentageLimitsVerticalReversed + .setMaxSplitPosition(80, Sizeable.UNITS_PERCENTAGE); + percentagePositionWithPercentageLimitsVerticalReversed + .setFirstComponent(new Label( + "Max 80 % - Reversed 50 % position")); + percentagePositionWithPercentageLimitsVerticalReversed + .setSecondComponent(new Label("Min 10 %")); + percentagePositionWithPercentageLimitsVerticalReversed + .setSplitPosition(50, Sizeable.UNITS_PERCENTAGE, true); + verticalSplitsLayout + .addComponent(percentagePositionWithPercentageLimitsVerticalReversed); + + VerticalSplitPanel pixelPositionWithPercentageLimitsVerticalReversed = new VerticalSplitPanel(); + pixelPositionWithPercentageLimitsVerticalReversed + .setMinimumSplitPosition(10, Sizeable.UNITS_PERCENTAGE); + pixelPositionWithPercentageLimitsVerticalReversed.setMaxSplitPosition( + 80, Sizeable.UNITS_PERCENTAGE); + pixelPositionWithPercentageLimitsVerticalReversed + .setFirstComponent(new Label( + "Max 80 % - Reversed 400 px position")); + pixelPositionWithPercentageLimitsVerticalReversed + .setSecondComponent(new Label("Min 10 %")); + pixelPositionWithPercentageLimitsVerticalReversed.setSplitPosition(400, + Sizeable.UNITS_PIXELS, true); + verticalSplitsLayout + .addComponent(pixelPositionWithPercentageLimitsVerticalReversed); + + VerticalSplitPanel pixelPositionWithPixelLimitsVerticalReversed = new VerticalSplitPanel(); + pixelPositionWithPixelLimitsVerticalReversed.setMinimumSplitPosition( + 100, Sizeable.UNITS_PIXELS); + pixelPositionWithPixelLimitsVerticalReversed.setMaxSplitPosition(400, + Sizeable.UNITS_PIXELS); + pixelPositionWithPixelLimitsVerticalReversed + .setFirstComponent(new Label( + "Max 400 px - Reversed 300 px position")); + pixelPositionWithPixelLimitsVerticalReversed + .setSecondComponent(new Label("Min 100 px")); + pixelPositionWithPixelLimitsVerticalReversed.setSplitPosition(300, + Sizeable.UNITS_PIXELS, true); + verticalSplitsLayout + .addComponent(pixelPositionWithPixelLimitsVerticalReversed); + + VerticalSplitPanel percentagePositionWithPixelLimitsVerticalReversed = new VerticalSplitPanel(); + percentagePositionWithPixelLimitsVerticalReversed + .setMinimumSplitPosition(100, Sizeable.UNITS_PIXELS); + percentagePositionWithPixelLimitsVerticalReversed.setMaxSplitPosition( + 400, Sizeable.UNITS_PIXELS); + percentagePositionWithPixelLimitsVerticalReversed + .setFirstComponent(new Label( + "Max 400 px - Reversed 30 % position")); + percentagePositionWithPixelLimitsVerticalReversed + .setSecondComponent(new Label("Min 100 px")); + percentagePositionWithPixelLimitsVerticalReversed.setSplitPosition(30, + Sizeable.UNITS_PERCENTAGE, true); + verticalSplitsLayout + .addComponent(percentagePositionWithPixelLimitsVerticalReversed); + + tabs.addComponent(verticalSplitsLayout); + verticalSplitsLayout.setSizeFull(); + + addComponent(tabs); + tabs.setHeight("550px"); + tabs.setWidth("600px"); + getLayout().setSizeFull(); + } + + @Override + protected String getDescription() { + return "SplitPanel could have setMaxSplitPosition and setMinSplitPosition methods as a way to set maximum and minimum limits for the split position. This is not a very critical feature but could be useful in some situations."; + } + + @Override + protected Integer getTicketNumber() { + return 1744; + } +} -- cgit v1.2.3 From f900ad7732663d06960caa10df4a53c51965be87 Mon Sep 17 00:00:00 2001 From: Jonatan Kronqvist Date: Wed, 30 May 2012 12:47:06 +0000 Subject: VFilterSelect implements SubPartAware #8878 svn changeset:23851/svn branch:6.8 --- .../terminal/gwt/client/ui/VFilterSelect.java | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VFilterSelect.java b/src/com/vaadin/terminal/gwt/client/ui/VFilterSelect.java index 4ecb42d920..8bb2cd5b5f 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VFilterSelect.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VFilterSelect.java @@ -62,7 +62,7 @@ import com.vaadin.terminal.gwt.client.VTooltip; @SuppressWarnings("deprecation") public class VFilterSelect extends Composite implements Paintable, Field, KeyDownHandler, KeyUpHandler, ClickHandler, FocusHandler, BlurHandler, - Focusable { + Focusable, SubPartAware { /** * Represents a suggestion in the suggestion popup box @@ -2008,4 +2008,24 @@ public class VFilterSelect extends Composite implements Paintable, Field, super.onDetach(); suggestionPopup.hide(); } + + @Override + public Element getSubPartElement(String subPart) { + if ("textbox".equals(subPart)) { + return this.tb.getElement(); + } else if ("button".equals(subPart)) { + return this.popupOpener.getElement(); + } + return null; + } + + @Override + public String getSubPartName(Element subElement) { + if (tb.getElement().isOrHasChild(subElement)) { + return "textbox"; + } else if (popupOpener.getElement().isOrHasChild(subElement)) { + return "button"; + } + return null; + } } -- cgit v1.2.3 From 56d0c039f888b59179bef114cb43ce32ea4da30e Mon Sep 17 00:00:00 2001 From: Automerge Date: Wed, 30 May 2012 13:08:20 +0000 Subject: [merge from 6.7] Small tweaks to #4120 based on review svn changeset:23852/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/Util.java | 2 +- src/com/vaadin/terminal/gwt/client/ui/ClickEventHandler.java | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/Util.java b/src/com/vaadin/terminal/gwt/client/Util.java index 1a9991bb80..4b25e6ec9e 100644 --- a/src/com/vaadin/terminal/gwt/client/Util.java +++ b/src/com/vaadin/terminal/gwt/client/Util.java @@ -1159,7 +1159,7 @@ public class Util { /** * Find the element corresponding to the coordinates in the passed mouse * event. Please note that this is not always the same as the target of the - * element e.g. if event capture is used. + * event e.g. if event capture is used. * * @param event * the mouse event to get coordinates from diff --git a/src/com/vaadin/terminal/gwt/client/ui/ClickEventHandler.java b/src/com/vaadin/terminal/gwt/client/ui/ClickEventHandler.java index 79ae5167fc..5617c94a27 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/ClickEventHandler.java +++ b/src/com/vaadin/terminal/gwt/client/ui/ClickEventHandler.java @@ -70,10 +70,6 @@ public abstract class ClickEventHandler implements DoubleClickHandler, if (lastMouseDownTarget != null && elementUnderMouse.cast() == lastMouseDownTarget) { mouseUpPreviewMatched = true; - } else { - System.out.println("Ignoring mouseup from " - + elementUnderMouse + " when mousedown was on " - + lastMouseDownTarget); } } } -- cgit v1.2.3 From 42dff513d801eecb011ad245bb6274e1396da66b Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Wed, 30 May 2012 14:02:35 +0000 Subject: #1744 Fixed a regression svn changeset:23854/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java b/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java index 4cb183917f..d998c3e5b4 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java @@ -398,7 +398,7 @@ public class VSplitPanel extends ComplexPanel implements Container, if (positionReversed) { posAsInt = offsetLength - posAsInt - getSplitterSize(); } - posAsFloat = ((float) posAsInt / (float) getOffsetWidth() * 100); + posAsFloat = ((float) posAsInt / (float) offsetLength * 100); } else { posAsFloat = Float.parseFloat(pos.substring(0, pos.length() - 1)); -- cgit v1.2.3 From 113228df952c43aecd1ec13b9d24f8cb6954ddd3 Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Wed, 30 May 2012 14:56:51 +0000 Subject: #1744 Should not check for reversed position here svn changeset:23855/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java | 4 ---- 1 file changed, 4 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java b/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java index d998c3e5b4..613ec47f57 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java @@ -394,10 +394,6 @@ public class VSplitPanel extends ComplexPanel implements Container, if (posAsInt + getSplitterSize() >= offsetLength) { posAsInt = offsetLength; } - // Reversed position - if (positionReversed) { - posAsInt = offsetLength - posAsInt - getSplitterSize(); - } posAsFloat = ((float) posAsInt / (float) offsetLength * 100); } else { -- cgit v1.2.3 From e978b997047573b1497a07f77f730195e3ea467a Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Wed, 30 May 2012 15:39:50 +0000 Subject: #8878 Cannot use @Override when implementing interface methods in Java 1.5 svn changeset:23856/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VFilterSelect.java | 2 -- 1 file changed, 2 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VFilterSelect.java b/src/com/vaadin/terminal/gwt/client/ui/VFilterSelect.java index 8bb2cd5b5f..ce254a7bc6 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VFilterSelect.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VFilterSelect.java @@ -2009,7 +2009,6 @@ public class VFilterSelect extends Composite implements Paintable, Field, suggestionPopup.hide(); } - @Override public Element getSubPartElement(String subPart) { if ("textbox".equals(subPart)) { return this.tb.getElement(); @@ -2019,7 +2018,6 @@ public class VFilterSelect extends Composite implements Paintable, Field, return null; } - @Override public String getSubPartName(Element subElement) { if (tb.getElement().isOrHasChild(subElement)) { return "textbox"; -- cgit v1.2.3 From 2e581760d056ad7038bfa5c04c6fd17c883a7d32 Mon Sep 17 00:00:00 2001 From: Tapio Aali Date: Thu, 31 May 2012 05:30:06 +0000 Subject: Optimized network usage of the split position limits of the SplitPanel (#8880). svn changeset:23857/svn branch:6.8 --- .../vaadin/terminal/gwt/client/ui/VSplitPanel.java | 22 ++++++++++++---------- src/com/vaadin/ui/AbstractSplitPanel.java | 8 ++++++-- 2 files changed, 18 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java b/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java index 613ec47f57..00d76e3a45 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VSplitPanel.java @@ -147,9 +147,9 @@ public class VSplitPanel extends ComplexPanel implements Container, /* The current position of the split handle in either percentages or pixels */ private String position; - private String maximumPosition; + private String maximumPosition = null; - private String minimumPosition; + private String minimumPosition = null; private final TouchScrollHandler touchScrollHandler; @@ -277,8 +277,10 @@ public class VSplitPanel extends ComplexPanel implements Container, position = uidl.getStringAttribute("position"); - minimumPosition = uidl.getStringAttribute("minimumPosition"); - maximumPosition = uidl.getStringAttribute("maximumPosition"); + minimumPosition = uidl.hasAttribute("minimumPosition") ? uidl + .getStringAttribute("minimumPosition") : null; + maximumPosition = uidl.hasAttribute("maximumPosition") ? uidl + .getStringAttribute("maximumPosition") : null; setSplitPosition(position); @@ -404,12 +406,12 @@ public class VSplitPanel extends ComplexPanel implements Container, private String checkSplitPositionLimits(String pos) { float positionAsFloat = convertToPixels(pos); - float maximumAsFloat = convertToPixels(maximumPosition); - float minimumAsFloat = convertToPixels(minimumPosition); - if (maximumAsFloat < positionAsFloat) { + if (maximumPosition != null + && convertToPixels(maximumPosition) < positionAsFloat) { pos = maximumPosition; - } else if (minimumAsFloat > positionAsFloat) { + } else if (minimumPosition != null + && convertToPixels(minimumPosition) > positionAsFloat) { pos = minimumPosition; } return pos; @@ -870,8 +872,8 @@ public class VSplitPanel extends ComplexPanel implements Container, if (position.indexOf("%") > 0) { pos = Float.valueOf(position.substring(0, position.length() - 1)); } else { - pos = Integer - .parseInt(position.substring(0, position.length() - 2)); + pos = Math.round(Float.parseFloat(position.substring(0, + position.length() - 2))); } client.updateVariable(id, "position", pos, immediate); } diff --git a/src/com/vaadin/ui/AbstractSplitPanel.java b/src/com/vaadin/ui/AbstractSplitPanel.java index ebdee17de2..586dbc81fe 100644 --- a/src/com/vaadin/ui/AbstractSplitPanel.java +++ b/src/com/vaadin/ui/AbstractSplitPanel.java @@ -222,8 +222,12 @@ public abstract class AbstractSplitPanel extends AbstractLayout { final String maximumPosition = posMax + UNIT_SYMBOLS[posMaxUnit]; target.addAttribute("position", position); - target.addAttribute("minimumPosition", minimumPosition); - target.addAttribute("maximumPosition", maximumPosition); + if (minimumPosition != "0%") { + target.addAttribute("minimumPosition", minimumPosition); + } + if (maximumPosition != "100%") { + target.addAttribute("maximumPosition", maximumPosition); + } if (isLocked()) { target.addAttribute("locked", true); -- cgit v1.2.3 From ee7526e0876fbe5e418331e3883ad5b9a1d7a828 Mon Sep 17 00:00:00 2001 From: Tapio Aali Date: Thu, 31 May 2012 08:34:34 +0000 Subject: Created a test for disabling and enabling max/min split position of SplitPanel. Also fixed some inconsistenties from the AbstractSplitPanel class. svn changeset:23859/svn branch:6.8 --- src/com/vaadin/ui/AbstractSplitPanel.java | 20 ++-- .../SplitPanelWithMinimumAndMaximum.html | 55 +++++++++++ .../SplitPanelWithMinimumAndMaximum.java | 102 ++++++++++++++++----- 3 files changed, 144 insertions(+), 33 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/ui/AbstractSplitPanel.java b/src/com/vaadin/ui/AbstractSplitPanel.java index 586dbc81fe..0588e44d40 100644 --- a/src/com/vaadin/ui/AbstractSplitPanel.java +++ b/src/com/vaadin/ui/AbstractSplitPanel.java @@ -41,11 +41,11 @@ public abstract class AbstractSplitPanel extends AbstractLayout { private boolean posReversed = false; - private int posMin = 0; + private float posMin = 0; private int posMinUnit = UNITS_PERCENTAGE; - private int posMax = 100; + private float posMax = 100; private int posMaxUnit = UNITS_PERCENTAGE; @@ -222,10 +222,10 @@ public abstract class AbstractSplitPanel extends AbstractLayout { final String maximumPosition = posMax + UNIT_SYMBOLS[posMaxUnit]; target.addAttribute("position", position); - if (minimumPosition != "0%") { + if (!minimumPosition.equals("0%")) { target.addAttribute("minimumPosition", minimumPosition); } - if (maximumPosition != "100%") { + if (!maximumPosition.equals("100%")) { target.addAttribute("maximumPosition", maximumPosition); } @@ -348,7 +348,7 @@ public abstract class AbstractSplitPanel extends AbstractLayout { * the unit (from {@link Sizeable}) in which the size is given. * Allowed units are UNITS_PERCENTAGE and UNITS_PIXELS */ - public void setMinimumSplitPosition(int pos, int unit) { + public void setMinSplitPosition(float pos, int unit) { setSplitPositionLimits(pos, unit, posMax, posMaxUnit); } @@ -358,7 +358,7 @@ public abstract class AbstractSplitPanel extends AbstractLayout { * * @return the minimum position of the splitter */ - public int getMinSplitPosition() { + public float getMinSplitPosition() { return posMin; } @@ -381,7 +381,7 @@ public abstract class AbstractSplitPanel extends AbstractLayout { * the unit (from {@link Sizeable}) in which the size is given. * Allowed units are UNITS_PERCENTAGE and UNITS_PIXELS */ - public void setMaxSplitPosition(int pos, int unit) { + public void setMaxSplitPosition(float pos, int unit) { setSplitPositionLimits(posMin, posMinUnit, pos, unit); } @@ -391,7 +391,7 @@ public abstract class AbstractSplitPanel extends AbstractLayout { * * @return the maximum position of the splitter */ - public int getMaxSplitPosition() { + public float getMaxSplitPosition() { return posMax; } @@ -419,8 +419,8 @@ public abstract class AbstractSplitPanel extends AbstractLayout { * the unit (from {@link Sizeable}) in which the maximum position * is given. */ - private void setSplitPositionLimits(int minPos, int minPosUnit, int maxPos, - int maxPosUnit) { + private void setSplitPositionLimits(float minPos, int minPosUnit, + float maxPos, int maxPosUnit) { if ((minPosUnit != UNITS_PERCENTAGE && minPosUnit != UNITS_PIXELS) || (maxPosUnit != UNITS_PERCENTAGE && maxPosUnit != UNITS_PIXELS)) { throw new IllegalArgumentException( diff --git a/tests/testbench/com/vaadin/tests/components/splitpanel/SplitPanelWithMinimumAndMaximum.html b/tests/testbench/com/vaadin/tests/components/splitpanel/SplitPanelWithMinimumAndMaximum.html index 3aefedeff3..70d619edac 100644 --- a/tests/testbench/com/vaadin/tests/components/splitpanel/SplitPanelWithMinimumAndMaximum.html +++ b/tests/testbench/com/vaadin/tests/components/splitpanel/SplitPanelWithMinimumAndMaximum.html @@ -201,6 +201,61 @@ vertical-splits-down + + mouseClick + vaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/domChild[0]/domChild[0]/domChild[0]/domChild[0]/domChild[2]/domChild[0]/domChild[0]/domChild[0] + 25,5 + + + dragAndDrop + vaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VVerticalLayout[1]/ChildComponentContainer[0]/VSplitPanelHorizontal[0]/domChild[0]/domChild[2]/domChild[0] + -239,0 + + + screenCapture + + togglable-to-min-with-limit-enabled + + + click + vaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VVerticalLayout[1]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[0]/VButton[0]/domChild[0]/domChild[0] + + + + dragAndDrop + vaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VVerticalLayout[1]/ChildComponentContainer[0]/VSplitPanelHorizontal[0]/domChild[0]/domChild[2]/domChild[0] + -60,0 + + + screenCapture + + togglable-to-min-with-limit-disabled + + + dragAndDrop + vaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VVerticalLayout[1]/ChildComponentContainer[0]/VSplitPanelHorizontal[0]/domChild[0]/domChild[2]/domChild[0] + 478,0 + + + screenCapture + + togglable-to-max-with-limit-enabled + + + click + vaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VVerticalLayout[1]/ChildComponentContainer[1]/VHorizontalLayout[0]/ChildComponentContainer[2]/VButton[0]/domChild[0]/domChild[0] + + + + dragAndDrop + vaadin=runcomvaadintestscomponentssplitpanelSplitPanelWithMinimumAndMaximum::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VTabsheet[0]/VTabsheetPanel[0]/VVerticalLayout[1]/ChildComponentContainer[0]/VSplitPanelHorizontal[0]/domChild[0]/domChild[2]/domChild[0] + 113,0 + + + screenCapture + + togglable-to-max-with-limit-disabled + diff --git a/tests/testbench/com/vaadin/tests/components/splitpanel/SplitPanelWithMinimumAndMaximum.java b/tests/testbench/com/vaadin/tests/components/splitpanel/SplitPanelWithMinimumAndMaximum.java index 9fa6fc18a3..f7c3dd84e4 100644 --- a/tests/testbench/com/vaadin/tests/components/splitpanel/SplitPanelWithMinimumAndMaximum.java +++ b/tests/testbench/com/vaadin/tests/components/splitpanel/SplitPanelWithMinimumAndMaximum.java @@ -2,6 +2,7 @@ package com.vaadin.tests.components.splitpanel; import com.vaadin.terminal.Sizeable; import com.vaadin.tests.components.TestBase; +import com.vaadin.ui.Button; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.HorizontalSplitPanel; import com.vaadin.ui.Label; @@ -19,8 +20,8 @@ public class SplitPanelWithMinimumAndMaximum extends TestBase { horizontalSplitsLayout.setCaption("Horizontal splits"); HorizontalSplitPanel percentagePositionWithPercentageLimitsHorizontal = new HorizontalSplitPanel(); - percentagePositionWithPercentageLimitsHorizontal - .setMinimumSplitPosition(10, Sizeable.UNITS_PERCENTAGE); + percentagePositionWithPercentageLimitsHorizontal.setMinSplitPosition( + 10, Sizeable.UNITS_PERCENTAGE); percentagePositionWithPercentageLimitsHorizontal.setMaxSplitPosition( 80, Sizeable.UNITS_PERCENTAGE); percentagePositionWithPercentageLimitsHorizontal @@ -33,7 +34,7 @@ public class SplitPanelWithMinimumAndMaximum extends TestBase { .addComponent(percentagePositionWithPercentageLimitsHorizontal); HorizontalSplitPanel pixelPositionWithPercentageLimitsHorizontal = new HorizontalSplitPanel(); - pixelPositionWithPercentageLimitsHorizontal.setMinimumSplitPosition(10, + pixelPositionWithPercentageLimitsHorizontal.setMinSplitPosition(10, Sizeable.UNITS_PERCENTAGE); pixelPositionWithPercentageLimitsHorizontal.setMaxSplitPosition(80, Sizeable.UNITS_PERCENTAGE); @@ -47,7 +48,7 @@ public class SplitPanelWithMinimumAndMaximum extends TestBase { .addComponent(pixelPositionWithPercentageLimitsHorizontal); HorizontalSplitPanel pixelPositionWithPixelLimitsHorizontal = new HorizontalSplitPanel(); - pixelPositionWithPixelLimitsHorizontal.setMinimumSplitPosition(100, + pixelPositionWithPixelLimitsHorizontal.setMinSplitPosition(100, Sizeable.UNITS_PIXELS); pixelPositionWithPixelLimitsHorizontal.setMaxSplitPosition(550, Sizeable.UNITS_PIXELS); @@ -61,8 +62,8 @@ public class SplitPanelWithMinimumAndMaximum extends TestBase { .addComponent(pixelPositionWithPixelLimitsHorizontal); HorizontalSplitPanel percentagePositionWithPixelLimitsHorizontal = new HorizontalSplitPanel(); - percentagePositionWithPixelLimitsHorizontal.setMinimumSplitPosition( - 100, Sizeable.UNITS_PIXELS); + percentagePositionWithPixelLimitsHorizontal.setMinSplitPosition(100, + Sizeable.UNITS_PIXELS); percentagePositionWithPixelLimitsHorizontal.setMaxSplitPosition(550, Sizeable.UNITS_PIXELS); percentagePositionWithPixelLimitsHorizontal @@ -76,7 +77,7 @@ public class SplitPanelWithMinimumAndMaximum extends TestBase { HorizontalSplitPanel percentagePositionWithPercentageLimitsHorizontalResersed = new HorizontalSplitPanel(); percentagePositionWithPercentageLimitsHorizontalResersed - .setMinimumSplitPosition(10, Sizeable.UNITS_PERCENTAGE); + .setMinSplitPosition(10, Sizeable.UNITS_PERCENTAGE); percentagePositionWithPercentageLimitsHorizontalResersed .setMaxSplitPosition(80, Sizeable.UNITS_PERCENTAGE); percentagePositionWithPercentageLimitsHorizontalResersed @@ -91,7 +92,7 @@ public class SplitPanelWithMinimumAndMaximum extends TestBase { HorizontalSplitPanel pixelPositionWithPercentageLimitsHorizontalResersed = new HorizontalSplitPanel(); pixelPositionWithPercentageLimitsHorizontalResersed - .setMinimumSplitPosition(10, Sizeable.UNITS_PERCENTAGE); + .setMinSplitPosition(10, Sizeable.UNITS_PERCENTAGE); pixelPositionWithPercentageLimitsHorizontalResersed .setMaxSplitPosition(80, Sizeable.UNITS_PERCENTAGE); pixelPositionWithPercentageLimitsHorizontalResersed @@ -105,8 +106,8 @@ public class SplitPanelWithMinimumAndMaximum extends TestBase { .addComponent(pixelPositionWithPercentageLimitsHorizontalResersed); HorizontalSplitPanel pixelPositionWithPixelLimitsHorizontalResersed = new HorizontalSplitPanel(); - pixelPositionWithPixelLimitsHorizontalResersed.setMinimumSplitPosition( - 100, Sizeable.UNITS_PIXELS); + pixelPositionWithPixelLimitsHorizontalResersed.setMinSplitPosition(100, + Sizeable.UNITS_PIXELS); pixelPositionWithPixelLimitsHorizontalResersed.setMaxSplitPosition(550, Sizeable.UNITS_PIXELS); pixelPositionWithPixelLimitsHorizontalResersed @@ -121,7 +122,7 @@ public class SplitPanelWithMinimumAndMaximum extends TestBase { HorizontalSplitPanel percentagePositionWithPixelLimitsHorizontalResersed = new HorizontalSplitPanel(); percentagePositionWithPixelLimitsHorizontalResersed - .setMinimumSplitPosition(100, Sizeable.UNITS_PIXELS); + .setMinSplitPosition(100, Sizeable.UNITS_PIXELS); percentagePositionWithPixelLimitsHorizontalResersed .setMaxSplitPosition(550, Sizeable.UNITS_PIXELS); percentagePositionWithPixelLimitsHorizontalResersed @@ -141,8 +142,8 @@ public class SplitPanelWithMinimumAndMaximum extends TestBase { verticalSplitsLayout.setCaption("Vertical splits"); VerticalSplitPanel percentagePositionWithPercentageLimitsVertical = new VerticalSplitPanel(); - percentagePositionWithPercentageLimitsVertical.setMinimumSplitPosition( - 10, Sizeable.UNITS_PERCENTAGE); + percentagePositionWithPercentageLimitsVertical.setMinSplitPosition(10, + Sizeable.UNITS_PERCENTAGE); percentagePositionWithPercentageLimitsVertical.setMaxSplitPosition(80, Sizeable.UNITS_PERCENTAGE); percentagePositionWithPercentageLimitsVertical @@ -155,7 +156,7 @@ public class SplitPanelWithMinimumAndMaximum extends TestBase { .addComponent(percentagePositionWithPercentageLimitsVertical); VerticalSplitPanel pixelPositionWithPercentageLimitsVertical = new VerticalSplitPanel(); - pixelPositionWithPercentageLimitsVertical.setMinimumSplitPosition(10, + pixelPositionWithPercentageLimitsVertical.setMinSplitPosition(10, Sizeable.UNITS_PERCENTAGE); pixelPositionWithPercentageLimitsVertical.setMaxSplitPosition(80, Sizeable.UNITS_PERCENTAGE); @@ -169,7 +170,7 @@ public class SplitPanelWithMinimumAndMaximum extends TestBase { .addComponent(pixelPositionWithPercentageLimitsVertical); VerticalSplitPanel pixelPositionWithPixelLimitsVertical = new VerticalSplitPanel(); - pixelPositionWithPixelLimitsVertical.setMinimumSplitPosition(100, + pixelPositionWithPixelLimitsVertical.setMinSplitPosition(100, Sizeable.UNITS_PIXELS); pixelPositionWithPixelLimitsVertical.setMaxSplitPosition(450, Sizeable.UNITS_PIXELS); @@ -182,7 +183,7 @@ public class SplitPanelWithMinimumAndMaximum extends TestBase { verticalSplitsLayout.addComponent(pixelPositionWithPixelLimitsVertical); VerticalSplitPanel percentagePositionWithPixelLimitsVertical = new VerticalSplitPanel(); - percentagePositionWithPixelLimitsVertical.setMinimumSplitPosition(100, + percentagePositionWithPixelLimitsVertical.setMinSplitPosition(100, Sizeable.UNITS_PIXELS); percentagePositionWithPixelLimitsVertical.setMaxSplitPosition(450, Sizeable.UNITS_PIXELS); @@ -197,7 +198,7 @@ public class SplitPanelWithMinimumAndMaximum extends TestBase { VerticalSplitPanel percentagePositionWithPercentageLimitsVerticalReversed = new VerticalSplitPanel(); percentagePositionWithPercentageLimitsVerticalReversed - .setMinimumSplitPosition(10, Sizeable.UNITS_PERCENTAGE); + .setMinSplitPosition(10, Sizeable.UNITS_PERCENTAGE); percentagePositionWithPercentageLimitsVerticalReversed .setMaxSplitPosition(80, Sizeable.UNITS_PERCENTAGE); percentagePositionWithPercentageLimitsVerticalReversed @@ -211,8 +212,8 @@ public class SplitPanelWithMinimumAndMaximum extends TestBase { .addComponent(percentagePositionWithPercentageLimitsVerticalReversed); VerticalSplitPanel pixelPositionWithPercentageLimitsVerticalReversed = new VerticalSplitPanel(); - pixelPositionWithPercentageLimitsVerticalReversed - .setMinimumSplitPosition(10, Sizeable.UNITS_PERCENTAGE); + pixelPositionWithPercentageLimitsVerticalReversed.setMinSplitPosition( + 10, Sizeable.UNITS_PERCENTAGE); pixelPositionWithPercentageLimitsVerticalReversed.setMaxSplitPosition( 80, Sizeable.UNITS_PERCENTAGE); pixelPositionWithPercentageLimitsVerticalReversed @@ -226,8 +227,8 @@ public class SplitPanelWithMinimumAndMaximum extends TestBase { .addComponent(pixelPositionWithPercentageLimitsVerticalReversed); VerticalSplitPanel pixelPositionWithPixelLimitsVerticalReversed = new VerticalSplitPanel(); - pixelPositionWithPixelLimitsVerticalReversed.setMinimumSplitPosition( - 100, Sizeable.UNITS_PIXELS); + pixelPositionWithPixelLimitsVerticalReversed.setMinSplitPosition(100, + Sizeable.UNITS_PIXELS); pixelPositionWithPixelLimitsVerticalReversed.setMaxSplitPosition(400, Sizeable.UNITS_PIXELS); pixelPositionWithPixelLimitsVerticalReversed @@ -241,8 +242,8 @@ public class SplitPanelWithMinimumAndMaximum extends TestBase { .addComponent(pixelPositionWithPixelLimitsVerticalReversed); VerticalSplitPanel percentagePositionWithPixelLimitsVerticalReversed = new VerticalSplitPanel(); - percentagePositionWithPixelLimitsVerticalReversed - .setMinimumSplitPosition(100, Sizeable.UNITS_PIXELS); + percentagePositionWithPixelLimitsVerticalReversed.setMinSplitPosition( + 100, Sizeable.UNITS_PIXELS); percentagePositionWithPixelLimitsVerticalReversed.setMaxSplitPosition( 400, Sizeable.UNITS_PIXELS); percentagePositionWithPixelLimitsVerticalReversed @@ -258,6 +259,61 @@ public class SplitPanelWithMinimumAndMaximum extends TestBase { tabs.addComponent(verticalSplitsLayout); verticalSplitsLayout.setSizeFull(); + final VerticalLayout togglableSplitPanelLayout = new VerticalLayout(); + togglableSplitPanelLayout.setCaption("Togglable minimum/maximum"); + + final HorizontalSplitPanel togglableSplitPanel = new HorizontalSplitPanel(); + togglableSplitPanel.setMinSplitPosition(10, Sizeable.UNITS_PERCENTAGE); + togglableSplitPanel.setMaxSplitPosition(80, Sizeable.UNITS_PERCENTAGE); + togglableSplitPanel.setFirstComponent(new Label( + "Min 10 % - 50 % position")); + togglableSplitPanel.setSecondComponent(new Label("Max 80 %")); + togglableSplitPanel.setSplitPosition(50, Sizeable.UNITS_PERCENTAGE); + togglableSplitPanel.setHeight("250px"); + togglableSplitPanelLayout.addComponent(togglableSplitPanel); + + final HorizontalLayout buttonLayout = new HorizontalLayout(); + + Button disableMinimum = new Button("Disable min limit", + new Button.ClickListener() { + public void buttonClick(Button.ClickEvent event) { + togglableSplitPanel.setMinSplitPosition(0, + Sizeable.UNITS_PERCENTAGE); + + } + }); + Button enableMinimum = new Button("Enable min limit", + new Button.ClickListener() { + public void buttonClick(Button.ClickEvent event) { + togglableSplitPanel.setMinSplitPosition(10, + Sizeable.UNITS_PERCENTAGE); + + } + }); + Button disableMaximum = new Button("Disable max limit", + new Button.ClickListener() { + public void buttonClick(Button.ClickEvent event) { + togglableSplitPanel.setMaxSplitPosition(100, + Sizeable.UNITS_PERCENTAGE); + + } + }); + Button enableMaximum = new Button("Enable max limit", + new Button.ClickListener() { + public void buttonClick(Button.ClickEvent event) { + togglableSplitPanel.setMaxSplitPosition(80, + Sizeable.UNITS_PERCENTAGE); + + } + }); + buttonLayout.addComponent(disableMinimum); + buttonLayout.addComponent(enableMinimum); + buttonLayout.addComponent(disableMaximum); + buttonLayout.addComponent(enableMaximum); + + togglableSplitPanelLayout.addComponent(buttonLayout); + tabs.addComponent(togglableSplitPanelLayout); + addComponent(tabs); tabs.setHeight("550px"); tabs.setWidth("600px"); -- cgit v1.2.3 From 35973ebe675b8914f35e672b95b07be988fdc9e5 Mon Sep 17 00:00:00 2001 From: Johannes Dahlström Date: Thu, 31 May 2012 09:15:27 +0000 Subject: #7495 Inverted the server-side API naming (eg. setColumnNoncollapsible -> setColumnCollapsible). No other change in semantics. svn changeset:23861/svn branch:6.8 --- src/com/vaadin/ui/Table.java | 27 ++++++++++++++-------- .../table/TableWithNoncollapsibleColumns.java | 6 ++--- 2 files changed, 20 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/ui/Table.java b/src/com/vaadin/ui/Table.java index 564aa24991..73fe9679d5 100644 --- a/src/com/vaadin/ui/Table.java +++ b/src/com/vaadin/ui/Table.java @@ -1187,31 +1187,38 @@ public class Table extends AbstractSelect implements Action.Container, } /** - * Sets whether a column can be collapsed or not. + * Sets whether the given column is collapsible. Note that collapsible + * columns can only be actually collapsed (via UI or with + * {@link #setColumnCollapsed(Object, boolean) setColumnCollapsed()}) if + * {@link #isColumnCollapsingAllowed()} is true. By default all columns are + * collapsible. * * @param propertyId * the propertyID identifying the column. * @param collapsible - * the desired collapsibleness + * true if the column should be collapsible, false otherwise. */ - public void setColumnNoncollapsible(Object propertyId, - boolean noncollapsible) { - if (noncollapsible) { + public void setColumnCollapsible(Object propertyId, boolean collapsible) { + if (collapsible) { + noncollapsibleColumns.remove(propertyId); + } else { noncollapsibleColumns.add(propertyId); collapsedColumns.remove(propertyId); - } else { - noncollapsibleColumns.remove(propertyId); } refreshRowCache(); } /** - * Checks if the column can be collapsed. + * Checks if the given column is collapsible. Note that even if this method + * returns true, the column can only be actually collapsed (via + * UI or with {@link #setColumnCollapsed(Object, boolean) + * setColumnCollapsed()}) if {@link #isColumnCollapsingAllowed()} is also + * true. * * @return true if the column can be collapsed; false otherwise. */ - public boolean isColumnNoncollapsible(Object propertyId) { - return noncollapsibleColumns.contains(propertyId); + public boolean isColumnCollapsible(Object propertyId) { + return !noncollapsibleColumns.contains(propertyId); } /** diff --git a/tests/testbench/com/vaadin/tests/components/table/TableWithNoncollapsibleColumns.java b/tests/testbench/com/vaadin/tests/components/table/TableWithNoncollapsibleColumns.java index 9e8c201452..404ba5d779 100644 --- a/tests/testbench/com/vaadin/tests/components/table/TableWithNoncollapsibleColumns.java +++ b/tests/testbench/com/vaadin/tests/components/table/TableWithNoncollapsibleColumns.java @@ -25,7 +25,7 @@ public class TableWithNoncollapsibleColumns extends TestBase { table.addContainerProperty("Column 3 - toggle collapsing", String.class, null); - table.setColumnNoncollapsible("Column 1 - noncollapsible", true); + table.setColumnCollapsible("Column 1 - noncollapsible", false); layout.addComponent(table); final Button button1 = new Button("Column 1: collapse/show", @@ -57,9 +57,9 @@ public class TableWithNoncollapsibleColumns extends TestBase { "Column 3: make noncollapsible/collapsible", new Button.ClickListener() { public void buttonClick(ClickEvent event) { - table.setColumnNoncollapsible( + table.setColumnCollapsible( "Column 3 - toggle collapsing", - !table.isColumnNoncollapsible("Column 3 - toggle collapsing")); + !table.isColumnCollapsible("Column 3 - toggle collapsing")); } }); -- cgit v1.2.3 From d1b21ae7f7a52542ee56a150a5495bf52b1d0b25 Mon Sep 17 00:00:00 2001 From: Automerge Date: Fri, 1 Jun 2012 09:07:29 +0000 Subject: [merge from 6.7] Made tooltips work for Slider (#8863) svn changeset:23873/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VSlider.java | 6 ++ .../tests/components/slider/SliderTooltip.html | 67 ++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 tests/testbench/com/vaadin/tests/components/slider/SliderTooltip.html (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VSlider.java b/src/com/vaadin/terminal/gwt/client/ui/VSlider.java index e605c6fe12..84a7284944 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VSlider.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VSlider.java @@ -20,6 +20,7 @@ import com.vaadin.terminal.gwt.client.Paintable; import com.vaadin.terminal.gwt.client.UIDL; import com.vaadin.terminal.gwt.client.Util; import com.vaadin.terminal.gwt.client.VConsole; +import com.vaadin.terminal.gwt.client.VTooltip; public class VSlider extends SimpleFocusablePanel implements Paintable, Field, ContainerResizedListener { @@ -113,6 +114,8 @@ public class VSlider extends SimpleFocusablePanel implements Paintable, Field, feedbackPopup.addStyleName(CLASSNAME + "-feedback"); feedbackPopup.setWidget(feedback); + + sinkEvents(VTooltip.TOOLTIP_EVENTS); } public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { @@ -369,6 +372,9 @@ public class VSlider extends SimpleFocusablePanel implements Paintable, Field, event.preventDefault(); // avoid simulated events event.stopPropagation(); } + if (client != null) { + client.handleTooltipEvent(event, this); + } } private void processMouseWheelEvent(final Event event) { diff --git a/tests/testbench/com/vaadin/tests/components/slider/SliderTooltip.html b/tests/testbench/com/vaadin/tests/components/slider/SliderTooltip.html new file mode 100644 index 0000000000..4e8296050f --- /dev/null +++ b/tests/testbench/com/vaadin/tests/components/slider/SliderTooltip.html @@ -0,0 +1,67 @@ + + + + + + +New Test + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
New Test
open/run/com.vaadin.tests.components.slider.SliderTest?debug&restartApplication
mouseClickvaadin=runcomvaadintestscomponentssliderSliderTest::PID_Smenu#item024,2
mouseClickvaadin=runcomvaadintestscomponentssliderSliderTest::Root/VOverlay[0]/VMenuBar[0]#item135,12
mouseClickvaadin=runcomvaadintestscomponentssliderSliderTest::Root/VOverlay[1]/VMenuBar[0]#item174,3
mouseClickvaadin=runcomvaadintestscomponentssliderSliderTest::Root/VOverlay[2]/VMenuBar[0]#item230,6
showTooltipvaadin=runcomvaadintestscomponentssliderSliderTest::PID_StestComponent/domChild[2]/domChild[0]0,0
waitForElementPresentvaadin=runcomvaadintestscomponentssliderSliderTest::Root/VTooltip[0]/FlowPanel[0]/domChild[1]
assertTextvaadin=runcomvaadintestscomponentssliderSliderTest::Root/VTooltip[0]/FlowPanel[0]/domChild[1]This is a semi-long text that might wrap.
mouseClickvaadin=runcomvaadintestscomponentssliderSliderTest::/VVerticalLayout[0]/ChildComponentContainer[0]/VLabel[0]40,16
waitForElementNotPresentvaadin=runcomvaadintestscomponentssliderSliderTest::Root/VTooltip[0]/FlowPanel[0]/domChild[1]
+ + -- cgit v1.2.3 From 17c14316649b191bedc5cf2c0cc58cd49ad74a03 Mon Sep 17 00:00:00 2001 From: Henri Sara Date: Tue, 5 Jun 2012 07:44:15 +0000 Subject: #8297 Do not use static logger instances svn changeset:23882/svn branch:6.8 --- src/com/vaadin/Application.java | 14 ++-- src/com/vaadin/data/util/MethodProperty.java | 9 +- .../vaadin/data/util/MethodPropertyDescriptor.java | 11 +-- .../data/util/sqlcontainer/SQLContainer.java | 98 ++++++++++++---------- .../connection/J2EEConnectionPool.java | 5 +- .../data/util/sqlcontainer/query/TableQuery.java | 29 +++---- src/com/vaadin/event/ListenerMethod.java | 16 ++-- .../vaadin/event/dd/acceptcriteria/SourceIs.java | 12 ++- .../gwt/server/AbstractApplicationPortlet.java | 33 ++++---- .../gwt/server/AbstractApplicationServlet.java | 67 ++++++++------- .../gwt/server/AbstractCommunicationManager.java | 39 +++++---- .../gwt/server/AbstractWebApplicationContext.java | 9 +- .../gwt/server/ApplicationRunnerServlet.java | 15 ++-- .../gwt/server/ComponentSizeValidator.java | 13 +-- .../terminal/gwt/server/DragAndDropService.java | 17 ++-- .../terminal/gwt/server/GAEApplicationServlet.java | 36 ++++---- .../terminal/gwt/server/JsonPaintTarget.java | 34 ++++---- .../gwt/server/PortletApplicationContext2.java | 17 ++-- .../gwt/widgetsetutils/ClassPathExplorer.java | 42 ++++++---- src/com/vaadin/tools/WidgetsetCompiler.java | 11 +-- src/com/vaadin/ui/Table.java | 69 +++++++++------ src/com/vaadin/ui/TreeTable.java | 11 +-- 22 files changed, 341 insertions(+), 266 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/Application.java b/src/com/vaadin/Application.java index 9fb4cfe7fa..a41cff36cb 100644 --- a/src/com/vaadin/Application.java +++ b/src/com/vaadin/Application.java @@ -92,9 +92,6 @@ import com.vaadin.ui.Window; public abstract class Application implements URIHandler, Terminal.ErrorListener, Serializable { - private final static Logger logger = Logger.getLogger(Application.class - .getName()); - /** * Id use for the next window that is opened. Access to this must be * synchronized. @@ -1191,8 +1188,9 @@ public abstract class Application implements URIHandler, final Throwable t = event.getThrowable(); if (t instanceof SocketException) { // Most likely client browser closed socket - logger.info("SocketException in CommunicationManager." - + " Most likely client (browser) closed socket."); + getLogger().info( + "SocketException in CommunicationManager." + + " Most likely client (browser) closed socket."); return; } @@ -1219,7 +1217,7 @@ public abstract class Application implements URIHandler, } // also print the error on console - logger.log(Level.SEVERE, "Terminal error:", t); + getLogger().log(Level.SEVERE, "Terminal error:", t); } /** @@ -1906,4 +1904,8 @@ public abstract class Application implements URIHandler, } } + + private static final Logger getLogger() { + return Logger.getLogger(Application.class.getName()); + } } \ No newline at end of file diff --git a/src/com/vaadin/data/util/MethodProperty.java b/src/com/vaadin/data/util/MethodProperty.java index ff258d3e0f..777ce68790 100644 --- a/src/com/vaadin/data/util/MethodProperty.java +++ b/src/com/vaadin/data/util/MethodProperty.java @@ -49,8 +49,6 @@ import com.vaadin.util.SerializerHelper; @SuppressWarnings("serial") public class MethodProperty extends AbstractProperty { - private static final Logger logger = Logger.getLogger(MethodProperty.class - .getName()); /** * The object that includes the property the MethodProperty is bound to. */ @@ -131,9 +129,9 @@ public class MethodProperty extends AbstractProperty { getMethod = null; } } catch (SecurityException e) { - logger.log(Level.SEVERE, "Internal deserialization error", e); + getLogger().log(Level.SEVERE, "Internal deserialization error", e); } catch (NoSuchMethodException e) { - logger.log(Level.SEVERE, "Internal deserialization error", e); + getLogger().log(Level.SEVERE, "Internal deserialization error", e); } }; @@ -805,4 +803,7 @@ public class MethodProperty extends AbstractProperty { super.fireValueChange(); } + private static final Logger getLogger() { + return Logger.getLogger(MethodProperty.class.getName()); + } } diff --git a/src/com/vaadin/data/util/MethodPropertyDescriptor.java b/src/com/vaadin/data/util/MethodPropertyDescriptor.java index f0c879766b..c4ec515917 100644 --- a/src/com/vaadin/data/util/MethodPropertyDescriptor.java +++ b/src/com/vaadin/data/util/MethodPropertyDescriptor.java @@ -23,9 +23,6 @@ import com.vaadin.util.SerializerHelper; public class MethodPropertyDescriptor implements VaadinPropertyDescriptor { - private static final Logger logger = Logger - .getLogger(MethodPropertyDescriptor.class.getName()); - private final String name; private Class propertyType; private transient Method readMethod; @@ -109,9 +106,9 @@ public class MethodPropertyDescriptor implements readMethod = null; } } catch (SecurityException e) { - logger.log(Level.SEVERE, "Internal deserialization error", e); + getLogger().log(Level.SEVERE, "Internal deserialization error", e); } catch (NoSuchMethodException e) { - logger.log(Level.SEVERE, "Internal deserialization error", e); + getLogger().log(Level.SEVERE, "Internal deserialization error", e); } }; @@ -128,4 +125,8 @@ public class MethodPropertyDescriptor implements writeMethod); } + private static final Logger getLogger() { + return Logger.getLogger(MethodPropertyDescriptor.class.getName()); + } + } \ No newline at end of file diff --git a/src/com/vaadin/data/util/sqlcontainer/SQLContainer.java b/src/com/vaadin/data/util/sqlcontainer/SQLContainer.java index 7eb67437e0..242a977614 100644 --- a/src/com/vaadin/data/util/sqlcontainer/SQLContainer.java +++ b/src/com/vaadin/data/util/sqlcontainer/SQLContainer.java @@ -36,9 +36,6 @@ import com.vaadin.data.util.sqlcontainer.query.generator.OracleGenerator; public class SQLContainer implements Container, Container.Filterable, Container.Indexed, Container.Sortable, Container.ItemSetChangeNotifier { - private static final Logger logger = Logger.getLogger(SQLContainer.class - .getName()); - /** Query delegate */ private QueryDelegate delegate; /** Auto commit mode, default = false */ @@ -162,15 +159,15 @@ public class SQLContainer implements Container, Container.Filterable, if (notificationsEnabled) { CacheFlushNotifier.notifyOfCacheFlush(this); } - logger.log(Level.FINER, "Row added to DB..."); + getLogger().log(Level.FINER, "Row added to DB..."); return itemId; } catch (SQLException e) { - logger.log(Level.WARNING, + getLogger().log(Level.WARNING, "Failed to add row to DB. Rolling back.", e); try { delegate.rollback(); } catch (SQLException ee) { - logger.log(Level.SEVERE, + getLogger().log(Level.SEVERE, "Failed to roll back row addition", e); } return null; @@ -215,7 +212,7 @@ public class SQLContainer implements Container, Container.Filterable, return delegate.containsRowWithKey(((RowId) itemId).getId()); } catch (Exception e) { /* Query failed, just return false. */ - logger.log(Level.WARNING, "containsId query failed", e); + getLogger().log(Level.WARNING, "containsId query failed", e); } } return false; @@ -325,17 +322,18 @@ public class SQLContainer implements Container, Container.Filterable, rs.close(); delegate.commit(); } catch (SQLException e) { - logger.log(Level.WARNING, "getItemIds() failed, rolling back.", e); + getLogger().log(Level.WARNING, + "getItemIds() failed, rolling back.", e); try { delegate.rollback(); } catch (SQLException e1) { - logger.log(Level.SEVERE, "Failed to roll back state", e1); + getLogger().log(Level.SEVERE, "Failed to roll back state", e1); } try { rs.getStatement().close(); rs.close(); } catch (SQLException e1) { - logger.log(Level.WARNING, "Closing session failed", e1); + getLogger().log(Level.WARNING, "Closing session failed", e1); } throw new RuntimeException("Failed to fetch item indexes.", e); } @@ -400,29 +398,29 @@ public class SQLContainer implements Container, Container.Filterable, CacheFlushNotifier.notifyOfCacheFlush(this); } if (success) { - logger.log(Level.FINER, "Row removed from DB..."); + getLogger().log(Level.FINER, "Row removed from DB..."); } return success; } catch (SQLException e) { - logger.log(Level.WARNING, "Failed to remove row, rolling back", - e); + getLogger().log(Level.WARNING, + "Failed to remove row, rolling back", e); try { delegate.rollback(); } catch (SQLException ee) { /* Nothing can be done here */ - logger.log(Level.SEVERE, "Failed to rollback row removal", - ee); + getLogger().log(Level.SEVERE, + "Failed to rollback row removal", ee); } return false; } catch (OptimisticLockException e) { - logger.log(Level.WARNING, "Failed to remove row, rolling back", - e); + getLogger().log(Level.WARNING, + "Failed to remove row, rolling back", e); try { delegate.rollback(); } catch (SQLException ee) { /* Nothing can be done here */ - logger.log(Level.SEVERE, "Failed to rollback row removal", - ee); + getLogger().log(Level.SEVERE, + "Failed to rollback row removal", ee); } throw e; } @@ -452,7 +450,7 @@ public class SQLContainer implements Container, Container.Filterable, } if (success) { delegate.commit(); - logger.log(Level.FINER, "All rows removed from DB..."); + getLogger().log(Level.FINER, "All rows removed from DB..."); refresh(); if (notificationsEnabled) { CacheFlushNotifier.notifyOfCacheFlush(this); @@ -462,23 +460,23 @@ public class SQLContainer implements Container, Container.Filterable, } return success; } catch (SQLException e) { - logger.log(Level.WARNING, + getLogger().log(Level.WARNING, "removeAllItems() failed, rolling back", e); try { delegate.rollback(); } catch (SQLException ee) { /* Nothing can be done here */ - logger.log(Level.SEVERE, "Failed to roll back", ee); + getLogger().log(Level.SEVERE, "Failed to roll back", ee); } return false; } catch (OptimisticLockException e) { - logger.log(Level.WARNING, + getLogger().log(Level.WARNING, "removeAllItems() failed, rolling back", e); try { delegate.rollback(); } catch (SQLException ee) { /* Nothing can be done here */ - logger.log(Level.SEVERE, "Failed to roll back", ee); + getLogger().log(Level.SEVERE, "Failed to roll back", ee); } throw e; } @@ -743,7 +741,7 @@ public class SQLContainer implements Container, Container.Filterable, try { asc = ascending[i]; } catch (Exception e) { - logger.log(Level.WARNING, "", e); + getLogger().log(Level.WARNING, "", e); } sorters.add(new OrderBy((String) propertyId[i], asc)); } @@ -872,7 +870,8 @@ public class SQLContainer implements Container, Container.Filterable, */ public void commit() throws UnsupportedOperationException, SQLException { try { - logger.log(Level.FINER, "Commiting changes through delegate..."); + getLogger().log(Level.FINER, + "Commiting changes through delegate..."); delegate.beginTransaction(); /* Perform buffered deletions */ for (RowItem item : removedItems.values()) { @@ -926,7 +925,7 @@ public class SQLContainer implements Container, Container.Filterable, * @throws SQLException */ public void rollback() throws UnsupportedOperationException, SQLException { - logger.log(Level.FINE, "Rolling back changes..."); + getLogger().log(Level.FINE, "Rolling back changes..."); removedItems.clear(); addedItems.clear(); modifiedItems.clear(); @@ -956,15 +955,15 @@ public class SQLContainer implements Container, Container.Filterable, if (notificationsEnabled) { CacheFlushNotifier.notifyOfCacheFlush(this); } - logger.log(Level.FINER, "Row updated to DB..."); + getLogger().log(Level.FINER, "Row updated to DB..."); } catch (SQLException e) { - logger.log(Level.WARNING, + getLogger().log(Level.WARNING, "itemChangeNotification failed, rolling back...", e); try { delegate.rollback(); } catch (SQLException ee) { /* Nothing can be done here */ - logger.log(Level.SEVERE, "Rollback failed", e); + getLogger().log(Level.SEVERE, "Rollback failed", e); } throw new RuntimeException(e); } @@ -1009,13 +1008,13 @@ public class SQLContainer implements Container, Container.Filterable, try { delegate.setFilters(filters); } catch (UnsupportedOperationException e) { - logger.log(Level.FINE, + getLogger().log(Level.FINE, "The query delegate doesn't support filtering", e); } try { delegate.setOrderBy(sorters); } catch (UnsupportedOperationException e) { - logger.log(Level.FINE, + getLogger().log(Level.FINE, "The query delegate doesn't support filtering", e); } int newSize = delegate.getCount(); @@ -1025,7 +1024,8 @@ public class SQLContainer implements Container, Container.Filterable, } sizeUpdated = new Date(); sizeDirty = false; - logger.log(Level.FINER, "Updated row count. New count is: " + size); + getLogger().log(Level.FINER, + "Updated row count. New count is: " + size); } catch (SQLException e) { throw new RuntimeException("Failed to update item set size.", e); } @@ -1069,7 +1069,7 @@ public class SQLContainer implements Container, Container.Filterable, try { type = Class.forName(rsmd.getColumnClassName(i)); } catch (Exception e) { - logger.log(Level.WARNING, "Class not found", e); + getLogger().log(Level.WARNING, "Class not found", e); /* On failure revert to Object and hope for the best. */ type = Object.class; } @@ -1095,14 +1095,14 @@ public class SQLContainer implements Container, Container.Filterable, rs.getStatement().close(); rs.close(); delegate.commit(); - logger.log(Level.FINER, "Property IDs fetched."); + getLogger().log(Level.FINER, "Property IDs fetched."); } catch (SQLException e) { - logger.log(Level.WARNING, + getLogger().log(Level.WARNING, "Failed to fetch property ids, rolling back", e); try { delegate.rollback(); } catch (SQLException e1) { - logger.log(Level.SEVERE, "Failed to roll back", e1); + getLogger().log(Level.SEVERE, "Failed to roll back", e1); } try { if (rs != null) { @@ -1112,7 +1112,7 @@ public class SQLContainer implements Container, Container.Filterable, rs.close(); } } catch (SQLException e1) { - logger.log(Level.WARNING, "Failed to close session", e1); + getLogger().log(Level.WARNING, "Failed to close session", e1); } throw e; } @@ -1135,7 +1135,7 @@ public class SQLContainer implements Container, Container.Filterable, } catch (UnsupportedOperationException e) { /* The query delegate doesn't support sorting. */ /* No need to do anything. */ - logger.log(Level.FINE, + getLogger().log(Level.FINE, "The query delegate doesn't support sorting", e); } delegate.beginTransaction(); @@ -1217,14 +1217,17 @@ public class SQLContainer implements Container, Container.Filterable, rs.getStatement().close(); rs.close(); delegate.commit(); - logger.log(Level.FINER, "Fetched " + pageLength * CACHE_RATIO - + " rows starting from " + currentOffset); + getLogger().log( + Level.FINER, + "Fetched " + pageLength * CACHE_RATIO + + " rows starting from " + currentOffset); } catch (SQLException e) { - logger.log(Level.WARNING, "Failed to fetch rows, rolling back", e); + getLogger().log(Level.WARNING, + "Failed to fetch rows, rolling back", e); try { delegate.rollback(); } catch (SQLException e1) { - logger.log(Level.SEVERE, "Failed to roll back", e1); + getLogger().log(Level.SEVERE, "Failed to roll back", e1); } try { if (rs != null) { @@ -1234,7 +1237,7 @@ public class SQLContainer implements Container, Container.Filterable, } } } catch (SQLException e1) { - logger.log(Level.WARNING, "Failed to close session", e1); + getLogger().log(Level.WARNING, "Failed to close session", e1); } throw new RuntimeException("Failed to fetch page.", e); } @@ -1577,7 +1580,8 @@ public class SQLContainer implements Container, Container.Filterable, r.getReferencedColumn())); return true; } catch (Exception e) { - logger.log(Level.WARNING, "Setting referenced item failed.", e); + getLogger() + .log(Level.WARNING, "Setting referenced item failed.", e); return false; } } @@ -1640,4 +1644,8 @@ public class SQLContainer implements Container, Container.Filterable, } } + private static final Logger getLogger() { + return Logger.getLogger(SQLContainer.class.getName()); + } + } \ No newline at end of file diff --git a/src/com/vaadin/data/util/sqlcontainer/connection/J2EEConnectionPool.java b/src/com/vaadin/data/util/sqlcontainer/connection/J2EEConnectionPool.java index 9e4bb772f5..40d0d0426f 100644 --- a/src/com/vaadin/data/util/sqlcontainer/connection/J2EEConnectionPool.java +++ b/src/com/vaadin/data/util/sqlcontainer/connection/J2EEConnectionPool.java @@ -13,8 +13,6 @@ import javax.naming.NamingException; import javax.sql.DataSource; public class J2EEConnectionPool implements JDBCConnectionPool { - private static final Logger logger = Logger - .getLogger(J2EEConnectionPool.class.getName()); private String dataSourceJndiName; @@ -58,7 +56,8 @@ public class J2EEConnectionPool implements JDBCConnectionPool { try { conn.close(); } catch (SQLException e) { - logger.log(Level.FINE, "Could not release SQL connection", e); + Logger.getLogger(J2EEConnectionPool.class.getName()).log( + Level.FINE, "Could not release SQL connection", e); } } } diff --git a/src/com/vaadin/data/util/sqlcontainer/query/TableQuery.java b/src/com/vaadin/data/util/sqlcontainer/query/TableQuery.java index 7e546309f6..22ca30cc32 100644 --- a/src/com/vaadin/data/util/sqlcontainer/query/TableQuery.java +++ b/src/com/vaadin/data/util/sqlcontainer/query/TableQuery.java @@ -38,9 +38,6 @@ import com.vaadin.data.util.sqlcontainer.query.generator.StatementHelper; public class TableQuery implements QueryDelegate, QueryDelegate.RowIdChangeNotifier { - private static final Logger logger = Logger.getLogger(TableQuery.class - .getName()); - /** Table name, primary key column name(s) and version column name */ private String tableName; private List primaryKeyColumns; @@ -115,7 +112,7 @@ public class TableQuery implements QueryDelegate, * @see com.vaadin.addon.sqlcontainer.query.QueryDelegate#getCount() */ public int getCount() throws SQLException { - logger.log(Level.FINE, "Fetching count..."); + getLogger().log(Level.FINE, "Fetching count..."); StatementHelper sh = sqlGenerator.generateSelectQuery(tableName, filters, null, 0, 0, "COUNT(*)"); boolean shouldCloseTransaction = false; @@ -228,7 +225,7 @@ public class TableQuery implements QueryDelegate, PreparedStatement pstmt = activeConnection.prepareStatement( sh.getQueryString(), primaryKeyColumns.toArray(new String[0])); sh.setParameterValuesToStatement(pstmt); - logger.log(Level.FINE, "DB -> " + sh.getQueryString()); + getLogger().log(Level.FINE, "DB -> " + sh.getQueryString()); int result = pstmt.executeUpdate(); if (result > 0) { /* @@ -293,7 +290,7 @@ public class TableQuery implements QueryDelegate, throw new IllegalStateException(); } - logger.log(Level.FINE, "DB -> begin transaction"); + getLogger().log(Level.FINE, "DB -> begin transaction"); activeConnection = connectionPool.reserveConnection(); activeConnection.setAutoCommit(false); transactionOpen = true; @@ -306,7 +303,7 @@ public class TableQuery implements QueryDelegate, */ public void commit() throws UnsupportedOperationException, SQLException { if (transactionOpen && activeConnection != null) { - logger.log(Level.FINE, "DB -> commit"); + getLogger().log(Level.FINE, "DB -> commit"); activeConnection.commit(); connectionPool.releaseConnection(activeConnection); } else { @@ -334,7 +331,7 @@ public class TableQuery implements QueryDelegate, */ public void rollback() throws UnsupportedOperationException, SQLException { if (transactionOpen && activeConnection != null) { - logger.log(Level.FINE, "DB -> rollback"); + getLogger().log(Level.FINE, "DB -> rollback"); activeConnection.rollback(); connectionPool.releaseConnection(activeConnection); } else { @@ -389,7 +386,7 @@ public class TableQuery implements QueryDelegate, } PreparedStatement pstmt = c.prepareStatement(sh.getQueryString()); sh.setParameterValuesToStatement(pstmt); - logger.log(Level.FINE, "DB -> " + sh.getQueryString()); + getLogger().log(Level.FINE, "DB -> " + sh.getQueryString()); return pstmt.executeQuery(); } @@ -415,7 +412,7 @@ public class TableQuery implements QueryDelegate, } pstmt = c.prepareStatement(sh.getQueryString()); sh.setParameterValuesToStatement(pstmt); - logger.log(Level.FINE, "DB -> " + sh.getQueryString()); + getLogger().log(Level.FINE, "DB -> " + sh.getQueryString()); int retval = pstmt.executeUpdate(); return retval; } finally { @@ -458,7 +455,7 @@ public class TableQuery implements QueryDelegate, pstmt = c.prepareStatement(sh.getQueryString(), primaryKeyColumns.toArray(new String[0])); sh.setParameterValuesToStatement(pstmt); - logger.log(Level.FINE, "DB -> " + sh.getQueryString()); + getLogger().log(Level.FINE, "DB -> " + sh.getQueryString()); int result = pstmt.executeUpdate(); genKeys = pstmt.getGeneratedKeys(); RowId newId = getNewRowId(row, genKeys); @@ -571,7 +568,7 @@ public class TableQuery implements QueryDelegate, } return new RowId(newRowId.toArray()); } catch (Exception e) { - logger.log(Level.FINE, + getLogger().log(Level.FINE, "Failed to fetch key values on insert: " + e.getMessage()); return null; } @@ -586,8 +583,8 @@ public class TableQuery implements QueryDelegate, */ public boolean removeRow(RowItem row) throws UnsupportedOperationException, SQLException { - logger.log(Level.FINE, "Removing row with id: " - + row.getId().getId()[0].toString()); + getLogger().log(Level.FINE, + "Removing row with id: " + row.getId().getId()[0].toString()); if (executeUpdate(sqlGenerator.generateDeleteQuery(getTableName(), primaryKeyColumns, versionColumn, row)) == 1) { return true; @@ -695,4 +692,8 @@ public class TableQuery implements QueryDelegate, rowIdChangeListeners.remove(listener); } } + + private static final Logger getLogger() { + return Logger.getLogger(TableQuery.class.getName()); + } } diff --git a/src/com/vaadin/event/ListenerMethod.java b/src/com/vaadin/event/ListenerMethod.java index 1f1305fa69..f7dc8a7f13 100644 --- a/src/com/vaadin/event/ListenerMethod.java +++ b/src/com/vaadin/event/ListenerMethod.java @@ -43,9 +43,6 @@ import java.util.logging.Logger; @SuppressWarnings("serial") public class ListenerMethod implements EventListener, Serializable { - private static final Logger logger = Logger.getLogger(ListenerMethod.class - .getName()); - /** * Type of the event that should trigger this listener. Also the subclasses * of this class are accepted to trigger the listener. @@ -84,9 +81,10 @@ public class ListenerMethod implements EventListener, Serializable { out.writeObject(name); out.writeObject(paramTypes); } catch (NotSerializableException e) { - logger.warning("Error in serialization of the application: Class " - + target.getClass().getName() - + " must implement serialization."); + getLogger().warning( + "Error in serialization of the application: Class " + + target.getClass().getName() + + " must implement serialization."); throw e; } @@ -103,7 +101,7 @@ public class ListenerMethod implements EventListener, Serializable { // inner classes method = findHighestMethod(target.getClass(), name, paramTypes); } catch (SecurityException e) { - logger.log(Level.SEVERE, "Internal deserialization error", e); + getLogger().log(Level.SEVERE, "Internal deserialization error", e); } }; @@ -658,4 +656,8 @@ public class ListenerMethod implements EventListener, Serializable { return target; } + private static final Logger getLogger() { + return Logger.getLogger(ListenerMethod.class.getName()); + } + } diff --git a/src/com/vaadin/event/dd/acceptcriteria/SourceIs.java b/src/com/vaadin/event/dd/acceptcriteria/SourceIs.java index 0d29e9a327..62bf64f76c 100644 --- a/src/com/vaadin/event/dd/acceptcriteria/SourceIs.java +++ b/src/com/vaadin/event/dd/acceptcriteria/SourceIs.java @@ -25,8 +25,6 @@ import com.vaadin.ui.Component; @SuppressWarnings("serial") @ClientCriterion(VDragSourceIs.class) public class SourceIs extends ClientSideCriterion { - private static final Logger logger = Logger.getLogger(SourceIs.class - .getName()); private Component[] components; @@ -43,11 +41,11 @@ public class SourceIs extends ClientSideCriterion { if (c.getApplication() != null) { target.addAttribute("component" + paintedComponents++, c); } else { - logger.log( - Level.WARNING, - "SourceIs component {0} at index {1} is not attached to the component hierachy and will thus be ignored", - new Object[] { c.getClass().getName(), - Integer.valueOf(i) }); + Logger.getLogger(SourceIs.class.getName()) + .log(Level.WARNING, + "SourceIs component {0} at index {1} is not attached to the component hierachy and will thus be ignored", + new Object[] { c.getClass().getName(), + Integer.valueOf(i) }); } } target.addAttribute("c", paintedComponents); diff --git a/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java b/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java index 0a8e9530f0..9f1bd4e9ee 100644 --- a/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java +++ b/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java @@ -68,9 +68,6 @@ import com.vaadin.ui.Window; public abstract class AbstractApplicationPortlet extends GenericPortlet implements Constants { - private static final Logger logger = Logger - .getLogger(AbstractApplicationPortlet.class.getName()); - /** * This portlet parameter is used to add styles to the main element. E.g * "height:500px" generates a style="height:500px" to the main element. @@ -123,7 +120,7 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet * Print an information/warning message about running with xsrf * protection disabled */ - logger.warning(WARNING_XSRF_PROTECTION_DISABLED); + getLogger().warning(WARNING_XSRF_PROTECTION_DISABLED); } } @@ -136,9 +133,10 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet private void checkWidgetsetVersion(PortletRequest request) { if (!AbstractApplicationServlet.VERSION.equals(getHTTPRequestParameter( request, "wsver"))) { - logger.warning(String.format(WIDGETSET_MISMATCH_INFO, - AbstractApplicationServlet.VERSION, - getHTTPRequestParameter(request, "wsver"))); + getLogger().warning( + String.format(WIDGETSET_MISMATCH_INFO, + AbstractApplicationServlet.VERSION, + getHTTPRequestParameter(request, "wsver"))); } } @@ -158,7 +156,7 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet if (!productionMode) { /* Print an information/warning message about running in debug mode */ // TODO Maybe we need a different message for portlets? - logger.warning(NOT_PRODUCTION_MODE_INFO); + getLogger().warning(NOT_PRODUCTION_MODE_INFO); } } @@ -473,11 +471,12 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet } catch (final SessionExpiredException e) { // TODO Figure out a better way to deal with // SessionExpiredExceptions - logger.finest("A user session has expired"); + getLogger().finest("A user session has expired"); } catch (final GeneralSecurityException e) { // TODO Figure out a better way to deal with // GeneralSecurityExceptions - logger.fine("General security exception, the security key was probably incorrect."); + getLogger() + .fine("General security exception, the security key was probably incorrect."); } catch (final Throwable e) { handleServiceException(request, response, application, e); } finally { @@ -508,7 +507,7 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet private void handleUnknownRequest(PortletRequest request, PortletResponse response) { - logger.warning("Unknown request type"); + getLogger().warning("Unknown request type"); } /** @@ -705,8 +704,9 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet os.write(buffer, 0, bytes); } } else { - logger.info("Requested resource [" + resourceID - + "] could not be found"); + getLogger().info( + "Requested resource [" + resourceID + + "] could not be found"); response.setProperty(ResourceResponse.HTTP_STATUS_CODE, Integer.toString(HttpServletResponse.SC_NOT_FOUND)); } @@ -963,7 +963,8 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet appClass += getApplicationClass().getSimpleName(); } catch (ClassNotFoundException e) { appClass += "unknown"; - logger.log(Level.SEVERE, "Could not find application class", e); + getLogger() + .log(Level.SEVERE, "Could not find application class", e); } String themeClass = "v-theme-" + themeName.replaceAll("[^a-zA-Z0-9]", ""); @@ -1633,4 +1634,8 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet return PortletApplicationContext2.getApplicationContext(portletSession); } + private static final Logger getLogger() { + return Logger.getLogger(AbstractApplicationPortlet.class.getName()); + } + } diff --git a/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java b/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java index 54ea4a94ed..c6d286ed03 100644 --- a/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java +++ b/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java @@ -67,9 +67,6 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements // TODO Move some (all?) of the constants to a separate interface (shared // with portlet) - private static final Logger logger = Logger - .getLogger(AbstractApplicationServlet.class.getName()); - /** * The version number of this release. For example "6.2.0". Always in the * format "major.minor.revision[.build]". The build part is optional. All of @@ -232,7 +229,7 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements * Print an information/warning message about running with xsrf * protection disabled */ - logger.warning(WARNING_XSRF_PROTECTION_DISABLED); + getLogger().warning(WARNING_XSRF_PROTECTION_DISABLED); } } @@ -244,8 +241,9 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements */ private void checkWidgetsetVersion(HttpServletRequest request) { if (!VERSION.equals(request.getParameter("wsver"))) { - logger.warning(String.format(WIDGETSET_MISMATCH_INFO, VERSION, - request.getParameter("wsver"))); + getLogger().warning( + String.format(WIDGETSET_MISMATCH_INFO, VERSION, + request.getParameter("wsver"))); } } @@ -264,7 +262,7 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements if (!productionMode) { /* Print an information/warning message about running in debug mode */ - logger.warning(NOT_PRODUCTION_MODE_INFO); + getLogger().warning(NOT_PRODUCTION_MODE_INFO); } } @@ -278,7 +276,7 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements } catch (NumberFormatException nfe) { // Default is 1h resourceCacheTime = 3600; - logger.warning(WARNING_RESOURCE_CACHING_TIME_NOT_NUMERIC); + getLogger().warning(WARNING_RESOURCE_CACHING_TIME_NOT_NUMERIC); } } @@ -857,8 +855,8 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements resultPath = url.getFile(); } catch (final Exception e) { // FIXME: Handle exception - logger.log(Level.INFO, "Could not find resource path " + path, - e); + getLogger().log(Level.INFO, + "Could not find resource path " + path, e); } } return resultPath; @@ -1273,10 +1271,11 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements if (resourceUrl == null) { // cannot serve requested file - logger.info("Requested resource [" - + filename - + "] not found from filesystem or through class loader." - + " Add widgetset and/or theme JAR to your classpath or add files to WebContent/VAADIN folder."); + getLogger() + .info("Requested resource [" + + filename + + "] not found from filesystem or through class loader." + + " Add widgetset and/or theme JAR to your classpath or add files to WebContent/VAADIN folder."); response.setStatus(HttpServletResponse.SC_NOT_FOUND); return; } @@ -1284,9 +1283,10 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements // security check: do not permit navigation out of the VAADIN // directory if (!isAllowedVAADINResourceUrl(request, resourceUrl)) { - logger.info("Requested resource [" - + filename - + "] not accessible in the VAADIN directory or access to it is forbidden."); + getLogger() + .info("Requested resource [" + + filename + + "] not accessible in the VAADIN directory or access to it is forbidden."); response.setStatus(HttpServletResponse.SC_FORBIDDEN); return; } @@ -1307,10 +1307,10 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements } } catch (Exception e) { // Failed to find out last modified timestamp. Continue without it. - logger.log( - Level.FINEST, - "Failed to find out last modified timestamp. Continuing without it.", - e); + getLogger() + .log(Level.FINEST, + "Failed to find out last modified timestamp. Continuing without it.", + e); } // Set type mime type if we can determine it based on the filename @@ -1375,12 +1375,14 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements // loader sees it. if (!resourceUrl.getPath().contains("!/VAADIN/")) { - logger.info("Blocked attempt to access a JAR entry not starting with /VAADIN/: " - + resourceUrl); + getLogger().info( + "Blocked attempt to access a JAR entry not starting with /VAADIN/: " + + resourceUrl); return false; } - logger.fine("Accepted access to a JAR entry using a class loader: " - + resourceUrl); + getLogger().fine( + "Accepted access to a JAR entry using a class loader: " + + resourceUrl); return true; } else { // Some servers such as GlassFish extract files from JARs (file:) @@ -1390,11 +1392,13 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements // "/../" if (!resourceUrl.getPath().contains("/VAADIN/") || resourceUrl.getPath().contains("/../")) { - logger.info("Blocked attempt to access file: " + resourceUrl); + getLogger().info( + "Blocked attempt to access file: " + resourceUrl); return false; } - logger.fine("Accepted access to a file using a class loader: " - + resourceUrl); + getLogger().fine( + "Accepted access to a file using a class loader: " + + resourceUrl); return true; } } @@ -1796,7 +1800,8 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements try { return getApplicationClass().getSimpleName(); } catch (ClassNotFoundException e) { - logger.log(Level.WARNING, "getApplicationCSSClassName failed", e); + getLogger().log(Level.WARNING, "getApplicationCSSClassName failed", + e); return "unknown"; } } @@ -2518,4 +2523,8 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements c > 96 && c < 123 // a-z ; } + + private static final Logger getLogger() { + return Logger.getLogger(AbstractApplicationServlet.class.getName()); + } } diff --git a/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java b/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java index cb570f88e7..b001b52918 100644 --- a/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java +++ b/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java @@ -91,9 +91,6 @@ public abstract class AbstractCommunicationManager implements private static final String DASHDASH = "--"; - private static final Logger logger = Logger - .getLogger(AbstractCommunicationManager.class.getName()); - /** * Generic interface of a (HTTP or Portlet) request to the application. * @@ -737,8 +734,9 @@ public abstract class AbstractCommunicationManager implements if (window == null) { // This should not happen, no windows exists but // application is still open. - logger.warning("Could not get window for application with request ID " - + request.getRequestID()); + getLogger().warning( + "Could not get window for application with request ID " + + request.getRequestID()); return; } } else { @@ -762,7 +760,7 @@ public abstract class AbstractCommunicationManager implements // FIXME: Handle exception // Not critical, but something is still wrong; print // stacktrace - logger.log(Level.WARNING, + getLogger().log(Level.WARNING, "getSystemMessages() failed - continuing", e2); } if (ci != null) { @@ -808,7 +806,7 @@ public abstract class AbstractCommunicationManager implements printHighlightedComponentHierarchy(sb, component); } - logger.info(sb.toString()); + getLogger().info(sb.toString()); } protected void printHighlightedComponentHierarchy(StringBuilder sb, @@ -1095,16 +1093,16 @@ public abstract class AbstractCommunicationManager implements (Class[]) null); ci = (Application.SystemMessages) m.invoke(null, (Object[]) null); } catch (NoSuchMethodException e) { - logger.log(Level.WARNING, + getLogger().log(Level.WARNING, "getSystemMessages() failed - continuing", e); } catch (IllegalArgumentException e) { - logger.log(Level.WARNING, + getLogger().log(Level.WARNING, "getSystemMessages() failed - continuing", e); } catch (IllegalAccessException e) { - logger.log(Level.WARNING, + getLogger().log(Level.WARNING, "getSystemMessages() failed - continuing", e); } catch (InvocationTargetException e) { - logger.log(Level.WARNING, + getLogger().log(Level.WARNING, "getSystemMessages() failed - continuing", e); } @@ -1144,8 +1142,8 @@ public abstract class AbstractCommunicationManager implements resource); } catch (final Exception e) { // FIXME: Handle exception - logger.log(Level.FINER, "Failed to get theme resource stream.", - e); + getLogger().log(Level.FINER, + "Failed to get theme resource stream.", e); } if (is != null) { @@ -1164,13 +1162,13 @@ public abstract class AbstractCommunicationManager implements r.close(); } catch (final java.io.IOException e) { // FIXME: Handle exception - logger.log(Level.INFO, "Resource transfer failed", e); + getLogger().log(Level.INFO, "Resource transfer failed", e); } outWriter.print("\"" + JsonPaintTarget.escapeJSON(layout.toString()) + "\""); } else { // FIXME: Handle exception - logger.severe("CustomLayout not found: " + resource); + getLogger().severe("CustomLayout not found: " + resource); } } outWriter.print("}"); @@ -1444,7 +1442,7 @@ public abstract class AbstractCommunicationManager implements + variable[VAR_PID]; success = false; } - logger.warning(msg); + getLogger().warning(msg); continue; } } @@ -1779,8 +1777,9 @@ public abstract class AbstractCommunicationManager implements DateFormat dateFormat = DateFormat.getDateTimeInstance( DateFormat.SHORT, DateFormat.SHORT, l); if (!(dateFormat instanceof SimpleDateFormat)) { - logger.warning("Unable to get default date pattern for locale " - + l.toString()); + getLogger().warning( + "Unable to get default date pattern for locale " + + l.toString()); dateFormat = new SimpleDateFormat(); } final String df = ((SimpleDateFormat) dateFormat).toPattern(); @@ -2483,4 +2482,8 @@ public abstract class AbstractCommunicationManager implements return b; } } + + private static final Logger getLogger() { + return Logger.getLogger(AbstractCommunicationManager.class.getName()); + } } diff --git a/src/com/vaadin/terminal/gwt/server/AbstractWebApplicationContext.java b/src/com/vaadin/terminal/gwt/server/AbstractWebApplicationContext.java index c0ae0afc26..bf4ea860a8 100644 --- a/src/com/vaadin/terminal/gwt/server/AbstractWebApplicationContext.java +++ b/src/com/vaadin/terminal/gwt/server/AbstractWebApplicationContext.java @@ -32,9 +32,6 @@ import com.vaadin.terminal.ApplicationResource; public abstract class AbstractWebApplicationContext implements ApplicationContext, HttpSessionBindingListener, Serializable { - private static final Logger logger = Logger - .getLogger(AbstractWebApplicationContext.class.getName()); - protected Collection listeners = Collections .synchronizedList(new LinkedList()); @@ -145,7 +142,7 @@ public abstract class AbstractWebApplicationContext implements // remove same application here. Possible if you got e.g. session // lifetime 1 min but socket write may take longer than 1 min. // FIXME: Handle exception - logger.log(Level.SEVERE, + getLogger().log(Level.SEVERE, "Could not remove application, leaking memory.", e); } } @@ -252,4 +249,8 @@ public abstract class AbstractWebApplicationContext implements return lastRequestTime; } + private Logger getLogger() { + return Logger.getLogger(AbstractWebApplicationContext.class.getName()); + } + } \ No newline at end of file diff --git a/src/com/vaadin/terminal/gwt/server/ApplicationRunnerServlet.java b/src/com/vaadin/terminal/gwt/server/ApplicationRunnerServlet.java index a9eaa1bb82..38b36a0cbf 100644 --- a/src/com/vaadin/terminal/gwt/server/ApplicationRunnerServlet.java +++ b/src/com/vaadin/terminal/gwt/server/ApplicationRunnerServlet.java @@ -19,9 +19,6 @@ import com.vaadin.Application; @SuppressWarnings("serial") public class ApplicationRunnerServlet extends AbstractApplicationServlet { - private static final Logger logger = Logger - .getLogger(ApplicationRunnerServlet.class.getName()); - /** * The name of the application class currently used. Only valid within one * request. @@ -176,10 +173,10 @@ public class ApplicationRunnerServlet extends AbstractApplicationServlet { // Ignore as this is expected for many packages } catch (Exception e2) { // TODO: handle exception - logger.log( - Level.FINE, - "Failed to find application class in the default package.", - e2); + getLogger() + .log(Level.FINE, + "Failed to find application class in the default package.", + e2); } if (appClass != null) { return appClass; @@ -215,4 +212,8 @@ public class ApplicationRunnerServlet extends AbstractApplicationServlet { return staticFilesPath; } + private Logger getLogger() { + return Logger.getLogger(ApplicationRunnerServlet.class.getName()); + } + } diff --git a/src/com/vaadin/terminal/gwt/server/ComponentSizeValidator.java b/src/com/vaadin/terminal/gwt/server/ComponentSizeValidator.java index 7889968e63..2c48d03b10 100644 --- a/src/com/vaadin/terminal/gwt/server/ComponentSizeValidator.java +++ b/src/com/vaadin/terminal/gwt/server/ComponentSizeValidator.java @@ -35,9 +35,6 @@ import com.vaadin.ui.Window; @SuppressWarnings({ "serial", "deprecation" }) public class ComponentSizeValidator implements Serializable { - private final static Logger logger = Logger - .getLogger(ComponentSizeValidator.class.getName()); - private final static int LAYERS_SHOWN = 4; /** @@ -135,7 +132,7 @@ public class ComponentSizeValidator implements Serializable { return parentCanDefineHeight(component); } catch (Exception e) { - logger.log(Level.FINER, + getLogger().log(Level.FINER, "An exception occurred while validating sizes.", e); return true; } @@ -155,7 +152,7 @@ public class ComponentSizeValidator implements Serializable { return parentCanDefineWidth(component); } catch (Exception e) { - logger.log(Level.FINER, + getLogger().log(Level.FINER, "An exception occurred while validating sizes.", e); return true; } @@ -675,11 +672,15 @@ public class ComponentSizeValidator implements Serializable { return; } catch (Exception e) { // TODO Auto-generated catch block - logger.log(Level.FINER, + getLogger().log(Level.FINER, "An exception occurred while validating sizes.", e); } } } + private static Logger getLogger() { + return Logger.getLogger(ComponentSizeValidator.class.getName()); + } + } diff --git a/src/com/vaadin/terminal/gwt/server/DragAndDropService.java b/src/com/vaadin/terminal/gwt/server/DragAndDropService.java index 3a923c1840..0653754c39 100644 --- a/src/com/vaadin/terminal/gwt/server/DragAndDropService.java +++ b/src/com/vaadin/terminal/gwt/server/DragAndDropService.java @@ -23,9 +23,6 @@ import com.vaadin.ui.Component; public class DragAndDropService implements VariableOwner { - private static final Logger logger = Logger - .getLogger(DragAndDropService.class.getName()); - private int lastVisitId; private boolean lastVisitAccepted = false; @@ -45,8 +42,9 @@ public class DragAndDropService implements VariableOwner { // Validate drop handler owner if (!(owner instanceof DropTarget)) { - logger.severe("DropHandler owner " + owner - + " must implement DropTarget"); + getLogger() + .severe("DropHandler owner " + owner + + " must implement DropTarget"); return; } // owner cannot be null here @@ -76,8 +74,9 @@ public class DragAndDropService implements VariableOwner { DropHandler dropHandler = (dropTarget).getDropHandler(); if (dropHandler == null) { // No dropHandler returned so no drop can be performed. - logger.fine("DropTarget.getDropHandler() returned null for owner: " - + dropTarget); + getLogger().fine( + "DropTarget.getDropHandler() returned null for owner: " + + dropTarget); return; } @@ -212,4 +211,8 @@ public class DragAndDropService implements VariableOwner { } return false; } + + private Logger getLogger() { + return Logger.getLogger(DragAndDropService.class.getName()); + } } diff --git a/src/com/vaadin/terminal/gwt/server/GAEApplicationServlet.java b/src/com/vaadin/terminal/gwt/server/GAEApplicationServlet.java index 485c98f036..a6032fa98d 100644 --- a/src/com/vaadin/terminal/gwt/server/GAEApplicationServlet.java +++ b/src/com/vaadin/terminal/gwt/server/GAEApplicationServlet.java @@ -94,9 +94,6 @@ import com.vaadin.service.ApplicationContext; */ public class GAEApplicationServlet extends ApplicationServlet { - private static final Logger logger = Logger - .getLogger(GAEApplicationServlet.class.getName()); - // memcache mutex is MUTEX_BASE + sessio id private static final String MUTEX_BASE = "_vmutex"; @@ -209,8 +206,9 @@ public class GAEApplicationServlet extends ApplicationServlet { try { Thread.sleep(RETRY_AFTER_MILLISECONDS); } catch (InterruptedException e) { - logger.finer("Thread.sleep() interrupted while waiting for lock. Trying again. " - + e); + getLogger().finer( + "Thread.sleep() interrupted while waiting for lock. Trying again. " + + e); } } @@ -252,16 +250,16 @@ public class GAEApplicationServlet extends ApplicationServlet { ds.put(entity); } catch (DeadlineExceededException e) { - logger.warning("DeadlineExceeded for " + session.getId()); + getLogger().warning("DeadlineExceeded for " + session.getId()); sendDeadlineExceededNotification(request, response); } catch (NotSerializableException e) { - logger.log(Level.SEVERE, "Not serializable!", e); + getLogger().log(Level.SEVERE, "Not serializable!", e); // TODO this notification is usually not shown - should we redirect // in some other way - can we? sendNotSerializableNotification(request, response); } catch (Exception e) { - logger.log(Level.WARNING, + getLogger().log(Level.WARNING, "An exception occurred while servicing request.", e); sendCriticalErrorNotification(request, response); @@ -308,12 +306,14 @@ public class GAEApplicationServlet extends ApplicationServlet { session.setAttribute(WebApplicationContext.class.getName(), applicationContext); } catch (IOException e) { - logger.log(Level.WARNING, + getLogger().log( + Level.WARNING, "Could not de-serialize ApplicationContext for " + session.getId() + " A new one will be created. ", e); } catch (ClassNotFoundException e) { - logger.log(Level.WARNING, + getLogger().log( + Level.WARNING, "Could not de-serialize ApplicationContext for " + session.getId() + " A new one will be created. ", e); @@ -368,8 +368,9 @@ public class GAEApplicationServlet extends ApplicationServlet { List entities = pq.asList(Builder .withLimit(CLEANUP_LIMIT)); if (entities != null) { - logger.info("Vaadin cleanup deleting " + entities.size() - + " expired Vaadin sessions."); + getLogger().info( + "Vaadin cleanup deleting " + entities.size() + + " expired Vaadin sessions."); List keys = new ArrayList(); for (Entity e : entities) { keys.add(e.getKey()); @@ -387,8 +388,9 @@ public class GAEApplicationServlet extends ApplicationServlet { List entities = pq.asList(Builder .withLimit(CLEANUP_LIMIT)); if (entities != null) { - logger.info("Vaadin cleanup deleting " + entities.size() - + " expired appengine sessions."); + getLogger().info( + "Vaadin cleanup deleting " + entities.size() + + " expired appengine sessions."); List keys = new ArrayList(); for (Entity e : entities) { keys.add(e.getKey()); @@ -397,7 +399,11 @@ public class GAEApplicationServlet extends ApplicationServlet { } } } catch (Exception e) { - logger.log(Level.WARNING, "Exception while cleaning.", e); + getLogger().log(Level.WARNING, "Exception while cleaning.", e); } } + + private static final Logger getLogger() { + return Logger.getLogger(GAEApplicationServlet.class.getName()); + } } diff --git a/src/com/vaadin/terminal/gwt/server/JsonPaintTarget.java b/src/com/vaadin/terminal/gwt/server/JsonPaintTarget.java index 97c5139296..9292ae2506 100644 --- a/src/com/vaadin/terminal/gwt/server/JsonPaintTarget.java +++ b/src/com/vaadin/terminal/gwt/server/JsonPaintTarget.java @@ -52,9 +52,6 @@ import com.vaadin.ui.CustomLayout; @SuppressWarnings("serial") public class JsonPaintTarget implements PaintTarget { - private static final Logger logger = Logger.getLogger(JsonPaintTarget.class - .getName()); - /* Document type declarations */ private final static String UIDL_ARG_NAME = "name"; @@ -700,11 +697,11 @@ public class JsonPaintTarget implements PaintTarget { if (!manager.hasPaintableId(paintable)) { if (paintable instanceof Component && ((Component) paintable).getApplication() == null) { - logger.log( - Level.WARNING, - "Painting reference to orphan " - + paintable.getClass().getName() - + ", the component will not be accessible on the client side."); + getLogger() + .log(Level.WARNING, + "Painting reference to orphan " + + paintable.getClass().getName() + + ", the component will not be accessible on the client side."); return "Orphan"; } if (identifiersCreatedDueRefPaint == null) { @@ -1029,10 +1026,12 @@ public class JsonPaintTarget implements PaintTarget { && Paintable.class.isAssignableFrom(superclass)) { class1 = (Class) superclass; } else { - logger.warning("No superclass of " - + paintable.getClass().getName() - + " has a @ClientWidget" - + " annotation. Component will not be mapped correctly on client side."); + getLogger() + .warning( + "No superclass of " + + paintable.getClass().getName() + + " has a @ClientWidget" + + " annotation. Component will not be mapped correctly on client side."); break; } } @@ -1136,18 +1135,19 @@ public class JsonPaintTarget implements PaintTarget { // TODO could optimize to quit at the end attribute } } catch (IOException e1) { - logger.log(Level.SEVERE, + getLogger().log(Level.SEVERE, "An error occurred while finding widget mapping.", e1); } finally { try { bufferedReader.close(); } catch (IOException e1) { - logger.log(Level.SEVERE, "Could not close reader.", e1); + getLogger() + .log(Level.SEVERE, "Could not close reader.", e1); } } } catch (Throwable t) { - logger.log(Level.SEVERE, + getLogger().log(Level.SEVERE, "An error occurred while finding widget mapping.", t); } @@ -1176,4 +1176,8 @@ public class JsonPaintTarget implements PaintTarget { return !cacheEnabled; } + private static final Logger getLogger() { + return Logger.getLogger(JsonPaintTarget.class.getName()); + } + } diff --git a/src/com/vaadin/terminal/gwt/server/PortletApplicationContext2.java b/src/com/vaadin/terminal/gwt/server/PortletApplicationContext2.java index dce1a1a78c..1875103652 100644 --- a/src/com/vaadin/terminal/gwt/server/PortletApplicationContext2.java +++ b/src/com/vaadin/terminal/gwt/server/PortletApplicationContext2.java @@ -49,9 +49,6 @@ import com.vaadin.ui.Window; @SuppressWarnings("serial") public class PortletApplicationContext2 extends AbstractWebApplicationContext { - private static final Logger logger = Logger - .getLogger(PortletApplicationContext2.class.getName()); - protected Map> portletListeners = new HashMap>(); protected transient PortletSession session; @@ -77,11 +74,11 @@ public class PortletApplicationContext2 extends AbstractWebApplicationContext { return new File(url.getFile()); } catch (final Exception e) { // FIXME: Handle exception - logger.log( - Level.INFO, - "Cannot access base directory, possible security issue " - + "with Application Server or Servlet Container", - e); + getLogger() + .log(Level.INFO, + "Cannot access base directory, possible security issue " + + "with Application Server or Servlet Container", + e); } } return null; @@ -415,4 +412,8 @@ public class PortletApplicationContext2 extends AbstractWebApplicationContext { "Portlet mode can only be changed from a portlet request"); } } + + private Logger getLogger() { + return Logger.getLogger(PortletApplicationContext2.class.getName()); + } } diff --git a/src/com/vaadin/terminal/gwt/widgetsetutils/ClassPathExplorer.java b/src/com/vaadin/terminal/gwt/widgetsetutils/ClassPathExplorer.java index 2e4ce39513..8d7e370aaa 100644 --- a/src/com/vaadin/terminal/gwt/widgetsetutils/ClassPathExplorer.java +++ b/src/com/vaadin/terminal/gwt/widgetsetutils/ClassPathExplorer.java @@ -54,9 +54,6 @@ import com.vaadin.ui.ClientWidget; */ public class ClassPathExplorer { - private static Logger logger = Logger.getLogger(ClassPathExplorer.class - .getName()); - private static final String VAADIN_ADDON_VERSION_ATTRIBUTE = "Vaadin-Package-Version"; /** @@ -103,6 +100,7 @@ public class ClassPathExplorer { * @return a collection of {@link Paintable} classes */ public static Collection> getPaintablesHavingWidgetAnnotation() { + final Logger logger = getLogger(); logger.info("Searching for paintables.."); long start = System.currentTimeMillis(); Collection> paintables = new HashSet>(); @@ -157,6 +155,7 @@ public class ClassPathExplorer { sb.append(widgetsets.get(ws)); sb.append("\n"); } + final Logger logger = getLogger(); logger.info(sb.toString()); logger.info("Search took " + (end - start) + "ms"); return widgetsets; @@ -217,7 +216,7 @@ public class ClassPathExplorer { } catch (MalformedURLException e) { // should never happen as based on an existing URL, // only changing end of file name/path part - logger.log(Level.SEVERE, + getLogger().log(Level.SEVERE, "Error locating the widgetset " + classname, e); } } @@ -253,7 +252,7 @@ public class ClassPathExplorer { } } } catch (IOException e) { - logger.log(Level.WARNING, "Error parsing jar file", e); + getLogger().log(Level.WARNING, "Error parsing jar file", e); } } @@ -281,7 +280,7 @@ public class ClassPathExplorer { classpath = classpath.substring(0, classpath.length() - 1); } - logger.fine("Classpath: " + classpath); + getLogger().fine("Classpath: " + classpath); String[] split = classpath.split(pathSep); for (int i = 0; i < split.length; i++) { @@ -315,6 +314,7 @@ public class ClassPathExplorer { include(null, file, locations); } long end = System.currentTimeMillis(); + Logger logger = getLogger(); if (logger.isLoggable(Level.FINE)) { logger.fine("getClassPathLocations took " + (end - start) + "ms"); } @@ -355,7 +355,7 @@ public class ClassPathExplorer { url = new URL("jar:" + url.toExternalForm() + "!/"); JarURLConnection conn = (JarURLConnection) url .openConnection(); - logger.fine(url.toString()); + getLogger().fine(url.toString()); JarFile jarFile = conn.getJarFile(); Manifest manifest = jarFile.getManifest(); if (manifest != null) { @@ -366,9 +366,11 @@ public class ClassPathExplorer { } } } catch (MalformedURLException e) { - logger.log(Level.FINEST, "Failed to inspect JAR file", e); + getLogger().log(Level.FINEST, "Failed to inspect JAR file", + e); } catch (IOException e) { - logger.log(Level.FINEST, "Failed to inspect JAR file", e); + getLogger().log(Level.FINEST, "Failed to inspect JAR file", + e); } return false; @@ -515,7 +517,7 @@ public class ClassPathExplorer { } } } catch (IOException e) { - logger.warning(e.toString()); + getLogger().warning(e.toString()); } } @@ -594,7 +596,8 @@ public class ClassPathExplorer { // Must be done here after stderr and stdout have been reset. if (errorToShow != null && logLevel != null) { - logger.log(logLevel, + getLogger().log( + logLevel, "Failed to load class " + fullclassName + ". " + errorToShow.getClass().getName() + ": " + errorToShow.getMessage()); @@ -613,6 +616,9 @@ public class ClassPathExplorer { * @return URL */ public static URL getDefaultSourceDirectory() { + + final Logger logger = getLogger(); + if (logger.isLoggable(Level.FINE)) { logger.fine("classpathLocations values:"); ArrayList locations = new ArrayList( @@ -669,20 +675,24 @@ public class ClassPathExplorer { public static void main(String[] args) { Collection> paintables = ClassPathExplorer .getPaintablesHavingWidgetAnnotation(); - logger.info("Found annotated paintables:"); + getLogger().info("Found annotated paintables:"); for (Class cls : paintables) { - logger.info(cls.getCanonicalName()); + getLogger().info(cls.getCanonicalName()); } - logger.info(""); - logger.info("Searching available widgetsets..."); + getLogger().info(""); + getLogger().info("Searching available widgetsets..."); Map availableWidgetSets = ClassPathExplorer .getAvailableWidgetSets(); for (String string : availableWidgetSets.keySet()) { - logger.info(string + " in " + availableWidgetSets.get(string)); + getLogger().info(string + " in " + availableWidgetSets.get(string)); } } + private static final Logger getLogger() { + return Logger.getLogger(ClassPathExplorer.class.getName()); + } + } diff --git a/src/com/vaadin/tools/WidgetsetCompiler.java b/src/com/vaadin/tools/WidgetsetCompiler.java index 323fb17e32..9bb76022ae 100644 --- a/src/com/vaadin/tools/WidgetsetCompiler.java +++ b/src/com/vaadin/tools/WidgetsetCompiler.java @@ -33,9 +33,6 @@ import com.vaadin.terminal.gwt.widgetsetutils.WidgetSetBuilder; */ public class WidgetsetCompiler { - private static final Logger logger = Logger - .getLogger(WidgetsetCompiler.class.getName()); - /** * @param args * same arguments as for com.google.gwt.dev.Compiler @@ -72,7 +69,7 @@ public class WidgetsetCompiler { String[].class); method.invoke(null, new Object[] { args }); } catch (Throwable thr) { - logger.log(Level.SEVERE, + getLogger().log(Level.SEVERE, "Widgetset compilation failed", thr); } } @@ -82,7 +79,11 @@ public class WidgetsetCompiler { runThread.join(); System.out.println("Widgetset compilation finished"); } catch (Throwable thr) { - logger.log(Level.SEVERE, "Widgetset compilation failed", thr); + getLogger().log(Level.SEVERE, "Widgetset compilation failed", thr); } } + + private static final Logger getLogger() { + return Logger.getLogger(WidgetsetCompiler.class.getName()); + } } diff --git a/src/com/vaadin/ui/Table.java b/src/com/vaadin/ui/Table.java index 73fe9679d5..55f3f27507 100644 --- a/src/com/vaadin/ui/Table.java +++ b/src/com/vaadin/ui/Table.java @@ -76,8 +76,7 @@ public class Table extends AbstractSelect implements Action.Container, Container.Ordered, Container.Sortable, ItemClickSource, ItemClickNotifier, DragSource, DropTarget { - private static final Logger logger = Logger - .getLogger(Table.class.getName()); + private transient Logger logger = null; /** * Modes that Table support as drag sourse. @@ -1646,8 +1645,9 @@ public class Table extends AbstractSelect implements Action.Container, * @return */ private Object[][] getVisibleCellsInsertIntoCache(int firstIndex, int rows) { - logger.finest("Insert " + rows + " rows at index " + firstIndex - + " to existing page buffer requested"); + getLogger().finest( + "Insert " + rows + " rows at index " + firstIndex + + " to existing page buffer requested"); // Page buffer must not become larger than pageLength*cacheRate before // or after the current page @@ -1750,11 +1750,14 @@ public class Table extends AbstractSelect implements Action.Container, } } pageBuffer = newPageBuffer; - logger.finest("Page Buffer now contains " - + pageBuffer[CELL_ITEMID].length + " rows (" - + pageBufferFirstIndex + "-" - + (pageBufferFirstIndex + pageBuffer[CELL_ITEMID].length - 1) - + ")"); + getLogger().finest( + "Page Buffer now contains " + + pageBuffer[CELL_ITEMID].length + + " rows (" + + pageBufferFirstIndex + + "-" + + (pageBufferFirstIndex + + pageBuffer[CELL_ITEMID].length - 1) + ")"); return cells; } @@ -1771,8 +1774,9 @@ public class Table extends AbstractSelect implements Action.Container, */ private Object[][] getVisibleCellsNoCache(int firstIndex, int rows, boolean replaceListeners) { - logger.finest("Render visible cells for rows " + firstIndex + "-" - + (firstIndex + rows - 1)); + getLogger().finest( + "Render visible cells for rows " + firstIndex + "-" + + (firstIndex + rows - 1)); final Object[] colids = getVisibleColumns(); final int cols = colids.length; @@ -1954,8 +1958,9 @@ public class Table extends AbstractSelect implements Action.Container, } protected void registerComponent(Component component) { - logger.finest("Registered " + component.getClass().getSimpleName() - + ": " + component.getCaption()); + getLogger().finest( + "Registered " + component.getClass().getSimpleName() + ": " + + component.getCaption()); if (component.getParent() != this) { component.setParent(this); } @@ -1986,8 +1991,9 @@ public class Table extends AbstractSelect implements Action.Container, * @param count */ private void unregisterComponentsAndPropertiesInRows(int firstIx, int count) { - logger.finest("Unregistering components in rows " + firstIx + "-" - + (firstIx + count - 1)); + getLogger().finest( + "Unregistering components in rows " + firstIx + "-" + + (firstIx + count - 1)); Object[] colids = getVisibleColumns(); if (pageBuffer != null && pageBuffer[CELL_ITEMID].length > 0) { int bufSize = pageBuffer[CELL_ITEMID].length; @@ -2067,8 +2073,9 @@ public class Table extends AbstractSelect implements Action.Container, * a set of components that should be unregistered. */ protected void unregisterComponent(Component component) { - logger.finest("Unregistered " + component.getClass().getSimpleName() - + ": " + component.getCaption()); + getLogger().finest( + "Unregistered " + component.getClass().getSimpleName() + ": " + + component.getCaption()); component.setParent(null); /* * Also remove property data sources to unregister listeners keeping the @@ -2438,7 +2445,7 @@ public class Table extends AbstractSelect implements Action.Container, .get("lastToBeRendered")).intValue(); } catch (Exception e) { // FIXME: Handle exception - logger.log(Level.FINER, + getLogger().log(Level.FINER, "Could not parse the first and/or last rows.", e); } @@ -2458,8 +2465,9 @@ public class Table extends AbstractSelect implements Action.Container, } } } - logger.finest("Client wants rows " + reqFirstRowToPaint + "-" - + (reqFirstRowToPaint + reqRowsToPaint - 1)); + getLogger().finest( + "Client wants rows " + reqFirstRowToPaint + "-" + + (reqFirstRowToPaint + reqRowsToPaint - 1)); clientNeedsContentRefresh = true; } @@ -2505,7 +2513,7 @@ public class Table extends AbstractSelect implements Action.Container, } } catch (final Exception e) { // FIXME: Handle exception - logger.log(Level.FINER, + getLogger().log(Level.FINER, "Could not determine column collapsing state", e); } clientNeedsContentRefresh = true; @@ -2527,7 +2535,7 @@ public class Table extends AbstractSelect implements Action.Container, } } catch (final Exception e) { // FIXME: Handle exception - logger.log(Level.FINER, + getLogger().log(Level.FINER, "Could not determine column reordering state", e); } clientNeedsContentRefresh = true; @@ -2817,8 +2825,9 @@ public class Table extends AbstractSelect implements Action.Container, target.startTag("prows"); if (!shouldHideAddedRows()) { - logger.finest("Paint rows for add. Index: " + firstIx + ", count: " - + count + "."); + getLogger().finest( + "Paint rows for add. Index: " + firstIx + ", count: " + + count + "."); // Partial row additions bypass the normal caching mechanism. Object[][] cells = getVisibleCellsInsertIntoCache(firstIx, count); @@ -2841,8 +2850,9 @@ public class Table extends AbstractSelect implements Action.Container, indexInRowbuffer, itemId); } } else { - logger.finest("Paint rows for remove. Index: " + firstIx - + ", count: " + count + "."); + getLogger().finest( + "Paint rows for remove. Index: " + firstIx + ", count: " + + count + "."); removeRowsFromCacheAndFillBottom(firstIx, count); target.addAttribute("hide", true); } @@ -5217,4 +5227,11 @@ public class Table extends AbstractSelect implements Action.Container, } super.setVisible(visible); } + + private final Logger getLogger() { + if (logger == null) { + logger = Logger.getLogger(Table.class.getName()); + } + return logger; + } } diff --git a/src/com/vaadin/ui/TreeTable.java b/src/com/vaadin/ui/TreeTable.java index 19ca27133b..ffdb25b041 100644 --- a/src/com/vaadin/ui/TreeTable.java +++ b/src/com/vaadin/ui/TreeTable.java @@ -50,9 +50,6 @@ import com.vaadin.ui.treetable.HierarchicalContainerOrderedWrapper; @ClientWidget(VTreeTable.class) public class TreeTable extends Table implements Hierarchical { - private static final Logger logger = Logger.getLogger(TreeTable.class - .getName()); - private interface ContainerStrategy extends Serializable { public int size(); @@ -223,9 +220,9 @@ public class TreeTable extends Table implements Hierarchical { boolean removed = openItems.remove(itemId); if (!removed) { openItems.add(itemId); - logger.finest("Item " + itemId + " is now expanded"); + getLogger().finest("Item " + itemId + " is now expanded"); } else { - logger.finest("Item " + itemId + " is now collapsed"); + getLogger().finest("Item " + itemId + " is now collapsed"); } clearPreorderCache(); } @@ -787,4 +784,8 @@ public class TreeTable extends Table implements Hierarchical { requestRepaint(); } + private static final Logger getLogger() { + return Logger.getLogger(TreeTable.class.getName()); + } + } -- cgit v1.2.3 From f8cb0b8eefb3e3f173b4168782324c9e8887d8a7 Mon Sep 17 00:00:00 2001 From: Leif Åstrand Date: Wed, 6 Jun 2012 07:42:00 +0000 Subject: Show better error message when variable change decoding fails (#8914) svn changeset:23888/svn branch:6.8 --- .../gwt/server/AbstractCommunicationManager.java | 27 ++++++++++++++-------- 1 file changed, 17 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java b/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java index b001b52918..fe848e50f2 100644 --- a/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java +++ b/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java @@ -1369,15 +1369,11 @@ public abstract class AbstractCommunicationManager implements // we have more than one value changes in row for // one variable owner, collect them in HashMap m = new HashMap(); - m.put(variable[VAR_NAME], - convertVariableValue(variable[VAR_TYPE].charAt(0), - variable[VAR_VALUE])); + m.put(variable[VAR_NAME], decodeVariable(variable)); } else { // use optimized single value map - m = Collections.singletonMap( - variable[VAR_NAME], - convertVariableValue(variable[VAR_TYPE].charAt(0), - variable[VAR_VALUE])); + m = Collections.singletonMap(variable[VAR_NAME], + decodeVariable(variable)); } // collect following variable changes for this owner @@ -1390,9 +1386,7 @@ public abstract class AbstractCommunicationManager implements } else { nextVariable = null; } - m.put(variable[VAR_NAME], - convertVariableValue(variable[VAR_TYPE].charAt(0), - variable[VAR_VALUE])); + m.put(variable[VAR_NAME], decodeVariable(variable)); } try { changeVariables(source, owner, m); @@ -1560,6 +1554,19 @@ public abstract class AbstractCommunicationManager implements } + private Object decodeVariable(String[] variable) { + try { + return convertVariableValue(variable[VAR_TYPE].charAt(0), + variable[VAR_VALUE]); + } catch (Exception e) { + String pid = variable[VAR_PID]; + VariableOwner variableOwner = getVariableOwner(pid); + throw new RuntimeException("Could not convert variable \"" + + variable[VAR_NAME] + "\" for " + + variableOwner.getClass().getName() + " (" + pid + ")", e); + } + } + private Object convertVariableValue(char variableType, String strValue) { Object val = null; switch (variableType) { -- cgit v1.2.3 From 948b55f86a4a7981ca576f6304820c644f418e61 Mon Sep 17 00:00:00 2001 From: Leif Åstrand Date: Wed, 6 Jun 2012 08:12:01 +0000 Subject: Avoid potential NPE discovered in review (#8914) svn changeset:23889/svn branch:6.8 --- .../vaadin/terminal/gwt/server/AbstractCommunicationManager.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java b/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java index fe848e50f2..ae2cacdd38 100644 --- a/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java +++ b/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java @@ -1561,9 +1561,11 @@ public abstract class AbstractCommunicationManager implements } catch (Exception e) { String pid = variable[VAR_PID]; VariableOwner variableOwner = getVariableOwner(pid); + String targetType = variableOwner == null ? "unknown VariableOwner" + : variableOwner.getClass().getName(); throw new RuntimeException("Could not convert variable \"" - + variable[VAR_NAME] + "\" for " - + variableOwner.getClass().getName() + " (" + pid + ")", e); + + variable[VAR_NAME] + "\" for " + targetType + " (" + pid + + ")", e); } } -- cgit v1.2.3 From 8eae5a4313ea8ddba38bd42c93043a9a6fa9ce03 Mon Sep 17 00:00:00 2001 From: Automerge Date: Wed, 6 Jun 2012 13:07:21 +0000 Subject: [merge from 6.7] #7606 Run a Webkit overflow fix as deferred to keep table scroll position accurate svn changeset:23896/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java index 9bfd013603..8d0414a235 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java @@ -6247,7 +6247,14 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, // Webkit may sometimes get an odd rendering bug (white space // between header and body), see bug #3875. Running // overflow hack here to shake body element a bit. - Util.runWebkitOverflowAutoFix(scrollBodyPanel.getElement()); + // We must run the fix as a deferred command to prevent it from + // overwriting the scroll position with an outdated value, see + // #7606. + Scheduler.get().scheduleDeferred(new Command() { + public void execute() { + Util.runWebkitOverflowAutoFix(scrollBodyPanel.getElement()); + } + }); } /* -- cgit v1.2.3 From b18d9f7bb2419c947c8e0401fc7ee1b4f29e92cb Mon Sep 17 00:00:00 2001 From: Leif Åstrand Date: Thu, 7 Jun 2012 10:58:10 +0000 Subject: Refactor ?debug detection (#8923) This fixes #8923 by not looking at the uri fragment at all. Also prevents e.g. ?nodebugwindow or ?mode=debug from opening the debug window. svn changeset:23898/svn branch:6.8 --- .../gwt/client/ApplicationConfiguration.java | 23 ++++--- .../com/vaadin/tests/debug/DebugWindowPresent.html | 72 +++++++++++++++++++++- 2 files changed, 84 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ApplicationConfiguration.java b/src/com/vaadin/terminal/gwt/client/ApplicationConfiguration.java index 21ecfe2776..c6d6bae80a 100644 --- a/src/com/vaadin/terminal/gwt/client/ApplicationConfiguration.java +++ b/src/com/vaadin/terminal/gwt/client/ApplicationConfiguration.java @@ -16,6 +16,7 @@ import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArrayString; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.Timer; +import com.google.gwt.user.client.Window; import com.vaadin.terminal.gwt.client.ui.VUnknownComponent; public class ApplicationConfiguration implements EntryPoint { @@ -496,12 +497,15 @@ public class ApplicationConfiguration implements EntryPoint { * * @return true if client side is currently been debugged */ - public native static boolean isDebugMode() + public static boolean isDebugMode() { + return isDebugAvailable() + && Window.Location.getParameter("debug") != null; + } + + private native static boolean isDebugAvailable() /*-{ if($wnd.vaadin.debug) { - var parameters = $wnd.location.search; - var re = /debug[^\/]*$/; - return re.test(parameters); + return true; } else { return false; } @@ -512,11 +516,10 @@ public class ApplicationConfiguration implements EntryPoint { * * @return true if debug logging should be quiet */ - public native static boolean isQuietDebugMode() - /*-{ - var uri = $wnd.location; - var re = /debug=q[^\/]*$/; - return re.test(uri); - }-*/; + public static boolean isQuietDebugMode() { + String debugParameter = Window.Location.getParameter("debug"); + return isDebugAvailable() && debugParameter != null + && debugParameter.startsWith("q"); + } } diff --git a/tests/testbench/com/vaadin/tests/debug/DebugWindowPresent.html b/tests/testbench/com/vaadin/tests/debug/DebugWindowPresent.html index d396c1778e..11640ef6c3 100644 --- a/tests/testbench/com/vaadin/tests/debug/DebugWindowPresent.html +++ b/tests/testbench/com/vaadin/tests/debug/DebugWindowPresent.html @@ -13,7 +13,17 @@ open - /run/com.vaadin.tests.debug.DebugWindowPresent?restartApplication&debug + /run/com.vaadin.tests.debug.DebugWindowPresent?restartApplication&debug&otherparam + + + + assertElementPresent + vaadin=runcomvaadintestsdebugDebugWindowPresent::Root/VDebugConsole[0] + + + + open + /run/com.vaadin.tests.debug.DebugWindowPresent?debug&restartApplication @@ -31,6 +41,66 @@ vaadin=runcomvaadintestsdebugDebugWindowPresent::Root/VDebugConsole[0] + + open + /run/com.vaadin.tests.debug.DebugWindowPresent?restartApplication&mode=debug + + + + assertElementNotPresent + vaadin=runcomvaadintestsdebugDebugWindowPresent::Root/VDebugConsole[0] + + + + open + /run/com.vaadin.tests.debug.DebugWindowPresent?nodebug&restartApplication + + + + assertElementNotPresent + vaadin=runcomvaadintestsdebugDebugWindowPresent::Root/VDebugConsole[0] + + + + open + /run/com.vaadin.tests.debug.DebugWindowPresent?restartApplication&nodebug + + + + assertElementNotPresent + vaadin=runcomvaadintestsdebugDebugWindowPresent::Root/VDebugConsole[0] + + + + open + /run/com.vaadin.tests.debug.DebugWindowPresent?restartApplication&debug=quiet + + + + assertElementNotPresent + vaadin=runcomvaadintestsdebugDebugWindowPresent::Root/VDebugConsole[0] + + + + open + /run/com.vaadin.tests.debug.DebugWindowPresent?debug=quiet&restartApplication + + + + assertElementNotPresent + vaadin=runcomvaadintestsdebugDebugWindowPresent::Root/VDebugConsole[0] + + + + open + /run/com.vaadin.tests.debug.DebugWindowPresent?restartApplication&debug=quiet#/asdf + + + + assertElementNotPresent + vaadin=runcomvaadintestsdebugDebugWindowPresent::Root/VDebugConsole[0] + + -- cgit v1.2.3 From d2c12c2e5ffb9ce8336eac53ef14faaf3499ae82 Mon Sep 17 00:00:00 2001 From: Automerge Date: Thu, 7 Jun 2012 11:42:29 +0000 Subject: [merge from 6.7] #7067 Update a comment, fix typoed ticket reference svn changeset:23903/svn branch:6.8 --- src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java index 8d0414a235..d88d0d31e5 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java @@ -2060,11 +2060,7 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, isNewBody = false; if (firstvisible > 0) { - // FIXME #7607 - // Originally deferred due to Firefox oddities which should not - // occur any more. Currently deferring breaks Webkit scrolling with - // relative-height tables, but not deferring instead breaks tables - // with explicit page length. + // Deferred due to some Firefox oddities Scheduler.get().scheduleDeferred(new Command() { public void execute() { scrollBodyPanel @@ -6249,7 +6245,7 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, // overflow hack here to shake body element a bit. // We must run the fix as a deferred command to prevent it from // overwriting the scroll position with an outdated value, see - // #7606. + // #7607. Scheduler.get().scheduleDeferred(new Command() { public void execute() { Util.runWebkitOverflowAutoFix(scrollBodyPanel.getElement()); -- cgit v1.2.3 From cece22a1d1919d8da459b6dab18c19e53c6e7f04 Mon Sep 17 00:00:00 2001 From: Leif Åstrand Date: Thu, 7 Jun 2012 12:07:16 +0000 Subject: Remove document.write from bootstrap (#8924) svn changeset:23905/svn branch:6.8 --- .../gwt/server/AbstractApplicationPortlet.java | 70 ++++++++++++++++------ .../gwt/server/AbstractApplicationServlet.java | 12 ++-- 2 files changed, 59 insertions(+), 23 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java b/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java index 9f1bd4e9ee..26b0d3df1d 100644 --- a/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java +++ b/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java @@ -879,6 +879,30 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet return null; } + /** + * Returns the URL from which the widgetset is served on the portal. + * + * @param request + * @return + */ + protected String getWidgetsetURL(RenderRequest request) { + String requestWidgetset = getApplicationOrSystemProperty( + PARAMETER_WIDGETSET, null); + String sharedWidgetset = getPortalProperty( + PORTAL_PARAMETER_VAADIN_WIDGETSET, request.getPortalContext()); + + String widgetset; + if (requestWidgetset != null) { + widgetset = requestWidgetset; + } else if (sharedWidgetset != null) { + widgetset = sharedWidgetset; + } else { + widgetset = DEFAULT_WIDGETSET; + } + String widgetsetURL = getWidgetsetURL(widgetset, request); + return widgetsetURL; + } + /** * Returns the URL from which the widgetset is served on the portal. * @@ -1037,12 +1061,32 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet writer.write("\n"); + writeAjaxPageWidgetset(request, writer); + writeAjaxPageHtmlTheme(request, writer, themeName, themeURI, portalTheme); // TODO Warn if widgetset has not been loaded after 15 seconds } + /** + * Writes the script to load the widgetset on the HTML fragment created by + * the portlet. + * + * @param request + * @param writer + * @throws IOException + */ + protected void writeAjaxPageWidgetset(RenderRequest request, + BufferedWriter writer) throws IOException { + String widgetsetURL = getWidgetsetURL(request); + writer.write("'\n"); + writer.write("\n"); + } + /** * Writes the script to load the widgetset on the HTML fragment created by * the portlet. @@ -1051,29 +1095,19 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet * @param response * @param writer * @throws IOException + * + * @Deprecated As of 6.8, use + * {@link #writeAjaxPageWidgetset(RenderRequest, BufferedWriter)} + * instead to avoid using document.write */ + @Deprecated protected void writeAjaxPageScriptWidgetset(RenderRequest request, RenderResponse response, final BufferedWriter writer) throws IOException { - String requestWidgetset = getApplicationOrSystemProperty( - PARAMETER_WIDGETSET, null); - String sharedWidgetset = getPortalProperty( - PORTAL_PARAMETER_VAADIN_WIDGETSET, request.getPortalContext()); + // No longer used as of #8924, but retained to maintain compatibility - String widgetset; - if (requestWidgetset != null) { - widgetset = requestWidgetset; - } else if (sharedWidgetset != null) { - widgetset = sharedWidgetset; - } else { - widgetset = DEFAULT_WIDGETSET; - } - String widgetsetURL = getWidgetsetURL(widgetset, request); - writer.write("document.write('');\n"); - writer.write("document.write(\"\n"); + page.write("\n"); + page.write("\n"); + if (themeName != null) { // Custom theme's stylesheet, load only once, in different // script -- cgit v1.2.3 From 45b2a35ec9789bd1c6ef9cd46de3ba6695279547 Mon Sep 17 00:00:00 2001 From: Leif Åstrand Date: Thu, 7 Jun 2012 13:40:30 +0000 Subject: Fix some typos in Portlet init javascript and html (#8924) svn changeset:23910/svn branch:6.8 --- src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java b/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java index 26b0d3df1d..898bd2856c 100644 --- a/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java +++ b/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java @@ -1082,7 +1082,7 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet String widgetsetURL = getWidgetsetURL(request); writer.write("'\n"); + + "hidden;opacity:0;top:-100px;left:-100px;\" src=\"javascript:false\">\n"); writer.write("\n"); } @@ -1107,7 +1107,7 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet // No longer used as of #8924, but retained to maintain compatibility // But we still need to close this one block, for compatibility - writer.append("\\n}\\n"); + writer.append("\n}\n"); } /** -- cgit v1.2.3 From 07b20a1cd3118b744e361d02ca4a5607cccf124f Mon Sep 17 00:00:00 2001 From: Leif Åstrand Date: Thu, 7 Jun 2012 14:02:38 +0000 Subject: Prevent double iframe and script tags if writeAjaxPageScriptWidgetset is overridden (#8924) svn changeset:23911/svn branch:6.8 --- .../gwt/server/AbstractApplicationPortlet.java | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java b/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java index 898bd2856c..edc151f22d 100644 --- a/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java +++ b/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java @@ -76,6 +76,8 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet private static final String PORTAL_PARAMETER_VAADIN_THEME = "vaadin.theme"; + public static final String WRITE_AJAX_PAGE_SCRIPT_WIDGETSET_SHOULD_WRITE = "writeAjaxPageScriptWidgetsetShouldWrite"; + // TODO some parts could be shared with AbstractApplicationServlet // TODO Can we close the application when the portlet is removed? Do we know @@ -1071,7 +1073,8 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet /** * Writes the script to load the widgetset on the HTML fragment created by - * the portlet. + * the portlet if the request attribute + * WRITE_AJAX_PAGE_SCRIPT_WIDGETSET_SHOULD_WRITE is set to Boolean.TRUE. * * @param request * @param writer @@ -1079,6 +1082,14 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet */ protected void writeAjaxPageWidgetset(RenderRequest request, BufferedWriter writer) throws IOException { + /* + * If the old method that used to add this code using document.write has + * been overridden, we shouldn't do anything here because then the + * iframe and script tag have already been added. + */ + if (request.getAttribute(WRITE_AJAX_PAGE_SCRIPT_WIDGETSET_SHOULD_WRITE) != Boolean.TRUE) { + return; + } String widgetsetURL = getWidgetsetURL(request); writer.write("