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@1528: 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@1528: 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@1528: import de.intevation.flys.client.shared.model.IntegerOptionsData; ingo@1528: import de.intevation.flys.client.client.FLYSConstants; 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@1528: protected String modeName; ingo@1528: protected String valuesName; ingo@1528: ingo@1528: protected Canvas valuesWrapper; ingo@1528: ingo@1528: protected DynamicForm modeForm; ingo@1528: protected DoubleArrayPanel panelW; ingo@1528: protected DoubleArrayPanel panelQ; ingo@1528: 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@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@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@1528: } ingo@1528: else if (newMode.equals("1")) { ingo@1528: valuesWrapper.addChild(panelQ); 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 :