From d089b94240b6a9945e29153624f03ac24b3b3e24 Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Thu, 5 Apr 2012 11:47:00 +0300 Subject: Fixed import --- .../vaadin/terminal/gwt/client/ui/AbstractOrderedLayoutConnector.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/AbstractOrderedLayoutConnector.java b/src/com/vaadin/terminal/gwt/client/ui/AbstractOrderedLayoutConnector.java index c9faf83e7d..0866a3007b 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/AbstractOrderedLayoutConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/AbstractOrderedLayoutConnector.java @@ -10,6 +10,7 @@ import com.google.gwt.user.client.Element; import com.google.gwt.user.client.ui.Widget; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.ComponentConnector; +import com.vaadin.terminal.gwt.client.ConnectorHierarchyChangeEvent; import com.vaadin.terminal.gwt.client.DirectionalManagedLayout; import com.vaadin.terminal.gwt.client.LayoutManager; import com.vaadin.terminal.gwt.client.Paintable; @@ -269,8 +270,7 @@ public abstract class AbstractOrderedLayoutConnector extends } @Override - public void onConnectorHierarchyChange( - com.vaadin.terminal.gwt.client.ConnectorHierarchyChangeEvent event) { + public void onConnectorHierarchyChange(ConnectorHierarchyChangeEvent event) { super.onConnectorHierarchyChange(event); List previousChildren = event.getOldChildren(); int currentIndex = 0; -- cgit v1.2.3 From c670b2fff5ec7cfa6571960ea39e8ecc66fc1c2e Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Thu, 5 Apr 2012 15:58:12 +0300 Subject: Disable TreeTable partial updates until it is fixed Currently TreeTable changes its child components during paint, which is too late for AbstractCommunicationManager to take into account --- src/com/vaadin/ui/TreeTable.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/com/vaadin/ui/TreeTable.java b/src/com/vaadin/ui/TreeTable.java index f920810edf..80e721aaea 100644 --- a/src/com/vaadin/ui/TreeTable.java +++ b/src/com/vaadin/ui/TreeTable.java @@ -551,7 +551,9 @@ public class TreeTable extends Table implements Hierarchical { public void setContainerDataSource(Container newDataSource) { cStrategy = null; - containerSupportsPartialUpdates = (newDataSource instanceof ItemSetChangeNotifier); + // FIXME: This disables partial updates until TreeTable is fixed so it + // does not change component hierarchy during paint + containerSupportsPartialUpdates = (newDataSource instanceof ItemSetChangeNotifier) && false; if (!(newDataSource instanceof Hierarchical)) { newDataSource = new ContainerHierarchicalWrapper(newDataSource); -- cgit v1.2.3 From 2f395ab251b336a1ba32b01742cfc93f075184f0 Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Thu, 5 Apr 2012 17:10:22 +0300 Subject: Fixed potential problem with file descriptors remaining in use --- .../gwt/server/AbstractApplicationServlet.java | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java b/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java index 90efdf2296..9f1691112b 100644 --- a/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java +++ b/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java @@ -15,6 +15,7 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; +import java.net.URLConnection; import java.security.GeneralSecurityException; import java.util.Arrays; import java.util.Collection; @@ -34,6 +35,8 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; +import sun.net.www.protocol.file.FileURLConnection; + import com.vaadin.Application; import com.vaadin.Application.ApplicationStartEvent; import com.vaadin.Application.SystemMessages; @@ -1123,8 +1126,10 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements // Find the modification timestamp long lastModifiedTime = 0; + URLConnection connection = null; try { - lastModifiedTime = resourceUrl.openConnection().getLastModified(); + connection = resourceUrl.openConnection(); + lastModifiedTime = connection.getLastModified(); // Remove milliseconds to avoid comparison problems (milliseconds // are not returned by the browser in the "If-Modified-Since" // header). @@ -1140,6 +1145,21 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements Level.FINEST, "Failed to find out last modified timestamp. Continuing without it.", e); + } finally { + if (connection instanceof FileURLConnection) { + try { + // Explicitly close the input stream to prevent it + // from remaining hanging + // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4257700 + InputStream is = connection.getInputStream(); + if (is != null) { + is.close(); + } + } catch (IOException e) { + logger.log(Level.INFO, + "Error closing FileURLConnection input stream", e); + } + } } // Set type mime type if we can determine it based on the filename -- cgit v1.2.3 From 238419e0f1a878716606427bd9d0d801aee10cb7 Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Tue, 10 Apr 2012 09:13:13 +0300 Subject: Print stack traces to console when in GWT Dev Mode At least for now --- src/com/vaadin/terminal/gwt/client/VDebugConsole.java | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/VDebugConsole.java b/src/com/vaadin/terminal/gwt/client/VDebugConsole.java index f28af4040d..fea777ff72 100644 --- a/src/com/vaadin/terminal/gwt/client/VDebugConsole.java +++ b/src/com/vaadin/terminal/gwt/client/VDebugConsole.java @@ -634,6 +634,10 @@ public class VDebugConsole extends VOverlay implements Console { } error(Util.getSimpleName(e) + ": " + e.getMessage()); GWT.log(e.getMessage(), e); + if (!GWT.isProdMode()) { + e.printStackTrace(); + } + } public void init() { -- cgit v1.2.3 From d9bd169e364213d565914f3a18f937a056c32773 Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Tue, 10 Apr 2012 09:53:18 +0300 Subject: Fixed GridLayout captions when components are moved in the layout --- .../gwt/client/ui/GridLayoutConnector.java | 63 +++++++++++++--------- .../vaadin/terminal/gwt/client/ui/VGridLayout.java | 29 ++++++++-- 2 files changed, 62 insertions(+), 30 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/GridLayoutConnector.java b/src/com/vaadin/terminal/gwt/client/ui/GridLayoutConnector.java index 1aad705109..4b37d2c407 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/GridLayoutConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/GridLayoutConnector.java @@ -3,7 +3,6 @@ */ package com.vaadin.terminal.gwt.client.ui; -import java.util.HashSet; import java.util.Iterator; import com.google.gwt.core.client.GWT; @@ -12,6 +11,7 @@ import com.google.gwt.user.client.ui.Widget; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.ComponentConnector; import com.vaadin.terminal.gwt.client.ConnectorHierarchyChangeEvent; +import com.vaadin.terminal.gwt.client.ConnectorMap; import com.vaadin.terminal.gwt.client.DirectionalManagedLayout; import com.vaadin.terminal.gwt.client.Paintable; import com.vaadin.terminal.gwt.client.UIDL; @@ -115,27 +115,11 @@ public class GridLayoutConnector extends AbstractComponentContainerConnector layout.columnWidths = new int[cols]; layout.rowHeights = new int[rows]; - if (layout.cells == null) { - layout.cells = new Cell[cols][rows]; - } else if (layout.cells.length != cols - || layout.cells[0].length != rows) { - Cell[][] newCells = new Cell[cols][rows]; - for (int i = 0; i < layout.cells.length; i++) { - for (int j = 0; j < layout.cells[i].length; j++) { - if (i < cols && j < rows) { - newCells[i][j] = layout.cells[i][j]; - } - } - } - layout.cells = newCells; - } + layout.setSize(rows, cols); final int[] alignments = uidl.getIntArrayAttribute("alignments"); int alignmentIndex = 0; - HashSet nonRenderedWidgets = new HashSet( - layout.widgetToCell.keySet()); - for (final Iterator i = uidl.getChildIterator(); i.hasNext();) { final UIDL r = (UIDL) i.next(); if ("gr".equals(r.getTag())) { @@ -145,11 +129,34 @@ public class GridLayoutConnector extends AbstractComponentContainerConnector int row = cellUidl.getIntAttribute("y"); int col = cellUidl.getIntAttribute("x"); - Cell cell = layout.getCell(row, col, cellUidl); + Widget previousWidget = null; + + Cell cell = layout.getCell(row, col); + if (cell != null && cell.slot != null) { + // This is an update. Track if the widget changes + // and update the caption if that happens. This + // workaround can be removed once the DOM update is + // done in onContainerHierarchyChange + previousWidget = cell.slot.getWidget(); + } + + cell = layout.createCell(row, col); + + cell.updateFromUidl(cellUidl); + if (cell.hasContent()) { cell.setAlignment(new AlignmentInfo( alignments[alignmentIndex++])); - nonRenderedWidgets.remove(cell.slot.getWidget()); + if (cell.slot.getWidget() != previousWidget) { + // Widget changed or widget moved from another + // slot. Update its caption as the widget might + // have called updateCaption when the widget was + // still in its old slot. This workaround can be + // removed once the DOM update + // is done in onContainerHierarchyChange + updateCaption(ConnectorMap.get(getConnection()) + .getConnector(cell.slot.getWidget())); + } } } } @@ -168,9 +175,7 @@ public class GridLayoutConnector extends AbstractComponentContainerConnector needCaptionUpdate = false; for (ComponentConnector child : getChildren()) { - if (child.delegateCaptionHandling()) { - updateCaption(child); - } + updateCaption(child); } } getLayoutManager().setNeedsUpdate(this); @@ -200,11 +205,19 @@ public class GridLayoutConnector extends AbstractComponentContainerConnector } public void updateCaption(ComponentConnector childConnector) { + if (!childConnector.delegateCaptionHandling()) { + // Check not required by interface but by workarounds in this class + // when updateCaption is explicitly called for all children. + return; + } + VGridLayout layout = getWidget(); Cell cell = layout.widgetToCell.get(childConnector.getWidget()); if (cell == null) { - // workaround before updateFromUidl is removed. Update the - // captions at the end of updateFromUidl instead of immediately + // workaround before updateFromUidl is removed. We currently update + // the captions at the end of updateFromUidl instead of immediately + // because the DOM has not been set up at this point (as it is done + // in updateFromUidl) needCaptionUpdate = true; return; } diff --git a/src/com/vaadin/terminal/gwt/client/ui/VGridLayout.java b/src/com/vaadin/terminal/gwt/client/ui/VGridLayout.java index a0c0f8f393..f218594edb 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VGridLayout.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VGridLayout.java @@ -577,21 +577,24 @@ public class VGridLayout extends ComplexPanel { } } + Cell getCell(int row, int col) { + return cells[col][row]; + } + /** - * Returns the Cell with the given coordinates. Creates a new Cell if an - * existing was not found and also updates the Cell based on the given UIDL. + * Creates a new Cell with the given coordinates. If an existing cell was + * found, returns that one. * * @param row * @param col * @return */ - Cell getCell(int row, int col, UIDL c) { - Cell cell = cells[col][row]; + Cell createCell(int row, int col) { + Cell cell = getCell(row, col); if (cell == null) { cell = new Cell(row, col); cells[col][row] = cell; } - cell.updateFromUidl(c); return cell; } @@ -652,4 +655,20 @@ public class VGridLayout extends ComplexPanel { } } + public void setSize(int rows, int cols) { + if (cells == null) { + cells = new Cell[cols][rows]; + } else if (cells.length != cols || cells[0].length != rows) { + Cell[][] newCells = new Cell[cols][rows]; + for (int i = 0; i < cells.length; i++) { + for (int j = 0; j < cells[i].length; j++) { + if (i < cols && j < rows) { + newCells[i][j] = cells[i][j]; + } + } + } + cells = newCells; + } + } + } -- cgit v1.2.3 From 7a73577a35c53a73093f5a2a245cd1944fd64130 Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Tue, 10 Apr 2012 11:15:47 +0300 Subject: Fixed NPE in click listener --- .../gwt/client/ui/AbsoluteLayoutConnector.java | 18 +++++++++++++++++- .../vaadin/terminal/gwt/client/ui/VAbsoluteLayout.java | 16 ---------------- 2 files changed, 17 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/AbsoluteLayoutConnector.java b/src/com/vaadin/terminal/gwt/client/ui/AbsoluteLayoutConnector.java index d29f3dadb3..6a911fc321 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/AbsoluteLayoutConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/AbsoluteLayoutConnector.java @@ -15,6 +15,7 @@ import com.vaadin.terminal.gwt.client.ComponentConnector; import com.vaadin.terminal.gwt.client.Connector; import com.vaadin.terminal.gwt.client.ConnectorHierarchyChangeEvent; import com.vaadin.terminal.gwt.client.DirectionalManagedLayout; +import com.vaadin.terminal.gwt.client.Util; import com.vaadin.terminal.gwt.client.VCaption; import com.vaadin.terminal.gwt.client.communication.RpcProxy; import com.vaadin.terminal.gwt.client.communication.ServerRpc; @@ -55,7 +56,7 @@ public class AbsoluteLayoutConnector extends @Override protected ComponentConnector getChildComponent(Element element) { - return getWidget().getComponent(element); + return getConnectorForElement(element); } @Override @@ -75,6 +76,21 @@ public class AbsoluteLayoutConnector extends rpc = RpcProxy.create(AbsoluteLayoutServerRPC.class, this); } + /** + * Returns the deepest nested child component which contains "element". The + * child component is also returned if "element" is part of its caption. + * + * @param element + * An element that is a nested sub element of the root element in + * this layout + * @return The Paintable which the element is a part of. Null if the element + * belongs to the layout and not to a child. + */ + protected ComponentConnector getConnectorForElement(Element element) { + return Util.getConnectorForElement(getConnection(), getWidget(), + element); + } + public void updateCaption(ComponentConnector component) { VAbsoluteLayout absoluteLayoutWidget = getWidget(); AbsoluteWrapper componentWrapper = getWrapper(component); diff --git a/src/com/vaadin/terminal/gwt/client/ui/VAbsoluteLayout.java b/src/com/vaadin/terminal/gwt/client/ui/VAbsoluteLayout.java index c5c3834d4b..4b411e910c 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VAbsoluteLayout.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VAbsoluteLayout.java @@ -12,8 +12,6 @@ import com.google.gwt.user.client.ui.ComplexPanel; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; import com.vaadin.terminal.gwt.client.ApplicationConnection; -import com.vaadin.terminal.gwt.client.ComponentConnector; -import com.vaadin.terminal.gwt.client.Util; import com.vaadin.terminal.gwt.client.VCaption; public class VAbsoluteLayout extends ComplexPanel { @@ -133,18 +131,4 @@ public class VAbsoluteLayout extends ComplexPanel { } } - /** - * Returns the deepest nested child component which contains "element". The - * child component is also returned if "element" is part of its caption. - * - * @param element - * An element that is a nested sub element of the root element in - * this layout - * @return The Paintable which the element is a part of. Null if the element - * belongs to the layout and not to a child. - */ - ComponentConnector getComponent(Element element) { - return Util.getConnectorForElement(client, this, element); - } - } -- cgit v1.2.3 From 105d563f6622256d00d580dc52cc302e7c810e56 Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Tue, 10 Apr 2012 11:16:15 +0300 Subject: Fixed problem with captions always being in the top left corner --- src/com/vaadin/terminal/gwt/client/ui/AbsoluteLayoutConnector.java | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/com/vaadin/terminal/gwt/client/ui/AbsoluteLayoutConnector.java b/src/com/vaadin/terminal/gwt/client/ui/AbsoluteLayoutConnector.java index 6a911fc321..7e1683934c 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/AbsoluteLayoutConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/AbsoluteLayoutConnector.java @@ -103,6 +103,7 @@ public class AbsoluteLayoutConnector extends if (caption == null) { caption = new VCaption(component, getConnection()); absoluteLayoutWidget.add(caption); + componentWrapper.setCaption(caption); } caption.updateCaption(); componentWrapper.updateCaptionPosition(); -- cgit v1.2.3