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 :