teichmann@5861: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5861: * Software engineering by Intevation GmbH teichmann@5861: * teichmann@5993: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5861: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5993: * documentation coming with Dive4Elements River for details. teichmann@5861: */ teichmann@5861: teichmann@5835: package org.dive4elements.river.client.client.ui; ingo@2521: gernotbelger@9390: import java.util.ArrayList; gernotbelger@9390: import java.util.List; gernotbelger@9390: import java.util.Map; gernotbelger@9390: import java.util.Set; ingo@2521: teichmann@5835: import org.dive4elements.river.client.client.FLYSConstants; teichmann@5835: import org.dive4elements.river.client.shared.model.Data; teichmann@5835: import org.dive4elements.river.client.shared.model.DataItem; teichmann@5835: import org.dive4elements.river.client.shared.model.DataList; teichmann@5835: import org.dive4elements.river.client.shared.model.DefaultData; teichmann@5835: import org.dive4elements.river.client.shared.model.DefaultDataItem; teichmann@5835: import org.dive4elements.river.client.shared.model.IntegerOptionsData; rrenkert@7826: import org.dive4elements.river.client.shared.model.MultiAttributeData; teichmann@5835: import org.dive4elements.river.client.shared.model.StringOptionsData; ingo@2521: gernotbelger@9390: import com.google.gwt.core.client.GWT; gernotbelger@9390: import com.smartgwt.client.widgets.Canvas; gernotbelger@9390: import com.smartgwt.client.widgets.Label; gernotbelger@9390: import com.smartgwt.client.widgets.layout.HLayout; gernotbelger@9390: import com.smartgwt.client.widgets.layout.LayoutSpacer; gernotbelger@9390: import com.smartgwt.client.widgets.layout.VLayout; christian@4184: ingo@2521: /** ingo@2521: * @author Ingo Weinzierl ingo@2521: */ ingo@2521: public class ParameterMatrixPanel extends AbstractUIProvider { ingo@2521: christian@4184: private static final long serialVersionUID = -5827445025768340371L; christian@4184: felix@3994: /** The message class that provides i18n strings. */ felix@3994: protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); felix@3994: ingo@2525: private ParameterMatrix matrix; gernotbelger@9390: private final String itemnameColTitle; gernotbelger@9390: gernotbelger@9390: public ParameterMatrixPanel(final String itemNameColTitle) { gernotbelger@9390: this.itemnameColTitle = itemNameColTitle; gernotbelger@9390: } ingo@2525: ingo@2521: @Override ingo@2521: protected Data[] getData() { gernotbelger@9390: final Map> selection = this.matrix.getSelection(); gernotbelger@9390: final Set>> entries = selection.entrySet(); ingo@2525: gernotbelger@9390: final Data[] list = new Data[this.matrix.getColumnNames().size()]; ingo@2525: ingo@2525: int i = 0; ingo@2525: gernotbelger@9390: for (final Map.Entry> entry : entries) { gernotbelger@9390: final String value = buildValueString(entry.getValue()); ingo@2525: gernotbelger@9390: final DataItem item = new DefaultDataItem(entry.getKey(), null, value); ingo@2525: gernotbelger@9390: list[i++] = new DefaultData(entry.getKey(), null, null, new DataItem[] { item }); ingo@2525: } ingo@2525: felix@7580: // To delete old values already given, construct empty ones felix@7580: // for all not-specified options. gernotbelger@9390: for (final String colName : this.matrix.getColumnNames()) { felix@7580: boolean found = false; gernotbelger@9390: for (final Data data : list) { felix@7580: if (data != null && data.getLabel().equals(colName)) { felix@7580: found = true; felix@7580: break; felix@7580: } felix@7580: } felix@7580: if (!found) { felix@7580: // Add an empty data for this. gernotbelger@9390: list[i++] = new DefaultData(colName, null, null, new DataItem[] {}); felix@7580: } felix@7580: } felix@7580: ingo@2525: return list; ingo@2521: } ingo@2521: gernotbelger@9390: protected String buildValueString(final List values) { gernotbelger@9390: final StringBuilder sb = new StringBuilder(); ingo@2525: ingo@2525: boolean first = true; ingo@2525: gernotbelger@9390: for (final String value : values) { ingo@2525: if (!first) { ingo@2525: sb.append(";"); ingo@2525: } ingo@2525: ingo@2525: sb.append(value); ingo@2525: ingo@2525: first = false; ingo@2525: } ingo@2525: ingo@2525: return sb.toString(); ingo@2525: } ingo@2525: felix@3850: /** Canvas to show in non-edit mode. */ ingo@2521: @Override gernotbelger@9390: public Canvas createOld(final DataList dataList) { gernotbelger@9390: final HLayout layout = new HLayout(); gernotbelger@9390: final VLayout vLayout = new VLayout(); ingo@2528: ingo@2528: layout.setWidth(300); ingo@2528: vLayout.setWidth(280); ingo@2528: ingo@2528: for (int i = 0, n = dataList.size(); i < n; i++) { gernotbelger@9390: final HLayout row = new HLayout(); gernotbelger@9390: final VLayout cols = new VLayout(); ingo@2528: ingo@2528: row.setWidth(300); ingo@2528: cols.setWidth(100); ingo@2528: gernotbelger@9390: final Data data = dataList.get(i); gernotbelger@9390: final DataItem[] items = data.getItems(); ingo@2528: gernotbelger@9390: final Label parameter = new Label(data.getDescription()); ingo@2528: parameter.setWidth(200); ingo@2528: gernotbelger@9390: for (final DataItem item : items) { gernotbelger@9390: final Label value = new Label(item.getLabel()); ingo@2528: gernotbelger@9390: value.setValign(com.smartgwt.client.types.VerticalAlignment.TOP); ingo@2528: value.setWidth(130); andre@8612: value.setHeight(15); ingo@2528: ingo@2528: cols.addMember(value); gernotbelger@9390: final LayoutSpacer spacer = new LayoutSpacer(); andre@8612: spacer.setHeight(5); andre@8612: cols.addMember(spacer); ingo@2528: } ingo@2528: ingo@2528: row.addMember(parameter); ingo@2528: row.addMember(cols); ingo@2528: ingo@2528: vLayout.addMember(row); ingo@2528: } ingo@2528: gernotbelger@9390: final Canvas back = getBackButton(dataList.getState()); ingo@2528: ingo@2528: layout.addMember(vLayout); ingo@2528: layout.addMember(back); ingo@2528: ingo@2528: return layout; ingo@2521: } ingo@2521: felix@3853: /** Create the main canvas in the "editing" mode. */ ingo@2521: @Override gernotbelger@9390: public Canvas create(final DataList dataList) { gernotbelger@9390: final VLayout v = new VLayout(); ingo@2521: v.addMember(createTitle(dataList)); ingo@2521: gernotbelger@9390: this.matrix = new ParameterMatrix(this.itemnameColTitle); ingo@2521: gernotbelger@9390: for (final Data data : dataList.getAll()) { ingo@2521: if (data instanceof IntegerOptionsData) { gernotbelger@9390: this.matrix.addColumn((IntegerOptionsData) data); gernotbelger@9390: } else if (data instanceof StringOptionsData) { gernotbelger@9390: this.matrix.addColumn((StringOptionsData) data); gernotbelger@9390: } else if (data instanceof MultiAttributeData) { gernotbelger@9390: this.matrix.addColumn((MultiAttributeData) data); rrenkert@7826: } ingo@2521: } ingo@2521: felix@3853: // If too many items are shown, show it in the helper Panel. felix@3854: // TODO its not about the datalist, but about the "rows" in the data. felix@3853: if (dataList.getAll().size() > 5) { gernotbelger@9390: v.addMember(this.matrix.create(false)); gernotbelger@9390: } else { gernotbelger@9390: this.helperContainer.addMember(this.matrix.create(true)); felix@3853: } ingo@2525: v.addMember(getNextButton()); ingo@2521: ingo@2521: return v; ingo@2521: } ingo@2521: felix@3853: /** Reaturns a label with description of first Data. */ gernotbelger@9390: protected Canvas createTitle(final DataList dataList) { gernotbelger@9390: final Data data = dataList.get(0); gernotbelger@9390: final Label label = new Label(data.getDescription()); ingo@2521: label.setHeight(35); ingo@2521: ingo@2521: return label; ingo@2521: } felix@3994: felix@3994: /** Selection shall not be empty. */ felix@3994: @Override felix@3994: public List validate() { gernotbelger@9390: GWT.log("validation. validation. validation. "); gernotbelger@9390: final List errors = new ArrayList(); felix@3994: // Early stop on one (only) error. rrenkert@4627: boolean ok = false; gernotbelger@9390: for (final Map.Entry> entry : this.matrix.getSelection().entrySet()) { gernotbelger@9390: /* gernotbelger@9390: * single entries are allowed!! gernotbelger@9390: * if (entry.getValue() == null || entry.getValue().size() == 0) { gernotbelger@9390: * errors.add(MESSAGES.error_values_needed()); gernotbelger@9390: * return errors; gernotbelger@9390: * } gernotbelger@9390: */ rrenkert@4627: if (entry.getValue() != null && entry.getValue().size() > 0) { rrenkert@4627: ok = true; rrenkert@4627: } rrenkert@4627: } rrenkert@4627: if (!ok) { gernotbelger@9390: errors.add(this.MESSAGES.error_values_needed()); felix@3994: } felix@3994: return errors; felix@3994: } ingo@2521: } ingo@2521: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :