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