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