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.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@9404: import org.dive4elements.river.client.shared.model.GaugeInfoObject; 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@9407: import com.google.gwt.dom.client.Style.Unit; gernotbelger@9407: import com.google.gwt.user.client.ui.Label; 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.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@9404: private Canvas submit; gernotbelger@9404: gernotbelger@9404: private final List gaugeNames = new ArrayList(); gernotbelger@9404: private final Map gaugeNamesRange = new HashMap(); gernotbelger@9404: 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@9404: protected final Map getGaugeNamesRange() { gernotbelger@9404: return this.gaugeNamesRange; gernotbelger@9404: } gernotbelger@9404: gernotbelger@9404: protected final String[] getGaugeNames() { gernotbelger@9404: return this.gaugeNames.toArray(new String[this.gaugeNames.size()]); gernotbelger@9404: } gernotbelger@9404: gernotbelger@9288: /** Inits the helper panel. */ gernotbelger@9288: // TODO duplicate in WQInputPanel gernotbelger@9288: protected void initHelperPanel() { gernotbelger@9407: final VLayout layout = new VLayout(); gernotbelger@9288: this.tabs = new TabSet(); gernotbelger@9288: this.tabs.setWidth100(); gernotbelger@9288: this.tabs.setHeight100(); gernotbelger@9407: final String msg = this.getWQInfoMsg(); gernotbelger@9407: final Label test = PanelHelper.getValidationLabel(); gernotbelger@9407: test.setText(msg); mschaefer@9409: test.getElement().getStyle().setColor("black"); gernotbelger@9407: test.getElement().getStyle().setPadding(1, Unit.MM); gernotbelger@9288: gernotbelger@9288: // For each gauge, add two tabs with helper tables. gernotbelger@9288: createTabs(); gernotbelger@9407: layout.addMember(this.tabs); gernotbelger@9407: if (msg != null) gernotbelger@9407: layout.addMember(test); gernotbelger@9288: gernotbelger@9407: this.helperContainer.addMember(layout); gernotbelger@9407: // DOM.setStyleAttribute(test.getElement(), "color", "red"); gernotbelger@9407: 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@9404: this.submit = getNextButton(); gernotbelger@9288: final Canvas widget = createWidget(data); gernotbelger@9288: final Label label = new Label(this.MSG.wqadaptedTitle()); gernotbelger@9288: gernotbelger@9407: label.setHeight("25px"); 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@9404: layout.addMember(this.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@9404: protected final Canvas getSubmitBtn() { gernotbelger@9404: return this.submit; gernotbelger@9404: } gernotbelger@9404: 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@9407: l.setWidth("65px"); gernotbelger@9407: v.setWidth("65px"); 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@9404: final String gaugeName = item.getStringValue(); gernotbelger@9404: this.gaugeNames.add(gaugeName); gernotbelger@9404: this.gaugeNamesRange.put(gaugeName, 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@9404: protected abstract void fetchWQData(); gernotbelger@9288: gernotbelger@9404: // protected abstract void callMainValuesService(String locale, String river, double start, double end, gernotbelger@9404: // AsyncCallback cb); gernotbelger@9288: gernotbelger@9404: /** Add Info to helper table for gauge at index gaugeIdx. */ gernotbelger@9404: public void addWQInfo(final WQInfoObject[] wqi, final int gaugeIdx, final GaugeInfoObject gauge) { gernotbelger@9404: if (wqi == null) { gernotbelger@9404: // this.wTables.get(gaugeIdx).setLoadingDataMessage(""); (keine W-tables vorhanden - wo W-Table benutzt werden, gibt es gernotbelger@9404: // ein Popup) gernotbelger@9404: final String emptyMsg = gauge.getErrorMessage(); gernotbelger@9404: final QDTable table = this.qdTables.get(gaugeIdx); gernotbelger@9404: table.setEmptyMessage(emptyMsg == null ? "" : emptyMsg); gernotbelger@9404: table.redraw(); gernotbelger@9404: } else { gernotbelger@9404: for (final WQInfoObject wi : wqi) { gernotbelger@9404: final WQInfoRecord rec = new WQInfoRecord(wi); gernotbelger@9288: gernotbelger@9404: if (wi.getType().equals("W")) { gernotbelger@9404: if (gaugeIdx < this.wTables.size()) gernotbelger@9404: this.wTables.get(gaugeIdx).addData(rec); gernotbelger@9404: } else { // Q,D,- alle gehören hier rein! gernotbelger@9404: if (gaugeIdx < this.qdTables.size()) gernotbelger@9404: this.qdTables.get(gaugeIdx).addData(rec); gernotbelger@9288: } gernotbelger@9404: } gernotbelger@9288: } gernotbelger@9404: if (gauge != null) gernotbelger@9404: AbstractWQAdaptedInputPanel.this.doubleArrayPanels.get(gaugeIdx).setError(gauge.getErrorMessage()); gernotbelger@9288: } gernotbelger@9288: gernotbelger@9404: public void resetLoadingMessageOfQTable(final String msg) { gernotbelger@9404: for (final QDTable table : this.qdTables) { gernotbelger@9404: table.setEmptyMessage(msg); gernotbelger@9404: table.redraw(); 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@9407: protected abstract Canvas createWidget(final DataList dataList); gernotbelger@9407: gernotbelger@9407: protected abstract String getWQInfoMsg(); gernotbelger@9288: }