ingo@243: package de.intevation.flys.client.client.ui; ingo@243: ingo@565: import java.util.ArrayList; ingo@246: import java.util.HashMap; ingo@246: import java.util.Iterator; ingo@255: import java.util.LinkedHashMap; ingo@246: import java.util.List; ingo@246: import java.util.Map; ingo@246: ingo@243: import com.google.gwt.core.client.GWT; ingo@565: import com.google.gwt.i18n.client.NumberFormat; ingo@243: ingo@246: import com.smartgwt.client.types.TitleOrientation; ingo@247: import com.smartgwt.client.types.VerticalAlignment; ingo@602: import com.smartgwt.client.util.SC; ingo@243: import com.smartgwt.client.widgets.Canvas; ingo@243: import com.smartgwt.client.widgets.Label; ingo@255: import com.smartgwt.client.widgets.form.DynamicForm; ingo@255: import com.smartgwt.client.widgets.form.fields.RadioGroupItem; ingo@243: import com.smartgwt.client.widgets.form.fields.events.BlurHandler; ingo@243: import com.smartgwt.client.widgets.form.fields.events.BlurEvent; ingo@243: import com.smartgwt.client.widgets.form.fields.events.ChangeHandler; ingo@243: import com.smartgwt.client.widgets.form.fields.events.ChangeEvent; ingo@247: import com.smartgwt.client.widgets.layout.HLayout; ingo@243: import com.smartgwt.client.widgets.layout.VLayout; ingo@243: ingo@243: import de.intevation.flys.client.shared.model.Data; ingo@243: import de.intevation.flys.client.shared.model.DataItem; ingo@243: import de.intevation.flys.client.shared.model.DataList; ingo@243: import de.intevation.flys.client.shared.model.DefaultData; ingo@243: import de.intevation.flys.client.shared.model.DefaultDataItem; ingo@565: import de.intevation.flys.client.shared.model.WQDataItem; ingo@243: ingo@246: import de.intevation.flys.client.client.FLYSConstants; ingo@246: ingo@243: ingo@243: /** ingo@243: * This UIProvider creates a widget to enter W or Q data for discharge ingo@243: * longitudinal section computations. ingo@243: * ingo@243: * @author Ingo Weinzierl ingo@243: */ ingo@243: public class WQAdaptedInputPanel ingo@243: extends AbstractUIProvider ingo@243: implements ChangeHandler, BlurHandler ingo@243: { ingo@246: public static final String FIELD_WQ_MODE = "wq_mode"; ingo@255: public static final String FIELD_WQ_W = "W"; ingo@255: public static final String FIELD_WQ_Q = "Q"; ingo@246: ingo@247: public static final String GAUGE_SEPARATOR = ":"; ingo@247: ingo@247: public static final String GAUGE_PART_SEPARATOR = ";"; ingo@247: ingo@247: public static final String VALUE_SEPARATOR = ","; ingo@247: ingo@255: public static final int ROW_HEIGHT = 20; ingo@255: ingo@246: ingo@246: /** The message class that provides i18n strings.*/ ingo@246: protected FLYSConstants MSG = GWT.create(FLYSConstants.class); ingo@246: ingo@246: /** Stores the input panels related to their keys.*/ ingo@246: protected Map wqranges; ingo@246: ingo@565: /** Stores the min/max values for each q range.*/ ingo@565: protected Map qranges; ingo@565: ingo@565: /** Stores the min/max values for each w range.*/ ingo@565: protected Map wranges; ingo@565: ingo@255: /** The RadioGroupItem that determines the w/q input mode.*/ ingo@255: protected DynamicForm modes; ingo@255: ingo@246: ingo@246: ingo@243: public WQAdaptedInputPanel() { ingo@246: wqranges = new HashMap(); ingo@565: qranges = new HashMap(); ingo@565: wranges = new HashMap(); ingo@243: } ingo@243: ingo@243: ingo@243: public Canvas create(DataList data) { ingo@243: Canvas submit = getNextButton(); ingo@246: Canvas widget = createWidget(data); ingo@246: Label label = new Label(MSG.wqadaptedTitle()); ingo@246: ingo@246: label.setHeight(25); ingo@243: ingo@243: VLayout layout = new VLayout(); ingo@243: layout.setMembersMargin(10); ingo@255: layout.setWidth(350); ingo@243: ingo@246: layout.addMember(label); ingo@246: layout.addMember(widget); ingo@243: layout.addMember(submit); ingo@243: ingo@243: return layout; ingo@243: } ingo@243: ingo@243: ingo@243: public Canvas createOld(DataList dataList) { ingo@247: List all = dataList.getAll(); ingo@247: Data wqData = getData(all, "wq_values"); ingo@247: Data wqMode = getData(all, "wq_mode"); ingo@247: ingo@247: Canvas back = getBackButton(dataList.getState()); ingo@247: ingo@247: HLayout valLayout = new HLayout(); ingo@247: HLayout modeLayout = new HLayout(); ingo@247: VLayout vlayout = new VLayout(); ingo@247: ingo@247: Label wqLabel = new Label(dataList.getLabel()); ingo@247: Label modeLabel = new Label(""); ingo@247: ingo@247: wqLabel.setValign(VerticalAlignment.TOP); ingo@247: ingo@247: wqLabel.setWidth(200); ingo@247: wqLabel.setHeight(25); ingo@247: modeLabel.setHeight(25); ingo@247: modeLabel.setWidth(200); ingo@247: ingo@247: valLayout.addMember(wqLabel); ingo@247: valLayout.addMember(createOldWQValues(wqData)); ingo@247: valLayout.addMember(back); ingo@247: modeLayout.addMember(modeLabel); ingo@247: ingo@247: vlayout.addMember(valLayout); ingo@247: vlayout.addMember(modeLayout); ingo@247: ingo@247: return vlayout; ingo@247: } ingo@247: ingo@247: ingo@247: protected Canvas createOldWQValues(Data wqData) { ingo@247: VLayout layout = new VLayout(); ingo@247: ingo@247: DataItem item = wqData.getItems()[0]; ingo@247: String value = item.getStringValue(); ingo@247: ingo@247: String[] gauges = value.split(GAUGE_SEPARATOR); ingo@247: ingo@247: for (String gauge: gauges) { ingo@247: HLayout h = new HLayout(); ingo@247: ingo@247: String[] parts = gauge.split(GAUGE_PART_SEPARATOR); ingo@247: String[] values = parts[2].split(VALUE_SEPARATOR); ingo@247: ingo@247: Label l = new Label(parts[0] + " - " + parts[1] + ": "); ingo@247: ingo@247: StringBuilder sb = new StringBuilder(); ingo@247: boolean first = true; ingo@247: ingo@247: for (String v: values) { ingo@247: if (!first) { ingo@247: sb.append(", "); ingo@247: } ingo@247: ingo@247: sb.append(v); ingo@247: ingo@247: first = false; ingo@247: } ingo@247: ingo@247: Label v = new Label(sb.toString()); ingo@247: ingo@247: l.setWidth(65); ingo@247: v.setWidth(65); ingo@247: ingo@247: h.addMember(l); ingo@247: h.addMember(v); ingo@247: ingo@247: layout.addMember(h); ingo@247: } ingo@247: ingo@247: return layout; ingo@243: } ingo@243: ingo@243: ingo@246: protected Canvas createWidget(DataList dataList) { ingo@246: VLayout layout = new VLayout(); ingo@246: ingo@255: Canvas mode = createMode(dataList); ingo@255: Canvas list = createList(dataList); ingo@255: ingo@255: DataItem[] items = getWQItems(dataList); ingo@255: int listHeight = ROW_HEIGHT * items.length; ingo@255: ingo@255: mode.setHeight(25); ingo@255: mode.setWidth(200); ingo@255: ingo@255: layout.addMember(mode); ingo@255: layout.addMember(list); ingo@255: ingo@255: layout.setHeight(25 + listHeight); ingo@255: layout.setWidth(350); ingo@255: ingo@519: initUserDefaults(dataList); ingo@519: ingo@255: return layout; ingo@255: } ingo@255: ingo@255: ingo@565: @Override ingo@565: public List validate() { ingo@565: if (isWMode()) { ingo@565: return validateW(); ingo@565: } ingo@565: else { ingo@565: return validateQ(); ingo@565: } ingo@565: } ingo@565: ingo@565: ingo@565: protected List validateW() { ingo@565: List errors = new ArrayList(); ingo@565: NumberFormat nf = NumberFormat.getDecimalFormat(); ingo@565: ingo@565: Iterator iter = wqranges.keySet().iterator(); ingo@565: ingo@565: while (iter.hasNext()) { ingo@565: List tmpErrors = new ArrayList(); ingo@565: ingo@565: String key = iter.next(); ingo@565: DoubleArrayPanel dap = wqranges.get(key); ingo@602: ingo@602: if (!dap.validateForm()) { ingo@602: errors.add(MSG.error_invalid_double_value()); ingo@602: return errors; ingo@602: } ingo@602: ingo@602: double[] mm = wranges.get(key); ingo@602: if (mm == null) { ingo@602: SC.warn(MSG.error_read_minmax_values()); ingo@602: continue; ingo@602: } ingo@565: ingo@565: double[] values = dap.getInputValues(); ingo@565: double[] good = new double[values.length]; ingo@565: ingo@565: int idx = 0; ingo@565: ingo@565: for (double value: values) { ingo@565: if (value < mm[0] || value > mm[1]) { ingo@565: String tmp = MSG.error_validate_range(); ingo@565: tmp = tmp.replace("$1", nf.format(value)); ingo@565: tmp = tmp.replace("$2", nf.format(mm[0])); ingo@565: tmp = tmp.replace("$3", nf.format(mm[1])); ingo@565: tmpErrors.add(tmp); ingo@565: } ingo@565: else { ingo@565: good[idx++] = value; ingo@565: } ingo@565: } ingo@565: ingo@565: double[] justGood = new double[idx]; ingo@565: for (int i = 0; i < justGood.length; i++) { ingo@565: justGood[i] = good[i]; ingo@565: } ingo@565: ingo@565: if (!tmpErrors.isEmpty()) { ingo@565: dap.setValues(justGood); ingo@565: ingo@565: errors.addAll(tmpErrors); ingo@565: } ingo@565: } ingo@565: ingo@565: return errors; ingo@565: } ingo@565: ingo@565: ingo@565: protected List validateQ() { ingo@565: List errors = new ArrayList(); ingo@565: NumberFormat nf = NumberFormat.getDecimalFormat(); ingo@565: ingo@565: Iterator iter = wqranges.keySet().iterator(); ingo@565: ingo@565: while (iter.hasNext()) { ingo@565: List tmpErrors = new ArrayList(); ingo@565: ingo@565: String key = iter.next(); ingo@565: DoubleArrayPanel dap = wqranges.get(key); ingo@602: ingo@602: if (!dap.validateForm()) { ingo@602: errors.add(MSG.error_invalid_double_value()); ingo@602: return errors; ingo@602: } ingo@602: ingo@602: double[] mm = qranges.get(key); ingo@602: if (mm == null) { ingo@602: SC.warn(MSG.error_read_minmax_values()); ingo@602: continue; ingo@602: } ingo@565: ingo@565: double[] values = dap.getInputValues(); ingo@565: double[] good = new double[values.length]; ingo@565: ingo@565: int idx = 0; ingo@565: ingo@565: for (double value: values) { ingo@565: if (value < mm[0] || value > mm[1]) { ingo@565: String tmp = MSG.error_validate_range(); ingo@565: tmp = tmp.replace("$1", nf.format(value)); ingo@565: tmp = tmp.replace("$2", nf.format(mm[0])); ingo@565: tmp = tmp.replace("$3", nf.format(mm[1])); ingo@565: tmpErrors.add(tmp); ingo@565: } ingo@565: else { ingo@565: good[idx++] = value; ingo@565: } ingo@565: } ingo@565: ingo@565: double[] justGood = new double[idx]; ingo@565: for (int i = 0; i < justGood.length; i++) { ingo@565: justGood[i] = good[i]; ingo@565: } ingo@565: ingo@565: if (!tmpErrors.isEmpty()) { ingo@565: dap.setValues(justGood); ingo@565: ingo@565: errors.addAll(tmpErrors); ingo@565: } ingo@565: } ingo@565: ingo@565: return errors; ingo@565: } ingo@565: ingo@565: ingo@519: protected void initUserDefaults(DataList dataList) { ingo@519: ingo@519: initUserWQValues(dataList); ingo@519: initUserWQMode(dataList); ingo@519: } ingo@519: ingo@519: ingo@519: protected void initUserWQMode(DataList dataList) { ingo@519: List allData = dataList.getAll(); ingo@519: ingo@519: Data dDef = getData(allData, "wq_mode"); ingo@519: DataItem def = dDef != null ? dDef.getDefault() : null; ingo@519: String value = def != null ? def.getStringValue() : null; ingo@519: ingo@617: if (value != null && value.equals(FIELD_WQ_W)) { ingo@617: modes.setValue(FIELD_WQ_MODE, FIELD_WQ_W); ingo@519: } ingo@519: else { ingo@617: modes.setValue(FIELD_WQ_MODE, FIELD_WQ_Q); ingo@519: } ingo@519: } ingo@519: ingo@519: ingo@519: protected void initUserWQValues(DataList dataList) { ingo@519: List allData = dataList.getAll(); ingo@519: ingo@519: Data dDef = getData(allData, "wq_values"); ingo@519: DataItem def = dDef != null ? dDef.getDefault() : null; ingo@519: String value = def != null ? def.getStringValue() : null; ingo@519: ingo@519: if (value == null || value.length() == 0) { ingo@519: return; ingo@519: } ingo@519: ingo@519: String[] lines = value.split(GAUGE_SEPARATOR); ingo@519: ingo@519: if (lines == null || lines.length == 0) { ingo@519: return; ingo@519: } ingo@519: ingo@519: for (String line: lines) { ingo@519: String[] cols = line.split(GAUGE_PART_SEPARATOR); ingo@519: String title = createLineTitle(line); ingo@519: ingo@519: if (cols == null || cols.length < 3) { ingo@519: continue; ingo@519: } ingo@519: ingo@519: String[] strValues = cols[2].split(VALUE_SEPARATOR); ingo@519: double[] values = new double[strValues.length]; ingo@519: ingo@519: int idx = 0; ingo@519: ingo@519: for (String strValue: strValues) { ingo@519: try { ingo@519: values[idx++] = Double.valueOf(strValue); ingo@519: } ingo@519: catch (NumberFormatException nfe) { ingo@519: // do nothing ingo@519: } ingo@519: } ingo@519: ingo@519: String key = cols[0] + GAUGE_PART_SEPARATOR + cols[1]; ingo@519: DoubleArrayPanel dap = wqranges.get(key); ingo@560: ingo@560: if (dap == null) { ingo@560: continue; ingo@560: } ingo@560: ingo@519: dap.setValues(values); ingo@519: } ingo@519: } ingo@519: ingo@519: ingo@255: protected Canvas createList(DataList dataList) { ingo@255: VLayout layout = new VLayout(); ingo@255: ingo@255: DataItem[] items = getWQItems(dataList); ingo@255: ingo@255: for (DataItem item: items) { ingo@255: String title = item.getLabel(); ingo@255: ingo@255: DoubleArrayPanel dap = new DoubleArrayPanel( ingo@255: createLineTitle(title), null, this, TitleOrientation.LEFT); ingo@255: ingo@255: wqranges.put(title, dap); ingo@565: ingo@565: if (item instanceof WQDataItem) { ingo@565: WQDataItem wq = (WQDataItem) item; ingo@565: double[] mmQ = wq.getQRange(); ingo@565: double[] mmW = wq.getWRange(); ingo@565: ingo@565: GWT.log(title + " Q: " + mmQ[0] + " - " + mmQ[1]); ingo@565: GWT.log(title + " W: " + mmW[0] + " - " + mmW[1]); ingo@565: ingo@565: qranges.put(title, mmQ); ingo@565: wranges.put(title, mmW); ingo@565: } ingo@565: ingo@255: layout.addMember(dap); ingo@255: } ingo@255: ingo@255: layout.setHeight(items.length * ROW_HEIGHT); ingo@255: ingo@255: return layout; ingo@255: } ingo@255: ingo@255: ingo@255: protected DataItem[] getWQItems(DataList dataList) { ingo@246: List data = dataList.getAll(); ingo@246: ingo@246: for (Data d: data) { ingo@246: String name = d.getLabel(); ingo@246: ingo@246: if (name.equals(FIELD_WQ_MODE)) { ingo@246: continue; ingo@246: } ingo@246: ingo@255: return d.getItems(); ingo@246: } ingo@246: ingo@255: return null; ingo@255: } ingo@255: ingo@255: ingo@255: protected Canvas createMode(DataList dataList) { ingo@255: RadioGroupItem wq = new RadioGroupItem(FIELD_WQ_MODE); ingo@255: wq.setShowTitle(false); ingo@255: wq.setVertical(false); ingo@255: wq.setWidth(200); ingo@255: ingo@255: LinkedHashMap wqValues = new LinkedHashMap(); ingo@255: wqValues.put(FIELD_WQ_W, MSG.wqW()); ingo@255: wqValues.put(FIELD_WQ_Q, MSG.wqQ()); ingo@255: ingo@255: wq.setValueMap(wqValues); ingo@255: ingo@255: modes = new DynamicForm(); ingo@255: modes.setFields(wq); ingo@255: modes.setWidth(200); ingo@255: ingo@255: LinkedHashMap initial = new LinkedHashMap(); ingo@617: initial.put(FIELD_WQ_MODE, FIELD_WQ_Q); ingo@255: modes.setValues(initial); ingo@255: ingo@255: return modes; ingo@246: } ingo@246: ingo@246: ingo@246: public String createLineTitle(String key) { ingo@246: String[] splitted = key.split(";"); ingo@246: ingo@246: return splitted[0] + " - " + splitted[1]; ingo@246: } ingo@246: ingo@246: ingo@243: public Data[] getData() { ingo@246: Data mode = getWQMode(); ingo@246: Data values = getWQValues(); ingo@243: ingo@246: return new Data[] { mode, values }; ingo@246: } ingo@246: ingo@246: ingo@565: public boolean isWMode() { ingo@565: String mode = (String) modes.getValue(FIELD_WQ_MODE); ingo@565: ingo@565: return FIELD_WQ_W.equals(mode); ingo@565: } ingo@565: ingo@565: ingo@246: protected Data getWQMode() { ingo@255: String wqMode = modes.getValueAsString(FIELD_WQ_MODE); ingo@255: DataItem item = new DefaultDataItem("wq_mode", "wq_mode", wqMode); ingo@243: Data mode = new DefaultData( ingo@243: "wq_mode", null, null, new DataItem[] { item }); ingo@243: ingo@246: return mode; ingo@246: } ingo@246: ingo@246: ingo@246: protected Data getWQValues() { ingo@246: String wqvalue = null; ingo@246: ingo@246: Iterator iter = wqranges.keySet().iterator(); ingo@246: while (iter.hasNext()) { ingo@246: String key = iter.next(); ingo@246: DoubleArrayPanel dap = wqranges.get(key); ingo@246: ingo@246: double[] values = dap.getInputValues(); ingo@246: if (wqvalue == null) { ingo@246: wqvalue = createValueString(key, values); ingo@246: } ingo@246: else { ingo@247: wqvalue += GAUGE_SEPARATOR + createValueString(key, values); ingo@246: } ingo@246: } ingo@246: ingo@243: DataItem valueItem = new DefaultDataItem( ingo@246: "wq_values", "wq_values", wqvalue); ingo@243: Data values = new DefaultData( ingo@243: "wq_values", null, null, new DataItem[] { valueItem }); ingo@243: ingo@246: return values; ingo@246: } ingo@246: ingo@246: ingo@246: protected String createValueString(String key, double[] values) { ingo@246: StringBuilder sb = new StringBuilder(); ingo@246: ingo@246: boolean first = true; ingo@246: ingo@246: for (double value: values) { ingo@246: if (!first) { ingo@246: sb.append(","); ingo@246: } ingo@246: ingo@246: sb.append(Double.toString(value)); ingo@246: ingo@246: first = false; ingo@246: } ingo@246: ingo@246: return key + ";" + sb.toString(); ingo@243: } ingo@243: ingo@243: ingo@243: public void onChange(ChangeEvent event) { ingo@243: // TODO IMPLEMENT ME ingo@243: } ingo@243: ingo@243: ingo@243: public void onBlur(BlurEvent event) { ingo@246: DoubleArrayPanel dap = (DoubleArrayPanel) event.getForm(); ingo@246: dap.validateForm(event.getItem()); ingo@243: } ingo@243: } ingo@243: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :