package org.dashbuilder.common.client.editor.map; import com.google.gwt.cell.client.EditTextCell; import com.google.gwt.cell.client.FieldUpdater; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style; import com.google.gwt.editor.client.Editor; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiConstructor; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.ui.*; import org.gwtbootstrap3.client.ui.constants.ButtonSize; import org.gwtbootstrap3.client.ui.constants.IconType; import org.gwtbootstrap3.client.ui.gwt.ButtonCell; import org.gwtbootstrap3.client.ui.gwt.DataGrid; import javax.enterprise.context.Dependent; import java.util.List; import java.util.Map; /** * <p>The MapEditor view that uses a DataGrid widget.</p> * * @since 0.4.0 */ @Dependent public class MapEditorView extends Composite implements MapEditor.View { interface Binder extends UiBinder<Widget, MapEditorView> { Binder BINDER = GWT.create(Binder.class); } @UiField @Editor.Ignore HTMLPanel mainPanel; @UiField @Editor.Ignore ScrollPanel gridPanel; @UiField DataGrid<Map.Entry<String, String>> grid; @UiField @Editor.Ignore org.gwtbootstrap3.client.ui.Button addButton; @UiField @Editor.Ignore org.gwtbootstrap3.client.ui.Label errorLabel; private MapEditor presenter; @UiConstructor public MapEditorView() { initWidget(Binder.BINDER.createAndBindUi(this)); addButton.addClickHandler(new ClickHandler() { @Override public void onClick(final ClickEvent event) { presenter.addEntry(); } }); } @Override public void init(final MapEditor presenter) { this.presenter = presenter; } @Override public MapEditor.View setEmptyText(final String text) { grid.setEmptyTableWidget(new org.gwtbootstrap3.client.ui.Label(text)); return this; } @Override public MapEditor.View setAddText(final String text) { addButton.setText(text); addButton.setTitle(text); return this; } @Override public MapEditor.View addTextColumn(final int columnIndex, final String heading, boolean isSortable, int width) { final com.google.gwt.user.cellview.client.Column<Map.Entry<String, String>, String> keyColumn = new com.google.gwt.user.cellview.client.Column<Map.Entry<String, String>, String>(new EditTextCell()) { @Override public String getValue(final Map.Entry<String, String> object) { return presenter.getValue(columnIndex, object); } }; addColumn(keyColumn, columnIndex, heading, isSortable, width); return this; } @Override public MapEditor.View addButtonColumn(final int columnIndex, final String header, final int width) { final com.google.gwt.user.cellview.client.Column<Map.Entry<String, String>, String> removeColumn = new com.google.gwt.user.cellview.client.Column<Map.Entry<String, String>, String>(new ButtonCell( IconType.MINUS, ButtonSize.EXTRA_SMALL)) { @Override public String getValue(Map.Entry<String, String> object) { return presenter.getValue(columnIndex, object); } }; addColumn(removeColumn, columnIndex, header, false, width); return this; } private void addColumn(final com.google.gwt.user.cellview.client.Column<Map.Entry<String, String>, String> column, final int columnIndex, final String header, final boolean isSortable, final int width) { column.setSortable(isSortable); column.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT); grid.addColumn(column, header); grid.setColumnWidth(column, width, Style.Unit.PCT); column.setFieldUpdater(new FieldUpdater<Map.Entry<String, String>, String>() { @Override public void update(final int index, final Map.Entry<String, String> object, final String value) { presenter.update(columnIndex, index, object, value); } }); } @Override public MapEditor.View removeColumn(final int index) { grid.removeColumn(index); return this; } @Override public MapEditor.View setRowCount(final int count) { grid.setRowCount(count); return this; } @Override public MapEditor.View setData(final List<Map.Entry<String, String>> data) { grid.setRowData(0, data); return this; } @Override public MapEditor.View showError(final SafeHtml message) { final Element element = errorLabel.getElement(); element.setInnerText(message.asString()); element.getStyle().setDisplay(Style.Display.INLINE); element.getStyle().setBorderColor("red"); element.getStyle().setBorderStyle(Style.BorderStyle.SOLID); element.getStyle().setBorderWidth(1, Style.Unit.PX); errorLabel.setVisible(true); return this; } @Override public MapEditor.View clearError() { final Element element = errorLabel.getElement(); element.setInnerText(""); element.getStyle().setDisplay(Style.Display.NONE); element.getStyle().setBorderWidth(0, Style.Unit.PX); errorLabel.setVisible(false); return this; } }