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.uibinder.client.UiChild;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.ValueBoxBase;
import com.google.gwt.user.client.ui.Widget;
import org.gwtbootstrap3.client.ui.constants.Placement;
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 a ValueBoxBase widget of type T.</p>
* <p>It displays the editor errors using a bootstrap tooltip.</p>
*
* @since 0.4.0
*/
@Dependent
public class ValueBoxEditor<T> implements IsWidget, LeafAttributeEditor<T> {
public interface View<T> extends UberView<ValueBoxEditor<T>> {
@UiChild(limit = 1, tagname = "valuebox")
void setValueBox(final ValueBoxBase<T> widget);
View<T> addHelpContent(final String title, final String content, final Placement placement);
View<T> setValue(T value);
View<T> showError(final SafeHtml message);
View<T> clearError();
}
Event<org.dashbuilder.common.client.event.ValueChangeEvent<T>> valueChangeEvent;
public View<T> view;
T value;
@Inject
public ValueBoxEditor(final View<T> view,
final Event<org.dashbuilder.common.client.event.ValueChangeEvent<T>> valueChangeEvent) {
this.view = view;
this.valueChangeEvent = valueChangeEvent;
}
@PostConstruct
public void init() {
view.init(this);
}
public void addHelpContent(final String title, final String content, final Placement placement) {
view.addHelpContent(title, content, placement);
}
@Override
public void showErrors(List<EditorError> errors) {
StringBuilder sb = new StringBuilder();
for (final 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(T value) {
this.value = value;
view.setValue(value);
}
@Override
public T getValue() {
return value;
}
void onValueChanged(final T 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.
T before = this.value;
this.value = value;
// Fire the value change event.
valueChangeEvent.fire(new org.dashbuilder.common.client.event.ValueChangeEvent<T>(this, before, this.value));
}
}