package org.dashbuilder.common.client.editor; import com.google.gwt.editor.client.EditorError; import com.google.gwt.editor.client.HasEditorErrors; import com.google.gwt.editor.client.LeafValueEditor; import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.user.client.ui.IsWidget; import com.google.gwt.user.client.ui.Widget; import org.uberfire.client.mvp.UberView; import javax.annotation.PostConstruct; import javax.enterprise.context.Dependent; import javax.enterprise.event.Event; import javax.inject.Inject; import java.util.List; /** * <p>Provides an editor for Boolean values using a toggle switch for the view.</p> * <p>It displays the editor errors using a bootstrap tooltip.</p> * * @since 0.4.0 */ @Dependent public class ToggleSwitchEditor implements IsWidget, LeafAttributeEditor<Boolean> { public interface View extends UberView<ToggleSwitchEditor> { View setValue(Boolean value); View setEnabled(Boolean value); View showError(final SafeHtml message); View clearError(); } Event<org.dashbuilder.common.client.event.ValueChangeEvent<Boolean>> valueChangeEvent; public View view; Boolean value; @Inject public ToggleSwitchEditor(final View view, final Event<org.dashbuilder.common.client.event.ValueChangeEvent<Boolean>> valueChangeEvent) { this.view = view; this.valueChangeEvent = valueChangeEvent; } @PostConstruct public void init() { view.init(this); } public void setEnabled(final boolean isEnabled) { view.setEnabled(isEnabled); } @Override public void showErrors(List<EditorError> errors) { StringBuilder sb = new StringBuilder(); for (EditorError error : errors) { if (error.getEditor() == this) { sb.append("\n").append(error.getMessage()); } } boolean hasErrors = sb.length() > 0; if (!hasErrors) { view.clearError(); return; } // Show the errors. view.showError(new SafeHtmlBuilder().appendEscaped(sb.substring(1)).toSafeHtml()); } @Override public Widget asWidget() { return view.asWidget(); } @Override public void setValue(Boolean value) { this.value = value; view.setValue(value); } @Override public Boolean getValue() { return value; } void onValueChanged(final Boolean value) { // Check value is not same one as current. if (this.value != null && this.value.equals(value)) return; // Clear error messages on the view. view.clearError(); // Set the new value. Boolean before = this.value; this.value = value; // Fire the value change event. valueChangeEvent.fire(new org.dashbuilder.common.client.event.ValueChangeEvent<Boolean>(this, before, this.value)); } }