package de.tud.kom.socom.web.client.influence.text; import java.util.Date; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.BlurEvent; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.FocusEvent; import com.google.gwt.event.dom.client.KeyUpEvent; import com.google.gwt.event.shared.HandlerRegistration; 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.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.administration.itemadministration.ItemAdministrationState; 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.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; /** This class will never fire an FormSubmitCompleteEvent as it only can fire FormSubmitEvents on case the "add" button is clicked * @author jkonert * */ public class InfluenceAnswerFreeTextView extends InfluenceAnswerTextView implements InfluencePresenter.InfluenceFreeAnswerViewInterface<String> { @UiTemplate("InfluenceAnswerTextView.ui.xml") // same! template like TextAnswer without Free interface InfluenceAnswerFreeTextViewUiBinder extends UiBinder<Widget, InfluenceAnswerFreeTextView> { } private static InfluenceAnswerFreeTextViewUiBinder uiBinder = GWT.create(InfluenceAnswerFreeTextViewUiBinder.class); // @UiField inherited plus: @UiField TextBox answerTextBox; @UiField Button addTextButton; @UiField protected ItemAdministration itemAdministration; @UiField protected ItemReportView itemReportView; String oldTextBoxValue; public static String defaultTextBoxValue; /** * @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 InfluenceAnswerFreeTextView(boolean isResultView, int expectedAnswerLength) { super(isResultView); this.answerLabel.addClassName("hidden"); this.itemReportView.addStyleName("hidden"); this.answerTextBox.removeStyleName("hidden"); this.addTextButton.removeStyleName("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(); defaultTextBoxValue = this.oldTextBoxValue; } @Override void initWidget() { initWidget(uiBinder.createAndBindUi(this)); } @UiHandler("answerTextBox") public void onFocusTextBox(FocusEvent event) { if (this.answerTextBox.getValue().equals(defaultTextBoxValue)) { this.answerTextBox.setValue(""); } } @UiHandler("answerTextBox") public void onBlurTextBox(BlurEvent event) { if (this.answerTextBox.getValue().equals("")) { this.answerTextBox.setValue(defaultTextBoxValue); } } @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(); } @UiHandler("addTextButton") public void onClickAddTextButton(ClickEvent event) { this.fireEvent(new FormSubmitEvent(this)); } 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(String answer) { super.setAnswer(answer); if (answer == null || answer.equals("")) 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("")) && userId == -1) fromUserContainer.addClassName("hidden"); } @Override public String getFreeAnswerValue() { return this.answerTextBox.getValue(); } /** * does not really make sense to call/add here Hander, as FreeAnswers text are not uploaded via forms, but registered via ChangeEvents */ @Override public HandlerRegistration addFormSubmitHandler( FormSubmitEventHandler handler) { return this.addHandler(handler, de.tud.kom.socom.web.client.events.FormSubmitEvent.TYPE); } /** * does not really make sense to call/add here Hander, as FreeAnswers text are not uploaded via forms, but registered via ChangeEvents */ @Override public HandlerRegistration addFormSubmitCompleteHandler( FormSubmitCompleteEventHandler handler) { return this.addHandler(handler, de.tud.kom.socom.web.client.events.FormSubmitCompleteEvent.TYPE); } @Override public void disableAddAnswer() { this.addTextButton.setVisible(false); } @Override public void setAdministrationState(ItemAdministrationState state, ItemAdministration.DeleteButtonCallback cb) { itemAdministration.setState(ItemAdministrationState.none, null); } @Override public void setAdministrationState(ItemAdministrationState state) { itemAdministration.setState(ItemAdministrationState.none, null); } }