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 :