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; raimund@256: gernotbelger@9064: import java.util.List; gernotbelger@9064: gernotbelger@9064: import org.dive4elements.river.client.client.Config; gernotbelger@9064: import org.dive4elements.river.client.client.FLYSConstants; gernotbelger@9064: import org.dive4elements.river.client.client.services.CSVExportService; gernotbelger@9064: import org.dive4elements.river.client.client.services.CSVExportServiceAsync; gernotbelger@9064: import org.dive4elements.river.client.shared.model.DataList; gernotbelger@9064: raimund@256: import com.google.gwt.core.client.GWT; christian@4184: import com.google.gwt.i18n.client.NumberFormat; raimund@256: import com.google.gwt.user.client.rpc.AsyncCallback; christian@4184: import com.smartgwt.client.types.ListGridFieldType; ingo@550: import com.smartgwt.client.util.SC; raimund@256: import com.smartgwt.client.widgets.Canvas; raimund@256: import com.smartgwt.client.widgets.grid.ListGrid; raimund@256: import com.smartgwt.client.widgets.grid.ListGridField; raimund@256: import com.smartgwt.client.widgets.grid.ListGridRecord; christian@4184: import com.smartgwt.client.widgets.layout.VLayout; raimund@256: raimund@256: /** raimund@256: * This UIProvider creates a widget that displays calculated data in a table. raimund@256: * raimund@256: * @author Raimund Renkert raimund@256: */ gernotbelger@9064: public class TableDataPanel { felix@810: /** The message class that provides i18n strings. */ raimund@256: protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); raimund@256: gernotbelger@9064: protected CSVExportServiceAsync exportService = GWT.create(CSVExportService.class); raimund@256: felix@810: /** A container that will contain the location or the distance panel. */ raimund@256: protected VLayout container; raimund@256: felix@810: /** The export type. */ raimund@256: protected String name; raimund@256: felix@810: /** The UUID of the collection. */ raimund@256: protected String uuid; raimund@256: felix@810: /** The table. */ raimund@256: protected ListGrid dataTable; raimund@256: raimund@256: /** felix@7616: * Creates a new TableDataPanel instance. raimund@256: */ raimund@256: public TableDataPanel() { gernotbelger@9064: this.container = new VLayout(); gernotbelger@9064: this.dataTable = new ListGrid(); gernotbelger@9064: this.name = ""; raimund@256: } raimund@256: raimund@256: /** felix@810: * This method creates a widget that contains a table. raimund@256: * raimund@256: * @return a panel. raimund@256: */ raimund@256: public Canvas create() { gernotbelger@9064: final Config config = Config.getInstance(); gernotbelger@9064: final String locale = config.getLocale(); gernotbelger@9064: this.dataTable.setEmptyMessage(this.MESSAGES.empty_table()); gernotbelger@9064: this.dataTable.setShowHeaderContextMenu(false); gernotbelger@9064: this.dataTable.setCanDragSelectText(true); raimund@256: gernotbelger@9064: this.exportService.getCSV(locale, this.uuid, this.name, new AsyncCallback>() { gernotbelger@9064: @Override gernotbelger@9064: public void onFailure(final Throwable caught) { gernotbelger@9064: GWT.log("Could not receive csv."); gernotbelger@9064: SC.warn(caught.getMessage()); gernotbelger@9064: } raimund@256: gernotbelger@9064: @Override gernotbelger@9064: public void onSuccess(final List l) { gernotbelger@9064: GWT.log("Recieved csv with " + l.size() + " lines."); gernotbelger@9064: setData(l); raimund@256: } gernotbelger@9064: }); raimund@256: gernotbelger@9064: this.container.addMember(this.dataTable); raimund@256: gernotbelger@9064: return this.container; raimund@256: } raimund@256: gernotbelger@9064: public void setName(final String name) { gernotbelger@9064: this.name = name; raimund@256: } raimund@256: gernotbelger@9064: public void setUuid(final String uuid) { gernotbelger@9064: this.uuid = uuid; raimund@256: } raimund@256: gernotbelger@9064: public Canvas createOld(final DataList dataList) { raimund@256: return null; raimund@256: } raimund@256: gernotbelger@9064: protected Canvas createWidget(final DataList data) { raimund@256: return null; raimund@256: } raimund@256: raimund@259: /** christian@4184: * This method sets the data to a dynamic table. raimund@259: * gernotbelger@9064: * @param list gernotbelger@9064: * List of String[] containing the data. raimund@259: */ gernotbelger@9064: public void setData(final List list) { ingo@1289: if (list == null || list.size() < 2) { gernotbelger@9064: this.dataTable.setEmptyMessage(this.MESSAGES.error_no_calc_result()); gernotbelger@9064: this.dataTable.redraw(); ingo@1289: return; ingo@1289: } ingo@1289: gernotbelger@9064: final Config config = Config.getInstance(); gernotbelger@9064: final String locale = config.getLocale(); ingo@1486: ingo@1486: NumberFormat nf; ingo@1486: if (locale.equals("de")) { ingo@1486: nf = NumberFormat.getFormat("#,##"); gernotbelger@9064: } else { ingo@1486: nf = NumberFormat.getFormat("#.##"); ingo@1486: } ingo@1486: gernotbelger@9064: final String[] header = list.get(0); gernotbelger@9064: final String[] displayField = new String[header.length]; ingo@1289: gernotbelger@9064: final ListGridField[] fields = new ListGridField[header.length]; ingo@1486: gernotbelger@9064: for (int i = 0; i < header.length; i++) { gernotbelger@9064: final ListGridField f = new ListGridField(String.valueOf(i)); raimund@259: fields[i] = f; raimund@259: f.setTitle(header[i]); raimund@906: raimund@906: try { gernotbelger@9064: /* gernotbelger@9064: * Try to determine the type with the first gernotbelger@9064: * non empty element. gernotbelger@9064: */ andre@8632: for (int j = 1; j < list.size(); j++) { andre@8632: if (!list.get(j)[i].isEmpty()) { andre@8632: nf.parse(list.get(j)[i]); andre@8632: f.setType(ListGridFieldType.FLOAT); andre@8632: break; andre@8632: } andre@8632: } raimund@906: } gernotbelger@9064: catch (final NumberFormatException nfe) { raimund@906: f.setType(ListGridFieldType.TEXT); raimund@906: } felix@7617: felix@7602: // To keep server-side formatting and i18n also of felix@7602: // float values, we will store the value once formatted 'as is' felix@7602: // to be displayed and once as e.g. float to allow functions like felix@7602: // sorting on it. felix@7602: displayField[i] = i + "_displayField"; felix@7602: f.setDisplayField(displayField[i]); felix@7602: f.setValueField(String.valueOf(i)); felix@7602: f.setSortByDisplayField(false); raimund@259: } raimund@259: gernotbelger@9064: this.dataTable.setFields(fields); raimund@259: gernotbelger@9064: for (int i = 1; i < list.size(); i++) { gernotbelger@9064: final String[] sItem = list.get(i); gernotbelger@9064: final ListGridRecord r = new ListGridRecord(); gernotbelger@9064: for (int j = 0; j < sItem.length; j++) { felix@7602: // See above, display 'as is' from server, but keep value felix@7602: // in machine-usable way (float), to allow numeric sorting. felix@7602: r.setAttribute(displayField[j], sItem[j]); felix@7602: if (fields[j].getType() == ListGridFieldType.TEXT) { felix@7602: r.setAttribute(String.valueOf(j), sItem[j]); gernotbelger@9064: } else { felix@7617: try { felix@7617: r.setAttribute(String.valueOf(j), nf.parse(sItem[j])); felix@7617: } gernotbelger@9064: catch (final NumberFormatException nfe) { felix@7617: r.setAttribute(String.valueOf(j), sItem[j]); felix@7617: } felix@7602: } raimund@256: } gernotbelger@9064: this.dataTable.addData(r); raimund@256: } raimund@256: } raimund@256: } raimund@256: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :