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