package de.tud.kom.socom.web.client.influence.image; import org.moxieapps.gwt.uploader.client.File; import org.moxieapps.gwt.uploader.client.Uploader; import org.moxieapps.gwt.uploader.client.events.UploadErrorEvent; import org.moxieapps.gwt.uploader.client.events.UploadErrorHandler; import org.moxieapps.gwt.uploader.client.events.UploadSuccessEvent; import org.moxieapps.gwt.uploader.client.events.UploadSuccessHandler; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.JsArray; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.DragEnterEvent; import com.google.gwt.event.dom.client.DragEnterHandler; import com.google.gwt.event.dom.client.DragLeaveEvent; import com.google.gwt.event.dom.client.DragLeaveHandler; import com.google.gwt.event.dom.client.DragOverEvent; import com.google.gwt.event.dom.client.DragOverHandler; import com.google.gwt.event.dom.client.DropEvent; import com.google.gwt.event.dom.client.DropHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.json.client.JSONObject; import com.google.gwt.json.client.JSONString; import com.google.gwt.safehtml.shared.SafeUri; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.uibinder.client.UiTemplate; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.ui.FileUpload; import com.google.gwt.user.client.ui.FocusPanel; import com.google.gwt.user.client.ui.FormPanel; import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteEvent; import com.google.gwt.user.client.ui.FormPanel.SubmitEvent; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.Hidden; import com.google.gwt.user.client.ui.Widget; import de.tud.kom.socom.web.client.eventhandler.FormSubmitCompleteEventHandler; import de.tud.kom.socom.web.client.eventhandler.FormSubmitEventHandler; import de.tud.kom.socom.web.client.events.FormSubmitCompleteEvent; import de.tud.kom.socom.web.client.events.FormSubmitEvent; import de.tud.kom.socom.web.client.events.FormValueChangeEvent; import de.tud.kom.socom.web.client.events.FormValueChangeEvent.ChangeType; import de.tud.kom.socom.web.client.influence.InfluencePresenter; import de.tud.kom.socom.web.client.sharedmodels.SimpleEntry; import de.tud.kom.socom.web.client.util.InputDialogBox; import de.tud.kom.socom.web.client.util.InputDialogBox.InputCallback; /** * @author rhaban * */ public class InfluenceAnswerFreeImageView extends InfluenceAnswerImageView implements InfluencePresenter.InfluenceFreeAnswerWithFileViewInterface<AnswerImage> { @UiTemplate("InfluenceAnswerImageView.ui.xml") interface InfluenceAnswerFreeTextViewUiBinder extends UiBinder<Widget, InfluenceAnswerFreeImageView> { } private static InfluenceAnswerFreeTextViewUiBinder uiBinder = GWT.create(InfluenceAnswerFreeTextViewUiBinder.class); // @UiField inherited plus: @UiField FocusPanel freeimg; @UiField FormPanel answerForm; @UiField FileUpload answerFileUpload; @UiField HTMLPanel answerFormHiddenContainer; //uploader for drag n drop uploads private Uploader uploader; /** * @param isResultView * if set true, this view displays itself as a result view and * does not report/display any inputs for a form * @param expectedAnswerLength * number of chars expected for answer length (helps view to * layout the input properly) */ public InfluenceAnswerFreeImageView(boolean isResultView, int expectedAnswerLength) { super(isResultView); this.itemReportView.addStyleName("hidden"); this.itemAdministration.addStyleName("hidden"); this.img.addStyleName("hidden"); this.answerLabel.addStyleName("hidden"); this.magnifier.addStyleName("hidden"); this.freeimg.removeStyleName("hidden"); this.answerFileUpload.setName("data"); // not possible via XML...but // server looks for this field } @Override void initWidget() { initWidget(uiBinder.createAndBindUi(this)); initDropHandler(); } private void initDropHandler() { if (Uploader.isAjaxUploadWithProgressEventsSupported()) { uploader = new Uploader(); freeimg.addDragOverHandler(new DragOverHandler() { @Override public void onDragOver(DragOverEvent event) { event.preventDefault(); } }); freeimg.addDragEnterHandler(new DragEnterHandler() { @Override public void onDragEnter(DragEnterEvent event) { event.preventDefault(); } }); freeimg.addDragLeaveHandler(new DragLeaveHandler() { @Override public void onDragLeave(DragLeaveEvent event) { event.preventDefault(); } }); freeimg.addDropHandler(new DropHandler() { @Override public void onDrop(DropEvent event) { @SuppressWarnings("unchecked") JsArray<File> droppedFiles = Uploader.getDroppedFiles(event.getNativeEvent()); uploader.addFilesToQueue(droppedFiles); final String value = droppedFiles.get(0).getName(); InputDialogBox inputDialogBox = new InputDialogBox("Gib eine Nachricht ein.", new InputCallback() { @Override public boolean isInputValid(String input) { return input.length() > 2 && input.length() < 200; } @Override public void callbackOK(String input) { fireEvent(new FormValueChangeEvent(InfluenceAnswerFreeImageView.this, ChangeType.file_drop, true, null, value, input)); } @Override public void callbackCancel() { // do nothing } }); inputDialogBox.center(); inputDialogBox.show(); event.preventDefault(); } }); } } @UiHandler("freeimg") public void onAddImageClicked(ClickEvent e) { fakeAddImageFormClick(answerFileUpload.getElement()); } // this native method fakes a click on the hidden upload form private static native void fakeAddImageFormClick(Element element) /*-{ element.click(); }-*/; @UiHandler("answerFileUpload") public void onValueChangeFileUpload(ChangeEvent event) { // start upload on select image final String value = this.answerFileUpload.getFilename(); InputDialogBox inputDialogBox = new InputDialogBox("Gib eine Nachricht ein.", new InputCallback() { @Override public boolean isInputValid(String input) { return input.length() > 2 && input.length() < 200; } @Override public void callbackOK(String input) { fireEvent(new FormValueChangeEvent(InfluenceAnswerFreeImageView.this, ChangeType.file, true, null, value, input)); } @Override public void callbackCancel() { //do nothing } }); inputDialogBox.center(); inputDialogBox.show(); } @UiHandler("answerForm") public void onFileFormSubmitComplete(SubmitCompleteEvent event) { this.fireEvent(new FormSubmitCompleteEvent(this, event.getResults())); } @UiHandler("answerForm") public void onFileFormSubmitComplete(SubmitEvent event) { this.fireEvent(new FormSubmitEvent(this)); } @Override public void submitFile(SafeUri action, SimpleEntry<String, String>... hiddenParameters) { submitFile(ChangeType.file, action, hiddenParameters); } @Override public void submitFile(ChangeType type, SafeUri action, SimpleEntry<String, String>... hiddenParameters) { switch(type) { case file: this.answerForm.setAction(action); // add new hidden params if given if (hiddenParameters != null) { for (int i = 0; i < hiddenParameters.length; i++) { SimpleEntry<String, String> e = hiddenParameters[i]; Hidden ip = new Hidden(e.getKey(), e.getValue()); this.answerFormHiddenContainer.add(ip); } } this.answerForm.submit(); break; case file_drop: uploader.setUploadURL(action.asString()); JSONObject postParams = new JSONObject(); for(SimpleEntry<String, String> se : hiddenParameters) { postParams.put(se.getKey(), new JSONString(se.getValue())); } uploader.setPostParams(postParams); uploader.startUpload(); uploader.setUploadSuccessHandler(new UploadSuccessHandler() { @Override public boolean onUploadSuccess(UploadSuccessEvent uploadSuccessEvent) { fireEvent(new FormSubmitCompleteEvent(InfluenceAnswerFreeImageView.this, uploadSuccessEvent.getServerData())); return true; } }); uploader.setUploadErrorHandler(new UploadErrorHandler() { @Override public boolean onUploadError(UploadErrorEvent uploadErrorEvent) { fireEvent(new FormSubmitCompleteEvent(InfluenceAnswerFreeImageView.this, uploadErrorEvent.getMessage())); return true; } }); break; default: break; } } @Override public HandlerRegistration addFormSubmitHandler(FormSubmitEventHandler handler) { return this.addHandler(handler, de.tud.kom.socom.web.client.events.FormSubmitEvent.TYPE); } @Override public HandlerRegistration addFormSubmitCompleteHandler(FormSubmitCompleteEventHandler handler) { return this.addHandler(handler, de.tud.kom.socom.web.client.events.FormSubmitCompleteEvent.TYPE); } @Override public void setSubmitEnabled(boolean enabled) { // no submit button } @Override public void disableAddAnswer() { // no "add answer" button } @Override public AnswerImage getFreeAnswerValue() { throw new RuntimeException("cant know answer here"); // and also shouldnt be called } }