From c1608eea9df1c3409100e9ea151b6023c881577d Mon Sep 17 00:00:00 2001 From: Matti Tahvonen Date: Fri, 7 May 2010 14:55:24 +0000 Subject: [PATCH] fixes #4654, added virtual client side synchronization for UI check that happens after the upload started event svn changeset:13085/svn branch:6.3 --- .../terminal/gwt/client/ui/VUpload.java | 10 +++++++- src/com/vaadin/ui/Upload.java | 23 ++++++++++++++++--- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/com/vaadin/terminal/gwt/client/ui/VUpload.java b/src/com/vaadin/terminal/gwt/client/ui/VUpload.java index d164de79db..ce3012b3b0 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VUpload.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VUpload.java @@ -99,6 +99,8 @@ public class VUpload extends SimplePanel implements Paintable { private com.google.gwt.dom.client.Element synthesizedFrame; + private int nextUploadId; + public VUpload() { super(com.google.gwt.dom.client.Document.get().createFormElement()); @@ -136,9 +138,14 @@ public class VUpload extends SimplePanel implements Paintable { if (client.updateComponent(this, uidl, true)) { return; } + if (uidl.hasAttribute("notStarted")) { + t.schedule(400); + return; + } setImmediate(uidl.getBooleanAttribute("immediate")); this.client = client; paintableId = uidl.getId(); + nextUploadId = uidl.getIntAttribute("nextid"); element.setAction(client.getAppUri()); submitButton.setText(uidl.getStringAttribute("buttoncaption")); fu.setName(paintableId + "_file"); @@ -265,7 +272,8 @@ public class VUpload extends SimplePanel implements Paintable { .getConsole() .log( "Visiting server to see if upload started event changed UI."); - client.sendPendingVariableChanges(); + client.updateVariable(paintableId, "pollForStart", + nextUploadId, true); } }; t.schedule(800); diff --git a/src/com/vaadin/ui/Upload.java b/src/com/vaadin/ui/Upload.java index 49cf159e0a..0e2f022561 100644 --- a/src/com/vaadin/ui/Upload.java +++ b/src/com/vaadin/ui/Upload.java @@ -100,6 +100,10 @@ public class Upload extends AbstractComponent implements Component.Focusable { private boolean interrupted = false; + private boolean notStarted; + + private int nextid; + /* TODO: Add a default constructor, receive to temp file. */ /** @@ -219,8 +223,14 @@ public class Upload extends AbstractComponent implements Component.Focusable { */ @Override public void changeVariables(Object source, Map variables) { - // NOP - + if (variables.containsKey("pollForStart")) { + int id = (Integer) variables.get("pollForStart"); + if (!isUploading && id == nextid) { + notStarted = true; + requestRepaint(); + } else { + } + } } /** @@ -233,6 +243,11 @@ public class Upload extends AbstractComponent implements Component.Focusable { */ @Override public void paintContent(PaintTarget target) throws PaintException { + if (notStarted) { + target.addAttribute("notStarted", true); + notStarted = false; + return; + } // The field should be focused if (focus) { target.addAttribute("focus", true); @@ -247,7 +262,8 @@ public class Upload extends AbstractComponent implements Component.Focusable { target.addAttribute("buttoncaption", buttonCaption); - target.addUploadStreamVariable(this, "stream"); + target.addAttribute("nextid", nextid); + } /** @@ -906,6 +922,7 @@ public class Upload extends AbstractComponent implements Component.Focusable { throw new IllegalStateException("uploading already started"); } isUploading = true; + nextid++; } /** -- 2.39.5