/**
* Copyright (c) 2011-2012, Thilo Planz. All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package v7cr.vaadin;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.vaadin.easyuploads.MultiUploadHandler;
import org.vaadin.easyuploads.MultiUpload.FileDetail;
import com.vaadin.terminal.PaintException;
import com.vaadin.terminal.PaintTarget;
import com.vaadin.terminal.StreamVariable;
import com.vaadin.ui.AbstractComponent;
/**
* Server side component for the VMultiUpload widget. Pretty much hacked up
* together to test new Receiver support in the GWT terminal.
*/
@SuppressWarnings("serial")
// @com.vaadin.ui.ClientWidget(org.vaadin.easyuploads.client.ui.VMultiUpload.class)
public class V7MultiUpload extends AbstractComponent {
List<FileDetail> pendingFiles = new ArrayList<FileDetail>();
private MultiUploadHandler receiver;
StreamVariable streamVariable = new StreamVariable() {
public void streamingStarted(StreamingStartEvent event) {
final FileDetail next = getPendingFileNames().iterator().next();
receiver.streamingStarted(new StreamingStartEvent() {
public String getMimeType() {
return next.getMimeType();
}
public String getFileName() {
return next.getFileName();
}
public long getContentLength() {
return next.getContentLength();
}
public long getBytesReceived() {
return 0;
}
public void disposeStreamVariable() {
}
});
}
public void streamingFinished(final StreamingEndEvent event) {
final FileDetail next = getPendingFileNames().iterator().next();
receiver.streamingFinished(new StreamingEndEvent() {
public String getMimeType() {
return next.getMimeType();
}
public String getFileName() {
return next.getFileName();
}
public long getContentLength() {
return next.getContentLength();
}
public long getBytesReceived() {
return event.getBytesReceived();
}
});
pendingFiles.remove(0);
}
public void streamingFailed(StreamingErrorEvent event) {
receiver.streamingFailed(event);
}
public void onProgress(StreamingProgressEvent event) {
receiver.onProgress(event);
}
public boolean listenProgress() {
return true;
}
public boolean isInterrupted() {
return false;
}
public OutputStream getOutputStream() {
return receiver.getOutputStream();
}
};
private boolean ready;
public void setHandler(MultiUploadHandler receiver) {
this.receiver = receiver;
}
@Override
public void paintContent(PaintTarget target) throws PaintException {
super.paintContent(target);
target.addVariable(this, "realTarget", streamVariable);
target
.addVariable(this, "target",
"http://0.0.0.0:80888/upload/vaadin");
if (ready) {
target.addAttribute("ready", true);
ready = false;
}
target.addAttribute("buttoncaption", getButtonCaption());
}
@Override
public void changeVariables(Object source, Map<String, Object> variables) {
super.changeVariables(source, variables);
if (variables.containsKey("filequeue")) {
String[] filequeue = (String[]) variables.get("filequeue");
List<FileDetail> newFiles = new ArrayList<FileDetail>(
filequeue.length);
for (String string : filequeue) {
newFiles.add(new FileDetail(string));
}
receiver.filesQueued(newFiles);
pendingFiles.addAll(newFiles);
requestRepaint();
ready = true;
}
}
public Collection<FileDetail> getPendingFileNames() {
return Collections.unmodifiableCollection(pendingFiles);
}
public void setButtonCaption(String buttonCaption) {
this.buttonCaption = buttonCaption;
}
public String getButtonCaption() {
return buttonCaption;
}
private String buttonCaption = "...";
}