package de.tud.kom.socom.web.client.influence.audio; import java.util.Date; import java.util.LinkedList; import java.util.List; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.KeyUpEvent; import com.google.gwt.event.shared.HandlerRegistration; 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.ui.Button; import com.google.gwt.user.client.ui.FileUpload; 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.TextBox; import com.google.gwt.user.client.ui.Widget; import de.tud.kom.socom.web.client.administration.itemadministration.ItemAdministration; 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.reporting.ItemReportView; import de.tud.kom.socom.web.client.sharedmodels.SimpleEntry; /** * @author jkonert * */ public class InfluenceAnswerFreeAudioView extends InfluenceAnswerAudioView implements InfluencePresenter.InfluenceFreeAnswerWithFileViewInterface<AnswerAudio> { @UiTemplate("InfluenceAnswerAudioView.ui.xml") // same! template like TextAnswer without Free interface InfluenceAnswerFreeTextViewUiBinder extends UiBinder<Widget, InfluenceAnswerFreeAudioView> { } private static InfluenceAnswerFreeTextViewUiBinder uiBinder = GWT.create(InfluenceAnswerFreeTextViewUiBinder.class); // @UiField inherited plus: @UiField TextBox answerTextBox; @UiField FormPanel answerForm; // needed to submit the file @UiField HTMLPanel answerFormHiddenContainer; // needed to add/remove some Hidden Inputs for submit @UiField FileUpload answerFileUpload; // do NOT give the FileUpload and Form a hidden IFRAME yourself. They do it themselves @UiField Button answerFileUploadSubmit; @UiField protected ItemAdministration itemAdministration; @UiField protected ItemReportView itemReportView; String oldTextBoxValue; String oldFileUploadValue; private List<Hidden> hiddenParams; // a temprorary memory of items added to form..will be removed on next submit before new params are added /** * @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 InfluenceAnswerFreeAudioView(boolean isResultView, int expectedAnswerLength) { super(isResultView); if (!isResultView) { this.answerLabel.addClassName("hidden"); this.itemReportView.addStyleName("hidden"); this.audioControl.addStyleName("hidden"); this.answerForm.removeStyleName("hidden"); this.itemAdministration.addStyleName("hidden"); if (expectedAnswerLength <= 10) expectedAnswerLength = 10; else if (expectedAnswerLength > 130) expectedAnswerLength = 130; this.answerTextBox.getElement().getStyle().setProperty("width", expectedAnswerLength, Unit.EX); this.oldTextBoxValue = this.answerTextBox.getValue(); this.oldFileUploadValue = this.answerFileUpload.getFilename(); this.setSubmitEnabled((this.oldFileUploadValue != null && !this.oldFileUploadValue.equals(""))); this.answerFileUpload.setName("data"); // not possible via XML...but server looks for this field } } @Override void initWidget() { initWidget(uiBinder.createAndBindUi(this)); } @UiHandler("answerFileUpload") public void onValueChangeFileUpload(ChangeEvent event) { // nothing. do it on submit click.. String value = this.answerFileUpload.getFilename(); this.setSubmitEnabled(( value!= null && value != "")); } @UiHandler("answerFileUploadSubmit") public void onFileSubmitButtonClicked(ClickEvent event) { if (oldFileUploadValue == answerFileUpload.getFilename()) return; this.fireEvent(new FormValueChangeEvent(this, ChangeType.file, answerCheckbox.getValue(), oldFileUploadValue, answerFileUpload.getFilename(), null)); oldFileUploadValue = answerFileUpload.getFilename(); this.setSubmitEnabled((oldFileUploadValue != answerFileUpload.getFilename())); } @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)); } @UiHandler("answerTextBox") public void onValueChangeTextBox(KeyUpEvent event) { // update the label & userinfo // if first typing try to select this field automatically and if empty deselect automatically // all done by presenter checkAndProcessTextBoxValueChange(); } private void checkAndProcessTextBoxValueChange() { if (oldTextBoxValue == answerTextBox.getValue()) return; this.fireEvent(new FormValueChangeEvent(this, ChangeType.message, answerCheckbox.getValue(), oldTextBoxValue, answerTextBox.getValue(), null)); oldTextBoxValue = answerTextBox.getValue(); } @Override public void setAnswer(AnswerAudio answer) { super.setAnswer(answer); if (answer == null) answerLabel.addClassName("hidden"); // maybe animate this.. } @Override public void setFromUser(long userId, String userName, Date created) { super.setFromUser(userId, userName, created); if (created == null && (userName == null || userName.equals(""))) fromUserContainer.addClassName("hidden"); } @Override public AnswerAudio getFreeAnswerValue() { return new AnswerAudio(this.audioControl.getFilePath(),this.answerTextBox.getValue()); // TODO JK check if the path is not better read from input.. } /** * the submitted binary-data will be called "data" field. Thus prevent overriding this by given params.. */ @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) { this.answerForm.setAction(action); if (this.hiddenParams != null) {// remove old params from former upload.. for(Hidden h: this.hiddenParams) { this.answerFormHiddenContainer.remove(h); } this.hiddenParams = null; } // add new hidden params if given if (hiddenParameters != null) { this.hiddenParams = new LinkedList<Hidden>(); for (int i = 0; i< hiddenParameters.length; i++) { SimpleEntry<String, String> e = hiddenParameters[i]; Hidden ip = new Hidden(e.getKey(), e.getValue()); hiddenParams.add(ip); this.answerFormHiddenContainer.add(ip); } } this.answerForm.submit(); } @Override public void setSubmitEnabled(boolean enabled) { this.answerFileUploadSubmit.setEnabled(enabled); } @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 disableAddAnswer() { // ignore since we have no "add new answer"-Button here } }