package org.activityinfo.ui.client.component.importDialog.source; import com.google.common.base.Strings; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.KeyUpEvent; import com.google.gwt.event.dom.client.KeyUpHandler; import com.google.gwt.event.shared.EventBus; 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.user.client.ui.ResizeComposite; import com.google.gwt.user.client.ui.Widget; import org.activityinfo.core.client.type.converter.JsConverterFactory; import org.activityinfo.core.shared.importing.model.ImportModel; import org.activityinfo.i18n.shared.I18N; import org.activityinfo.ui.client.component.importDialog.ImportPage; import org.activityinfo.ui.client.component.importDialog.PageChangedEvent; import org.activityinfo.ui.client.component.importDialog.data.PastedTable; import org.activityinfo.ui.client.widget.TextArea; /** * Start page for the table import process that prompts the user * for pasted table data */ public class ChooseSourcePage extends ResizeComposite implements ImportPage { private static ChoosePageUiBinder uiBinder = GWT .create(ChoosePageUiBinder.class); interface ChoosePageUiBinder extends UiBinder<Widget, ChooseSourcePage> { } private ImportModel model; private final EventBus eventBus; @UiField TextArea textArea; public ChooseSourcePage(ImportModel model, EventBus eventBus) { this.model = model; this.eventBus = eventBus; initWidget(uiBinder.createAndBindUi(this)); textArea.addKeyUpHandler(new KeyUpHandler() { @Override public void onKeyUp(KeyUpEvent event) { fireStateChanged(); } }); } public void fireStateChanged() { // validate boolean valid = false; PastedTable pastedTable = null; try { pastedTable = new PastedTable(textArea.getValue()); valid = !pastedTable.getRows().isEmpty(); } catch (Exception e) { // ignore : text is not valid } if (valid) { pastedTable.guessColumnsType(JsConverterFactory.get()); model.setSource(pastedTable); eventBus.fireEvent(new PageChangedEvent(true, "")); } else { eventBus.fireEvent(new PageChangedEvent(false, errorMessage(pastedTable))); } } private String errorMessage(PastedTable pastedTable) { if (pastedTable != null && pastedTable.getFirstInvalidRow() > 0) { return I18N.MESSAGES.pleaseProvideCommaSeparatedText(pastedTable.getFirstInvalidRow()); } return I18N.CONSTANTS.pleaseProvideCommaSeparatedText(); } @UiHandler("textArea") public void onTextChanged(ChangeEvent event) { fireStateChanged(); } @Override public boolean isValid() { if (!Strings.isNullOrEmpty(textArea.getValue())) { try { final PastedTable pastedTable = new PastedTable(textArea.getValue()); return !pastedTable.getRows().isEmpty(); } catch (Exception e) { // ignore : text is not valid } } return false; } @Override public boolean hasNextStep() { return false; } @Override public boolean hasPreviousStep() { return false; } @Override public void start() { } @Override public void nextStep() { } @Override public void previousStep() { } }