aboutsummaryrefslogtreecommitdiffstats
path: root/client/src
diff options
context:
space:
mode:
authorPatrik Lindström <patrik@vaadin.com>2013-10-11 14:23:52 +0300
committerPatrik Lindström <patrik@vaadin.com>2013-10-11 14:27:29 +0300
commitdf9a1192efeb49285cb1c4fc100bb60b5a77ac14 (patch)
treea89aea53ffd89943f8672a5ef8943da6579bdb92 /client/src
parentc2b81b20ca3a981b775ac5f16506861724119df4 (diff)
parent4cb304d8eb63ce0045a2742bd9c945af4f12aa66 (diff)
downloadvaadin-framework-df9a1192efeb49285cb1c4fc100bb60b5a77ac14.tar.gz
vaadin-framework-df9a1192efeb49285cb1c4fc100bb60b5a77ac14.zip
Merge remote-tracking branch 'origin/7.1' into testbench4
Change-Id: I58fe3b4126b61ec342ee06c18ce49a7fa7d4fd3d
Diffstat (limited to 'client/src')
-rw-r--r--client/src/com/vaadin/client/ApplicationConfiguration.java17
-rw-r--r--client/src/com/vaadin/client/ApplicationConnection.java2
-rw-r--r--client/src/com/vaadin/client/BrowserInfo.java9
-rw-r--r--client/src/com/vaadin/client/VConsole.java18
-rw-r--r--client/src/com/vaadin/client/communication/AtmospherePushConnection.java26
-rw-r--r--client/src/com/vaadin/client/debug/internal/LogSection.java6
-rw-r--r--client/src/com/vaadin/client/ui/PostLayoutListener.java18
-rw-r--r--client/src/com/vaadin/client/ui/VCalendarPanel.java24
-rw-r--r--client/src/com/vaadin/client/ui/VDragAndDropWrapper.java15
-rw-r--r--client/src/com/vaadin/client/ui/VOptionGroup.java79
-rw-r--r--client/src/com/vaadin/client/ui/VOverlay.java71
-rw-r--r--client/src/com/vaadin/client/ui/VScrollTable.java61
-rw-r--r--client/src/com/vaadin/client/ui/VTabsheet.java18
-rw-r--r--client/src/com/vaadin/client/ui/datefield/PopupDateFieldConnector.java9
-rw-r--r--client/src/com/vaadin/client/ui/dd/VDragAndDropManager.java11
-rw-r--r--client/src/com/vaadin/client/ui/dd/VTargetInSubtree.java4
-rw-r--r--client/src/com/vaadin/client/ui/orderedlayout/AbstractOrderedLayoutConnector.java32
-rw-r--r--client/src/com/vaadin/client/ui/slider/SliderConnector.java1
-rw-r--r--client/src/com/vaadin/client/ui/ui/UIConnector.java5
19 files changed, 297 insertions, 129 deletions
diff --git a/client/src/com/vaadin/client/ApplicationConfiguration.java b/client/src/com/vaadin/client/ApplicationConfiguration.java
index f27f9d65d2..a8ae47385a 100644
--- a/client/src/com/vaadin/client/ApplicationConfiguration.java
+++ b/client/src/com/vaadin/client/ApplicationConfiguration.java
@@ -247,6 +247,23 @@ public class ApplicationConfiguration implements EntryPoint {
ApplicationConstants.SERVICE_URL_PATH_AS_PARAMETER) == Boolean.TRUE;
}
+ /**
+ * Return the name of the parameter used to to send data to the service url.
+ * This method should only be called if {@link #useServiceUrlPathParam()} is
+ * true.
+ *
+ * @since 7.1.6
+ * @return The parameter name, by default <code>v-resourcePath</code>
+ */
+ public String getServiceUrlParameterName() {
+ String prefix = getJsoConfiguration(id).getConfigString(
+ ApplicationConstants.SERVICE_URL_PARAMETER_NAMESPACE);
+ if (prefix == null) {
+ prefix = "";
+ }
+ return prefix + ApplicationConstants.V_RESOURCE_PATH;
+ }
+
public String getRootPanelId() {
return id;
}
diff --git a/client/src/com/vaadin/client/ApplicationConnection.java b/client/src/com/vaadin/client/ApplicationConnection.java
index e038f37689..21f6ce8a31 100644
--- a/client/src/com/vaadin/client/ApplicationConnection.java
+++ b/client/src/com/vaadin/client/ApplicationConnection.java
@@ -2998,7 +2998,7 @@ public class ApplicationConnection {
if (!path.startsWith("/")) {
path = '/' + path;
}
- String pathParam = ApplicationConstants.V_RESOURCE_PATH + "="
+ String pathParam = conf.getServiceUrlParameterName() + "="
+ URL.encodeQueryString(path);
serviceUrl = addGetParameters(serviceUrl, pathParam);
uidlUri = serviceUrl;
diff --git a/client/src/com/vaadin/client/BrowserInfo.java b/client/src/com/vaadin/client/BrowserInfo.java
index 5d588f6f8b..273964c889 100644
--- a/client/src/com/vaadin/client/BrowserInfo.java
+++ b/client/src/com/vaadin/client/BrowserInfo.java
@@ -207,10 +207,7 @@ public class BrowserInfo {
return prefix + OS_ANDROID;
} else if (browserDetails.isIOS()) {
String iosClass = prefix + OS_IOS;
- if (isIOS6()) {
- iosClass += " " + prefix + OS_IOS + "6";
- }
- return iosClass;
+ return iosClass + " " + iosClass + getOperatingSystemMajorVersion();
} else if (browserDetails.isWindows()) {
return prefix + OS_WINDOWS;
} else if (browserDetails.isLinux()) {
@@ -392,9 +389,9 @@ public class BrowserInfo {
if (isAndroid() && isWebkit() && getWebkitVersion() >= 534) {
return false;
}
- // iOS 6 Safari supports native scrolling; iOS 5 suffers from #8792
+ // iOS 6+ Safari supports native scrolling; iOS 5 suffers from #8792
// TODO Should test other iOS browsers
- if (isIOS6() && isWebkit()) {
+ if (isIOS() && isWebkit() && getOperatingSystemMajorVersion() >= 6) {
return false;
}
return true;
diff --git a/client/src/com/vaadin/client/VConsole.java b/client/src/com/vaadin/client/VConsole.java
index 37ed8e6370..32eb206a70 100644
--- a/client/src/com/vaadin/client/VConsole.java
+++ b/client/src/com/vaadin/client/VConsole.java
@@ -41,25 +41,35 @@ public class VConsole {
public static void log(String msg) {
if (LogConfiguration.loggingIsEnabled(Level.INFO)) {
- getLogger().log(Level.INFO, msg);
+ // Check for null, so no NullPointerException is generated when
+ // formatting (#12588)
+ getLogger().log(Level.INFO, msg == null ? "null" : msg);
}
}
public static void log(Throwable e) {
if (LogConfiguration.loggingIsEnabled(Level.INFO)) {
- getLogger().log(Level.INFO, e.getMessage(), e);
+ // Check for null, so no NullPointerException is generated when
+ // formatting (#12588)
+ getLogger().log(Level.INFO,
+ e.getMessage() == null ? "" : e.getMessage(), e);
}
}
public static void error(Throwable e) {
if (LogConfiguration.loggingIsEnabled(Level.SEVERE)) {
- getLogger().log(Level.SEVERE, e.getMessage(), e);
+ // Check for null, so no NullPointerException is generated when
+ // formatting (#12588)
+ getLogger().log(Level.SEVERE,
+ e.getMessage() == null ? "" : e.getMessage(), e);
}
}
public static void error(String msg) {
if (LogConfiguration.loggingIsEnabled(Level.SEVERE)) {
- getLogger().log(Level.SEVERE, msg);
+ // Check for null, so no NullPointerException is generated when
+ // formatting (#12588)
+ getLogger().log(Level.SEVERE, msg == null ? "null" : msg);
}
}
diff --git a/client/src/com/vaadin/client/communication/AtmospherePushConnection.java b/client/src/com/vaadin/client/communication/AtmospherePushConnection.java
index 3cecb09dc1..4bf12ca1f3 100644
--- a/client/src/com/vaadin/client/communication/AtmospherePushConnection.java
+++ b/client/src/com/vaadin/client/communication/AtmospherePushConnection.java
@@ -228,10 +228,28 @@ public class AtmospherePushConnection implements PushConnection {
return config;
}
+ protected void onReopen(AtmosphereResponse response) {
+ VConsole.log("Push connection re-established using "
+ + response.getTransport());
+ onConnect(response);
+ }
+
protected void onOpen(AtmosphereResponse response) {
- transport = response.getTransport();
+ VConsole.log("Push connection established using "
+ + response.getTransport());
+ onConnect(response);
+ }
- VConsole.log("Push connection established using " + transport);
+ /**
+ * Called whenever a server push connection is established (or
+ * re-established).
+ *
+ * @param response
+ *
+ * @since 7.2
+ */
+ protected void onConnect(AtmosphereResponse response) {
+ transport = response.getTransport();
switch (state) {
case CONNECT_PENDING:
@@ -422,6 +440,7 @@ public class AtmospherePushConnection implements PushConnection {
reconnectInterval: 5000,
maxReconnectOnClose: 10000000,
trackMessageLength: true,
+ enableProtocol: false,
messageDelimiter: String.fromCharCode(@com.vaadin.shared.communication.PushConstants::MESSAGE_DELIMITER)
};
}-*/;
@@ -435,6 +454,9 @@ public class AtmospherePushConnection implements PushConnection {
config.onOpen = $entry(function(response) {
self.@com.vaadin.client.communication.AtmospherePushConnection::onOpen(*)(response);
});
+ config.onReopen = $entry(function(response) {
+ self.@com.vaadin.client.communication.AtmospherePushConnection::onReopen(*)(response);
+ });
config.onMessage = $entry(function(response) {
self.@com.vaadin.client.communication.AtmospherePushConnection::onMessage(*)(response);
});
diff --git a/client/src/com/vaadin/client/debug/internal/LogSection.java b/client/src/com/vaadin/client/debug/internal/LogSection.java
index 1e7524b56d..f792ec95be 100644
--- a/client/src/com/vaadin/client/debug/internal/LogSection.java
+++ b/client/src/com/vaadin/client/debug/internal/LogSection.java
@@ -73,6 +73,12 @@ public class LogSection implements Section {
return;
}
+ // If no message is provided, record.getMessage will be null and so
+ // the formatter.format will fail with NullPointerException (#12588)
+ if (record.getMessage() == null) {
+ record.setMessage("");
+ }
+
Formatter formatter = getFormatter();
String msg = formatter.format(record);
diff --git a/client/src/com/vaadin/client/ui/PostLayoutListener.java b/client/src/com/vaadin/client/ui/PostLayoutListener.java
index d60360747c..3da2358b0c 100644
--- a/client/src/com/vaadin/client/ui/PostLayoutListener.java
+++ b/client/src/com/vaadin/client/ui/PostLayoutListener.java
@@ -15,6 +15,24 @@
*/
package com.vaadin.client.ui;
+import com.vaadin.client.ComponentConnector;
+import com.vaadin.client.LayoutManager;
+
+/**
+ * Interface implemented by {@link ComponentConnector} implementations that want
+ * to know whenever a layout phase has ended. At the end of each layout phase,
+ * {@link LayoutManager} invokes the {@link #postLayout()} method for all
+ * registered component connectors implementing this interface.
+ *
+ * @since 7.0
+ * @author Vaadin Ltd
+ */
public interface PostLayoutListener {
+ /**
+ * Method invoked by {@link LayoutManager} to notify the connector that a
+ * layout phase has ended. This method can be used to finalize internal
+ * layouting, but it is not allowed to change the its own external size or
+ * modify the conditions for any children.
+ */
public void postLayout();
}
diff --git a/client/src/com/vaadin/client/ui/VCalendarPanel.java b/client/src/com/vaadin/client/ui/VCalendarPanel.java
index 1f40298760..58e0448b5f 100644
--- a/client/src/com/vaadin/client/ui/VCalendarPanel.java
+++ b/client/src/com/vaadin/client/ui/VCalendarPanel.java
@@ -2215,11 +2215,13 @@ public class VCalendarPanel extends FocusableFlexTable implements
* - the allowed range's start date
*/
public void setRangeStart(Date rangeStart) {
- this.rangeStart = rangeStart;
- if (initialRenderDone) {
- // Dynamic updates to the range needs to render the calendar to
- // update the element stylenames
- renderCalendar();
+ if (this.rangeStart != rangeStart) {
+ this.rangeStart = rangeStart;
+ if (initialRenderDone) {
+ // Dynamic updates to the range needs to render the calendar to
+ // update the element stylenames
+ renderCalendar();
+ }
}
}
@@ -2232,11 +2234,13 @@ public class VCalendarPanel extends FocusableFlexTable implements
* - the allowed range's end date
*/
public void setRangeEnd(Date rangeEnd) {
- this.rangeEnd = rangeEnd;
- if (initialRenderDone) {
- // Dynamic updates to the range needs to render the calendar to
- // update the element stylenames
- renderCalendar();
+ if (this.rangeEnd != rangeEnd) {
+ this.rangeEnd = rangeEnd;
+ if (initialRenderDone) {
+ // Dynamic updates to the range needs to render the calendar to
+ // update the element stylenames
+ renderCalendar();
+ }
}
}
}
diff --git a/client/src/com/vaadin/client/ui/VDragAndDropWrapper.java b/client/src/com/vaadin/client/ui/VDragAndDropWrapper.java
index 1c1173c295..ccd7e2758e 100644
--- a/client/src/com/vaadin/client/ui/VDragAndDropWrapper.java
+++ b/client/src/com/vaadin/client/ui/VDragAndDropWrapper.java
@@ -332,11 +332,16 @@ public class VDragAndDropWrapper extends VCustomComponent implements
vaadinDragEvent.setCurrentGwtEvent(event);
getDropHandler().dragOver(vaadinDragEvent);
- String s = event.getEffectAllowed();
- if ("all".equals(s) || s.contains("opy")) {
- event.setDropEffect("copy");
- } else {
- event.setDropEffect(s);
+ try {
+ String s = event.getEffectAllowed();
+ if ("all".equals(s) || s.contains("opy")) {
+ event.setDropEffect("copy");
+ } else {
+ event.setDropEffect(s);
+ }
+ } catch (Exception e) {
+ // IE10 throws exception here in getEffectAllowed, ignore it, let
+ // drop effect be whatever it is
}
try {
diff --git a/client/src/com/vaadin/client/ui/VOptionGroup.java b/client/src/com/vaadin/client/ui/VOptionGroup.java
index a4c8b6733c..fee1c313f5 100644
--- a/client/src/com/vaadin/client/ui/VOptionGroup.java
+++ b/client/src/com/vaadin/client/ui/VOptionGroup.java
@@ -87,19 +87,42 @@ public class VOptionGroup extends VOptionGroupBase implements FocusHandler,
/** For internal use only. May be removed or replaced in the future. */
public boolean htmlContentAllowed = false;
+ private boolean wasHtmlContentAllowed = false;
+ private boolean wasMultiselect = false;
+
public VOptionGroup() {
super(CLASSNAME);
panel = (Panel) optionsContainer;
optionsToKeys = new HashMap<CheckBox, String>();
optionsEnabled = new ArrayList<Boolean>();
+
+ wasMultiselect = isMultiselect();
}
/*
- * Return true if no elements were changed, false otherwise.
+ * Try to update content of existing elements, rebuild panel entirely
+ * otherwise
*/
@Override
public void buildOptions(UIDL uidl) {
- panel.clear();
+ /*
+ * In order to retain focus, we need to update values rather than
+ * recreate panel from scratch (#10451). However, the panel will be
+ * rebuilt (losing focus) if number of elements or their order is
+ * changed.
+ */
+ HashMap<String, CheckBox> keysToOptions = new HashMap<String, CheckBox>();
+ for (Map.Entry<CheckBox, String> entry : optionsToKeys.entrySet()) {
+ keysToOptions.put(entry.getValue(), entry.getKey());
+ }
+ ArrayList<Widget> existingwidgets = new ArrayList<Widget>();
+ ArrayList<Widget> newwidgets = new ArrayList<Widget>();
+
+ // Get current order of elements
+ for (Widget wid : panel) {
+ existingwidgets.add(wid);
+ }
+
optionsEnabled.clear();
if (isMultiselect()) {
@@ -110,7 +133,6 @@ public class VOptionGroup extends VOptionGroupBase implements FocusHandler,
for (final Iterator<?> it = uidl.getChildIterator(); it.hasNext();) {
final UIDL opUidl = (UIDL) it.next();
- CheckBox op;
String itemHtml = opUidl.getStringAttribute("caption");
if (!htmlContentAllowed) {
@@ -124,33 +146,56 @@ public class VOptionGroup extends VOptionGroupBase implements FocusHandler,
+ Icon.CLASSNAME + "\" alt=\"\" />" + itemHtml;
}
- if (isMultiselect()) {
- op = new VCheckBox();
- op.setHTML(itemHtml);
- } else {
- op = new RadioButton(paintableId, itemHtml, true);
- op.setStyleName("v-radiobutton");
- }
+ String key = opUidl.getStringAttribute("key");
+ CheckBox op = keysToOptions.get(key);
- if (icon != null && icon.length() != 0) {
- Util.sinkOnloadForImages(op.getElement());
- op.addHandler(iconLoadHandler, LoadEvent.getType());
+ // Need to recreate object if isMultiselect is changed (#10451)
+ // OR if htmlContentAllowed changed due to Safari 5 issue
+ if ((op == null) || (htmlContentAllowed != wasHtmlContentAllowed)
+ || (isMultiselect() != wasMultiselect)) {
+ // Create a new element
+ if (isMultiselect()) {
+ op = new VCheckBox();
+ } else {
+ op = new RadioButton(paintableId);
+ op.setStyleName("v-radiobutton");
+ }
+ if (icon != null && icon.length() != 0) {
+ Util.sinkOnloadForImages(op.getElement());
+ op.addHandler(iconLoadHandler, LoadEvent.getType());
+ }
+
+ op.addStyleName(CLASSNAME_OPTION);
+ op.addClickHandler(this);
+
+ optionsToKeys.put(op, key);
}
- op.addStyleName(CLASSNAME_OPTION);
+ op.setHTML(itemHtml);
op.setValue(opUidl.getBooleanAttribute("selected"));
boolean optionEnabled = !opUidl
.getBooleanAttribute(OptionGroupConstants.ATTRIBUTE_OPTION_DISABLED);
boolean enabled = optionEnabled && !isReadonly() && isEnabled();
op.setEnabled(enabled);
optionsEnabled.add(optionEnabled);
+
setStyleName(op.getElement(),
ApplicationConnection.DISABLED_CLASSNAME,
!(optionEnabled && isEnabled()));
- op.addClickHandler(this);
- optionsToKeys.put(op, opUidl.getStringAttribute("key"));
- panel.add(op);
+
+ newwidgets.add(op);
}
+
+ if (!newwidgets.equals(existingwidgets)) {
+ // Rebuild the panel, losing focus
+ panel.clear();
+ for (Widget wid : newwidgets) {
+ panel.add(wid);
+ }
+ }
+
+ wasHtmlContentAllowed = htmlContentAllowed;
+ wasMultiselect = isMultiselect();
}
@Override
diff --git a/client/src/com/vaadin/client/ui/VOverlay.java b/client/src/com/vaadin/client/ui/VOverlay.java
index ced476f9dd..0e031e3d0d 100644
--- a/client/src/com/vaadin/client/ui/VOverlay.java
+++ b/client/src/com/vaadin/client/ui/VOverlay.java
@@ -248,10 +248,6 @@ public class VOverlay extends PopupPanel implements CloseHandler<PopupPanel> {
return isShadowEnabled() && shadow.getParentElement() != null;
}
- private boolean isShimElementAttached() {
- return shimElement != null && shimElement.hasParentElement();
- }
-
private void adjustZIndex() {
setZIndex(Z_INDEX);
}
@@ -469,36 +465,51 @@ public class VOverlay extends PopupPanel implements CloseHandler<PopupPanel> {
getOffsetWidth();
}
- PositionAndSize positionAndSize = new PositionAndSize(getActualLeft(),
- getActualTop(), getOffsetWidth(), getOffsetHeight());
+ if (isShadowEnabled() || needsShimElement()) {
+
+ PositionAndSize positionAndSize = new PositionAndSize(
+ getActualLeft(), getActualTop(), getOffsetWidth(),
+ getOffsetHeight());
+
+ // Animate the size
+ positionAndSize.setAnimationFromCenterProgress(progress);
+
+ Element container = getElement().getParentElement().cast();
- // Animate the size
- positionAndSize.setAnimationFromCenterProgress(progress);
+ if (isShadowEnabled()) {
+ updateShadowPosition(progress, zIndex, positionAndSize);
+ if (shadow.getParentElement() == null) {
+ container.insertBefore(shadow, getElement());
+ sinkShadowEvents();
+ }
+ }
+
+ if (needsShimElement()) {
+ updateShimPosition(positionAndSize);
+ if (shimElement.getParentElement() == null) {
+ container.insertBefore(shimElement, getElement());
+ }
+ }
+ }
+ }
+ private void updateShadowPosition(final double progress, String zIndex,
+ PositionAndSize positionAndSize) {
// Opera needs some shaking to get parts of the shadow showing
- // properly
- // (ticket #2704)
- if (BrowserInfo.get().isOpera() && isShadowEnabled()) {
+ // properly (ticket #2704)
+ if (BrowserInfo.get().isOpera()) {
// Clear the height of all middle elements
DOM.getChild(shadow, 3).getStyle().setProperty("height", "auto");
DOM.getChild(shadow, 4).getStyle().setProperty("height", "auto");
DOM.getChild(shadow, 5).getStyle().setProperty("height", "auto");
}
- // Update correct values
- if (isShadowEnabled()) {
- updatePositionAndSize(shadow, positionAndSize);
- DOM.setStyleAttribute(shadow, "zIndex", zIndex);
- DOM.setStyleAttribute(shadow, "display", progress < 0.9 ? "none"
- : "");
- }
- if (needsShimElement()) {
- updatePositionAndSize((Element) Element.as(getShimElement()),
- positionAndSize);
- }
+ updatePositionAndSize(shadow, positionAndSize);
+ DOM.setStyleAttribute(shadow, "zIndex", zIndex);
+ DOM.setStyleAttribute(shadow, "display", progress < 0.9 ? "none" : "");
// Opera fix, part 2 (ticket #2704)
- if (BrowserInfo.get().isOpera() && isShadowEnabled()) {
+ if (BrowserInfo.get().isOpera()) {
// We'll fix the height of all the middle elements
DOM.getChild(shadow, 3)
.getStyle()
@@ -513,17 +524,11 @@ public class VOverlay extends PopupPanel implements CloseHandler<PopupPanel> {
.setPropertyPx("height",
DOM.getChild(shadow, 5).getOffsetHeight());
}
+ }
- Element container = getElement().getParentElement().cast();
- // Attach to dom if not there already
- if (isShadowEnabled() && !isShadowAttached()) {
- container.insertBefore(shadow, getElement());
- sinkShadowEvents();
- }
- if (needsShimElement() && !isShimElementAttached()) {
- container.insertBefore(getShimElement(), getElement());
- }
-
+ private void updateShimPosition(PositionAndSize positionAndSize) {
+ updatePositionAndSize((Element) Element.as(getShimElement()),
+ positionAndSize);
}
/**
diff --git a/client/src/com/vaadin/client/ui/VScrollTable.java b/client/src/com/vaadin/client/ui/VScrollTable.java
index fe2e99a28f..ab3a41402d 100644
--- a/client/src/com/vaadin/client/ui/VScrollTable.java
+++ b/client/src/com/vaadin/client/ui/VScrollTable.java
@@ -178,6 +178,8 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
private int firstRowInViewPort = 0;
private int pageLength = 15;
private int lastRequestedFirstvisible = 0; // to detect "serverside scroll"
+ private int firstvisibleOnLastPage = -1; // To detect if the first visible
+ // is on the last page
/** For internal use only. May be removed or replaced in the future. */
public boolean showRowHeaders = false;
@@ -1072,6 +1074,17 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
}
if (selected != row.isSelected()) {
row.toggleSelection();
+
+ if (selected) {
+ if (focusedRow == null
+ || !selectedRowKeys.contains(focusedRow
+ .getKey())) {
+ // The focus is no longer on a selected row,
+ // move focus to first selected row
+ setRowFocus(row);
+ }
+ }
+
if (!isSingleSelectMode() && !selected) {
// Update selection range in case a row is
// unselected from the middle of a range - #8076
@@ -1113,8 +1126,16 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
private ScheduledCommand lazyScroller = new ScheduledCommand() {
@Override
public void execute() {
- int offsetTop = measureRowHeightOffset(firstvisible);
- scrollBodyPanel.setScrollPosition(offsetTop);
+ if (firstvisible > 0) {
+ firstRowInViewPort = firstvisible;
+ if (firstvisibleOnLastPage > -1) {
+ scrollBodyPanel
+ .setScrollPosition(measureRowHeightOffset(firstvisibleOnLastPage));
+ } else {
+ scrollBodyPanel
+ .setScrollPosition(measureRowHeightOffset(firstvisible));
+ }
+ }
}
};
@@ -1122,18 +1143,18 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
public void updateFirstVisibleAndScrollIfNeeded(UIDL uidl) {
firstvisible = uidl.hasVariable("firstvisible") ? uidl
.getIntVariable("firstvisible") : 0;
+ firstvisibleOnLastPage = uidl.hasVariable("firstvisibleonlastpage") ? uidl
+ .getIntVariable("firstvisibleonlastpage") : -1;
if (firstvisible != lastRequestedFirstvisible && scrollBody != null) {
- // received 'surprising' firstvisible from server: scroll there
- firstRowInViewPort = firstvisible;
+
// Update lastRequestedFirstvisible right away here
// (don't rely on update in the timer which could be cancelled).
lastRequestedFirstvisible = firstRowInViewPort;
- /*
- * Schedule the scrolling to be executed last so no updates to the
- * rows affect scrolling measurements.
- */
- Scheduler.get().scheduleFinally(lazyScroller);
+ // Only scroll if the first visible changes from the server side.
+ // Else we might unintentionally scroll even when the scroll
+ // position has not changed.
+ Scheduler.get().scheduleDeferred(lazyScroller);
}
}
@@ -2153,16 +2174,7 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
isNewBody = false;
if (firstvisible > 0) {
- // Deferred due to some Firefox oddities
- Scheduler.get().scheduleDeferred(new Command() {
-
- @Override
- public void execute() {
- scrollBodyPanel
- .setScrollPosition(measureRowHeightOffset(firstvisible));
- firstRowInViewPort = firstvisible;
- }
- });
+ Scheduler.get().scheduleDeferred(lazyScroller);
}
if (enabled) {
@@ -6125,7 +6137,13 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
.next();
setRowFocus(endRow);
}
+ } else if (!startRow.isSelected()) {
+ // The start row is no longer selected (probably removed)
+ // and so we select from above
+ startRow = (VScrollTableRow) scrollBody.iterator().next();
+ setRowFocus(endRow);
}
+
// Deselect previous items if so desired
if (deselectPrevious) {
deselectAll();
@@ -6911,6 +6929,11 @@ public class VScrollTable extends FlowPanel implements HasWidgets,
// fix footers horizontal scrolling
tFoot.setHorizontalScrollPosition(scrollLeft);
+ if (totalRows == 0) {
+ // No rows, no need to fetch new rows
+ return;
+ }
+
firstRowInViewPort = calcFirstRowInViewPort();
if (firstRowInViewPort > totalRows - pageLength) {
firstRowInViewPort = totalRows - pageLength;
diff --git a/client/src/com/vaadin/client/ui/VTabsheet.java b/client/src/com/vaadin/client/ui/VTabsheet.java
index fe29e2ebc0..7dec62bde0 100644
--- a/client/src/com/vaadin/client/ui/VTabsheet.java
+++ b/client/src/com/vaadin/client/ui/VTabsheet.java
@@ -1115,14 +1115,16 @@ public class VTabsheet extends VTabsheetBase implements Focusable,
if (event.getSource() instanceof Tab) {
int keycode = event.getNativeEvent().getKeyCode();
- if (keycode == getPreviousTabKey()) {
- selectPreviousTab();
- } else if (keycode == getNextTabKey()) {
- selectNextTab();
- } else if (keycode == getCloseTabKey()) {
- Tab tab = tb.getTab(activeTabIndex);
- if (tab.isClosable()) {
- tab.onClose();
+ if (!event.isAnyModifierKeyDown()) {
+ if (keycode == getPreviousTabKey()) {
+ selectPreviousTab();
+ } else if (keycode == getNextTabKey()) {
+ selectNextTab();
+ } else if (keycode == getCloseTabKey()) {
+ Tab tab = tb.getTab(activeTabIndex);
+ if (tab.isClosable()) {
+ tab.onClose();
+ }
}
}
}
diff --git a/client/src/com/vaadin/client/ui/datefield/PopupDateFieldConnector.java b/client/src/com/vaadin/client/ui/datefield/PopupDateFieldConnector.java
index 627478ebe5..f018caefa5 100644
--- a/client/src/com/vaadin/client/ui/datefield/PopupDateFieldConnector.java
+++ b/client/src/com/vaadin/client/ui/datefield/PopupDateFieldConnector.java
@@ -77,9 +77,6 @@ public class PopupDateFieldConnector extends TextualDateConnector {
String oldLocale = getWidget().getCurrentLocale();
- boolean lastReadOnlyState = getWidget().isReadonly();
- boolean lastEnabledState = getWidget().isEnabled();
-
getWidget().parsable = uidl.getBooleanAttribute("parsable");
super.updateFromUIDL(uidl, client);
@@ -92,7 +89,8 @@ public class PopupDateFieldConnector extends TextualDateConnector {
.getCurrentResolution()) {
getWidget().calendar.setResolution(getWidget()
.getCurrentResolution());
- if (getWidget().calendar.getDate() != null) {
+ if (getWidget().calendar.getDate() != null
+ && getWidget().getCurrentDate() != null) {
getWidget().calendar.setDate((Date) getWidget()
.getCurrentDate().clone());
// force re-render when changing resolution only
@@ -101,7 +99,7 @@ public class PopupDateFieldConnector extends TextualDateConnector {
}
// Force re-render of calendar if locale has changed (#12153)
- if (getWidget().getCurrentLocale() != oldLocale) {
+ if (!getWidget().getCurrentLocale().equals(oldLocale)) {
getWidget().calendar.renderCalendar();
}
@@ -113,6 +111,7 @@ public class PopupDateFieldConnector extends TextualDateConnector {
.setFocusChangeListener(new FocusChangeListener() {
@Override
public void focusChanged(Date date) {
+
getWidget().updateValue(date);
getWidget().buildDate();
Date date2 = getWidget().calendar.getDate();
diff --git a/client/src/com/vaadin/client/ui/dd/VDragAndDropManager.java b/client/src/com/vaadin/client/ui/dd/VDragAndDropManager.java
index b4cf008a38..b911c28a07 100644
--- a/client/src/com/vaadin/client/ui/dd/VDragAndDropManager.java
+++ b/client/src/com/vaadin/client/ui/dd/VDragAndDropManager.java
@@ -374,6 +374,17 @@ public class VDragAndDropManager {
public void onPreviewNativeEvent(
NativePreviewEvent event) {
int typeInt = event.getTypeInt();
+ if (typeInt == -1
+ && event.getNativeEvent().getType()
+ .contains("MSPointer")) {
+ /*
+ * Ignore MSPointer events, until they are
+ * properly used (might improve usability on
+ * touch devices).
+ */
+ return;
+ }
+
switch (typeInt) {
case Event.ONMOUSEOVER:
if (dragElement == null) {
diff --git a/client/src/com/vaadin/client/ui/dd/VTargetInSubtree.java b/client/src/com/vaadin/client/ui/dd/VTargetInSubtree.java
index e9061114aa..c3f56b410d 100644
--- a/client/src/com/vaadin/client/ui/dd/VTargetInSubtree.java
+++ b/client/src/com/vaadin/client/ui/dd/VTargetInSubtree.java
@@ -32,7 +32,7 @@ final public class VTargetInSubtree extends VAcceptCriterion {
protected boolean accept(VDragEvent drag, UIDL configuration) {
VTree tree = (VTree) VDragAndDropManager.get().getCurrentDropHandler()
- .getConnector();
+ .getConnector().getWidget();
TreeNode treeNode = tree.getNodeByKey((String) drag.getDropDetails()
.get("itemIdOver"));
if (treeNode != null) {
@@ -53,4 +53,4 @@ final public class VTargetInSubtree extends VAcceptCriterion {
return false;
}
-} \ No newline at end of file
+}
diff --git a/client/src/com/vaadin/client/ui/orderedlayout/AbstractOrderedLayoutConnector.java b/client/src/com/vaadin/client/ui/orderedlayout/AbstractOrderedLayoutConnector.java
index e0dc0d51df..ec4307e50b 100644
--- a/client/src/com/vaadin/client/ui/orderedlayout/AbstractOrderedLayoutConnector.java
+++ b/client/src/com/vaadin/client/ui/orderedlayout/AbstractOrderedLayoutConnector.java
@@ -19,6 +19,7 @@ import java.util.List;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.ui.Widget;
import com.vaadin.client.ApplicationConnection;
import com.vaadin.client.ComponentConnector;
import com.vaadin.client.ConnectorHierarchyChangeEvent;
@@ -611,13 +612,14 @@ public abstract class AbstractOrderedLayoutConnector extends
LayoutManager layoutManager = getLayoutManager();
for (ComponentConnector child : getChildComponents()) {
- Slot slot = getWidget().getSlot(child.getWidget());
+ Widget childWidget = child.getWidget();
+ Slot slot = getWidget().getSlot(childWidget);
Element captionElement = slot.getCaptionElement();
- CaptionPosition pos = slot.getCaptionPosition();
+ CaptionPosition captionPosition = slot.getCaptionPosition();
- Element childElement = child.getWidget().getElement();
- int h = layoutManager.getOuterHeight(childElement);
- if (h == -1) {
+ int pixelHeight = layoutManager.getOuterHeight(childWidget
+ .getElement());
+ if (pixelHeight == -1) {
// Height has not yet been measured -> postpone actions that
// depend on the max height
return -1;
@@ -625,14 +627,10 @@ public abstract class AbstractOrderedLayoutConnector extends
boolean hasRelativeHeight = slot.hasRelativeHeight();
+ boolean captionSizeShouldBeAddedtoComponentHeight = captionPosition == CaptionPosition.TOP
+ || captionPosition == CaptionPosition.BOTTOM;
boolean includeCaptionHeight = captionElement != null
- && (pos == CaptionPosition.TOP || pos == CaptionPosition.BOTTOM);
- if (!hasRelativeHeight && !includeCaptionHeight
- && captionElement != null) {
- String sHeight = childElement.getStyle().getHeight();
- includeCaptionHeight = (sHeight == null || !sHeight
- .endsWith("%"));
- }
+ && captionSizeShouldBeAddedtoComponentHeight;
if (includeCaptionHeight) {
int captionHeight = layoutManager
@@ -643,16 +641,16 @@ public abstract class AbstractOrderedLayoutConnector extends
// depend on the max height
return -1;
}
- h += captionHeight;
+ pixelHeight += captionHeight;
}
if (!hasRelativeHeight) {
- if (h > highestNonRelative) {
- highestNonRelative = h;
+ if (pixelHeight > highestNonRelative) {
+ highestNonRelative = pixelHeight;
}
} else {
- if (h > highestRelative) {
- highestRelative = h;
+ if (pixelHeight > highestRelative) {
+ highestRelative = pixelHeight;
}
}
}
diff --git a/client/src/com/vaadin/client/ui/slider/SliderConnector.java b/client/src/com/vaadin/client/ui/slider/SliderConnector.java
index e6e3e0467d..71462d69f0 100644
--- a/client/src/com/vaadin/client/ui/slider/SliderConnector.java
+++ b/client/src/com/vaadin/client/ui/slider/SliderConnector.java
@@ -52,6 +52,7 @@ public class SliderConnector extends AbstractFieldConnector implements
@Override
public void onValueChange(ValueChangeEvent<Double> event) {
+ getState().value = event.getValue();
rpc.valueChanged(event.getValue());
}
diff --git a/client/src/com/vaadin/client/ui/ui/UIConnector.java b/client/src/com/vaadin/client/ui/ui/UIConnector.java
index c6d2e1436b..46b5f63180 100644
--- a/client/src/com/vaadin/client/ui/ui/UIConnector.java
+++ b/client/src/com/vaadin/client/ui/ui/UIConnector.java
@@ -319,6 +319,11 @@ public class UIConnector extends AbstractSingleComponentContainerConnector
ComponentConnector paintable = (ComponentConnector) uidl
.getPaintableAttribute("focused", getConnection());
+ if (paintable == null) {
+ // Do not try to focus invisible components which not present in UIDL
+ return;
+ }
+
final Widget toBeFocused = paintable.getWidget();
/*
* Two types of Widgets can be focused, either implementing