teichmann@5835: package org.dive4elements.river.client.client.ui; ingo@1528: ingo@1528: import com.google.gwt.core.client.GWT; ingo@1595: import com.google.gwt.i18n.client.NumberFormat; ingo@2467: import com.google.gwt.user.client.rpc.AsyncCallback; christian@4568: ingo@1528: import com.smartgwt.client.widgets.Canvas; ingo@1528: import com.smartgwt.client.widgets.Label; ingo@1528: import com.smartgwt.client.widgets.form.DynamicForm; ingo@1528: import com.smartgwt.client.widgets.form.fields.RadioGroupItem; ingo@1528: import com.smartgwt.client.widgets.form.fields.events.BlurEvent; ingo@1528: import com.smartgwt.client.widgets.form.fields.events.BlurHandler; ingo@1528: import com.smartgwt.client.widgets.form.fields.events.ChangedEvent; ingo@1528: import com.smartgwt.client.widgets.form.fields.events.ChangedHandler; ingo@1556: import com.smartgwt.client.widgets.layout.HLayout; ingo@1528: import com.smartgwt.client.widgets.layout.VLayout; ingo@4198: import com.smartgwt.client.widgets.tab.Tab; ingo@2467: import com.smartgwt.client.widgets.tab.TabSet; ingo@1528: teichmann@5835: import org.dive4elements.river.client.client.Config; teichmann@5835: import org.dive4elements.river.client.client.FLYSConstants; teichmann@5835: import org.dive4elements.river.client.client.services.GaugeInfoService; teichmann@5835: import org.dive4elements.river.client.client.services.GaugeInfoServiceAsync; teichmann@5835: import org.dive4elements.river.client.client.services.WQInfoService; teichmann@5835: import org.dive4elements.river.client.client.services.WQInfoServiceAsync; teichmann@5835: import org.dive4elements.river.client.client.ui.wq.ClickableQDTable; teichmann@5835: import org.dive4elements.river.client.client.ui.wq.ClickableWTable; teichmann@5835: import org.dive4elements.river.client.client.ui.wq.ClickableWTable.ClickMode; teichmann@5835: import org.dive4elements.river.client.client.widgets.DischargeTablesChart; teichmann@5835: import org.dive4elements.river.client.shared.model.ArtifactDescription; teichmann@5835: import org.dive4elements.river.client.shared.model.Data; teichmann@5835: import org.dive4elements.river.client.shared.model.DataItem; teichmann@5835: import org.dive4elements.river.client.shared.model.DataList; teichmann@5835: import org.dive4elements.river.client.shared.model.DefaultData; teichmann@5835: import org.dive4elements.river.client.shared.model.DefaultDataItem; teichmann@5835: import org.dive4elements.river.client.shared.model.DoubleArrayData; teichmann@5835: import org.dive4elements.river.client.shared.model.Gauge; teichmann@5835: import org.dive4elements.river.client.shared.model.IntegerOptionsData; teichmann@5835: import org.dive4elements.river.client.shared.model.WQInfoObject; teichmann@5835: import org.dive4elements.river.client.shared.model.WQInfoRecord; ingo@1528: christian@4568: import java.util.ArrayList; christian@4568: import java.util.LinkedHashMap; christian@4568: import java.util.List; christian@4568: ingo@1528: ingo@1528: /** ingo@1528: * An UIProvider for inserting a mode for W or Q and an array of values for each ingo@1528: * mode. ingo@1528: * ingo@1528: * @author Ingo Weinzierl ingo@1528: */ ingo@1528: public class WQSimpleArrayPanel ingo@1528: extends AbstractUIProvider ingo@1528: implements BlurHandler ingo@1528: { christian@4568: private static final long serialVersionUID = 3223369196267895010L; christian@4568: ingo@1528: public static final String FIELD_MODE = "field_mode"; ingo@1528: public static final String FIELD_VALUES = "field_values"; ingo@1528: ingo@1528: public static final int MODE_W = 0; ingo@1528: ingo@1528: protected FLYSConstants MSG = GWT.create(FLYSConstants.class); ingo@1528: ingo@2467: protected GaugeInfoServiceAsync gaugeService = ingo@2467: GWT.create(GaugeInfoService.class); ingo@2467: ingo@2467: protected WQInfoServiceAsync wqInfoService = ingo@2467: GWT.create(WQInfoService.class); ingo@2467: ingo@1528: protected String modeName; ingo@1528: protected String valuesName; ingo@1528: ingo@1528: protected Canvas valuesWrapper; ingo@1528: ingo@4200: protected TabSet tabs; ingo@4200: ingo@1528: protected DynamicForm modeForm; ingo@1528: protected DoubleArrayPanel panelW; ingo@1528: protected DoubleArrayPanel panelQ; ingo@1528: ingo@4198: protected ClickableWTable wTable; ingo@4198: protected ClickableQDTable qTable; ingo@2467: ingo@1528: ingo@1528: @Override ingo@1528: public Canvas create(DataList data) { ingo@1528: VLayout rootLayout = new VLayout(); ingo@1528: rootLayout.addMember(createLabel(data)); ingo@1528: rootLayout.addMember(createModeForm(data)); ingo@1528: rootLayout.addMember(createValuesForm(data)); ingo@1528: rootLayout.addMember(getNextButton()); ingo@1528: ingo@1528: initializeMode(data); ingo@2467: initializeTables(); ingo@2467: initializeHelperPanel(); ingo@1528: ingo@1528: return rootLayout; ingo@1528: } ingo@1528: ingo@1528: ingo@1528: @Override ingo@1556: public Canvas createOld(DataList dataList) { ingo@1576: IntegerOptionsData modeData = findOptionsData(dataList); ingo@1595: DoubleArrayData valuesData = findValuesData(dataList); ingo@1576: ingo@1576: DataItem[] modeItems = modeData.getItems(); ingo@1556: ingo@1556: HLayout layout = new HLayout(); ingo@1556: VLayout valueContainer = new VLayout(); ingo@1556: ingo@1556: Label label = new Label(dataList.getLabel()); ingo@1556: label.setWidth(200); ingo@1556: label.setHeight(20); ingo@1556: ingo@1576: Label mode = new Label(modeItems[0].getLabel()); ingo@1556: mode.setHeight(20); ingo@1556: mode.setWidth(150); ingo@1556: ingo@1595: Canvas values = createOldValues(modeData, valuesData); ingo@1556: values.setWidth(150); ingo@1556: ingo@1556: valueContainer.addMember(mode); ingo@1556: valueContainer.addMember(values); ingo@1556: ingo@1556: layout.addMember(label); ingo@1556: layout.addMember(valueContainer); ingo@1556: layout.addMember(getBackButton(dataList.getState())); ingo@1556: ingo@1556: return layout; ingo@1528: } ingo@1528: ingo@1528: ingo@1528: @Override ingo@1528: protected Data[] getData() { ingo@1528: Data mode = getModeAsData(); ingo@1528: ingo@1528: if (getMode() == MODE_W) { ingo@1528: return new Data[] { mode, getWValuesAsData() }; ingo@1528: } ingo@1528: else { ingo@1528: return new Data[] { mode, getQValuesAsData() }; ingo@1528: } ingo@1528: } ingo@1528: ingo@1528: ingo@1528: @Override ingo@1528: public List validate() { ingo@1528: List errors = new ArrayList(); ingo@1528: ingo@1528: // TODO IMPLEMENT ME ingo@1528: ingo@1528: return errors; ingo@1528: } ingo@1528: ingo@1528: ingo@1528: @Override ingo@1528: public void onBlur(BlurEvent event) { ingo@1528: // TODO TRIGGER VALIDATION HERE ingo@1528: } ingo@1528: ingo@1528: ingo@1528: protected void initializeMode(DataList dataList) { ingo@1528: IntegerOptionsData data = findOptionsData(dataList); ingo@1528: DataItem[] items = data != null ? data.getItems() : null; ingo@1528: ingo@1528: if (items != null) { ingo@1528: String value = items[0].getStringValue(); ingo@1528: modeForm.setValue(modeName, value); ingo@1528: switchMode(value); ingo@1528: } ingo@1528: } ingo@1528: ingo@1528: felix@5641: /** Initialize the w/q/d tables for the helper area. */ ingo@2467: protected void initializeTables() { ingo@4198: wTable = new ClickableWTable(new ClickableWTable.WClickedListener() { ingo@4198: @Override ingo@4198: public void clickedUpper(double value) { ingo@4198: // nothing to do here ingo@4198: } ingo@4198: ingo@4198: @Override ingo@4198: public void clickedLower(double value) { ingo@4198: panelW.addValue(value); ingo@4198: } felix@5333: }, ClickMode.SINGLE, true); ingo@4198: ingo@4198: qTable = new ClickableQDTable(new ClickableQDTable.QClickedListener() { ingo@4198: ingo@4198: @Override ingo@4198: public void clickedUpper(double value) { ingo@4198: // nothing to do here ingo@4198: } ingo@4198: ingo@4198: @Override ingo@4198: public void clickedLower(double value) { ingo@4198: panelQ.addValue(value); ingo@4198: } ingo@4198: }, ClickableQDTable.ClickMode.SINGLE); ingo@2467: ingo@2467: fetchWQData(); ingo@2467: } ingo@2467: ingo@2467: felix@5641: /** Put interactive tables to the helper area. */ ingo@2467: protected void initializeHelperPanel() { ingo@4200: tabs = new TabSet(); ingo@2467: tabs.setWidth100(); ingo@2467: tabs.setHeight100(); ingo@2467: ingo@2467: Tab w = new Tab(MSG.wq_table_w()); ingo@2467: Tab q = new Tab(MSG.wq_table_q()); felix@5337: Tab c = new Tab(MSG.discharge_tables_chart()); ingo@2467: ingo@2467: w.setPane(wTable); ingo@2467: q.setPane(qTable); ingo@4218: c.setPane(new DischargeTablesChart(this.artifact)); ingo@2467: ingo@2467: tabs.addTab(w, 0); ingo@2467: tabs.addTab(q, 1); ingo@4218: tabs.addTab(c, 2); ingo@2467: ingo@2467: helperContainer.addMember(tabs); ingo@2467: } ingo@2467: ingo@2467: ingo@2467: protected void fetchWQData() { ingo@2467: ArtifactDescription desc = artifact.getArtifactDescription(); ingo@2467: ingo@2467: final String river = desc.getRiver(); ingo@2467: final String refGauge = desc.getReferenceGauge(); ingo@2467: ingo@2467: gaugeService.getGaugeInfo(river, refGauge, new AsyncCallback>() { christian@4568: @Override ingo@2467: public void onFailure(Throwable throwable) { ingo@2467: GWT.log("ERROR WHILE FETCHING GAUGES!"); ingo@2467: } ingo@2467: christian@4568: @Override ingo@2467: public void onSuccess(List gauges) { ingo@2467: Gauge g = gauges.get(0); ingo@2467: updateWQData(river, g.getLower(), g.getUpper()); ingo@2467: } ingo@2467: }); ingo@2467: } ingo@2467: ingo@2467: ingo@2467: protected void updateWQData(String river, double lower, double upper) { ingo@2467: GWT.log("FETCH WQ INFO FOR " + lower + " - " + upper + " now!"); ingo@2467: ingo@2467: Config config = Config.getInstance(); ingo@2467: String locale = config.getLocale(); ingo@2467: ingo@2467: wqInfoService.getWQInfo(locale, river, lower, upper, ingo@2467: new AsyncCallback() { christian@4568: @Override ingo@2467: public void onFailure(Throwable caught) { ingo@2467: GWT.log("Could not recieve wq informations."); ingo@2467: } ingo@2467: christian@4568: @Override ingo@2467: public void onSuccess(WQInfoObject[] wqi) { ingo@2467: int num = wqi != null ? wqi.length :0; ingo@2467: GWT.log("Recieved " + num + " wq informations."); ingo@2467: ingo@2467: if (num == 0) { ingo@2467: return; ingo@2467: } ingo@2467: ingo@2467: addWQInfo(wqi); ingo@2467: } ingo@2467: } ingo@2467: ); ingo@2467: } ingo@2467: ingo@2467: ingo@2467: protected void addWQInfo (WQInfoObject[] wqi) { ingo@2467: for(WQInfoObject wi: wqi) { ingo@2467: WQInfoRecord rec = new WQInfoRecord(wi); ingo@2467: ingo@2467: if (wi.getType().equals("W")) { ingo@2467: wTable.addData(rec); ingo@2467: } ingo@2467: else { ingo@2467: qTable.addData(rec); ingo@2467: } ingo@2467: } ingo@2467: } ingo@2467: ingo@2467: ingo@1528: protected Canvas createLabel(DataList dataList) { ingo@1528: Label label = new Label(MSG.wqHistorical()); ingo@1528: label.setWidth100(); ingo@1528: label.setHeight(25); ingo@1528: ingo@1528: return label; ingo@1528: } ingo@1528: ingo@1528: ingo@1595: protected Canvas createOldValues( ingo@1595: IntegerOptionsData modeData, ingo@1595: DoubleArrayData valuesData ingo@1595: ) { ingo@1595: NumberFormat nf = NumberFormat.getDecimalFormat(); ingo@1595: ingo@1595: DataItem[] items = modeData.getItems(); felix@4921: String unit = items[0].getStringValue().equals("0") ? "cm" : "m³/s"; ingo@1595: ingo@1595: VLayout layout = new VLayout(); ingo@1595: ingo@1595: for (double val: valuesData.getValues()) { ingo@1595: Label tmp = new Label(nf.format(val) + " " + unit); ingo@1595: tmp.setHeight(20); ingo@1595: layout.addMember(tmp); ingo@1595: } ingo@1595: ingo@1595: return layout; ingo@1595: } ingo@1595: ingo@1595: ingo@1595: protected DoubleArrayData findValuesData(DataList dataList) { ingo@1528: for (int i = 0, n = dataList.size(); i < n; i++) { ingo@1528: Data tmp = dataList.get(i); ingo@1528: ingo@1595: if (tmp instanceof DoubleArrayData) { ingo@1595: return (DoubleArrayData) tmp; ingo@1528: } ingo@1528: } ingo@1528: ingo@1528: return null; ingo@1528: } ingo@1528: ingo@1528: ingo@1528: protected IntegerOptionsData findOptionsData(DataList dataList) { ingo@1528: for (int i = 0, n = dataList.size(); i < n; i++) { ingo@1528: Data tmp = dataList.get(i); ingo@1528: ingo@1528: if (tmp instanceof IntegerOptionsData) { ingo@1528: return (IntegerOptionsData) tmp; ingo@1528: } ingo@1528: } ingo@1528: ingo@1528: return null; ingo@1528: } ingo@1528: ingo@1528: ingo@1528: protected Canvas createModeForm(DataList dataList) { ingo@1528: IntegerOptionsData data = findOptionsData(dataList); ingo@1528: DataItem[] opts = data != null ? data.getItems() : null; ingo@1528: ingo@1528: if (data == null || opts == null) { ingo@1528: return new Label("NO MODES FOUND"); ingo@1528: } ingo@1528: ingo@1528: modeName = data.getLabel(); ingo@1528: modeForm = new DynamicForm(); ingo@1528: ingo@1528: RadioGroupItem items = new RadioGroupItem(data.getLabel()); ingo@1528: LinkedHashMap values = new LinkedHashMap(); ingo@1528: ingo@1528: for (DataItem opt: opts) { ingo@1528: values.put(opt.getStringValue(), opt.getLabel()); ingo@1528: } ingo@1528: ingo@1528: items.setValueMap(values); ingo@1528: items.setVertical(false); ingo@1528: items.setShowTitle(false); ingo@1528: items.addChangedHandler(new ChangedHandler() { ingo@1528: @Override ingo@1528: public void onChanged(ChangedEvent event) { ingo@1528: switchMode((String) event.getValue()); ingo@1528: } ingo@1528: }); ingo@1528: ingo@1528: modeForm.setFields(items); ingo@1528: ingo@1528: return modeForm; ingo@1528: } ingo@1528: ingo@1528: ingo@1528: protected Canvas createValuesForm(DataList dataList) { ingo@1595: DoubleArrayData data = findValuesData(dataList); ingo@1528: ingo@1528: if (data == null) { ingo@1528: return new Label("NO VALUES GIVEN!"); ingo@1528: } ingo@1528: ingo@1528: valuesName = data.getLabel(); ingo@1528: panelW = new DoubleArrayPanel(MSG.unitWSingle(), null, this); ingo@1528: panelQ = new DoubleArrayPanel(MSG.unitQSingle(), null, this); ingo@1528: ingo@1528: valuesWrapper = new Canvas(); ingo@1528: valuesWrapper.setWidth100(); ingo@1528: valuesWrapper.setHeight(35); ingo@1528: ingo@1528: return valuesWrapper; ingo@1528: } ingo@1528: ingo@1528: ingo@1528: public void switchMode(String newMode) { ingo@1528: for (Canvas child: valuesWrapper.getChildren()) { ingo@1528: valuesWrapper.removeChild(child); ingo@1528: } ingo@1528: ingo@1528: if (newMode.equals("0")) { ingo@1528: valuesWrapper.addChild(panelW); ingo@4200: showWTable(); ingo@1528: } ingo@1528: else if (newMode.equals("1")) { ingo@1528: valuesWrapper.addChild(panelQ); ingo@4200: showQDTable(); ingo@4200: } ingo@4200: } ingo@4200: ingo@4200: public void showWTable() { ingo@4200: if (tabs != null) { ingo@4200: tabs.selectTab(0); ingo@4200: } ingo@4200: } ingo@4200: ingo@4200: public void showQDTable() { ingo@4200: if (tabs != null) { ingo@4200: tabs.selectTab(1); ingo@1528: } ingo@1528: } ingo@1528: ingo@1528: ingo@1528: public String getModeAsString() { ingo@1528: return (String) modeForm.getValue(modeName); ingo@1528: } ingo@1528: ingo@1528: ingo@1528: public int getMode() { ingo@1528: String modeValue = getModeAsString(); ingo@1528: ingo@1528: try { ingo@1528: return Integer.valueOf(modeValue); ingo@1528: } ingo@1528: catch (NumberFormatException nfe) { ingo@1528: // do something ingo@1528: } ingo@1528: catch (NullPointerException npe) { ingo@1528: // do something ingo@1528: } ingo@1528: ingo@1528: return -1; ingo@1528: } ingo@1528: ingo@1528: ingo@1528: public Data getModeAsData() { ingo@1528: String value = getModeAsString(); ingo@1528: DataItem item = new DefaultDataItem(value, value, value); ingo@1528: ingo@1528: return new DefaultData(modeName, null, null, new DataItem[] { item }); ingo@1528: } ingo@1528: ingo@1528: ingo@1528: public Data getWValuesAsData() { ingo@1528: double[] values = panelW.getInputValues(); ingo@1528: String valueStr = getStringValue(values); ingo@1528: ingo@1528: DataItem item = new DefaultDataItem(valueStr, valueStr, valueStr); ingo@1528: ingo@1528: return new DefaultData(valuesName, null, null, new DataItem[] { item }); ingo@1528: } ingo@1528: ingo@1528: ingo@1528: public Data getQValuesAsData() { ingo@1528: double[] values = panelQ.getInputValues(); ingo@1528: String valueStr = getStringValue(values); ingo@1528: ingo@1528: DataItem item = new DefaultDataItem(valueStr, valueStr, valueStr); ingo@1528: ingo@1528: return new DefaultData(valuesName, null, null, new DataItem[] { item }); ingo@1528: } ingo@1528: ingo@1528: ingo@1528: protected static String getStringValue(double[] values) { ingo@1528: StringBuilder sb = new StringBuilder(); ingo@1528: boolean first = true; ingo@1528: ingo@1528: for (double value: values) { ingo@1528: if (first) { ingo@1528: sb.append(String.valueOf(value)); ingo@1528: first = false; ingo@1528: } ingo@1528: else { ingo@1528: sb.append(";" + String.valueOf(value)); ingo@1528: } ingo@1528: } ingo@1528: ingo@1528: return sb.toString(); ingo@1528: } ingo@1528: } ingo@1528: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :