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 :