package org.dashbuilder.common.client.editor.list; 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.safehtml.shared.SafeUri; import com.google.gwt.user.client.ui.IsWidget; import com.google.gwt.user.client.ui.Widget; import org.dashbuilder.common.client.editor.LeafAttributeEditor; import org.gwtbootstrap3.client.ui.constants.Placement; import org.uberfire.mvp.Command; import javax.annotation.PostConstruct; import javax.enterprise.event.Event; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** * <p>Presenter for a gwt editor component that accepts multiple values and display each one using a given image.</p> * <p>The validation error messages are displayed by changing border color to RED and showing the message using a tooltip.</p> * <p>This component is typically used for handling enums.</p> * * @param <T> The edited type. * * @since 0.4.0 */ public abstract class ImageListEditor<T> implements IsWidget, LeafAttributeEditor<T> { private static final String IMAGE_SIZE = "160px"; public class Entry { private T value; private SafeUri uri; private SafeHtml heading; private SafeHtml text; private Entry(final T value, final SafeUri uri, final SafeHtml heading, final SafeHtml text) { this.value = value; this.uri = uri; this.heading = heading; this.text = text; } public T getValue() { return value; } public SafeUri getUri() { return uri; } public SafeHtml getHeading() { return heading; } public SafeHtml getText() { return text; } } Event<org.dashbuilder.common.client.event.ValueChangeEvent<T>> valueChangeEvent; public ImageListEditorView<T> view; final List<Entry> entries = new ArrayList<Entry>(); String imageWidth = IMAGE_SIZE; String imageHeight = IMAGE_SIZE; T value; public ImageListEditor(final ImageListEditorView<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 Entry newEntry(final T value, final SafeUri uri, final SafeHtml heading, final SafeHtml text) { return new Entry(value, uri, heading, text); } public void setEntries(final Collection<Entry> entries) { this.entries.clear(); if (entries != null) { this.entries.addAll(entries); } showElements(); } public void setImageSize(final String w, final String h) { this.imageWidth = w; this.imageHeight = h; } public void addHelpContent(final String title, final String content, final Placement placement) { view.addHelpContent(title, content, placement); } /************************************************************* ** GWT EDITOR CONTRACT METHODS ** *************************************************************/ @Override public void showErrors(final List<EditorError> errors) { StringBuilder sb = new StringBuilder(); for (EditorError error : errors) { if (error.getEditor().equals(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 T getValue() { return value; } @Override public void setValue(final T value) { setValue(value, false); } public void setValue(final T value, final boolean fireEvents) { if (this.value != null && this.value.equals(value)) return; T before = this.value; this.value = value; showElements(); if (fireEvents) { valueChangeEvent.fire(new org.dashbuilder.common.client.event.ValueChangeEvent<T>(this, before, this.value)); } } @Override public Widget asWidget() { return view.asWidget(); } public void clear() { this.entries.clear(); this.imageWidth = IMAGE_SIZE; this.imageHeight = IMAGE_SIZE; this.value = null; view.clear(); } /************************************************************* ** PRIVATE EDITOR METHODS ** *************************************************************/ protected void showElements() { view.clear(); for (final Entry entry : entries) { final boolean selected = this.value == null || entry.getValue().equals(this.value); view.add(entry.getUri(), this.imageWidth, this.imageHeight, entry.getHeading(), entry.getText(), selected, new Command() { @Override public void execute() { ImageListEditor.this.setValue(entry.getValue(), true); } }); } } }