gernotbelger@9276: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde gernotbelger@9276: * Software engineering by Intevation GmbH gernotbelger@9276: * gernotbelger@9276: * This file is Free Software under the GNU AGPL (>=v3) gernotbelger@9276: * and comes with ABSOLUTELY NO WARRANTY! Check out the gernotbelger@9276: * documentation coming with Dive4Elements River for details. gernotbelger@9276: */ gernotbelger@9276: gernotbelger@9276: package org.dive4elements.river.client.client.ui.bundu; gernotbelger@9276: gernotbelger@9276: import java.util.ArrayList; gernotbelger@9404: import java.util.Date; gernotbelger@9288: import java.util.LinkedHashMap; gernotbelger@9276: import java.util.List; gernotbelger@9276: import java.util.Map; gernotbelger@9276: gernotbelger@9404: import org.dive4elements.river.client.client.Config; gernotbelger@9288: import org.dive4elements.river.client.client.services.DynamicMainValuesService; gernotbelger@9288: import org.dive4elements.river.client.client.services.DynamicMainValuesServiceAsync; gernotbelger@9404: import org.dive4elements.river.client.client.services.DynamicMainValuesTimeRangeDeterminationService; gernotbelger@9404: import org.dive4elements.river.client.client.services.DynamicMainValuesTimeRangeDeterminationServiceAsync; gernotbelger@9288: import org.dive4elements.river.client.client.ui.AbstractWQAdaptedInputPanel; gernotbelger@9276: import org.dive4elements.river.client.client.ui.DoubleArrayPanel; gernotbelger@9288: import org.dive4elements.river.client.client.ui.wq.QDTable; gernotbelger@9404: import org.dive4elements.river.client.shared.model.ArtifactDescription; gernotbelger@9277: import org.dive4elements.river.client.shared.model.Data; gernotbelger@9278: import org.dive4elements.river.client.shared.model.DataItem; gernotbelger@9277: 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@9276: gernotbelger@9288: import com.google.gwt.core.client.GWT; gernotbelger@9276: import com.google.gwt.i18n.client.NumberFormat; gernotbelger@9288: import com.google.gwt.user.client.rpc.AsyncCallback; gernotbelger@9288: import com.smartgwt.client.types.TitleOrientation; gernotbelger@9288: import com.smartgwt.client.types.VerticalAlignment; gernotbelger@9288: import com.smartgwt.client.types.Visibility; gernotbelger@9404: import com.smartgwt.client.util.SC; gernotbelger@9277: 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.RadioGroupItem; gernotbelger@9288: import com.smartgwt.client.widgets.form.fields.TextItem; gernotbelger@9288: import com.smartgwt.client.widgets.form.fields.events.ChangeEvent; gernotbelger@9288: import com.smartgwt.client.widgets.form.fields.events.ChangeHandler; gernotbelger@9293: import com.smartgwt.client.widgets.form.fields.events.FocusEvent; gernotbelger@9293: import com.smartgwt.client.widgets.form.fields.events.FocusHandler; gernotbelger@9288: import com.smartgwt.client.widgets.form.validator.IntegerRangeValidator; 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.Tab; gernotbelger@9276: gernotbelger@9276: /** gernotbelger@9276: * This UIProvider creates a widget to enter W or Q data for gernotbelger@9276: * Fixation analysis gernotbelger@9276: * gernotbelger@9276: * @author Andre Heinecke gernotbelger@9276: */ gernotbelger@9293: public class BunduWstWQPanel extends AbstractWQAdaptedInputPanel implements FocusHandler { gernotbelger@9288: gernotbelger@9288: private static final long serialVersionUID = -1L; gernotbelger@9288: gernotbelger@9288: private static enum mode { gernotbelger@9288: Q, UD gernotbelger@9288: } gernotbelger@9288: gernotbelger@9293: /** The currently focussed Input element. */ gernotbelger@9293: private DoubleArrayPanel itemWithFocus; gernotbelger@9293: gernotbelger@9288: /** Service to fetch W/Q MainValues. */ gernotbelger@9288: private final DynamicMainValuesServiceAsync mainValueService = GWT.create(DynamicMainValuesService.class); gernotbelger@9404: private final DynamicMainValuesTimeRangeDeterminationServiceAsync serviceForTime = GWT.create(DynamicMainValuesTimeRangeDeterminationService.class); gernotbelger@9288: gernotbelger@9288: private final RadioGroupItem radiogroup = new RadioGroupItem(); gernotbelger@9276: gernotbelger@9278: private int bezugsjahr = 0; gernotbelger@9288: gernotbelger@9278: private int qSeriesLength = 0; gernotbelger@9278: gernotbelger@9288: private Canvas list; gernotbelger@9288: gernotbelger@9288: private final DynamicForm udForm = new DynamicForm(); gernotbelger@9288: gernotbelger@9288: private final TextItem udInputItem = new TextItem(); gernotbelger@9288: gernotbelger@9277: @Override gernotbelger@9288: protected void beforeCreate(final DataList data) { gernotbelger@9278: for (final Data container : data.getAll()) { gernotbelger@9288: final DataItem[] items = container.getItems(); gernotbelger@9288: if (items != null) { gernotbelger@9288: for (final DataItem item : items) { gernotbelger@9288: if ("ignore_bezugsjahr".equals(item.getLabel())) { gernotbelger@9288: this.bezugsjahr = Integer.valueOf(item.getStringValue()); gernotbelger@9288: } else if ("ignore_q_series_length".equals(item.getLabel())) { gernotbelger@9288: this.qSeriesLength = Integer.valueOf(item.getStringValue()); gernotbelger@9288: } gernotbelger@9278: } gernotbelger@9278: } gernotbelger@9278: } gernotbelger@9277: } gernotbelger@9277: gernotbelger@9276: @Override gernotbelger@9288: protected void afterCreate() { gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: @Override gernotbelger@9288: protected Canvas createWidget(final DataList dataList) { gernotbelger@9288: final VLayout layout = new VLayout(); gernotbelger@9288: final Canvas mode = createMode(dataList); gernotbelger@9288: gernotbelger@9288: this.list = createList(dataList); gernotbelger@9288: gernotbelger@9288: this.udInputItem.setShowTitle(false); gernotbelger@9288: this.udInputItem.setWidth(120); gernotbelger@9288: final IntegerRangeValidator validator = new IntegerRangeValidator(); gernotbelger@9288: validator.setMax(364); gernotbelger@9288: validator.setMin(0); gernotbelger@9288: validator.setErrorMessage(this.MSG.bundu_bezugswst_validation_range()); gernotbelger@9288: this.udInputItem.setRequiredMessage(this.MSG.bundu_bezugswst_validation_range()); gernotbelger@9288: this.udInputItem.setValidators(validator); gernotbelger@9288: this.udInputItem.setValidateOnChange(true); gernotbelger@9288: this.udForm.setFields(this.udInputItem); gernotbelger@9288: gernotbelger@9288: final List items = getWQItems(dataList); gernotbelger@9288: final int listHeight = ROW_HEIGHT * items.size(); gernotbelger@9288: gernotbelger@9288: mode.setHeight(25); gernotbelger@9288: mode.setWidth(200); gernotbelger@9288: gernotbelger@9288: layout.addMember(mode); gernotbelger@9288: layout.addMember(this.list); gernotbelger@9288: layout.addMember(this.udForm); gernotbelger@9288: layout.setHeight(25 + listHeight); gernotbelger@9288: layout.setWidth(350); gernotbelger@9288: enableQ(); gernotbelger@9288: return layout; gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: /** gernotbelger@9288: * Create radio button for switching gernotbelger@9288: * Radiobutton-change also triggers helper panel tab selection. gernotbelger@9288: */ gernotbelger@9288: gernotbelger@9288: private Canvas createMode(final DataList dataList) { gernotbelger@9288: this.radiogroup.setShowTitle(false); gernotbelger@9288: this.radiogroup.setVertical(false); gernotbelger@9288: this.radiogroup.setWidth(200); gernotbelger@9288: gernotbelger@9288: final LinkedHashMap wqValues = new LinkedHashMap(); gernotbelger@9288: wqValues.put(String.valueOf(mode.Q), this.MSG.wqQatGauge()); gernotbelger@9288: wqValues.put(String.valueOf(mode.UD), this.MSG.bundu_bezugswst_mode_ud()); gernotbelger@9288: this.radiogroup.setValueMap(wqValues); gernotbelger@9288: this.radiogroup.setValue(String.valueOf(mode.Q)); gernotbelger@9288: gernotbelger@9288: this.modes = new DynamicForm(); gernotbelger@9288: this.modes.setFields(this.radiogroup); gernotbelger@9288: this.modes.setWidth(200); gernotbelger@9288: this.radiogroup.addChangeHandler(new ChangeHandler() { gernotbelger@9288: @Override gernotbelger@9288: public void onChange(final ChangeEvent e) { gernotbelger@9288: gernotbelger@9288: final String value = e.getValue().toString(); gernotbelger@9288: if (value.equals(String.valueOf(mode.UD))) { gernotbelger@9290: enableUD(); gernotbelger@9290: } else if (value.equals(String.valueOf(mode.Q))) { gernotbelger@9288: enableQ(); gernotbelger@9288: } gernotbelger@9288: } gernotbelger@9288: }); gernotbelger@9288: return this.modes; gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: private void enableUD() { gernotbelger@9290: BunduWstWQPanel.this.list.setVisibility(Visibility.HIDDEN); gernotbelger@9290: BunduWstWQPanel.this.udForm.setVisibility(Visibility.VISIBLE); gernotbelger@9290: BunduWstWQPanel.this.tabs.disable(); gernotbelger@9290: } gernotbelger@9290: gernotbelger@9290: private void enableQ() { gernotbelger@9288: BunduWstWQPanel.this.list.setVisibility(Visibility.VISIBLE); gernotbelger@9288: BunduWstWQPanel.this.udForm.setVisibility(Visibility.HIDDEN); gernotbelger@9288: BunduWstWQPanel.this.tabs.enable(); gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: private final String getMode() { gernotbelger@9288: return (String) this.radiogroup.getValue(); gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: @Override gernotbelger@9288: public Data[] getData() { gernotbelger@9288: final Data[] data = new Data[2]; gernotbelger@9288: final String modeStr = getMode(); gernotbelger@9288: final DataItem item = new DefaultDataItem("bundu.wst.mode", "bundu.wst.mode", modeStr); gernotbelger@9288: final Data modeData = new DefaultData("bundu.wst.mode", null, null, new DataItem[] { item }); gernotbelger@9288: data[0] = modeData; gernotbelger@9288: if (modeStr.equals(mode.Q.toString())) { gernotbelger@9288: data[1] = getWQValues("wq_values"); gernotbelger@9288: } else if (modeStr.equals(mode.UD.toString())) { gernotbelger@9288: final String udValue = this.udInputItem.getValueAsString(); // in validate findet der int-check statt; er verhindert ein weitergehen, falls der Wert gernotbelger@9288: // nicht int-kompatibel ist gernotbelger@9288: final DataItem itemV = new DefaultDataItem("bundu.wst.ud_value", "bundu.wst.ud_value", udValue); gernotbelger@9288: data[1] = new DefaultData("bundu.wst.ud_value", null, null, new DataItem[] { itemV }); gernotbelger@9288: } gernotbelger@9288: return data; gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: @Override gernotbelger@9288: protected void createTabs() { gernotbelger@9288: for (int i = 0; i < this.gaugeRanges.size(); i++) { gernotbelger@9288: final Tab qTab = new Tab(this.MSG.wq_table_q()); gernotbelger@9407: qTab.setPaneMargin(0); gernotbelger@9288: final QDTable qdTable = new QDTable(); gernotbelger@9288: this.qdTables.add(qdTable); gernotbelger@9288: qdTable.showSelect(); gernotbelger@9288: qTab.setPane(qdTable); gernotbelger@9288: this.tabs.addTab(qTab, i); gernotbelger@9288: } gernotbelger@9288: this.tabs.setSelectedTab(0); gernotbelger@9407: gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: private Canvas createList(final DataList dataList) { gernotbelger@9288: final VLayout layout = new VLayout(); gernotbelger@9288: gernotbelger@9288: final List items = getWQItems(dataList); gernotbelger@9288: gernotbelger@9288: int i = 0; gernotbelger@9288: for (final DataItem item : items) { gernotbelger@9288: if (item instanceof WQDataItem) { gernotbelger@9288: final String title = item.getLabel(); gernotbelger@9288: final String label = item.getStringValue(); gernotbelger@9288: gernotbelger@9288: this.tabs.getTab(i).setTitle(this.tabs.getTab(i).getTitle() + " (" + label + ")"); gernotbelger@9288: gernotbelger@9293: final DoubleArrayPanel dap = new DoubleArrayPanel(label, null, this, this, TitleOrientation.LEFT); gernotbelger@9288: this.wqranges.put(title, dap); gernotbelger@9288: this.doubleArrayPanels.add(dap); gernotbelger@9288: if (item instanceof WQDataItem) { gernotbelger@9288: final WQDataItem wq = (WQDataItem) item; gernotbelger@9288: final double[] mmQ = wq.getQRange(); gernotbelger@9288: this.qranges.put(title, mmQ); gernotbelger@9288: gernotbelger@9288: } gernotbelger@9288: layout.addMember(dap); gernotbelger@9288: i++; gernotbelger@9288: } gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: layout.setHeight(items.size() * ROW_HEIGHT); gernotbelger@9288: gernotbelger@9288: return layout; gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: @Override gernotbelger@9288: public List validate() { gernotbelger@9276: final List errors = new ArrayList(); gernotbelger@9288: if (getMode().equals(mode.Q.toString())) { gernotbelger@9288: errors.addAll(this.validateRange(this.qranges)); gernotbelger@9288: } else if (getMode().equals(mode.UD.toString())) { gernotbelger@9288: try { gernotbelger@9290: if (!this.udInputItem.validate()) { gernotbelger@9288: errors.add(this.udInputItem.getRequiredMessage()); gernotbelger@9288: } gernotbelger@9292: final String value = this.udInputItem.getValueAsString(); gernotbelger@9292: if (value == null || value.isEmpty()) { gernotbelger@9292: errors.add(this.MSG.missingInput()); gernotbelger@9292: return errors; gernotbelger@9292: } gernotbelger@9292: Integer.valueOf(value);// irgendwie klappt die validator-validierung nur bei der eingabe von gernotbelger@9292: // ganzzahlen :-( gernotbelger@9288: } gernotbelger@9288: catch (final NumberFormatException e) { gernotbelger@9288: errors.add(this.MSG.error_invalid_integer()); gernotbelger@9288: } gernotbelger@9288: } gernotbelger@9288: return errors; gernotbelger@9288: } gernotbelger@9288: gernotbelger@9288: private List validateRange(final Map ranges) { gernotbelger@9288: final List errors = new ArrayList(); gernotbelger@9288: gernotbelger@9276: final NumberFormat nf = NumberFormat.getDecimalFormat(); gernotbelger@9276: gernotbelger@9276: for (final DoubleArrayPanel dap : this.wqranges.values()) { gernotbelger@9276: gernotbelger@9276: if (!dap.validateForm()) { gernotbelger@9276: errors.add(this.MSG.error_invalid_double_value()); gernotbelger@9276: return errors; gernotbelger@9276: } gernotbelger@9276: gernotbelger@9276: int idx = 0; gernotbelger@9276: gernotbelger@9276: final double[] values = dap.getInputValues(); gernotbelger@9292: if (values == null) { gernotbelger@9292: errors.add(this.MSG.missingInputs()); gernotbelger@9292: return errors; gernotbelger@9292: } gernotbelger@9276: final double[] good = new double[values.length]; gernotbelger@9276: gernotbelger@9276: for (final double value : values) { gernotbelger@9276: if (value <= 0) { gernotbelger@9276: String tmp = this.MSG.error_validate_positive(); gernotbelger@9276: tmp = tmp.replace("$1", nf.format(value)); gernotbelger@9276: errors.add(tmp); gernotbelger@9276: } else { gernotbelger@9276: good[idx++] = value; gernotbelger@9276: } gernotbelger@9276: } gernotbelger@9276: gernotbelger@9276: final double[] justGood = new double[idx]; gernotbelger@9276: for (int i = 0; i < justGood.length; i++) { gernotbelger@9276: justGood[i] = good[i]; gernotbelger@9276: } gernotbelger@9276: gernotbelger@9276: if (!errors.isEmpty()) { gernotbelger@9276: dap.setValues(justGood); gernotbelger@9276: } gernotbelger@9276: } gernotbelger@9276: return errors; gernotbelger@9276: } gernotbelger@9288: gernotbelger@9288: @Override gernotbelger@9288: public Canvas createOld(final DataList dataList) { gernotbelger@9288: final List all = dataList.getAll(); gernotbelger@9288: final Data wqData = getData(all, "wq_values"); gernotbelger@9288: final Data wqMode = getData(all, "bundu.wst.mode"); gernotbelger@9288: final Data udValue = getData(all, "bundu.wst.ud_value"); gernotbelger@9288: gernotbelger@9288: final boolean isQ = wqMode.getItems()[0].getStringValue().equals(String.valueOf(mode.Q)); gernotbelger@9288: final Canvas back = getBackButton(dataList.getState()); gernotbelger@9288: gernotbelger@9288: final HLayout valLayout = new HLayout(); gernotbelger@9288: final HLayout modeLayout = new HLayout(); gernotbelger@9288: final VLayout vlayout = new VLayout(); gernotbelger@9288: gernotbelger@9288: final Label wqLabel = new Label(dataList.getLabel()); gernotbelger@9288: final Label modeLabel = new Label(""); gernotbelger@9288: gernotbelger@9288: wqLabel.setValign(VerticalAlignment.TOP); gernotbelger@9288: gernotbelger@9288: wqLabel.setWidth(200); gernotbelger@9288: wqLabel.setHeight(25); gernotbelger@9288: modeLabel.setHeight(25); gernotbelger@9288: modeLabel.setWidth(200); gernotbelger@9288: gernotbelger@9288: valLayout.addMember(wqLabel); gernotbelger@9288: if (isQ) { gernotbelger@9288: valLayout.addMember(createOldWQValues(wqData, true)); gernotbelger@9288: } else { gernotbelger@9288: valLayout.addMember(new Label(udValue.getItems()[0].getStringValue() + " [d/a]")); gernotbelger@9288: } gernotbelger@9288: valLayout.addMember(back); gernotbelger@9288: modeLayout.addMember(modeLabel); gernotbelger@9288: gernotbelger@9288: vlayout.addMember(valLayout); gernotbelger@9288: vlayout.addMember(modeLayout); gernotbelger@9288: gernotbelger@9288: return vlayout; gernotbelger@9288: } gernotbelger@9288: gernotbelger@9404: protected void callMainValuesService(final String locale, final String river, final double start, final double end, final Date startDate, gernotbelger@9404: final Date endDate, final AsyncCallback cb) { gernotbelger@9288: gernotbelger@9404: this.mainValueService.getWQInfo(locale, river, start, end, startDate, endDate, cb); gernotbelger@9288: } gernotbelger@9293: gernotbelger@9293: @Override gernotbelger@9293: public void onFocus(final FocusEvent event) { gernotbelger@9293: this.itemWithFocus = (DoubleArrayPanel) event.getForm(); gernotbelger@9293: // Switch to respective tab. gernotbelger@9293: if (getMode().equals(mode.Q.toString())) { gernotbelger@9293: final int inputIndex = this.doubleArrayPanels.indexOf(this.itemWithFocus); gernotbelger@9293: this.tabs.selectTab(inputIndex); gernotbelger@9293: } gernotbelger@9293: } gernotbelger@9404: gernotbelger@9404: @Override gernotbelger@9404: protected void fetchWQData() { gernotbelger@9404: { gernotbelger@9404: final Config config = Config.getInstance(); gernotbelger@9404: final String locale = config.getLocale(); gernotbelger@9404: gernotbelger@9404: final ArtifactDescription adescr = this.artifact.getArtifactDescription(); gernotbelger@9404: final DataList[] data = adescr.getOldData(); gernotbelger@9404: gernotbelger@9404: final String river = getRiverName(data); gernotbelger@9404: final int startYear = this.bezugsjahr - this.qSeriesLength; gernotbelger@9404: final int endYear = this.bezugsjahr; gernotbelger@9404: gernotbelger@9404: // Gauge ranges overlap, move start and end a bit closer gernotbelger@9404: // to each other. gernotbelger@9404: gernotbelger@9404: final AsyncCallback cb = new AsyncCallback() { gernotbelger@9404: @Override gernotbelger@9404: public void onFailure(final Throwable caught) { gernotbelger@9404: GWT.log("Could not recieve wq informations."); gernotbelger@9404: final String msg = caught.getMessage(); gernotbelger@9404: resetLoadingMessageOfQTable(msg); gernotbelger@9404: // disable weiter-knopf gernotbelger@9404: getSubmitBtn().disable(); gernotbelger@9404: SC.warn(msg); gernotbelger@9404: } gernotbelger@9404: gernotbelger@9404: @Override gernotbelger@9404: public void onSuccess(final GaugeInfoObject[] result) { gernotbelger@9404: // TODO Auto-generated method stub gernotbelger@9404: final int num = result != null ? result.length : 0; gernotbelger@9404: GWT.log("Received timeranges for gauges"); gernotbelger@9404: gernotbelger@9404: if (num == 0) { gernotbelger@9404: return; gernotbelger@9404: } gernotbelger@9404: gernotbelger@9404: for (int i = 0; i < result.length; i++) { gernotbelger@9404: final GaugeInfoObject gauge = result[i]; gernotbelger@9404: // Gauge ranges overlap, move start and end a bit closer gernotbelger@9404: // to each other. gernotbelger@9404: final Double[] range = getGaugeNamesRange().get(gauge.getName()); gernotbelger@9404: final double rDiff = (range[1] - range[0]) / 10d; gernotbelger@9404: final int fi = i; gernotbelger@9404: gernotbelger@9404: final AsyncCallback cb = new AsyncCallback() { gernotbelger@9404: @Override gernotbelger@9404: public void onFailure(final Throwable caught) { gernotbelger@9404: GWT.log("Could not recieve wq informations."); gernotbelger@9404: addWQInfo(null, fi, gauge); gernotbelger@9404: } gernotbelger@9404: gernotbelger@9404: @Override gernotbelger@9404: public void onSuccess(final WQInfoObject[] wqi) { gernotbelger@9404: final int num = wqi != null ? wqi.length : 0; gernotbelger@9404: GWT.log("Received " + num + " wq informations (" + fi + "."); gernotbelger@9404: gernotbelger@9404: addWQInfo(wqi, fi, gauge); gernotbelger@9404: if (fi == (result.length - 1)) gernotbelger@9404: getSubmitBtn().enable(); gernotbelger@9404: } gernotbelger@9404: }; gernotbelger@9404: callMainValuesService(locale, river, range[0] + rDiff, range[1] - rDiff, gauge.getStartTime(), gauge.getStopTime(), cb); gernotbelger@9404: } gernotbelger@9404: } gernotbelger@9404: gernotbelger@9404: }; gernotbelger@9404: gernotbelger@9404: this.serviceForTime.getGaugeInfo(locale, river, getGaugeNames(), startYear, endYear, cb); gernotbelger@9404: getSubmitBtn().disable(); gernotbelger@9404: } gernotbelger@9404: gernotbelger@9404: } gernotbelger@9404: gernotbelger@9407: @Override gernotbelger@9407: protected String getWQInfoMsg() { gernotbelger@9407: return this.MSG.bundu_ws_wq_info(); gernotbelger@9407: } gernotbelger@9407: gernotbelger@9288: }