Mercurial > dive4elements > river
diff gwt-client/src/main/java/org/dive4elements/river/client/client/ui/TableHelper.java @ 9075:89740fe82196
Extract Table from Panel
author | gernotbelger |
---|---|
date | Fri, 18 May 2018 17:42:34 +0200 |
parents | 766890addcb2 |
children |
line wrap: on
line diff
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/TableHelper.java Fri May 18 17:26:26 2018 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/TableHelper.java Fri May 18 17:42:34 2018 +0200 @@ -9,7 +9,29 @@ */ package org.dive4elements.river.client.client.ui; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.SortedMap; +import java.util.TreeMap; + +import org.dive4elements.river.client.client.FLYSConstants; +import org.dive4elements.river.client.shared.model.Data; +import org.dive4elements.river.client.shared.model.DataItem; +import org.dive4elements.river.client.shared.model.DataList; +import org.dive4elements.river.client.shared.model.MultiAttributeData; +import org.dive4elements.river.client.shared.model.MultiDataItem; + +import com.google.gwt.core.client.GWT; +import com.smartgwt.client.data.Record; +import com.smartgwt.client.types.Alignment; +import com.smartgwt.client.types.ListGridFieldType; +import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.grid.ListGrid; +import com.smartgwt.client.widgets.grid.ListGridField; +import com.smartgwt.client.widgets.grid.events.RecordClickEvent; +import com.smartgwt.client.widgets.grid.events.RecordClickHandler; /** * @author Domenico Nardi Tironi @@ -17,14 +39,161 @@ */ public class TableHelper { + public interface IColumnClickHandler { + void columnClicked(String value); + } + private enum PinType { none, from, to } - private ListGrid table; + private final ListGrid table; + private final DataList dataList; + final FLYSConstants flys; + private final List<String> keyColEntries = new ArrayList<String>(); - public TableHelper() { + public TableHelper(final DataList dataList, final String definitionStr, final FLYSConstants flys, final IColumnClickHandler fromHandler) { + this.flys = flys; + this.dataList = dataList; + this.table = new ListGrid(); + this.table.setShowHeaderContextMenu(false); + this.table.setWidth100(); + this.table.setShowRecordComponents(true); + this.table.setShowRecordComponentsByCell(true); + this.table.setHeight100(); + this.table.setEmptyMessage(flys.empty_table()); + this.table.setCanReorderFields(false); + + final MultiAttributeData mData = findDefinition(definitionStr); + final Map<String, Map<String, String>> meta = mData.getMeta(); + + final Map<String, String> tableInfo = meta.get("meta_tableinfo"); + final String keyColumnName = tableInfo.get("keycol"); + + final SortedMap<Integer, ListGridField> fields = new TreeMap<Integer, ListGridField>(); + + for (final Entry<String, Map<String, String>> entry : meta.entrySet()) { + + final String colName = entry.getKey(); + if (colName.startsWith("meta_")) + continue; + + final Map<String, String> values = entry.getValue(); + + final int order = Integer.parseInt(values.get("order")); + + final ListGridField field = createField(colName, keyColumnName, values, fromHandler); + + fields.put(order, field); + } + + for (final DataItem dataItem : mData.opts) { + final MultiDataItem item = (MultiDataItem) dataItem; + + final Map<String, String> valueMap = item.getValue(); + // final String columnName = mData.getLabel(); + final Record newRecord = new Record(); + for (final Entry<String, String> entry : valueMap.entrySet()) { + final String key = entry.getKey(); + final String value = entry.getValue(); + newRecord.setAttribute(key, value); + + if (key.equals(keyColumnName)) + this.keyColEntries.add(value); + } + + this.table.addData(newRecord); + } + + this.table.setFields(fields.values().toArray(new ListGridField[fields.size()])); } + public Canvas getTable() { + return this.table; + } + + private MultiAttributeData findDefinition(final String paranemterName) { + + for (final Data data : this.dataList.getAll()) { + + final String label = data.getLabel(); + if (label.equals(paranemterName) && data instanceof MultiAttributeData) + return (MultiAttributeData) data; + } + + return null; + } + + private ListGridField createField(final String colName, final String keyColumnName, final Map<String, String> values, + final IColumnClickHandler fromHandler) { + + final String translation = getMeta(values, "translation", colName); + + final ListGridField field = new ListGridField(colName, translation); + + final String width = getMeta(values, "width", "99"); + field.setWidth(width); + + final ListGridFieldType type = getMeta(values, "type", ListGridFieldType.TEXT, ListGridFieldType.class); + field.setType(type); + + final Alignment alignment = getMeta(values, "alignment", Alignment.LEFT, Alignment.class); + field.setAlign(alignment); + + final PinType pinType = getMeta(values, "pin", PinType.none, PinType.class); + switch (pinType) { + case from: { + final String baseUrl = GWT.getHostPageBaseURL(); + field.setCellIcon(baseUrl + this.flys.markerGreen()); + field.addRecordClickHandler(new RecordClickHandler() { + @Override + public void onRecordClick(final RecordClickEvent e) { + final Record r = e.getRecord(); + fromHandler.columnClicked(r.getAttribute(keyColumnName)); + } + }); + } + break; + + case to: + break; + + case none: + default: + break; + } + + return field; + } + + private String getMeta(final Map<String, String> values, final String key, final String defaultValue) { + + final String value = values.get(key); + if (value == null || value.isEmpty()) + return defaultValue; + + return value; + } + + private <TYPE extends Enum<TYPE>> TYPE getMeta(final Map<String, String> values, final String key, final TYPE defaultValue, final Class<TYPE> enumType) { + + final String value = values.get(key); + if (value == null || value.isEmpty()) + return defaultValue; + + try { + return Enum.valueOf(enumType, value); + } + catch (final Exception e) { + e.printStackTrace(); + return defaultValue; + } + } + + public List<String> getKeycolEntries() { + + return this.keyColEntries; + } + }