package scrum.client.files;
import gwtupload.client.IFileInput.FileInputType;
import gwtupload.client.IUploadStatus;
import gwtupload.client.IUploadStatus.Status;
import gwtupload.client.IUploader;
import gwtupload.client.SingleUploader;
import gwtupload.client.Uploader;
import ilarkesto.core.logging.Log;
import ilarkesto.core.scope.Scope;
import java.util.Set;
import scrum.client.common.AScrumWidget;
import scrum.client.communication.PingServiceCall;
import scrum.client.project.Project;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.FormPanel;
import com.google.gwt.user.client.ui.Hidden;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
public class UploadWidget extends AScrumWidget {
private static final Log log = Log.get(UploadWidget.class);
private FormFlowPanel formPanel = new FormFlowPanel();
private Button button = new Button();
private Label statusLabel;
private SingleUploader uploader;
private DialogBox dialog;
public UploadWidget() {
statusLabel = new Label();
uploader = new SingleUploader(FileInputType.BROWSER_INPUT, new UploadStatus(), button, formPanel);
uploader.setAutoSubmit(true);
Uploader.setStatusInterval(1000);
}
@Override
protected Widget onInitialization() {
uploader.addOnFinishUploadHandler(new FinishHandler());
return uploader;
}
@Override
protected void onUpdate() {
super.onUpdate();
button.setVisible(false);
}
public static UploadWidget showDialog(Integer topPosition) {
UploadWidget uploadWidget = new UploadWidget();
uploadWidget.dialog = new DialogBox(true, true);
DialogBox dialog = uploadWidget.dialog;
dialog.setAnimationEnabled(true);
dialog.setWidget(uploadWidget.update());
dialog.center();
if (topPosition != null) dialog.setPopupPosition(dialog.getPopupLeft(), topPosition);
dialog.show();
return uploadWidget;
}
public DialogBox getDialog() {
return dialog;
}
private class FinishHandler implements IUploader.OnFinishUploaderHandler {
@Override
public void onFinish(IUploader ul) {
if (ul.getStatus() != Status.SUCCESS) {
new PingServiceCall().execute();
if (dialog != null) dialog.hide();
}
}
}
private class UploadStatus implements IUploadStatus {
private Status status;
private String filename;
@Override
public HandlerRegistration addCancelHandler(UploadCancelHandler handler) {
return null;
}
@Override
public Status getStatus() {
return status;
}
@Override
public Widget getWidget() {
return statusLabel;
}
@Override
public IUploadStatus newInstance() {
return null;
}
@Override
public void setCancelConfiguration(Set<CancelBehavior> config) {
Log.DEBUG("----------------------> setCancelConfiguration()");
}
@Override
public void setError(String error) {
log.error("Upload failed: " + error);
Window.alert("Upload failed: " + error);
statusLabel.setText(error);
}
@Override
public void setFileName(String name) {
this.filename = name;
}
@Override
public void setI18Constants(UploadStatusConstants strs) {
Log.DEBUG("----------------------> setI18()");
}
@Override
public void setStatus(Status status) {
Log.DEBUG("Upload status changed:", status);
if (this.status == null) {
dialog.setAutoHideEnabled(false);
formPanel.hideFileField();
statusLabel.getElement().getStyle().setPadding(10, Unit.PX);
} else if (status != Status.INPROGRESS && filename != null) {
statusLabel.setText("Uploading " + filename);
}
this.status = status;
}
@Override
public void setStatusChangedHandler(UploadStatusChangedHandler handler) {}
@Override
public void setVisible(boolean b) {}
@Override
public void setProgress(int done, int total) {
Log.DEBUG("Progress: " + done + "/" + total);
if (total == 0) {
statusLabel.setText("Uploading " + filename);
} else {
int percent = done * 100 / total;
statusLabel.setText("Uploading " + filename + " (" + percent + "%)");
}
}
}
public class FormFlowPanel extends FormPanel {
FlowPanel formElements = new FlowPanel();
Widget fileField;
public FormFlowPanel() {
super.add(formElements);
Project project = Scope.get().getComponent(Project.class);
Hidden projectIdField = new Hidden("projectId", project.getId());
projectIdField.setID("uploadProjectId");
add(projectIdField);
}
@Override
public void add(Widget w) {
formElements.add(w);
if (w != button) fileField = w;
}
public void hideFileField() {
fileField.setVisible(false);
}
}
}