ingo@42: package de.intevation.flys.client.client.ui; ingo@42: ingo@42: import java.util.LinkedHashMap; ingo@53: import java.util.List; ingo@42: ingo@42: import com.google.gwt.core.client.GWT; raimund@248: import com.google.gwt.user.client.rpc.AsyncCallback; raimund@248: raimund@248: import com.smartgwt.client.data.Record; ingo@42: ingo@42: import com.smartgwt.client.widgets.Canvas; ingo@42: import com.smartgwt.client.widgets.Label; ingo@42: import com.smartgwt.client.widgets.form.DynamicForm; ingo@42: import com.smartgwt.client.widgets.form.fields.FormItem; ingo@42: import com.smartgwt.client.widgets.form.fields.RadioGroupItem; ingo@42: import com.smartgwt.client.widgets.form.fields.events.BlurHandler; ingo@42: import com.smartgwt.client.widgets.form.fields.events.BlurEvent; ingo@42: import com.smartgwt.client.widgets.form.fields.events.ChangeHandler; ingo@42: import com.smartgwt.client.widgets.form.fields.events.ChangeEvent; ingo@53: import com.smartgwt.client.widgets.layout.HLayout; ingo@42: import com.smartgwt.client.widgets.layout.VLayout; raimund@248: import com.smartgwt.client.widgets.grid.ListGrid; raimund@248: import com.smartgwt.client.widgets.grid.ListGridField; raimund@248: import com.smartgwt.client.widgets.grid.events.CellClickHandler; raimund@248: import com.smartgwt.client.widgets.grid.events.CellClickEvent; ingo@42: ingo@42: import de.intevation.flys.client.shared.model.Data; ingo@47: import de.intevation.flys.client.shared.model.DataItem; ingo@51: import de.intevation.flys.client.shared.model.DataList; ingo@47: import de.intevation.flys.client.shared.model.DefaultData; ingo@47: import de.intevation.flys.client.shared.model.DefaultDataItem; raimund@248: import de.intevation.flys.client.shared.model.WQInfoObject; raimund@248: import de.intevation.flys.client.shared.model.WQInfoRecord; raimund@248: import de.intevation.flys.client.shared.model.ArtifactDescription; raimund@248: import com.smartgwt.client.types.ListGridFieldType; raimund@249: import com.smartgwt.client.types.SelectionStyle; raimund@248: raimund@248: import de.intevation.flys.client.client.services.WQInfoService; raimund@248: import de.intevation.flys.client.client.services.WQInfoServiceAsync; ingo@211: import de.intevation.flys.client.client.FLYSConstants; raimund@248: import de.intevation.flys.client.client.FLYSImages; raimund@248: import de.intevation.flys.client.client.Config; ingo@42: ingo@42: ingo@42: /** ingo@42: * This UIProvider creates a widget to enter W or Q data. ingo@42: * ingo@42: * @author Ingo Weinzierl ingo@42: */ ingo@42: public class WQInputPanel ingo@42: extends AbstractUIProvider ingo@42: implements ChangeHandler, BlurHandler ingo@42: { ingo@42: /** The message class that provides i18n strings.*/ raimund@248: protected FLYSConstants MESSAGE = GWT.create(FLYSConstants.class); ingo@42: raimund@248: /** The interface that provides the image resources. */ raimund@248: private FLYSImages IMAGES = GWT.create(FLYSImages.class); raimund@248: raimund@248: /** The DistanceInfoService used to retrieve locations about rivers.*/ raimund@248: protected WQInfoServiceAsync wqInfoService = raimund@248: GWT.create(WQInfoService.class); ingo@42: ingo@42: /** The constant field name for choosing w or q mode.*/ ingo@42: public static final String FIELD_WQ = "wq"; ingo@42: ingo@42: /** The constant field value for W input mode.*/ ingo@42: public static final String FIELD_WQ_W = "W"; ingo@42: ingo@42: /** The constant field value for Q input mode.*/ ingo@42: public static final String FIELD_WQ_Q = "Q"; ingo@42: ingo@42: /** The constant field name for choosing single values or range.*/ ingo@42: public static final String FIELD_MODE = "mode"; ingo@42: ingo@42: /** The constant field value for single input mode.*/ ingo@42: public static final String FIELD_MODE_SINGLE = "single"; ingo@42: ingo@42: /** The constant field value for range input mode.*/ ingo@42: public static final String FIELD_MODE_RANGE = "range"; ingo@42: ingo@42: /** The constant value that determines the width of the left panel.*/ ingo@42: public static final int WIDTH_LEFT = 200; ingo@42: ingo@42: ingo@42: /** The container that manages the w and q panels.*/ raimund@248: protected HLayout container; ingo@42: ingo@42: /** The RadioGroupItem that determines the w/q input mode.*/ ingo@42: protected DynamicForm modes; ingo@42: ingo@56: /** The min values for the 'from' property in the W-Range input mode.*/ ingo@56: protected double minW; ingo@56: ingo@56: /** The min values for the 'from' property in the Q-Range input mode.*/ ingo@56: protected double minQ; ingo@56: ingo@56: /** The max values for the 'from' property in the W-Range input mode.*/ ingo@56: protected double maxW; ingo@56: ingo@56: /** The max values for the 'from' property in the Q-Range input mode.*/ ingo@56: protected double maxQ; ingo@56: ingo@42: /** The 'from' value entered in the range W mode.*/ ingo@42: protected double fromW; ingo@42: ingo@42: /** The 'to' value entered in the range W mode.*/ ingo@42: protected double toW; ingo@42: ingo@42: /** The 'step' value entered in the range W mode.*/ ingo@42: protected double stepW; ingo@42: ingo@42: /** The values entered in the single W mode.*/ ingo@42: protected double[] valuesW; ingo@42: ingo@42: /** The 'from' value entered in the range Q mode.*/ ingo@42: protected double fromQ; ingo@42: ingo@42: /** The 'to' value entered in the range Q mode.*/ ingo@42: protected double toQ; ingo@42: ingo@42: /** The 'step' value entered in the range Q mode.*/ ingo@42: protected double stepQ; ingo@42: ingo@42: /** The values entered in the single Q mode.*/ ingo@42: protected double[] valuesQ; ingo@42: raimund@249: /** The input panel for W values*/ raimund@249: protected DoubleArrayPanel wArrayPanel; raimund@249: raimund@249: /** The input panel for q values*/ raimund@249: protected DoubleArrayPanel qArrayPanel; raimund@249: raimund@249: /** The input panel for w range*/ raimund@249: protected DoubleRangePanel wRangePanel; raimund@249: raimund@249: /** The input panel for q range*/ raimund@249: protected DoubleRangePanel qRangePanel; raimund@249: raimund@248: /** The WQ Data*/ raimund@248: protected WQInfoObject[] tableData; raimund@248: raimund@248: /** The WQ Input Table*/ raimund@248: protected ListGrid wqTable; raimund@248: raimund@248: /** The WQ input table for ranges.*/ raimund@248: protected ListGrid wqRangeTable; ingo@42: ingo@42: /** ingo@42: * Creates a new WQInputPanel instance. ingo@42: */ ingo@42: public WQInputPanel() { raimund@248: wqTable = new ListGrid(); raimund@248: wqRangeTable = new ListGrid(); ingo@42: } ingo@42: ingo@42: ingo@42: /** ingo@42: * This method calls createWidget and puts a 'next' button to the bottom. ingo@42: * ingo@42: * @param data The data that is displayed. ingo@42: * ingo@42: * @return the widget. ingo@42: */ ingo@51: public Canvas create(DataList data) { ingo@56: initDefaults(data); ingo@56: raimund@248: ingo@42: Canvas widget = createWidget(data); ingo@57: Canvas submit = getNextButton(); raimund@248: Label label = new Label(MESSAGE.wqTitle()); ingo@42: ingo@42: label.setHeight(25); ingo@42: ingo@42: VLayout layout = new VLayout(); ingo@83: layout.setMembersMargin(10); ingo@83: ingo@42: layout.addMember(label); ingo@42: layout.addMember(widget); ingo@42: layout.addMember(submit); ingo@42: ingo@42: return layout; ingo@42: } ingo@42: ingo@42: ingo@53: public Canvas createOld(DataList dataList) { ingo@53: List items = dataList.getAll(); ingo@53: ingo@236: Data dMode = getData(items, "wq_mode"); ingo@236: Data dSelection = getData(items, "wq_selection"); ingo@236: Data dSingle = getData(items, "wq_single"); ingo@236: Data dFrom = getData(items, "wq_from"); ingo@236: Data dTo = getData(items, "wq_to"); ingo@236: Data dStep = getData(items, "wq_step"); ingo@53: ingo@53: DataItem[] mode = dMode.getItems(); ingo@236: String strMode = mode[0].getStringValue(); ingo@236: boolean wMode = strMode.equals(FIELD_WQ_W); ingo@53: ingo@53: HLayout layout = new HLayout(); raimund@91: layout.setWidth("400px"); raimund@91: ingo@236: Label label = new Label(dataList.getLabel()); raimund@91: label.setWidth("200px"); ingo@53: ingo@236: String text = null; ingo@236: ingo@236: DataItem[] selItem = dSelection.getItems(); ingo@236: String sel = selItem != null ingo@236: ? selItem[0].getStringValue() ingo@236: : ""; ingo@236: ingo@236: if (sel.equals("single")) { ingo@236: DataItem[] single = dSingle.getItems(); ingo@236: ingo@236: text = wMode ingo@236: ? createWString(single[0]) ingo@236: : createQString(single[0]); ingo@236: } ingo@236: else { ingo@236: DataItem[] from = dFrom.getItems(); ingo@236: DataItem[] to = dTo.getItems(); ingo@236: DataItem[] step = dStep.getItems(); ingo@236: ingo@236: text = wMode ingo@236: ? createWString(from[0], to[0], step[0]) ingo@236: : createQString(from[0], to[0], step[0]); ingo@236: } ingo@53: raimund@91: Label selected = new Label(text); raimund@91: selected.setWidth("130px"); raimund@91: ingo@58: Canvas back = getBackButton(dataList.getState()); ingo@58: ingo@53: layout.addMember(label); raimund@94: layout.addMember(selected); ingo@58: layout.addMember(back); ingo@53: ingo@53: return layout; ingo@53: } ingo@53: ingo@53: raimund@248: protected void createWQInputPanel() { raimund@248: wqTable.setWidth(450); raimund@248: wqTable.setShowRecordComponents(true); raimund@248: wqTable.setShowRecordComponentsByCell(true); raimund@248: wqTable.setHeight(300); raimund@248: raimund@248: wqRangeTable.setWidth(450); raimund@248: wqRangeTable.setShowRecordComponents(true); raimund@248: wqRangeTable.setShowRecordComponentsByCell(true); raimund@248: wqRangeTable.setHeight(300); raimund@248: raimund@248: ListGridField addWQ = new ListGridField("", ""); raimund@248: addWQ.setType(ListGridFieldType.ICON); raimund@248: addWQ.setWidth(30); raimund@249: raimund@249: CellClickHandler cch = new CellClickHandler() { raimund@248: public void onCellClick(CellClickEvent e) { raimund@249: if (e.getColNum() == 0 && !e.getRecord().getEnabled ()) { raimund@248: Record r = e.getRecord (); raimund@248: double val = r.getAttributeAsDouble("value"); raimund@249: if(isWMode() && !isRangeMode()) { raimund@249: double[] in = wArrayPanel.getInputValues(); raimund@249: int size = 0; raimund@249: if (in == null) { raimund@249: double[] vals = new double[1]; raimund@249: vals[0] = val; raimund@249: wArrayPanel.setValues(vals); raimund@249: setSingleW(vals); raimund@249: } raimund@249: else { raimund@249: double[] vals = new double[in.length+1]; raimund@249: for(int i = 0; i < in.length; i++) { raimund@249: vals[i] = in[i]; raimund@249: } raimund@249: vals[in.length] = val; raimund@249: wArrayPanel.setValues(vals); raimund@249: setSingleW(vals); raimund@249: } raimund@249: } raimund@249: else if (!isWMode() && !isRangeMode()) { raimund@249: double[] in = qArrayPanel.getInputValues(); raimund@249: int size = 0; raimund@249: if (in == null) { raimund@249: double[] vals = new double[1]; raimund@249: vals[0] = val; raimund@249: qArrayPanel.setValues(vals); raimund@249: setSingleQ(vals); raimund@249: } raimund@249: else { raimund@249: double[] vals = new double[in.length+1]; raimund@249: for(int i = 0; i < in.length; i++) { raimund@249: vals[i] = in[i]; raimund@249: } raimund@249: vals[in.length] = val; raimund@249: qArrayPanel.setValues(vals); raimund@249: setSingleQ(vals); raimund@249: } raimund@249: } raimund@248: } raimund@248: } raimund@249: }; raimund@249: raimund@249: CellClickHandler cchRange = new CellClickHandler() { raimund@249: public void onCellClick(CellClickEvent e) { raimund@249: if (e.getColNum() == 0 && !e.getRecord().getEnabled ()) { raimund@249: Record r = e.getRecord (); raimund@249: double val = r.getAttributeAsDouble("value"); raimund@249: if(isWMode() && isRangeMode()) { raimund@249: wRangePanel.setValues( raimund@249: val, raimund@249: wRangePanel.getTo(), raimund@249: wRangePanel. getStep()); raimund@249: } raimund@249: else if (!isWMode() && isRangeMode()) { raimund@249: qRangePanel.setValues( raimund@249: val, raimund@249: qRangePanel.getTo(), raimund@249: qRangePanel.getStep()); raimund@249: } raimund@249: } raimund@249: if (e.getColNum() == 1 && !e.getRecord().getEnabled()) { raimund@249: Record r = e.getRecord (); raimund@249: double val = r.getAttributeAsDouble("value"); raimund@249: if (isWMode() && isRangeMode()) { raimund@249: wRangePanel.setValues( raimund@249: wRangePanel.getFrom(), raimund@249: val, raimund@249: wRangePanel.getStep()); raimund@249: } raimund@249: else if(!isWMode() && isRangeMode()) { raimund@249: qRangePanel.setValues( raimund@249: qRangePanel.getFrom(), raimund@249: val, raimund@249: qRangePanel.getStep()); raimund@249: } raimund@249: } raimund@249: } raimund@249: }; raimund@249: wqTable.addCellClickHandler(cch); raimund@249: wqRangeTable.addCellClickHandler(cchRange); raimund@248: addWQ.setCellIcon (IMAGES.markerGreen().getURL()); raimund@248: raimund@248: ListGridField addWQMin = new ListGridField("", ""); raimund@248: addWQMin.setType(ListGridFieldType.ICON); raimund@248: addWQMin.setWidth(30); raimund@248: ListGridField addWQMax = new ListGridField("", ""); raimund@248: addWQMax.setType(ListGridFieldType.ICON); raimund@248: addWQMax.setWidth(30); raimund@248: raimund@249: wqRangeTable.addCellClickHandler(cch); raimund@248: addWQMin.setCellIcon(IMAGES.markerGreen().getURL()); raimund@248: addWQMax.setCellIcon(IMAGES.markerRed().getURL()); raimund@248: raimund@248: ListGridField name = new ListGridField("name", MESSAGE.name()); raimund@248: name.setType(ListGridFieldType.TEXT); raimund@248: name.setWidth("*"); raimund@248: ListGridField type = new ListGridField("type", MESSAGE.type()); raimund@248: type.setType(ListGridFieldType.TEXT); raimund@248: type.setWidth("50"); raimund@248: ListGridField value = new ListGridField("value", MESSAGE.wq_value()); raimund@248: value.setType(ListGridFieldType.TEXT); raimund@248: type.setWidth("50"); raimund@248: raimund@248: ListGridField name_r = new ListGridField("name", MESSAGE.name()); raimund@248: name_r.setType(ListGridFieldType.TEXT); raimund@248: name_r.setWidth("*"); raimund@248: ListGridField type_r = new ListGridField("type", MESSAGE.type()); raimund@248: type_r.setType(ListGridFieldType.TEXT); raimund@248: type_r.setWidth("50"); raimund@248: ListGridField value_r = new ListGridField("value", MESSAGE.wq_value()); raimund@248: value_r.setType(ListGridFieldType.TEXT); raimund@248: type_r.setWidth("50"); raimund@248: raimund@249: wqTable.setSelectionType(SelectionStyle.SINGLE); raimund@249: wqRangeTable.setSelectionType(SelectionStyle.SINGLE); raimund@248: wqTable.setFields(addWQ, name, type, value); raimund@248: wqRangeTable.setFields(addWQMin, addWQMax, name_r, type_r, value_r); raimund@248: } raimund@248: ingo@56: /** ingo@56: * This method reads the default values defined in the DataItems of the Data ingo@56: * objects in list. ingo@56: * ingo@56: * @param list The DataList container that stores the Data objects. ingo@56: */ ingo@56: protected void initDefaults(DataList list) { ingo@56: Data f = getData(list.getAll(), "wq_from"); ingo@56: Data t = getData(list.getAll(), "wq_to"); ingo@56: Data s = getData(list.getAll(), "wq_step"); ingo@56: ingo@56: DataItem fQItem = getDataItem(f.getItems(), "minQ"); ingo@56: DataItem fWItem = getDataItem(f.getItems(), "minW"); ingo@56: DataItem tQItem = getDataItem(t.getItems(), "maxQ"); ingo@56: DataItem tWItem = getDataItem(t.getItems(), "maxW"); ingo@56: DataItem sQItem = getDataItem(s.getItems(), "stepQ"); ingo@56: DataItem sWItem = getDataItem(s.getItems(), "stepW"); ingo@56: ingo@56: minW = Double.valueOf(fWItem.getStringValue()); ingo@56: maxW = Double.valueOf(tWItem.getStringValue()); ingo@56: stepW = Double.valueOf(sWItem.getStringValue()); ingo@56: ingo@56: minQ = Double.valueOf(fQItem.getStringValue()); ingo@56: maxQ = Double.valueOf(tQItem.getStringValue()); ingo@56: stepQ = Double.valueOf(sQItem.getStringValue()); ingo@56: ingo@56: this.fromW = minW; ingo@56: this.toW = maxW; ingo@56: this.stepW = stepW; ingo@56: ingo@56: this.fromQ = minQ; ingo@56: this.toQ = maxQ; ingo@56: this.stepQ = stepQ; ingo@56: } ingo@56: ingo@56: ingo@53: protected String createWString(DataItem from, DataItem to, DataItem step) { ingo@53: StringBuilder sb = new StringBuilder(); ingo@53: sb.append(from.getLabel()); raimund@248: sb.append(" " + MESSAGE.unitWFrom() + " "); ingo@53: sb.append(to.getLabel()); raimund@248: sb.append(" " + MESSAGE.unitWTo() + " "); ingo@53: sb.append(step.getLabel()); raimund@248: sb.append(" " + MESSAGE.unitWStep()); ingo@53: ingo@53: return sb.toString(); ingo@53: } ingo@53: ingo@53: ingo@236: protected String createWString(DataItem single) { ingo@236: return single.getLabel(); ingo@236: } ingo@236: ingo@236: ingo@53: protected String createQString(DataItem from, DataItem to, DataItem step) { ingo@53: StringBuilder sb = new StringBuilder(); ingo@53: sb.append(from.getLabel()); raimund@248: sb.append(" " + MESSAGE.unitQFrom() + " "); ingo@53: sb.append(to.getLabel()); raimund@248: sb.append(" " + MESSAGE.unitQTo() + " "); ingo@53: sb.append(step.getLabel()); raimund@248: sb.append(" " + MESSAGE.unitQStep()); ingo@53: ingo@53: return sb.toString(); ingo@53: } ingo@53: ingo@53: ingo@236: protected String createQString(DataItem single) { ingo@236: return single.getLabel(); ingo@236: } ingo@236: ingo@236: ingo@53: /** ingo@42: * This method creates the whole widget. There is a panel on the left, that ingo@42: * allows the user to enter values manually by keyboard. On the right, there ingo@42: * is a table that allows the user to enter values by mouse click. ingo@42: * ingo@42: * @param data The data that is displayed in the table on the right. ingo@42: * ingo@42: * @return the widget. ingo@42: */ ingo@51: protected Canvas createWidget(DataList data) { ingo@42: VLayout layout = new VLayout(); raimund@248: container = new HLayout(); ingo@42: Canvas modeForm = createModePanel(); ingo@42: raimund@248: container.setMembersMargin(30); raimund@248: createWQInputTable(); raimund@248: createWQInputPanel(); ingo@48: // the initial panel is the Single-W panel. ingo@48: double[] values = getSingleW(); raimund@249: wArrayPanel = new DoubleArrayPanel( raimund@249: MESSAGE.unitWSingle(), values, this); raimund@249: container.addMember(wArrayPanel); raimund@248: container.addMember(wqTable); ingo@42: layout.addMember(modeForm); ingo@42: layout.addMember(container); ingo@42: ingo@42: return layout; ingo@42: } ingo@42: ingo@42: ingo@42: /** ingo@42: * This method creates the mode panel. It contains two radio button panels ingo@42: * that allows the user to switch the input mode between w/q and ingo@42: * single/range input. ingo@42: * ingo@42: * @return a panel. ingo@42: */ ingo@42: protected Canvas createModePanel() { ingo@42: RadioGroupItem wq = new RadioGroupItem(FIELD_WQ); ingo@42: wq.setShowTitle(false); ingo@42: wq.setVertical(false); ingo@42: wq.setWidth(WIDTH_LEFT); ingo@42: ingo@42: RadioGroupItem mode = new RadioGroupItem(FIELD_MODE); ingo@42: mode.setShowTitle(false); ingo@42: mode.setVertical(false); ingo@42: mode.setWidth(WIDTH_LEFT); ingo@42: ingo@42: LinkedHashMap wqValues = new LinkedHashMap(); raimund@248: wqValues.put(FIELD_WQ_W, MESSAGE.wqW()); raimund@248: wqValues.put(FIELD_WQ_Q, MESSAGE.wqQ()); ingo@42: ingo@42: LinkedHashMap modeValues = new LinkedHashMap(); raimund@248: modeValues.put(FIELD_MODE_SINGLE, MESSAGE.wqSingle()); raimund@248: modeValues.put(FIELD_MODE_RANGE, MESSAGE.wqRange()); ingo@42: ingo@42: wq.setValueMap(wqValues); ingo@42: mode.setValueMap(modeValues); ingo@42: ingo@42: wq.addChangeHandler(this); ingo@42: mode.addChangeHandler(this); ingo@42: ingo@42: modes = new DynamicForm(); ingo@42: modes.setFields(wq, mode); ingo@42: modes.setWidth(WIDTH_LEFT); ingo@42: modes.setNumCols(1); ingo@42: ingo@42: LinkedHashMap initial = new LinkedHashMap(); ingo@42: initial.put(FIELD_WQ, FIELD_WQ_W); ingo@42: initial.put(FIELD_MODE, FIELD_MODE_SINGLE); ingo@42: modes.setValues(initial); ingo@42: ingo@42: return modes; ingo@42: } ingo@42: ingo@42: ingo@42: /** ingo@42: * This method returns the selected data. ingo@42: * ingo@42: * @return the selected/inserted data. ingo@42: */ ingo@42: public Data[] getData() { ingo@59: // XXX If we have entered a value and click right afterwards on the ingo@59: // 'next' button, the BlurEvent is not fired, and the values are not ingo@59: // saved. So, we gonna save those values explicitly. ingo@59: if (!isRangeMode()) { ingo@59: Canvas member = container.getMember(0); ingo@59: if (member instanceof DoubleArrayPanel) { ingo@59: DoubleArrayPanel form = (DoubleArrayPanel) member; ingo@59: if (isWMode()) { ingo@59: saveSingleWValues(form); ingo@59: } ingo@59: else { ingo@59: saveSingleQValues(form); ingo@59: } ingo@59: } ingo@236: ingo@236: return new Data[] { ingo@236: getDataMode(), ingo@236: getDataSelectionMode(), ingo@236: getDataSingle() }; ingo@59: } ingo@59: else { ingo@59: Canvas member = container.getMember(0); ingo@59: if (member instanceof DoubleRangePanel) { ingo@59: DoubleRangePanel form = (DoubleRangePanel) member; ingo@59: ingo@59: if (isWMode()) { ingo@59: saveRangeWValues(form); ingo@59: } ingo@59: else { ingo@59: saveRangeQValues(form); ingo@59: } ingo@59: } ingo@59: ingo@236: return new Data[] { ingo@236: getDataMode(), ingo@236: getDataSelectionMode(), ingo@236: getDataFrom(), ingo@236: getDataTo(), ingo@236: getDataStep() }; ingo@236: } ingo@47: } ingo@42: ingo@47: ingo@47: /** ingo@47: * Returns the Data object for the 'mode' attribute. ingo@47: * ingo@47: * @return the Data object for the 'mode' attribute. ingo@47: */ ingo@47: protected Data getDataMode() { ingo@47: String wqMode = modes.getValueAsString(FIELD_WQ); ingo@47: DataItem item = new DefaultDataItem("wq_mode", "wq_mode", wqMode); ingo@47: return new DefaultData( ingo@51: "wq_mode", null, null, new DataItem[] { item }); ingo@47: } ingo@47: ingo@47: ingo@47: /** ingo@236: * Returns the Data object for the 'mode' attribute. ingo@236: * ingo@236: * @return the Data object for the 'mode' attribute. ingo@236: */ ingo@236: protected Data getDataSelectionMode() { ingo@236: String wqSelection = modes.getValueAsString(FIELD_MODE); ingo@236: DataItem item = new DefaultDataItem( ingo@236: "wq_selection", "wq_selection", wqSelection); ingo@236: ingo@236: return new DefaultData( ingo@236: "wq_selection", null, null, new DataItem[] { item }); ingo@236: } ingo@236: ingo@236: ingo@236: /** ingo@236: * Returns the data object for the 'single' attribute. ingo@236: * ingo@236: * @return the Data object for the 'single' attribute. ingo@236: */ ingo@236: protected Data getDataSingle() { ingo@236: double[] values = getFinalSingle(); ingo@236: StringBuilder sb = new StringBuilder(); ingo@236: for (double value: values) { ingo@236: sb.append(Double.toString(value)); ingo@236: sb.append(" "); ingo@236: } ingo@236: ingo@236: DataItem item = new DefaultDataItem( ingo@236: "wq_single", "wq_single", sb.toString()); ingo@236: ingo@236: return new DefaultData( ingo@236: "wq_single", null, null, new DataItem[] { item }); ingo@236: } ingo@236: ingo@236: ingo@236: /** ingo@47: * Returns the Data object for the 'from' attribute. ingo@47: * ingo@47: * @return the Data object for the 'from' attribute. ingo@47: */ ingo@47: protected Data getDataFrom() { ingo@47: String value = Double.valueOf(getFinalFrom()).toString(); ingo@47: DataItem item = new DefaultDataItem("wq_from", "wq_from", value); ingo@47: return new DefaultData( ingo@51: "wq_from", null, null, new DataItem[] { item }); ingo@47: } ingo@47: ingo@47: ingo@47: /** ingo@47: * Returns the Data object for the 'to' attribute. ingo@47: * ingo@47: * @return the Data object for the 'to' attribute. ingo@47: */ ingo@47: protected Data getDataTo() { ingo@47: String value = Double.valueOf(getFinalTo()).toString(); ingo@47: DataItem item = new DefaultDataItem("wq_to", "wq_to", value); ingo@47: return new DefaultData( ingo@51: "wq_to", null, null, new DataItem[] { item }); ingo@47: } ingo@47: ingo@47: ingo@47: /** ingo@47: * Returns the Data object for the 'step' attribute. ingo@47: * ingo@47: * @return the Data object for the 'step' attribute. ingo@47: */ ingo@47: protected Data getDataStep() { ingo@47: String value = Double.valueOf(getFinalStep()).toString(); ingo@47: DataItem item = new DefaultDataItem("wq_step","wq_step", value); ingo@47: return new DefaultData( ingo@51: "wq_step", null, null, new DataItem[] { item }); ingo@47: } ingo@47: ingo@47: ingo@236: protected double[] getFinalSingle() { ingo@236: boolean wMode = isWMode(); ingo@236: ingo@236: return wMode ? getSingleW() : getSingleQ(); ingo@236: } ingo@236: ingo@236: ingo@47: /** ingo@47: * Returns the value of 'from' depending on the selected input mode. ingo@47: * ingo@47: * @return the value of 'from' depending on the selected input mode. ingo@47: */ ingo@47: protected double getFinalFrom() { ingo@47: boolean wMode = isWMode(); ingo@47: boolean rangeMode = isRangeMode(); ingo@47: ingo@47: if (rangeMode) { ingo@47: return wMode ? getFromW() : getFromQ(); ingo@47: ingo@47: } ingo@47: else { ingo@47: double[] values = wMode ? getSingleW() : getSingleQ(); ingo@47: double value = Double.MAX_VALUE; ingo@47: ingo@47: for (double v: values) { ingo@47: value = value < v ? value : v; ingo@47: } ingo@47: ingo@47: return value; ingo@47: } ingo@47: } ingo@47: ingo@47: ingo@47: /** ingo@47: * Returns the value of 'to' depending on the selected input mode. ingo@47: * ingo@47: * @return the value of 'to' depending on the selected input mode. ingo@47: */ ingo@47: protected double getFinalTo() { ingo@47: boolean wMode = isWMode(); ingo@47: boolean rangeMode = isRangeMode(); ingo@47: ingo@47: if (rangeMode) { ingo@47: return wMode ? getToW() : getToQ(); ingo@47: ingo@47: } ingo@47: else { ingo@47: double[] values = wMode ? getSingleW() : getSingleQ(); ingo@47: double value = Double.MIN_VALUE; ingo@47: ingo@47: for (double v: values) { ingo@47: value = value > v ? value : v; ingo@47: } ingo@47: ingo@47: return value; ingo@47: } ingo@47: } ingo@47: ingo@47: ingo@47: /** ingo@47: * Returns the value of 'step' depending on the selected input mode. ingo@47: * ingo@47: * @return the value of 'step' depending on the selected input mode. ingo@47: */ ingo@47: protected double getFinalStep() { ingo@47: boolean wMode = isWMode(); ingo@47: boolean rangeMode = isRangeMode(); ingo@47: ingo@47: if (rangeMode) { ingo@234: return wMode ? getStepW() : getStepQ(); ingo@47: } ingo@47: else { ingo@234: // we have no field to enter the 'step' attribute in the ingo@234: // single mode ingo@234: return 0d; ingo@47: } ingo@47: } ingo@47: ingo@47: ingo@47: /** ingo@47: * Determines the range/single mode. ingo@47: * ingo@47: * @return true if the range mode is activated. ingo@47: */ ingo@47: public boolean isRangeMode() { ingo@47: String rMode = modes.getValueAsString(FIELD_MODE); ingo@47: ingo@47: return rMode.equals(FIELD_MODE_RANGE) ? true : false; ingo@47: } ingo@47: ingo@47: ingo@47: /** ingo@47: * Determines the w/q mode. ingo@47: * ingo@47: * @return true, if the W mode is activated. ingo@47: */ ingo@47: public boolean isWMode() { ingo@47: String wq = modes.getValueAsString(FIELD_WQ); ingo@47: ingo@47: return wq.equals(FIELD_WQ_W) ? true : false; ingo@42: } ingo@42: ingo@42: ingo@42: /** ingo@42: * This method changes the lower panel with the input fields depending on ingo@42: * the combination of the two radio button panels. ingo@42: * ingo@42: * @param event The ChangeEvent. ingo@42: */ ingo@42: public void onChange(ChangeEvent event) { ingo@42: DynamicForm form = event.getForm(); ingo@42: FormItem item = event.getItem(); ingo@42: ingo@42: String wqMode = null; ingo@42: String inputMode = null; ingo@42: ingo@42: if (item.getFieldName().equals(FIELD_MODE)) { ingo@42: wqMode = form.getValueAsString(FIELD_WQ); ingo@42: inputMode = (String) event.getValue(); ingo@42: } ingo@42: else { ingo@42: wqMode = (String) event.getValue(); ingo@42: inputMode = form.getValueAsString(FIELD_MODE); ingo@42: } ingo@42: ingo@42: container.removeMembers(container.getMembers()); ingo@42: ingo@42: Canvas newPanel = null; ingo@42: ingo@42: if (wqMode.equals(FIELD_WQ_W)) { ingo@42: if (inputMode.equals(FIELD_MODE_SINGLE)) { ingo@42: // Single W mode ingo@42: double[] values = getSingleW(); ingo@42: raimund@249: wArrayPanel = new DoubleArrayPanel( raimund@248: MESSAGE.unitWSingle(), values, this); raimund@248: raimund@249: container.addMember(wArrayPanel); raimund@248: container.addMember(wqTable); ingo@42: } ingo@42: else { ingo@42: // Range W mode ingo@42: double from = getFromW(); ingo@42: double to = getToW(); ingo@42: double step = getStepW(); ingo@42: raimund@249: wRangePanel = new DoubleRangePanel( raimund@248: MESSAGE.unitWFrom(), MESSAGE.unitWTo(), MESSAGE.unitWStep(), ingo@42: from, to, step, ingo@42: 250, ingo@42: this); raimund@249: container.addMember(wRangePanel); raimund@248: container.addMember(wqRangeTable); ingo@42: } ingo@42: } ingo@42: else { ingo@42: if (inputMode.equals(FIELD_MODE_SINGLE)) { ingo@42: // Single Q mode ingo@42: double[] values = getSingleQ(); ingo@42: raimund@249: qArrayPanel = new DoubleArrayPanel( raimund@248: MESSAGE.unitQSingle(), values, this); raimund@249: container.addMember(qArrayPanel); raimund@248: container.addMember(wqTable); ingo@42: } ingo@42: else { ingo@42: // Range Q mode ingo@42: double from = getFromQ(); ingo@42: double to = getToQ(); ingo@42: double step = getStepQ(); ingo@42: raimund@249: qRangePanel = new DoubleRangePanel( raimund@248: MESSAGE.unitQFrom(), MESSAGE.unitQTo(), MESSAGE.unitQStep(), ingo@42: from, to, step, ingo@42: 250, ingo@42: this); raimund@249: container.addMember(qRangePanel); raimund@248: container.addMember(wqRangeTable); ingo@42: } ingo@42: } ingo@42: ingo@42: } ingo@42: ingo@42: ingo@42: /** ingo@42: * This method is called if the value of one of the input fields might have ingo@42: * changed. The entered values are validated and stored. ingo@42: * ingo@42: * @param event The BlurEvent. ingo@42: */ ingo@42: public void onBlur(BlurEvent event) { ingo@42: DynamicForm form = event.getForm(); ingo@42: FormItem item = event.getItem(); ingo@42: ingo@42: String wqMode = (String) modes.getValue(FIELD_WQ); ingo@42: String inputMode = (String) modes.getValue(FIELD_MODE); ingo@42: ingo@42: if (wqMode.equals(FIELD_WQ_W)) { ingo@42: if (inputMode.equals(FIELD_MODE_SINGLE)) { ingo@42: DoubleArrayPanel p = (DoubleArrayPanel) form; ingo@59: saveSingleWValue(p, item); ingo@42: } ingo@42: else { ingo@42: DoubleRangePanel p = (DoubleRangePanel) form; ingo@59: saveRangeWValue(p, item); ingo@42: } ingo@42: } ingo@42: else { ingo@42: if (inputMode.equals(FIELD_MODE_SINGLE)) { ingo@42: DoubleArrayPanel p = (DoubleArrayPanel) form; ingo@59: saveSingleQValue(p, item); ingo@42: } ingo@42: else { ingo@42: DoubleRangePanel p = (DoubleRangePanel) form; ingo@59: saveRangeQValue(p, item); ingo@59: } ingo@59: } ingo@59: } ingo@42: ingo@59: ingo@59: protected void saveSingleWValues(DoubleArrayPanel p) { ingo@59: FormItem[] formItems = p.getFields(); ingo@59: ingo@59: for (FormItem item: formItems) { ingo@59: if (item.getFieldName().equals(DoubleArrayPanel.FIELD_NAME)) { ingo@59: saveSingleWValue(p, item); ingo@42: } ingo@42: } ingo@42: } ingo@42: ingo@42: ingo@59: protected void saveSingleQValues(DoubleArrayPanel p) { ingo@59: FormItem[] formItems = p.getFields(); ingo@59: ingo@59: for (FormItem item: formItems) { ingo@59: if (item.getFieldName().equals(DoubleArrayPanel.FIELD_NAME)) { ingo@59: saveSingleQValue(p, item); ingo@59: } ingo@59: } ingo@59: } ingo@59: ingo@59: ingo@59: protected void saveSingleWValue(DoubleArrayPanel p, FormItem item) { ingo@59: if (p.validateForm(item)) { ingo@59: setSingleW(p.getInputValues(item)); ingo@59: } ingo@59: } ingo@59: ingo@59: ingo@59: protected void saveSingleQValue(DoubleArrayPanel p, FormItem item) { ingo@59: if (p.validateForm(item)) { ingo@59: setSingleQ(p.getInputValues(item)); ingo@59: } ingo@59: } ingo@59: ingo@59: ingo@59: protected void saveRangeWValues(DoubleRangePanel p) { ingo@59: FormItem[] formItems = p.getFields(); ingo@59: ingo@59: for (FormItem item: formItems) { ingo@59: saveRangeWValue(p, item); ingo@59: } ingo@59: } ingo@59: ingo@59: ingo@59: protected void saveRangeQValues(DoubleRangePanel p) { ingo@59: FormItem[] formItems = p.getFields(); ingo@59: ingo@59: for (FormItem item: formItems) { ingo@59: saveRangeQValue(p, item); ingo@59: } ingo@59: } ingo@59: ingo@59: ingo@59: protected void saveRangeWValue(DoubleRangePanel p, FormItem item) { ingo@59: if (p.validateForm(item)) { ingo@59: setFromW(p.getFrom()); ingo@59: setToW(p.getTo()); ingo@59: setStepW(p.getStep()); ingo@59: } ingo@59: } ingo@59: ingo@59: ingo@59: protected void saveRangeQValue(DoubleRangePanel p, FormItem item) { ingo@59: if (p.validateForm(item)) { ingo@59: setFromQ(p.getFrom()); ingo@59: setToQ(p.getTo()); ingo@59: setStepQ(p.getStep()); ingo@59: } ingo@59: } ingo@59: ingo@59: ingo@42: protected double[] getSingleQ() { ingo@42: return valuesQ; ingo@42: } ingo@42: ingo@42: ingo@42: protected void setSingleQ(double[] values) { ingo@42: valuesQ = values; ingo@42: } ingo@42: ingo@42: ingo@42: protected double getFromQ() { ingo@42: return fromQ; ingo@42: } ingo@42: ingo@42: ingo@42: protected void setFromQ(double fromQ) { ingo@42: this.fromQ = fromQ; ingo@42: } ingo@42: ingo@42: ingo@42: protected double getToQ() { ingo@42: return toQ; ingo@42: } ingo@42: ingo@42: ingo@42: protected void setToQ(double toQ) { ingo@42: this.toQ = toQ; ingo@42: } ingo@42: ingo@42: ingo@42: protected double getStepQ() { ingo@42: return stepQ; ingo@42: } ingo@42: ingo@42: ingo@42: protected void setStepQ(double stepQ) { ingo@42: this.stepQ = stepQ; ingo@42: } ingo@42: ingo@42: ingo@42: protected double[] getSingleW() { ingo@42: return valuesW; ingo@42: } ingo@42: ingo@42: ingo@42: protected void setSingleW(double[] values) { ingo@42: valuesW = values; ingo@42: } ingo@42: ingo@42: ingo@42: protected double getFromW() { ingo@42: return fromW; ingo@42: } ingo@42: ingo@42: ingo@42: protected void setFromW(double fromW) { ingo@42: this.fromW = fromW; ingo@42: } ingo@42: ingo@42: ingo@42: protected double getToW() { ingo@42: return toW; ingo@42: } ingo@42: ingo@42: ingo@42: protected void setToW(double toW) { ingo@42: this.toW = toW; ingo@42: } ingo@42: ingo@42: ingo@42: protected double getStepW() { ingo@42: return stepW; ingo@42: } ingo@42: ingo@42: ingo@42: protected void setStepW(double stepW) { ingo@42: this.stepW = stepW; ingo@42: } raimund@248: raimund@248: raimund@248: protected void createWQInputTable() { raimund@248: Config config = Config.getInstance(); raimund@248: String url = config.getServerUrl(); raimund@248: String locale = config.getLocale (); raimund@248: String river = ""; raimund@248: String value_min = ""; raimund@248: String value_max = ""; raimund@248: raimund@248: ArtifactDescription adescr = artifact.getArtifactDescription(); raimund@248: DataList[] data = adescr.getOldData(); raimund@248: raimund@248: //TODO: get the information about old data. raimund@248: if (data != null && data.length > 0) { raimund@248: for (int i = 0; i < data.length; i++) { raimund@248: DataList dl = data[i]; raimund@248: if (dl.getState().equals("state.winfo.river")) { raimund@248: for (int j = 0; j < dl.size(); j++) { raimund@248: Data d = dl.get(j); raimund@248: DataItem[] di = d.getItems(); raimund@248: if (di != null && di.length == 1) { raimund@248: river = d.getItems()[0].getStringValue(); raimund@248: } raimund@248: } raimund@248: } raimund@248: else if (dl.getState().equals("state.winfo.location_distance")){ raimund@248: for (int j = 0; j < dl.size(); j++) { raimund@248: Data d = dl.get(j); raimund@248: DataItem[] di = d.getItems(); raimund@248: if (di != null && di.length >= 1 && j == 0) { raimund@248: value_max = d.getItems()[0].getStringValue(); raimund@248: } raimund@248: else if (di != null && raimund@248: di.length >= 1 && raimund@248: j == dl.size() - 1) { raimund@248: value_min = d.getItems()[0].getStringValue(); raimund@248: } raimund@248: } raimund@248: } raimund@248: } raimund@248: } raimund@248: raimund@248: double from = Double.valueOf(value_min); raimund@248: double to = Double.valueOf(value_max); raimund@248: wqInfoService.getWQInfo(url, locale, river, from, to, raimund@248: new AsyncCallback() { raimund@248: public void onFailure(Throwable caught) { raimund@248: GWT.log("Could not recieve wq informations."); raimund@248: GWT.log(caught.getMessage()); raimund@248: } raimund@248: raimund@248: public void onSuccess(WQInfoObject[] wqi) { raimund@248: int num = wqi != null ? wqi.length :0; raimund@248: GWT.log("Recieved " + num + " wq informations."); raimund@248: raimund@248: if (num == 0) { raimund@248: return; raimund@248: } raimund@248: tableData = wqi; raimund@248: addWQInfo(wqi); raimund@248: } raimund@248: } raimund@248: ); raimund@248: } raimund@248: raimund@248: raimund@248: protected void addWQInfo (WQInfoObject[] wqi) { raimund@248: int i = 0; raimund@248: for(WQInfoObject wi: wqi) { raimund@248: WQInfoRecord rec = new WQInfoRecord (wi); raimund@248: wqTable.addData(rec); raimund@248: wqRangeTable.addData(rec); raimund@248: } raimund@248: return; raimund@248: } ingo@42: } ingo@42: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :