raimund@238: package de.intevation.flys.client.client.ui; raimund@238: raimund@238: import com.google.gwt.core.client.GWT; raimund@238: ingo@563: import com.smartgwt.client.util.SC; raimund@238: import com.smartgwt.client.widgets.Canvas; raimund@238: import com.smartgwt.client.widgets.Label; raimund@238: import com.smartgwt.client.widgets.form.fields.events.BlurHandler; raimund@238: import com.smartgwt.client.widgets.form.fields.events.BlurEvent; raimund@1534: raimund@238: import com.smartgwt.client.widgets.layout.HLayout; raimund@238: import com.smartgwt.client.widgets.layout.VLayout; raimund@906: raimund@238: import com.smartgwt.client.widgets.grid.events.RecordClickHandler; raimund@238: import com.smartgwt.client.widgets.grid.events.RecordClickEvent; raimund@1538: raimund@863: import com.smartgwt.client.data.Record; raimund@238: felix@1590: import de.intevation.flys.client.shared.model.ArtifactDescription; raimund@238: import de.intevation.flys.client.shared.model.Data; raimund@238: import de.intevation.flys.client.shared.model.DataItem; raimund@238: import de.intevation.flys.client.shared.model.DataList; raimund@238: import de.intevation.flys.client.shared.model.DistanceInfoObject; felix@1590: import de.intevation.flys.client.shared.model.RangeData; raimund@238: raimund@238: import de.intevation.flys.client.client.services.DistanceInfoService; raimund@238: import de.intevation.flys.client.client.services.DistanceInfoServiceAsync; raimund@238: import de.intevation.flys.client.client.Config; raimund@863: import de.intevation.flys.client.client.ui.range.DistanceInfoDataSource; raimund@238: raimund@238: raimund@238: /** felix@1590: * This UIProvider creates a widget to enter a single location (km). raimund@238: * raimund@238: * @author Raimund Renkert raimund@238: */ raimund@238: public class SingleLocationPanel felix@1591: extends LocationPanel felix@1590: implements RecordClickHandler raimund@238: { felix@1585: /** The DistanceInfoService used to retrieve locations about rivers. */ raimund@238: protected DistanceInfoServiceAsync distanceInfoService = raimund@238: GWT.create(DistanceInfoService.class); raimund@238: raimund@238: /** The table data. */ raimund@238: protected DistanceInfoObject[] tableData; raimund@238: felix@1590: /** The input helper (usually right side, table to click on, values are felix@1590: * then entered in the texfield. */ felix@1590: protected LocationPicker picker; felix@1586: raimund@238: /** raimund@238: * Creates a new LocationDistancePanel instance. raimund@238: */ raimund@238: public SingleLocationPanel() { felix@1590: picker = new LocationPicker(this); raimund@238: } raimund@238: raimund@238: raimund@238: /** raimund@238: * This method creates a widget that contains a label, a panel with raimund@238: * checkboxes to switch the input mode between location and distance input, felix@1585: * and a mode specific panel. raimund@238: * raimund@238: * @param data The data that might be inserted. raimund@238: * raimund@238: * @return a panel. raimund@238: */ felix@1586: @Override raimund@238: public Canvas create(DataList data) { felix@1593: findDataItemName(data); felix@1593: raimund@238: VLayout layout = new VLayout(); raimund@238: layout.setMembersMargin(10); raimund@238: felix@1586: Label label = new Label(MSG.location ()); raimund@238: Canvas widget = createWidget(data); raimund@238: Canvas submit = getNextButton(); raimund@238: ingo@519: initDefaults(data); ingo@519: felix@1590: picker.createLocationTable(); raimund@238: raimund@238: widget.setHeight(50); raimund@238: label.setHeight(25); raimund@238: raimund@238: layout.addMember(label); raimund@238: layout.addMember(widget); raimund@238: layout.addMember(submit); raimund@238: raimund@238: return layout; raimund@238: } raimund@238: raimund@238: raimund@238: /** raimund@238: * This method reads the default values defined in the DataItems of the Data raimund@238: * objects in list. raimund@238: * raimund@238: * @param list The DataList container that stores the Data objects. raimund@238: */ raimund@238: protected void initDefaults(DataList list) { ingo@519: Data data = list.get(0); ingo@519: felix@1590: // Compatibility with MinMax- DataItems: felix@1590: RangeData rangeData = null; felix@1590: felix@1590: for (int i = 0, n = list.size(); i < n; i++) { felix@1590: Data tmp = list.get(i); felix@1590: felix@1590: if (tmp instanceof RangeData) { felix@1590: rangeData = (RangeData) tmp; felix@1590: } ingo@519: } ingo@519: felix@1590: if (rangeData != null) { felix@1590: min = Double.parseDouble(rangeData.getDefaultLower().toString()); felix@1590: max = Double.parseDouble(rangeData.getDefaultUpper().toString()); felix@1590: // catch ..? felix@1590: } felix@1590: else { felix@1590: DataItem[] items = data.getItems(); felix@1590: DataItem iMin = getDataItem(items, "min"); felix@1590: DataItem iMax = getDataItem(items, "max"); felix@1590: felix@1590: try { felix@1590: min = Double.parseDouble(iMin.getStringValue()); felix@1590: max = Double.parseDouble(iMax.getStringValue()); felix@1590: } felix@1590: catch (NumberFormatException nfe) { felix@1590: SC.warn(MSG.error_read_minmax_values()); felix@1590: min = -Double.MAX_VALUE; felix@1590: max = Double.MAX_VALUE; felix@1590: } ingo@563: } ingo@563: felix@1593: DataItem def = data.getDefault(); felix@1593: if (def != null) { felix@1593: String value = def.getStringValue(); ingo@519: felix@1593: try { felix@1593: double d = Double.parseDouble(value); felix@1593: setLocationValues(new double[] { d } ); felix@1593: } felix@1593: catch (NumberFormatException nfe) { felix@1593: // could not parse, dont know what to do else felix@1593: } ingo@519: } raimund@238: } raimund@238: raimund@238: felix@1591: protected Canvas createWidget(DataList data) { felix@1591: VLayout layout = new VLayout(); felix@1593: inputLayout = new HLayout(); felix@1591: felix@1591: // The initial view will display the location input mode. felix@1591: locationPanel = new DoubleArrayPanel( felix@1591: MSG.unitLocation(), felix@1591: getLocationValues(), felix@1591: new BlurHandler(){public void onBlur(BlurEvent be) {}}); felix@1591: felix@1591: picker.getLocationTable().setAutoFetchData(true); felix@1591: felix@1591: inputLayout.addMember(locationPanel); felix@1591: felix@1591: layout.addMember(inputLayout); felix@1591: felix@1591: inputLayout.setMembersMargin(30); felix@1591: felix@1591: picker.prepareFilter(); felix@1591: felix@1591: helperContainer.addMember(picker.getLocationTable()); felix@1591: helperContainer.addMember(picker.getFilterLayout()); felix@1591: helperContainer.addMember(picker.getResultCountForm()); felix@1591: setPickerDataSource(); felix@1591: return layout; felix@1591: } felix@1591: felix@1591: raimund@238: /** raimund@238: * This method returns the selected data. raimund@238: * raimund@238: * @return the selected/inserted data. raimund@238: */ raimund@238: public Data[] getData() { raimund@242: saveLocationValues(locationPanel); raimund@238: double[] values = getLocationValues(); ingo@1387: Data[] data = new Data[values.length+1]; felix@1586: raimund@238: for (int i = 0; i < values.length; i++) { felix@1593: data[i] = createDataArray(getDataItemName(), raimund@238: Double.valueOf(values[i]).toString()); raimund@238: } felix@1586: data[values.length] = createDataArray("ld_mode", "locations"); ingo@1387: raimund@238: return data; raimund@238: } raimund@238: raimund@238: felix@1591: /** Hook service to the listgrid with possible input values. */ felix@1591: protected void setPickerDataSource() { raimund@238: Config config = Config.getInstance(); raimund@238: String url = config.getServerUrl(); raimund@238: String river = ""; raimund@238: raimund@238: ArtifactDescription adescr = artifact.getArtifactDescription(); raimund@238: DataList[] data = adescr.getOldData(); raimund@238: felix@1586: // Try to find a "river" data item to set the source for the felix@1586: // list grid. raimund@238: if (data != null && data.length > 0) { raimund@238: for (int i = 0; i < data.length; i++) { raimund@238: DataList dl = data[i]; raimund@1526: if (dl.getState().equals("state.winfo.river") || raimund@1526: dl.getState().equals("state.chart.river")) { raimund@238: for (int j = 0; j < dl.size(); j++) { raimund@238: Data d = dl.get(j); raimund@238: DataItem[] di = d.getItems(); raimund@238: if (di != null && di.length == 1) { raimund@238: river = d.getItems()[0].getStringValue(); sascha@276: break; raimund@238: } raimund@238: } raimund@238: } raimund@238: } raimund@238: } raimund@238: felix@1590: picker.getLocationTable().setDataSource(new DistanceInfoDataSource( felix@1591: url, river, "locations")); raimund@238: } felix@1590: felix@1590: felix@1590: /** felix@1590: * Callback when an item from the input helper was clicked. felix@1590: * Set the respective km-value in the location value field. felix@1590: * @param e event passed. felix@1590: */ felix@1590: public void onRecordClick (RecordClickEvent e) { felix@1590: Record record = e.getRecord(); felix@1590: double[] selected = new double[1]; felix@1590: try { felix@1590: selected[0] = felix@1590: Double.parseDouble(record.getAttribute("from")); felix@1590: } felix@1590: catch(NumberFormatException nfe) { felix@1590: // Is there anything else to do here? felix@1590: } felix@1590: setLocationValues(selected); felix@1590: } raimund@238: } raimund@238: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :