package kornell.gui.client.util.forms.formfield; import static kornell.core.util.StringUtils.isNone; import java.util.List; import com.github.gwtbootstrap.client.ui.Icon; import com.github.gwtbootstrap.client.ui.ListBox; import com.github.gwtbootstrap.client.ui.TextBox; import com.github.gwtbootstrap.client.ui.Tooltip; import com.github.gwtbootstrap.client.ui.constants.Placement; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.dom.client.HasChangeHandlers; import com.google.gwt.event.dom.client.HasKeyUpHandlers; import com.google.gwt.event.dom.client.KeyUpEvent; import com.google.gwt.event.dom.client.KeyUpHandler; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Widget; import com.google.web.bindery.event.shared.EventBus; import com.google.web.bindery.event.shared.SimpleEventBus; import kornell.api.client.Callback; import kornell.gui.client.util.validation.ValidationChangedEvent; import kornell.gui.client.util.validation.ValidationChangedHandler; import kornell.gui.client.util.validation.Validator; public class KornellFormFieldWrapper extends Composite { EventBus fieldBus = new SimpleEventBus(); interface MyUiBinder extends UiBinder<Widget, KornellFormFieldWrapper> { } private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class); @UiField FlowPanel fieldPanelWrapper; @UiField FlowPanel labelPanel; @UiField Label fieldLabel; @UiField FlowPanel fieldPanel; TextBox fieldTextBox; ListBox fieldListBox; SimpleDatePicker fieldSimpleDatePicker; Label fieldError; Label fieldTxt; boolean isEditMode; KornellFormField<?> formField; private Validator validator; private String tooltipText; private Timer updateTimer; public KornellFormFieldWrapper(String label, KornellFormField<?> formField) { this(label, formField, true,null); } public KornellFormFieldWrapper(String label, KornellFormField<?> formField, boolean isEditMode){ this(label, formField, isEditMode, null); } public KornellFormFieldWrapper(String label, KornellFormField<?> formField, boolean isEditMode, Validator validator) { this(label, formField, isEditMode, validator, null); } public KornellFormFieldWrapper(String label, KornellFormField<?> formField, boolean isEditMode, Validator validator, String tooltipText) { initWidget(uiBinder.createAndBindUi(this)); fieldLabel.setText(label); if(tooltipText != null && isEditMode){ Icon icon = new Icon(); icon.addStyleName("fa fa-question-circle"); Tooltip tooltip = new Tooltip(tooltipText); tooltip.setPlacement(Placement.RIGHT); tooltip.add(icon); labelPanel.add(tooltip); } this.formField = formField; this.isEditMode = isEditMode; this.validator = validator; this.tooltipText = tooltipText; initData(formField); updateTimer = new Timer() { @Override public void run() { validate(); } }; } public void initData(KornellFormField<?> formField) { fieldPanel.clear(); this.formField = formField; if (!isEditMode) { fieldTxt = new Label(); fieldTxt.addStyleName("lblValue"); fieldTxt.setText(formField.getDisplayText()); fieldPanel.add(fieldTxt); } else { final Widget fieldWidget = formField.getFieldWidget(); fieldPanel.add(fieldWidget); if (fieldWidget instanceof HasKeyUpHandlers) { HasKeyUpHandlers ku = (HasKeyUpHandlers) fieldWidget; if(validator != null){ ku.addKeyUpHandler(new KeyUpHandler() { @Override public void onKeyUp(KeyUpEvent event) { scheduleValidation(); } }); } } if (fieldWidget instanceof HasChangeHandlers) { HasChangeHandlers ku = (HasChangeHandlers) fieldWidget; if(validator != null){ ku.addChangeHandler(new ChangeHandler() { @Override public void onChange(ChangeEvent event) { scheduleValidation(); } }); } } fieldError = new Label(); fieldError.addStyleName("error"); fieldPanel.add(fieldError); } } private void validate() { validator.getErrors(formField.getFieldWidget(), new Callback<List<String>>() { @Override public void ok(List<String> errors) { if(errors.isEmpty()){ setError(""); }else { showErrors(errors); } fieldBus.fireEvent(new ValidationChangedEvent()); } }); } public void scheduleValidation(){ updateTimer.cancel(); updateTimer.schedule(500); } private void showErrors(List<String> errorKeys) { StringBuilder buf = new StringBuilder(); for(String e:errorKeys){ buf.append(e); } setError(buf.toString()); } public KornellFormField<?> getFormField() { return formField; } public void setFieldLabelText(String text) { fieldLabel.setText(text); } public Widget getFieldWidget() { return formField.getFieldWidget(); } public String getFieldDisplayText() { return formField.getDisplayText(); } public String getFieldPersistText() { return formField.getPersistText(); } public void setError(String text) { if(fieldError != null) fieldError.setText(text); } public String getError() { return fieldError != null ? fieldError.getText() : ""; } public void clearError() { if (fieldError != null) { fieldError.setText(""); } } public void addStyleName(String styleName){ fieldPanelWrapper.addStyleName(styleName); } public boolean isValid(){ return fieldError == null || isNone(fieldError.getText()); } public void addValidationListener(ValidationChangedHandler handler) { fieldBus.addHandler(ValidationChangedEvent.TYPE, handler); } }