gernotbelger@9068: /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde gernotbelger@9068: * Software engineering by gernotbelger@9068: * Björnsen Beratende Ingenieure GmbH gernotbelger@9068: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt gernotbelger@9068: * gernotbelger@9068: * This file is Free Software under the GNU AGPL (>=v3) gernotbelger@9068: * and comes with ABSOLUTELY NO WARRANTY! Check out the gernotbelger@9068: * documentation coming with Dive4Elements River for details. gernotbelger@9068: */ gernotbelger@9068: package org.dive4elements.river.client.client.ui.uinfo; gernotbelger@9068: gernotbelger@9068: import java.util.ArrayList; gernotbelger@9068: import java.util.List; gernotbelger@9068: gernotbelger@9068: import org.dive4elements.river.client.client.ui.AbstractUIProvider; gernotbelger@9070: import org.dive4elements.river.client.client.ui.PanelHelper; gernotbelger@9068: import org.dive4elements.river.client.shared.model.Data; gernotbelger@9068: import org.dive4elements.river.client.shared.model.DataItem; gernotbelger@9068: import org.dive4elements.river.client.shared.model.DataList; gernotbelger@9068: import org.dive4elements.river.client.shared.model.DefaultData; gernotbelger@9068: import org.dive4elements.river.client.shared.model.DefaultDataItem; gernotbelger@9068: gernotbelger@9107: import com.google.gwt.core.client.GWT; gernotbelger@9068: import com.smartgwt.client.data.Record; gernotbelger@9070: import com.smartgwt.client.types.Alignment; gernotbelger@9107: import com.smartgwt.client.types.ListGridFieldType; gernotbelger@9068: import com.smartgwt.client.widgets.Canvas; gernotbelger@9068: import com.smartgwt.client.widgets.Label; gernotbelger@9107: import com.smartgwt.client.widgets.form.validator.IntegerRangeValidator; gernotbelger@9068: import com.smartgwt.client.widgets.grid.ListGrid; gernotbelger@9070: import com.smartgwt.client.widgets.grid.ListGridField; gernotbelger@9068: import com.smartgwt.client.widgets.grid.ListGridRecord; gernotbelger@9107: import com.smartgwt.client.widgets.grid.events.RecordClickEvent; gernotbelger@9107: import com.smartgwt.client.widgets.grid.events.RecordClickHandler; gernotbelger@9068: import com.smartgwt.client.widgets.layout.HLayout; gernotbelger@9107: import com.smartgwt.client.widgets.layout.Layout; gernotbelger@9068: import com.smartgwt.client.widgets.layout.VLayout; gernotbelger@9068: gernotbelger@9068: /** gernotbelger@9068: * @author Domenico Nardi Tironi gernotbelger@9068: * gernotbelger@9068: */ gernotbelger@9070: public abstract class AbstractVegZonesTablePanel extends AbstractUIProvider { gernotbelger@9068: private static final long serialVersionUID = 1L; gernotbelger@9068: gernotbelger@9107: private static final String TABLE_CELL_SEPARATOR = "TABLE_CELL_SEPARATOR"; gernotbelger@9068: gernotbelger@9107: private static final String TABLE_ROW_SEPARATOR = "TABLE_ROW_SEPARATOR"; gernotbelger@9070: gernotbelger@9107: private static final String datakey = "vegzones"; gernotbelger@9068: gernotbelger@9107: private final ListGrid elements = new ListGrid(); gernotbelger@9107: gernotbelger@9107: // private final HLayout input = new HLayout(); gernotbelger@9107: gernotbelger@9107: protected final ListGrid createTable(final Layout root, final DataList data, final int width, final boolean editable) { gernotbelger@9070: data.add(VegetationzonesTablePanel.getDummyData()); // TODO: GET REAL DATA! gernotbelger@9070: gernotbelger@9070: final Label title = new Label(data.get(0).getDescription()); gernotbelger@9070: title.setHeight("35px"); // orig:25 gernotbelger@9070: gernotbelger@9070: this.elements.setWidth(width); // 185 gernotbelger@9070: this.elements.setHeight(300); // gernotbelger@9070: this.elements.setShowHeaderContextMenu(false); gernotbelger@9070: this.elements.setCanReorderFields(false); gernotbelger@9070: this.elements.setCanSort(false); gernotbelger@9107: this.elements.setCanEdit(editable); gernotbelger@9107: gernotbelger@9107: final ListGridField vegzoneField = new ListGridField("vegzone", this.MSG.uinfo_vegetation_zones_label()); gernotbelger@9107: vegzoneField.setType(ListGridFieldType.TEXT); gernotbelger@9107: vegzoneField.setWidth(245); gernotbelger@9107: gernotbelger@9107: final ListGridField fromField = new ListGridField("from", this.MSG.uinfo_vegetation_zones_from()); gernotbelger@9107: fromField.setType(ListGridFieldType.INTEGER); gernotbelger@9107: final IntegerRangeValidator validator = new IntegerRangeValidator(); gernotbelger@9107: validator.setMin(0); gernotbelger@9107: validator.setMax(365); gernotbelger@9107: gernotbelger@9107: fromField.setValidators(validator); gernotbelger@9107: fromField.setWidth(80); gernotbelger@9107: fromField.setAlign(Alignment.RIGHT); gernotbelger@9107: gernotbelger@9107: final ListGridField toField = new ListGridField("to", this.MSG.uinfo_vegetation_zones_to()); gernotbelger@9107: toField.setType(ListGridFieldType.INTEGER); gernotbelger@9107: toField.setValidators(validator); gernotbelger@9107: toField.setWidth(80); gernotbelger@9107: toField.setAlign(Alignment.RIGHT); gernotbelger@9107: gernotbelger@9107: if (editable) { gernotbelger@9107: final ListGridField removeField = createRemoveField(); gernotbelger@9107: this.elements.setFields(vegzoneField, fromField, toField, removeField); gernotbelger@9107: gernotbelger@9107: } else { gernotbelger@9107: this.elements.setFields(vegzoneField, fromField, toField); gernotbelger@9107: } gernotbelger@9070: gernotbelger@9070: addDataInit(data); gernotbelger@9070: gernotbelger@9107: root.addMember(title); gernotbelger@9107: root.addMember(this.elements); gernotbelger@9107: root.addMember(PanelHelper.getSpacer(10)); gernotbelger@9068: gernotbelger@9107: return this.elements; gernotbelger@9068: } gernotbelger@9068: gernotbelger@9107: private ListGridField createRemoveField() { gernotbelger@9068: gernotbelger@9107: final ListGridField removeField = new ListGridField("_removeRecord", "Remove Record") { gernotbelger@9107: { gernotbelger@9107: setType(ListGridFieldType.ICON); gernotbelger@9107: setIcon(GWT.getHostPageBaseURL() + AbstractVegZonesTablePanel.this.MSG.removeFeature()); gernotbelger@9107: setCanEdit(false); gernotbelger@9107: setCanFilter(false); gernotbelger@9107: setCanSort(false); gernotbelger@9107: setCanGroupBy(false); gernotbelger@9107: setCanFreeze(false); gernotbelger@9107: setWidth(25); gernotbelger@9107: } gernotbelger@9107: }; gernotbelger@9107: gernotbelger@9107: this.elements.addRecordClickHandler(new RecordClickHandler() { gernotbelger@9107: @Override gernotbelger@9107: public void onRecordClick(final RecordClickEvent event) { gernotbelger@9107: // Just handle remove-clicks gernotbelger@9107: if (!event.getField().getName().equals(removeField.getName())) { gernotbelger@9107: return; gernotbelger@9107: } gernotbelger@9107: event.getViewer().removeData(event.getRecord()); gernotbelger@9107: } gernotbelger@9107: }); gernotbelger@9107: gernotbelger@9107: return removeField; gernotbelger@9068: } gernotbelger@9068: gernotbelger@9107: public abstract void createWidget(final Layout root, final DataList data); gernotbelger@9068: gernotbelger@9070: private final void addDataInit(final DataList data) { gernotbelger@9068: for (final Data dataItemContainer : data.getAll()) { gernotbelger@9068: if (dataItemContainer.getItems() != null) { gernotbelger@9068: for (final DataItem dataItem : dataItemContainer.getItems()) { gernotbelger@9069: if (dataItem.getStringValue() != null && dataItem.getStringValue().contains(TABLE_ROW_SEPARATOR)) { gernotbelger@9068: gernotbelger@9069: final String[] rows = dataItem.getStringValue().split(TABLE_ROW_SEPARATOR); gernotbelger@9068: for (final String row : rows) { gernotbelger@9068: this.elements.addData(createEntry(row)); gernotbelger@9068: } gernotbelger@9068: } gernotbelger@9068: } gernotbelger@9068: } gernotbelger@9068: } gernotbelger@9068: } gernotbelger@9068: gernotbelger@9068: @Override gernotbelger@9068: public final Canvas create(final DataList data) { gernotbelger@9068: final VLayout layout = new VLayout(); gernotbelger@9107: gernotbelger@9107: // final Canvas helper = createHelper(); gernotbelger@9107: // this.helperContainer.addMember(helper); gernotbelger@9068: gernotbelger@9068: final Canvas submit = getNextButton(); gernotbelger@9068: gernotbelger@9107: final VLayout root = new VLayout(); gernotbelger@9107: createWidget(root, data); gernotbelger@9068: gernotbelger@9107: layout.addMember(root); gernotbelger@9107: layout.addMember(submit); gernotbelger@9068: gernotbelger@9068: return layout; gernotbelger@9068: } gernotbelger@9068: gernotbelger@9068: @Override gernotbelger@9068: public Canvas createOld(final DataList dataList) { gernotbelger@9068: final HLayout layout = new HLayout(); gernotbelger@9068: layout.setWidth("400px"); gernotbelger@9068: final VLayout vLayout = new VLayout(); gernotbelger@9068: vLayout.setWidth(130); gernotbelger@9068: final Label label = new Label(dataList.getLabel()); gernotbelger@9068: label.setWidth("200px"); gernotbelger@9068: label.setHeight(25); gernotbelger@9068: gernotbelger@9068: final List items = dataList.getAll(); gernotbelger@9068: final Data str = getData(items, datakey); gernotbelger@9068: final DataItem[] strItems = str.getItems(); gernotbelger@9068: gernotbelger@9107: final String[] entries = strItems[0].getLabel().split(AbstractVegZonesTablePanel.TABLE_ROW_SEPARATOR); gernotbelger@9068: for (final String entry : entries) { gernotbelger@9107: final String[] vals = entry.split(AbstractVegZonesTablePanel.TABLE_CELL_SEPARATOR); gernotbelger@9068: final Label dateLabel = new Label(vals[0] + " (" + vals[1] + "-" + vals[2] + ")"); gernotbelger@9068: dateLabel.setHeight(20); gernotbelger@9068: vLayout.addMember(dateLabel); gernotbelger@9068: } gernotbelger@9068: final Canvas back = getBackButton(dataList.getState()); gernotbelger@9068: layout.addMember(label); gernotbelger@9068: layout.addMember(vLayout); gernotbelger@9068: layout.addMember(back); gernotbelger@9068: gernotbelger@9068: return layout; gernotbelger@9068: } gernotbelger@9068: gernotbelger@9068: protected static final Data[] getDummyData() { gernotbelger@9068: final List data = new ArrayList(); gernotbelger@9070: gernotbelger@9069: // TODO: move to messages gernotbelger@9070: final String d = "Zonaler Wald" + TABLE_CELL_SEPARATOR + "0" + TABLE_CELL_SEPARATOR + "5" + TABLE_ROW_SEPARATOR// gernotbelger@9070: + "Hartholzaue, trocken" + TABLE_CELL_SEPARATOR + "5" + TABLE_CELL_SEPARATOR + "40" + TABLE_ROW_SEPARATOR// gernotbelger@9070: + "Hartholzaue, feucht" + TABLE_CELL_SEPARATOR + "40" + TABLE_CELL_SEPARATOR + "80" + TABLE_ROW_SEPARATOR// gernotbelger@9070: + "Silberweidenwald" + TABLE_CELL_SEPARATOR + "80" + TABLE_CELL_SEPARATOR + "140" + TABLE_ROW_SEPARATOR// gernotbelger@9070: + "Weidengebüsch" + TABLE_CELL_SEPARATOR + "140" + TABLE_CELL_SEPARATOR + "200" + TABLE_ROW_SEPARATOR// gernotbelger@9070: + "Uferröhricht" + TABLE_CELL_SEPARATOR + "200" + TABLE_CELL_SEPARATOR + "260" + TABLE_ROW_SEPARATOR// gernotbelger@9070: + "Uferpioniere" + TABLE_CELL_SEPARATOR + "260" + TABLE_CELL_SEPARATOR + "320" + TABLE_ROW_SEPARATOR// gernotbelger@9070: + "Vegetationslos" + TABLE_CELL_SEPARATOR + "320" + TABLE_CELL_SEPARATOR + "365" + TABLE_ROW_SEPARATOR// gernotbelger@9070: + "Wasserfläche" + TABLE_CELL_SEPARATOR + "365" + TABLE_CELL_SEPARATOR + "365" + TABLE_ROW_SEPARATOR;// gernotbelger@9068: gernotbelger@9068: final DataItem item = new DefaultDataItem(datakey, "entryDescription", d); // DATA-key gernotbelger@9068: data.add(new DefaultData(datakey, null, null, new DataItem[] { item })); gernotbelger@9068: return data.toArray(new Data[data.size()]); gernotbelger@9068: } gernotbelger@9068: gernotbelger@9068: @Override gernotbelger@9068: protected final Data[] getData() { gernotbelger@9068: final List data = new ArrayList(); gernotbelger@9068: gernotbelger@9068: final ListGridRecord[] lgr = this.elements.getRecords(); gernotbelger@9068: if (lgr.length == 0) { gernotbelger@9068: return getDummyData();// new Data[0]; // return getDummyData(); gernotbelger@9068: } gernotbelger@9068: String d = ""; gernotbelger@9068: for (final ListGridRecord element : lgr) { gernotbelger@9068: final Record r = element; gernotbelger@9107: d += r.getAttribute("vegzone") + AbstractVegZonesTablePanel.TABLE_CELL_SEPARATOR + r.getAttribute("from") gernotbelger@9107: + AbstractVegZonesTablePanel.TABLE_CELL_SEPARATOR + r.getAttribute("to"); gernotbelger@9107: d += AbstractVegZonesTablePanel.TABLE_ROW_SEPARATOR; gernotbelger@9068: } gernotbelger@9068: gernotbelger@9068: final DataItem item = new DefaultDataItem(datakey, null, d); // DATA-key gernotbelger@9068: data.add(new DefaultData(datakey, null, null, new DataItem[] { item })); gernotbelger@9068: return data.toArray(new Data[data.size()]); gernotbelger@9068: } gernotbelger@9068: gernotbelger@9068: public final ListGridRecord createEntry(final String row) { gernotbelger@9068: gernotbelger@9069: if (row.contains(TABLE_CELL_SEPARATOR)) { gernotbelger@9068: gernotbelger@9069: final String[] vals = row.split(TABLE_CELL_SEPARATOR); gernotbelger@9068: if (vals.length == 3) { gernotbelger@9068: final String vegzone = vals[0]; gernotbelger@9068: final String from = vals[1]; gernotbelger@9068: final String to = vals[2]; gernotbelger@9068: gernotbelger@9068: if (vegzone == null || from == null || to == null) { gernotbelger@9068: return null; gernotbelger@9068: } gernotbelger@9068: gernotbelger@9068: final ListGridRecord r = new ListGridRecord(); gernotbelger@9068: r.setAttribute("vegzone", vegzone); gernotbelger@9068: r.setAttribute("from", from); gernotbelger@9068: r.setAttribute("to", to); gernotbelger@9068: return r; gernotbelger@9068: gernotbelger@9068: } gernotbelger@9068: gernotbelger@9068: } gernotbelger@9068: return null; gernotbelger@9068: } gernotbelger@9107: }