Mercurial > dive4elements > river
diff flys-client/src/main/java/org/dive4elements/river/client/client/ui/ParameterMatrix.java @ 5834:f507086aa94b
Repaired internal references.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Thu, 25 Apr 2013 12:31:32 +0200 |
parents | flys-client/src/main/java/de/intevation/flys/client/client/ui/ParameterMatrix.java@d5821c6f0ab0 |
children | 821a02bbfb4e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-client/src/main/java/org/dive4elements/river/client/client/ui/ParameterMatrix.java Thu Apr 25 12:31:32 2013 +0200 @@ -0,0 +1,285 @@ +package de.intevation.flys.client.client.ui; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.user.client.ui.CheckBox; +import com.google.gwt.user.client.ui.Grid; +import com.google.gwt.user.client.ui.Widget; + +import com.smartgwt.client.types.ListGridFieldType; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.Label; +import com.smartgwt.client.widgets.grid.ListGrid; +import com.smartgwt.client.widgets.grid.ListGridField; +import com.smartgwt.client.widgets.grid.ListGridRecord; + +import de.intevation.flys.client.client.FLYSConstants; +import de.intevation.flys.client.shared.model.DataItem; +import de.intevation.flys.client.shared.model.IntegerOptionsData; +import de.intevation.flys.client.shared.model.StringOptionsData; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + * Some parameters take the form of on/off options that can also be seen + * as a matrix. + * + * This class helps to survive the underlying objects and create a visual + * representation of this matrix. Later can happen in two ways to overcome + * shortcomings of GWT/SmartGWT combination. + */ +public class ParameterMatrix { + + protected ListGrid listGrid = null; + + public static class Column implements Serializable { + + private static final long serialVersionUID = -3493426383086860118L; + + protected String name; + protected Map<String, String> values; + + private Column() { + this.values = new HashMap<String, String>(); + } + + public Column(String name) { + this(); + this.name = name; + } + + public void addValue(String label, String value) { + values.put(label, value); + } + + public String getValue(String label) { + return values.get(label); + } + } // end of class Column + + /** The message class that provides i18n strings.*/ + protected FLYSConstants MESSAGE = GWT.create(FLYSConstants.class); + + public static final int CELL_HEIGHT = 25; + + private Map<String, Column> columns; + private List<String> columnNames; + private List<String> valueNames; + + /** Maps column names to list of rows' first fields. */ + private Map<String, List<String>> selected; + + public ParameterMatrix() { + super(); + this.columns = new HashMap<String, Column>(); + this.columnNames = new ArrayList<String>(); + this.valueNames = new ArrayList<String>(); + this.selected = new HashMap<String, List<String>>(); + } + + + public void addColumn(IntegerOptionsData group) { + String groupTitle = group.getLabel(); + + Column col = new Column(groupTitle); + DataItem[] items = group.getItems(); + + if (items == null) { + GWT.log("No items found in StringOptionsData '" + groupTitle + "'"); + return; + } + + for (DataItem item: items) { + String title = item.getLabel(); + + if (valueNames.indexOf(title) < 0) { + valueNames.add(title); + } + + col.addValue(item.getLabel(), item.getStringValue()); + } + + columnNames.add(groupTitle); + columns.put(groupTitle, col); + } + + + public void addColumn(StringOptionsData options) { + String groupTitle = options.getLabel(); + + Column col = new Column(groupTitle); + DataItem[] items = options.getItems(); + + if (items == null) { + GWT.log("No items found in StringOptionsData '" + groupTitle + "'"); + return; + } + + for (DataItem item: items) { + String title = item.getLabel(); + + if (valueNames.indexOf(title) < 0) { + valueNames.add(title); + } + + col.addValue(item.getLabel(), item.getStringValue()); + } + + columnNames.add(groupTitle); + columns.put(groupTitle, col); + } + + + public Widget createParameterGrid() { + listGrid = new ListGrid(); + listGrid.setShowAllRecords(true); + listGrid.setWrapCells(true); + listGrid.setShowHeaderContextMenu(false); + listGrid.setCanReorderFields(false); + listGrid.setCanSort(false); + //listGrid.setAutoFitData(Autofit.VERTICAL); + listGrid.setFixedRecordHeights(false); + // TODO: Then also need "autofit" (when wrapping) + + ListGridField itemNameField = new ListGridField("itemname", " "); + ArrayList<ListGridField> fields = new ArrayList<ListGridField>(); + fields.add(itemNameField); + + for (int i = 0, n = columnNames.size(); i < n; i++) { + ListGridField field = new ListGridField(columnNames.get(i), MESSAGE.getString(columnNames.get(i))); + field.setType(ListGridFieldType.BOOLEAN); + field.setCanEdit(true); + fields.add(field); + selected.put(columnNames.get(i), new ArrayList<String>()); + } + + ListGridField[] fieldsArray = fields.toArray(new ListGridField[fields.size()]); + listGrid.setFields(fieldsArray); + + int nVals = valueNames.size(); + + ArrayList<ListGridRecord> records = new ArrayList<ListGridRecord>(); + for (int j = 0; j < nVals; j++) { + String valueName = valueNames.get(j); + ListGridRecord record = new ListGridRecord(); + record.setAttribute("itemname", valueName); + for (int i = 0, n = columnNames.size(); i < n; i++) { + String columnName = columnNames.get(i); + Column col = columns.get(columnName); + String value = col.getValue(valueName); + record.setAttribute(columnName, false); + record.setAttribute(columnName+"-value", value); + } + records.add(record); + } + + listGrid.setData(records.toArray(new ListGridRecord[records.size()])); + + return listGrid; + + } + + + /** + * Returns a widget with matrix of checkboxes and labels. + * @param asListGrid if true, use a ListGrid (for inclusion in SmartGWT + * containers, avoiding scrollbar-issues. + */ + public Widget create(boolean asListGrid) { + if (asListGrid) { + return createParameterGrid(); + } + Grid grid = new Grid(valueNames.size() + 1, columnNames.size() + 1); + + for (int i = 0, n = columnNames.size(); i < n; i++) { + String columnName = columnNames.get(i); + Column col = columns.get(columnName); + + selected.put(columnName, new ArrayList<String>()); + + grid.setWidget(0, i+1, createLabel(MESSAGE.getString(columnName))); + + for (int j = 0, o = valueNames.size(); j < o; j++) { + String valueName = valueNames.get(j); + String value = col.getValue(valueName); + + if (i == 0) { + grid.setWidget(j+1, 0, createLabel(valueName)); + } + + if (value != null && value.length() > 0) { + grid.setWidget(j+1, i+1, createCheckBox(columnName, value)); + } + } + } + + return grid; + } + + + /** Creates label with given text. */ + protected Label createLabel(String text) { + Label label = new Label(text); + label.setHeight(CELL_HEIGHT); + + return label; + } + + + /** Create Checkbox for column/value. */ + protected Canvas createCheckBox(final String colName, final String value) { + CheckBox box = new CheckBox(); + box.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + Map<String, List<String>> selection = getSelection(); + + List<String> values = selection.get(colName); + if (values.indexOf(value) >= 0) { + values.remove(value); + } + else { + values.add(value); + } + } + }); + + Canvas c = new Canvas(); + c.addChild(box); + return c; + } + + + public Map<String, List<String>> getSelection() { + if (listGrid == null) { + return selected; + } + + ListGridRecord[] records = listGrid.getRecords(); + Map<String, List<String>> result = new HashMap<String, List<String>>(); + for (ListGridRecord record : records) { + for (int i = 0, n = columnNames.size(); i < n; i++) { + String columnName = columnNames.get(i); + if (Boolean.valueOf(record.getAttribute(columnName)) == true) { + if (result.containsKey(columnName)) { + result.get(columnName).add(record.getAttribute(columnName + "-value")); + } + else { + List<String> items = new ArrayList<String>(); + items.add(record.getAttribute(columnName + "-value")); + result.put(columnName, items); + } + } + } + } + return result; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :