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@9118: import org.dive4elements.river.client.shared.model.VegetationZone; 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@9114: import com.smartgwt.client.widgets.grid.SortNormalizer; 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 datakey = "vegzones"; gernotbelger@9068: gernotbelger@9107: private final ListGrid elements = new ListGrid(); gernotbelger@9107: gernotbelger@9118: protected final ListGrid createTable(final Layout root, final DataList data, final String width, final boolean editable) { 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@9118: this.elements.setCanSort(true); gernotbelger@9118: this.elements.setSortField(1); gernotbelger@9118: this.elements.setCanResizeFields(false); gernotbelger@9114: 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@9118: vegzoneField.setWidth("*"); // 245 gernotbelger@9118: vegzoneField.setCanSort(false); gernotbelger@9118: vegzoneField.setCanDragResize(true); gernotbelger@9118: gernotbelger@9118: final ListGridField fromField = createIntTableField("from", this.MSG.uinfo_vegetation_zones_from(), true); gernotbelger@9118: gernotbelger@9118: final ListGridField toField = createIntTableField("to", this.MSG.uinfo_vegetation_zones_to(), false);// nicht sortierbar nach "ÜFDauer bis" gernotbelger@9118: gernotbelger@9118: if (editable) { gernotbelger@9118: final ListGridField removeField = createRemoveField(); gernotbelger@9118: this.elements.setFields(vegzoneField, fromField, toField, removeField); gernotbelger@9118: } else { gernotbelger@9118: this.elements.setFields(vegzoneField, fromField, toField); gernotbelger@9118: } gernotbelger@9118: gernotbelger@9118: addDataInit(data); gernotbelger@9118: root.setWidth(width); gernotbelger@9118: root.addMember(title); gernotbelger@9118: root.addMember(this.elements); gernotbelger@9118: root.addMember(PanelHelper.getSpacer(10)); gernotbelger@9118: gernotbelger@9118: return this.elements; gernotbelger@9118: } gernotbelger@9118: gernotbelger@9118: private IntegerRangeValidator getValidator() { gernotbelger@9118: final IntegerRangeValidator validator = new IntegerRangeValidator(); gernotbelger@9118: validator.setMin(0); gernotbelger@9118: validator.setMax(365); gernotbelger@9118: validator.setErrorMessage(this.MSG.uinfo_vegetation_zones_validation_range()); gernotbelger@9118: return validator; gernotbelger@9118: } gernotbelger@9118: gernotbelger@9118: private SortNormalizer getNormalizer() { gernotbelger@9114: final SortNormalizer normalizer = new SortNormalizer() { gernotbelger@9107: gernotbelger@9114: @Override gernotbelger@9114: public Object normalize(final ListGridRecord record, final String fieldName) { gernotbelger@9114: final String number = record.getAttribute(fieldName); gernotbelger@9114: // String.format("%03d", number);// format.format(Integer.valueOf(number)); funktioniert hier leider nicht gernotbelger@9114: final String numberFormat = "000" + number; gernotbelger@9114: return numberFormat.substring(numberFormat.length() - 3); gernotbelger@9114: } gernotbelger@9114: }; gernotbelger@9118: return normalizer; gernotbelger@9118: } gernotbelger@9107: gernotbelger@9118: private ListGridField createIntTableField(final String key, final String msg, final boolean canSort) { gernotbelger@9118: final ListGridField intField = new ListGridField(key, msg); gernotbelger@9118: intField.setType(ListGridFieldType.INTEGER); gernotbelger@9118: intField.setValidators(getValidator()); gernotbelger@9118: intField.setWidth(90); gernotbelger@9118: intField.setAlign(Alignment.RIGHT); gernotbelger@9118: intField.setSortNormalizer(getNormalizer()); gernotbelger@9118: intField.setCanSort(canSort); gernotbelger@9118: intField.setCanDragResize(false); gernotbelger@9114: gernotbelger@9118: return intField; 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@9118: setCanDragResize(false); gernotbelger@9118: super.setCanToggle(false); 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@9118: if (dataItem.getStringValue() != null) { gernotbelger@9068: gernotbelger@9118: final List rows = VegetationZone.parse(dataItem.getStringValue()); gernotbelger@9118: for (final VegetationZone 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@9118: root.setWidth(450); 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@9118: final List entries = VegetationZone.parse(strItems[0].getLabel()); gernotbelger@9118: gernotbelger@9118: for (final VegetationZone entry : entries) { gernotbelger@9118: final Label dateLabel = new Label(entry.getZoneName() + " (" + entry.getMin_day_overflow() + "-" + entry.getMax_day_overflow() + ")"); 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@9118: // protected static final Data[] getDataToAdd(final List list) { gernotbelger@9118: // final List data = new ArrayList(); gernotbelger@9118: // final String d = VegetationZone.parseListToDataString(list); gernotbelger@9118: // gernotbelger@9118: // final DataItem item = new DefaultDataItem(datakey, "entryDescription", d); gernotbelger@9118: // data.add(new DefaultData(datakey, null, null, new DataItem[] { item })); gernotbelger@9118: // return data.toArray(new Data[data.size()]); gernotbelger@9118: // } 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@9118: return null; // getDataToAdd(VegetationZone.getStandardList());// new Data[0]; //SHOULD NOT HAPPEN gernotbelger@9068: } gernotbelger@9118: final List zoneList = new ArrayList(); gernotbelger@9068: for (final ListGridRecord element : lgr) { gernotbelger@9068: final Record r = element; gernotbelger@9118: final VegetationZone zone = VegetationZone.createFromTableEntry(r.getAttribute("vegzone"), r.getAttribute("from"), r.getAttribute("to")); gernotbelger@9118: zoneList.add(zone); gernotbelger@9068: } gernotbelger@9068: gernotbelger@9118: final DataItem item = new DefaultDataItem(datakey, null, VegetationZone.parseListToDataString(zoneList)); // 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@9118: public final ListGridRecord createEntry(final VegetationZone row) { gernotbelger@9068: gernotbelger@9118: final String vegzone = row.getZoneName(); gernotbelger@9118: final Integer from = row.getMin_day_overflow(); gernotbelger@9118: final Integer to = row.getMax_day_overflow(); gernotbelger@9068: gernotbelger@9118: if (vegzone == null || from == null || to == null) { gernotbelger@9118: return null; gernotbelger@9118: } gernotbelger@9068: gernotbelger@9118: final ListGridRecord r = new ListGridRecord(); gernotbelger@9118: r.setAttribute("vegzone", vegzone); gernotbelger@9118: r.setAttribute("from", from); gernotbelger@9118: r.setAttribute("to", to); gernotbelger@9118: return r; gernotbelger@9068: gernotbelger@9068: } gernotbelger@9107: }