ingo@1528: package de.intevation.flys.client.client.ui;
ingo@1528:
ingo@1528: import java.util.ArrayList;
ingo@1528: import java.util.LinkedHashMap;
ingo@1528: import java.util.List;
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;
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:
ingo@4198: import de.intevation.flys.client.client.Config;
ingo@4198: import de.intevation.flys.client.client.FLYSConstants;
ingo@4198: import de.intevation.flys.client.client.services.GaugeInfoService;
ingo@4198: import de.intevation.flys.client.client.services.GaugeInfoServiceAsync;
ingo@4198: import de.intevation.flys.client.client.services.WQInfoService;
ingo@4198: import de.intevation.flys.client.client.services.WQInfoServiceAsync;
ingo@4198: import de.intevation.flys.client.client.ui.wq.ClickableQDTable;
ingo@4198: import de.intevation.flys.client.client.ui.wq.ClickableWTable;
ingo@4198: import de.intevation.flys.client.client.ui.wq.ClickableWTable.ClickMode;
ingo@4218: import de.intevation.flys.client.client.widgets.DischargeTablesChart;
ingo@2467: import de.intevation.flys.client.shared.model.ArtifactDescription;
ingo@1528: import de.intevation.flys.client.shared.model.Data;
ingo@1528: import de.intevation.flys.client.shared.model.DataItem;
ingo@1528: import de.intevation.flys.client.shared.model.DataList;
ingo@1528: import de.intevation.flys.client.shared.model.DefaultData;
ingo@1528: import de.intevation.flys.client.shared.model.DefaultDataItem;
ingo@1595: import de.intevation.flys.client.shared.model.DoubleArrayData;
ingo@2467: import de.intevation.flys.client.shared.model.Gauge;
ingo@1528: import de.intevation.flys.client.shared.model.IntegerOptionsData;
ingo@2467: import de.intevation.flys.client.shared.model.WQInfoObject;
ingo@4198: import de.intevation.flys.client.shared.model.WQInfoRecord;
ingo@1528:
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: {
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@1576: DataItem[] valuesItems = valuesData.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:
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: }
ingo@4198: }, ClickMode.SINGLE);
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:
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());
ingo@4218: Tab c = new Tab(MSG.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: DataList[] data = desc.getOldData();
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>() {
ingo@2467: public void onFailure(Throwable throwable) {
ingo@2467: GWT.log("ERROR WHILE FETCHING GAUGES!");
ingo@2467: }
ingo@2467:
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() {
ingo@2467: public void onFailure(Throwable caught) {
ingo@2467: GWT.log("Could not recieve wq informations.");
ingo@2467: }
ingo@2467:
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();
ingo@1595: String unit = items[0].getStringValue().equals("0") ? "cm" : "q³/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@1595: DoubleArrayData data = null;
ingo@1528:
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: IntegerOptionsData data = null;
ingo@1528:
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 :