gernotbelger@9288: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde gernotbelger@9288: * Software engineering by Intevation GmbH gernotbelger@9288: * gernotbelger@9288: * This file is Free Software under the GNU AGPL (>=v3) gernotbelger@9288: * and comes with ABSOLUTELY NO WARRANTY! Check out the gernotbelger@9288: * documentation coming with Dive4Elements River for details. gernotbelger@9288: */ gernotbelger@9288: gernotbelger@9288: package org.dive4elements.river.client.client.ui; gernotbelger@9288: gernotbelger@9288: import java.util.ArrayList; gernotbelger@9288: import java.util.HashMap; gernotbelger@9288: import java.util.List; gernotbelger@9288: import java.util.Map; gernotbelger@9288: gernotbelger@9288: import org.dive4elements.river.client.client.Config; gernotbelger@9288: import org.dive4elements.river.client.client.FLYSConstants; gernotbelger@9288: import org.dive4elements.river.client.client.ui.wq.QDTable; gernotbelger@9288: import org.dive4elements.river.client.client.ui.wq.WTable; gernotbelger@9288: import org.dive4elements.river.client.shared.model.ArtifactDescription; gernotbelger@9288: import org.dive4elements.river.client.shared.model.Data; gernotbelger@9288: import org.dive4elements.river.client.shared.model.DataItem; gernotbelger@9288: import org.dive4elements.river.client.shared.model.DataList; gernotbelger@9288: import org.dive4elements.river.client.shared.model.DefaultData; gernotbelger@9288: import org.dive4elements.river.client.shared.model.DefaultDataItem; gernotbelger@9288: import org.dive4elements.river.client.shared.model.WQDataItem; gernotbelger@9288: import org.dive4elements.river.client.shared.model.WQInfoObject; gernotbelger@9288: import org.dive4elements.river.client.shared.model.WQInfoRecord; gernotbelger@9288: gernotbelger@9288: import com.google.gwt.core.client.GWT; gernotbelger@9288: import com.google.gwt.user.client.rpc.AsyncCallback; gernotbelger@9288: import com.smartgwt.client.data.Record; gernotbelger@9288: import com.smartgwt.client.util.SC; gernotbelger@9288: import com.smartgwt.client.widgets.Canvas; gernotbelger@9288: import com.smartgwt.client.widgets.Label; gernotbelger@9288: import com.smartgwt.client.widgets.form.DynamicForm; gernotbelger@9288: import com.smartgwt.client.widgets.form.fields.events.BlurEvent; gernotbelger@9288: import com.smartgwt.client.widgets.form.fields.events.BlurHandler; gernotbelger@9288: import com.smartgwt.client.widgets.form.fields.events.ChangeEvent; gernotbelger@9288: import com.smartgwt.client.widgets.form.fields.events.ChangeHandler; gernotbelger@9288: import com.smartgwt.client.widgets.grid.events.CellClickEvent; gernotbelger@9288: import com.smartgwt.client.widgets.grid.events.CellClickHandler; gernotbelger@9288: import com.smartgwt.client.widgets.layout.HLayout; gernotbelger@9288: import com.smartgwt.client.widgets.layout.VLayout; gernotbelger@9288: import com.smartgwt.client.widgets.tab.TabSet; gernotbelger@9288: gernotbelger@9288: /** gernotbelger@9288: * This UIProvider creates a widget to enter W or Q data for discharge gernotbelger@9288: * longitudinal section computations. gernotbelger@9288: * gernotbelger@9288: * @author Ingo Weinzierl gernotbelger@9288: */ gernotbelger@9288: abstract public class AbstractWQAdaptedInputPanel extends AbstractUIProvider implements ChangeHandler, BlurHandler { gernotbelger@9288: private static final long serialVersionUID = -3218827566805476423L; gernotbelger@9288: gernotbelger@9288: /** The message class that provides i18n strings. */ gernotbelger@9288: protected FLYSConstants MSG = GWT.create(FLYSConstants.class); gernotbelger@9288: protected static final int ROW_HEIGHT = 20; gernotbelger@9288: gernotbelger@9288: /** List of QDTables in inputhelper section. */ gernotbelger@9288: protected List qdTables; gernotbelger@9288: gernotbelger@9288: private static final String GAUGE_SEPARATOR = ":"; gernotbelger@9288: gernotbelger@9288: private static final String GAUGE_PART_SEPARATOR = ";"; gernotbelger@9288: gernotbelger@9288: private static final String VALUE_SEPARATOR = ","; gernotbelger@9288: gernotbelger@9288: /** Stores the input panels related to their keys. */ gernotbelger@9288: protected Map wqranges; gernotbelger@9288: gernotbelger@9288: /** [startkm,endkm] per gauge in selected range. */ gernotbelger@9288: protected List gaugeRanges; gernotbelger@9288: gernotbelger@9288: /** Stores the min/max values for each q range (gauge). */ gernotbelger@9288: protected Map qranges; gernotbelger@9288: gernotbelger@9288: /** The RadioGroupItem that determines the w/q input mode. */ gernotbelger@9288: protected DynamicForm modes; gernotbelger@9288: /** List of doubleArrayPanels shown. */ gernotbelger@9288: protected final ArrayList doubleArrayPanels = new ArrayList(); gernotbelger@9288: /** List of wTables in inputhelper section. */ gernotbelger@9288: protected List wTables; gernotbelger@9288: gernotbelger@9288: /** Tabs in inputhelper area. */ gernotbelger@9288: protected TabSet tabs; gernotbelger@9288: gernotbelger@9288: public AbstractWQAdaptedInputPanel() { gernotbelger@9288: this.wqranges = new HashMap(); gernotbelger@9288: this.qranges = new HashMap(); gernotbelger@9288: this.wTables = new ArrayList(); gernotbelger@9288: this.qdTables = new ArrayList(); gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: /** Inits the helper panel. */ gernotbelger@9288: // TODO duplicate in WQInputPanel gernotbelger@9288: protected void initHelperPanel() { gernotbelger@9288: this.tabs = new TabSet(); gernotbelger@9288: this.tabs.setWidth100(); gernotbelger@9288: this.tabs.setHeight100(); gernotbelger@9288: gernotbelger@9288: // For each gauge, add two tabs with helper tables. gernotbelger@9288: createTabs(); gernotbelger@9288: gernotbelger@9288: this.helperContainer.addMember(this.tabs); gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: /** Create labels, canvasses, layouts. */ gernotbelger@9288: @Override gernotbelger@9288: public Canvas create(final DataList data) { gernotbelger@9288: beforeCreate(data); gernotbelger@9288: gernotbelger@9288: readGaugeRanges(data); gernotbelger@9288: initHelperPanel(); gernotbelger@9288: gernotbelger@9288: final Canvas submit = getNextButton(); gernotbelger@9288: final Canvas widget = createWidget(data); gernotbelger@9288: final Label label = new Label(this.MSG.wqadaptedTitle()); gernotbelger@9288: gernotbelger@9288: label.setHeight(25); gernotbelger@9288: gernotbelger@9288: final VLayout layout = new VLayout(); gernotbelger@9288: layout.setMembersMargin(10); gernotbelger@9288: layout.setWidth(350); gernotbelger@9288: gernotbelger@9288: layout.addMember(label); gernotbelger@9288: layout.addMember(widget); gernotbelger@9288: layout.addMember(submit); gernotbelger@9288: gernotbelger@9288: fetchWQData(); gernotbelger@9288: gernotbelger@9288: initTableListeners(); gernotbelger@9288: gernotbelger@9288: afterCreate(); gernotbelger@9288: gernotbelger@9288: return layout; gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: protected abstract void createTabs(); gernotbelger@9288: gernotbelger@9288: protected abstract void beforeCreate(final DataList data); gernotbelger@9288: gernotbelger@9288: protected abstract void afterCreate(); gernotbelger@9288: gernotbelger@9288: /** gernotbelger@9288: * Initializes the listeners of the WQD tables. gernotbelger@9288: */ gernotbelger@9288: // TODO dupe from WQInputPanel gernotbelger@9288: protected void initTableListeners() { gernotbelger@9288: int i = 0; gernotbelger@9288: for (final QDTable qdTable : this.qdTables) { gernotbelger@9288: // Register listener such that values are filled in on click. gernotbelger@9288: final QDTable table = qdTable; gernotbelger@9288: final int fi = i; gernotbelger@9288: final CellClickHandler handler = new CellClickHandler() { gernotbelger@9288: @Override gernotbelger@9288: public void onCellClick(final CellClickEvent e) { gernotbelger@9288: if (table.isDisabled() || table.isLocked()) { gernotbelger@9288: return; gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: final Record r = e.getRecord(); gernotbelger@9288: final double val = r.getAttributeAsDouble("value"); gernotbelger@9288: gernotbelger@9288: AbstractWQAdaptedInputPanel.this.doubleArrayPanels.get(fi).setValues(new double[] { val }); gernotbelger@9288: // If a named value for first gauge is chosen, gernotbelger@9288: // try to find and set gernotbelger@9288: // the values to the other panels too. gernotbelger@9288: if (fi == 0) { gernotbelger@9288: final String valueName = r.getAttribute("name"); gernotbelger@9288: int oi = 0; gernotbelger@9288: // TODO instead of oi use random access. gernotbelger@9288: for (final QDTable otherQDTable : AbstractWQAdaptedInputPanel.this.qdTables) { gernotbelger@9288: if (oi == 0) { gernotbelger@9288: oi++; gernotbelger@9288: continue; gernotbelger@9288: } gernotbelger@9288: final Double value = otherQDTable.findRecordValue(valueName); gernotbelger@9288: if (value == null) { gernotbelger@9288: SC.warn(AbstractWQAdaptedInputPanel.this.MSG.noMainValueAtGauge()); gernotbelger@9288: } else { gernotbelger@9288: AbstractWQAdaptedInputPanel.this.doubleArrayPanels.get(oi).setValues(new double[] { value }); gernotbelger@9288: } gernotbelger@9288: oi++; gernotbelger@9288: } gernotbelger@9288: } else { gernotbelger@9288: // Focus next. gernotbelger@9288: if (fi != AbstractWQAdaptedInputPanel.this.doubleArrayPanels.size() - 1) { gernotbelger@9288: AbstractWQAdaptedInputPanel.this.doubleArrayPanels.get(fi + 1).focusInItem(1); gernotbelger@9288: } gernotbelger@9288: } gernotbelger@9288: } gernotbelger@9288: }; gernotbelger@9288: gernotbelger@9288: qdTable.addCellClickHandler(handler); gernotbelger@9288: i++; gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: i = 0; gernotbelger@9288: for (final WTable wTable : this.wTables) { gernotbelger@9288: // Register listener such that values are filled in on click. gernotbelger@9288: final WTable table = wTable; gernotbelger@9288: final int fi = i; gernotbelger@9288: final CellClickHandler handler = new CellClickHandler() { gernotbelger@9288: gernotbelger@9288: @Override gernotbelger@9288: public void onCellClick(final CellClickEvent e) { gernotbelger@9288: if (table.isDisabled()) { gernotbelger@9288: return; gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: final Record r = e.getRecord(); gernotbelger@9288: final double val = r.getAttributeAsDouble("value"); gernotbelger@9288: gernotbelger@9288: AbstractWQAdaptedInputPanel.this.doubleArrayPanels.get(fi).setValues(new double[] { val }); gernotbelger@9288: // If a named value for first gauge is chosen, gernotbelger@9288: // try to find and set gernotbelger@9288: // the values to the other panels too. gernotbelger@9288: if (fi == 0) { gernotbelger@9288: final String valueName = r.getAttribute("name"); gernotbelger@9288: int oi = 0; gernotbelger@9288: // TODO instead of oi use random access. gernotbelger@9288: for (final WTable otherWTable : AbstractWQAdaptedInputPanel.this.wTables) { gernotbelger@9288: if (oi == 0) { gernotbelger@9288: oi++; gernotbelger@9288: continue; gernotbelger@9288: } gernotbelger@9288: final Double value = otherWTable.findRecordValue(valueName); gernotbelger@9288: if (value == null) { gernotbelger@9288: // TODO: afterwards it freaks out gernotbelger@9288: SC.warn(AbstractWQAdaptedInputPanel.this.MSG.noMainValueAtGauge()); gernotbelger@9288: } else { gernotbelger@9288: AbstractWQAdaptedInputPanel.this.doubleArrayPanels.get(oi).setValues(new double[] { value }); gernotbelger@9288: } gernotbelger@9288: oi++; gernotbelger@9288: } gernotbelger@9288: } else { gernotbelger@9288: // Focus next. gernotbelger@9288: if (fi != AbstractWQAdaptedInputPanel.this.doubleArrayPanels.size() - 1) { gernotbelger@9288: AbstractWQAdaptedInputPanel.this.doubleArrayPanels.get(fi + 1).focusInItem(1); gernotbelger@9288: } gernotbelger@9288: } gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: }; gernotbelger@9288: gernotbelger@9288: wTable.addCellClickHandler(handler); gernotbelger@9288: i++; gernotbelger@9288: } gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: /** Create area showing previously entered w or q data. */ gernotbelger@9288: protected final Canvas createOldWQValues(final Data wqData, final boolean isQ) { gernotbelger@9288: gernotbelger@9288: final VLayout layout = new VLayout(); gernotbelger@9288: if (wqData != null) { gernotbelger@9288: final DataItem item = wqData.getItems()[0]; gernotbelger@9288: final String value = item.getStringValue(); gernotbelger@9288: gernotbelger@9288: final String[] gauges = value.split(GAUGE_SEPARATOR); gernotbelger@9288: gernotbelger@9288: final String unit = isQ ? "m³/s" : "cm"; gernotbelger@9288: gernotbelger@9288: for (final String gauge : gauges) { gernotbelger@9288: final HLayout h = new HLayout(); gernotbelger@9288: gernotbelger@9288: final String[] parts = gauge.split(GAUGE_PART_SEPARATOR); gernotbelger@9288: final String[] values = parts[3].split(VALUE_SEPARATOR); gernotbelger@9288: gernotbelger@9288: final Label l = new Label(parts[2] + ": "); gernotbelger@9288: gernotbelger@9288: final StringBuilder sb = new StringBuilder(); gernotbelger@9288: boolean first = true; gernotbelger@9288: gernotbelger@9288: for (final String v : values) { gernotbelger@9288: if (!first) { gernotbelger@9288: sb.append(", "); gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: sb.append(v); gernotbelger@9288: sb.append(" "); gernotbelger@9288: sb.append(unit); gernotbelger@9288: gernotbelger@9288: first = false; gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: final Label v = new Label(sb.toString()); gernotbelger@9288: gernotbelger@9288: l.setWidth(65); gernotbelger@9288: v.setWidth(65); gernotbelger@9288: gernotbelger@9288: h.addMember(l); gernotbelger@9288: h.addMember(v); gernotbelger@9288: gernotbelger@9288: layout.addMember(h); gernotbelger@9288: } gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: return layout; gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: protected void initUserWQValues(final DataList dataList) { gernotbelger@9288: final List allData = dataList.getAll(); gernotbelger@9288: gernotbelger@9288: final Data dDef = getData(allData, "wq_values"); gernotbelger@9288: final DataItem def = dDef != null ? dDef.getDefault() : null; gernotbelger@9288: final String value = def != null ? def.getStringValue() : null; gernotbelger@9288: gernotbelger@9288: if (value == null || value.length() == 0) { gernotbelger@9288: return; gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: final String[] lines = value.split(GAUGE_SEPARATOR); gernotbelger@9288: gernotbelger@9288: if (lines == null || lines.length == 0) { gernotbelger@9288: return; gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: for (final String line : lines) { gernotbelger@9288: final String[] cols = line.split(GAUGE_PART_SEPARATOR); gernotbelger@9288: // final String title = createLineTitle(line); gernotbelger@9288: gernotbelger@9288: if (cols == null || cols.length < 3) { gernotbelger@9288: continue; gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: final String[] strValues = cols[2].split(VALUE_SEPARATOR); gernotbelger@9288: final double[] values = new double[strValues.length]; gernotbelger@9288: gernotbelger@9288: int idx = 0; gernotbelger@9288: gernotbelger@9288: for (final String strValue : strValues) { gernotbelger@9288: try { gernotbelger@9288: values[idx++] = Double.valueOf(strValue); gernotbelger@9288: } gernotbelger@9288: catch (final NumberFormatException nfe) { gernotbelger@9288: // do nothing gernotbelger@9288: } gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: final String key = cols[0] + GAUGE_PART_SEPARATOR + cols[1]; gernotbelger@9288: final DoubleArrayPanel dap = this.wqranges.get(key); gernotbelger@9288: gernotbelger@9288: if (dap == null) { gernotbelger@9288: continue; gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: dap.setValues(values); gernotbelger@9288: } gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: /** Populate Gauge Ranges array. */ gernotbelger@9288: protected final void readGaugeRanges(final DataList dataList) { gernotbelger@9288: final List items = getWQItems(dataList); gernotbelger@9288: this.gaugeRanges = new ArrayList(); gernotbelger@9288: gernotbelger@9288: for (final DataItem item : items) { gernotbelger@9288: if (item instanceof WQDataItem) { gernotbelger@9288: final String[] startEndKm = item.getLabel().split(";"); gernotbelger@9288: final Double[] kvp = new Double[] { Double.parseDouble(startEndKm[0]), Double.parseDouble(startEndKm[1]) }; gernotbelger@9288: this.gaugeRanges.add(kvp); gernotbelger@9288: } gernotbelger@9288: } gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: /** Get items which are not WQ_MODE. */ gernotbelger@9288: protected List getWQItems(final DataList dataList) { gernotbelger@9288: final List data = dataList.getAll(); gernotbelger@9288: final List results = new ArrayList(); gernotbelger@9288: for (final Data d : data) { gernotbelger@9288: final DataItem[] items = d.getItems(); gernotbelger@9288: if (items != null) { gernotbelger@9288: for (final Object item : items) { gernotbelger@9288: if (item instanceof WQDataItem) gernotbelger@9288: results.add((WQDataItem) item); gernotbelger@9288: } gernotbelger@9288: } gernotbelger@9288: } gernotbelger@9288: return results; gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: protected final Data getWQValues(final String dataKey) { gernotbelger@9288: String wqvalue = null; gernotbelger@9288: gernotbelger@9288: for (final Map.Entry entry : this.wqranges.entrySet()) { gernotbelger@9288: final String key = entry.getKey(); gernotbelger@9288: final DoubleArrayPanel dap = entry.getValue(); gernotbelger@9288: final String label = dap.getItemTitle(); gernotbelger@9288: gernotbelger@9288: final double[] values = dap.getInputValues(); gernotbelger@9288: if (wqvalue == null) { gernotbelger@9288: wqvalue = createValueString(key + ";" + label, values); gernotbelger@9288: } else { gernotbelger@9288: wqvalue += GAUGE_SEPARATOR + createValueString(key + ";" + label, values); gernotbelger@9288: } gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: final DataItem valueItem = new DefaultDataItem(dataKey, dataKey, wqvalue); gernotbelger@9288: final Data values = new DefaultData(dataKey, null, null, new DataItem[] { valueItem }); gernotbelger@9288: gernotbelger@9288: return values; gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: protected String createValueString(final String key, final double[] values) { gernotbelger@9288: final StringBuilder sb = new StringBuilder(); gernotbelger@9288: gernotbelger@9288: boolean first = true; gernotbelger@9288: gernotbelger@9288: for (final double value : values) { gernotbelger@9288: if (!first) { gernotbelger@9288: sb.append(","); gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: sb.append(Double.toString(value)); gernotbelger@9288: gernotbelger@9288: first = false; gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: return key + ";" + sb.toString(); gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: @Override gernotbelger@9288: public void onChange(final ChangeEvent event) { gernotbelger@9288: // TODO IMPLEMENT ME gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: /** Store the currently focussed DoubleArrayPanel and focus helper tab. */ gernotbelger@9288: gernotbelger@9288: @Override gernotbelger@9288: public final void onBlur(final BlurEvent event) { gernotbelger@9288: final DoubleArrayPanel dap = (DoubleArrayPanel) event.getForm(); gernotbelger@9288: dap.validateForm(event.getItem()); gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: /** Get the WQD data from service and stuck them up that tables. */ gernotbelger@9288: protected void fetchWQData() { gernotbelger@9288: final Config config = Config.getInstance(); gernotbelger@9288: final String locale = config.getLocale(); gernotbelger@9288: gernotbelger@9288: final ArtifactDescription adescr = this.artifact.getArtifactDescription(); gernotbelger@9288: final DataList[] data = adescr.getOldData(); gernotbelger@9288: gernotbelger@9288: final String river = getRiverName(data); gernotbelger@9288: gernotbelger@9288: int i = 0; gernotbelger@9288: gernotbelger@9288: // Get Data for respective gauge. gernotbelger@9288: for (final Double[] range : this.gaugeRanges) { gernotbelger@9288: // Gauge ranges overlap, move start and end a bit closer gernotbelger@9288: // to each other. gernotbelger@9288: final double rDiff = (range[1] - range[0]) / 10d; gernotbelger@9288: final int fi = i; gernotbelger@9288: gernotbelger@9288: final AsyncCallback cb = new AsyncCallback() { gernotbelger@9288: @Override gernotbelger@9288: public void onFailure(final Throwable caught) { gernotbelger@9288: GWT.log("Could not recieve wq informations."); gernotbelger@9288: SC.warn(caught.getMessage()); gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: @Override gernotbelger@9288: public void onSuccess(final WQInfoObject[] wqi) { gernotbelger@9288: final int num = wqi != null ? wqi.length : 0; gernotbelger@9288: GWT.log("Received " + num + " wq informations (" + fi + "."); gernotbelger@9288: gernotbelger@9288: if (num == 0) { gernotbelger@9288: return; gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: addWQInfo(wqi, fi); gernotbelger@9288: } gernotbelger@9288: }; gernotbelger@9288: gernotbelger@9288: callMainValuesService(locale, river, range[0] + rDiff, range[1] - rDiff, cb); gernotbelger@9288: gernotbelger@9288: i++; gernotbelger@9288: } gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: protected abstract void callMainValuesService(String locale, String river, double start, double end, AsyncCallback cb); gernotbelger@9288: gernotbelger@9288: /** Add Info to helper table for gauge at index gaugeIdx. */ gernotbelger@9288: private void addWQInfo(final WQInfoObject[] wqi, final int gaugeIdx) { gernotbelger@9288: for (final WQInfoObject wi : wqi) { gernotbelger@9288: final WQInfoRecord rec = new WQInfoRecord(wi); gernotbelger@9288: gernotbelger@9288: if (wi.getType().equals("W")) { gernotbelger@9288: if (gaugeIdx < this.wTables.size()) gernotbelger@9288: this.wTables.get(gaugeIdx).addData(rec); gernotbelger@9393: } else { // Q,D,- alle gehören hier rein! gernotbelger@9288: if (gaugeIdx < this.qdTables.size()) gernotbelger@9288: this.qdTables.get(gaugeIdx).addData(rec); gernotbelger@9288: } gernotbelger@9288: } gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: /** gernotbelger@9288: * Returns the name of the selected river. gernotbelger@9288: * gernotbelger@9288: * @param data gernotbelger@9288: * The DataList with all data. gernotbelger@9288: * gernotbelger@9288: * @return the name of the current river. gernotbelger@9288: */ gernotbelger@9288: protected String getRiverName(final DataList[] data) { gernotbelger@9288: final ArtifactDescription adesc = this.artifact.getArtifactDescription(); gernotbelger@9288: return adesc.getRiver(); gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: abstract protected Canvas createWidget(final DataList dataList); gernotbelger@9288: }