teichmann@5861: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5861: * Software engineering by Intevation GmbH teichmann@5861: * teichmann@5993: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5861: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5993: * documentation coming with Dive4Elements River for details. teichmann@5861: */ teichmann@5861: teichmann@5835: package org.dive4elements.river.client.client.ui; ingo@41: gernotbelger@9175: import java.util.ArrayList; gernotbelger@9175: import java.util.LinkedHashMap; gernotbelger@9175: import java.util.List; gernotbelger@9175: gernotbelger@9175: import org.dive4elements.river.client.client.Config; gernotbelger@9175: import org.dive4elements.river.client.client.FLYSConstants; gernotbelger@9175: import org.dive4elements.river.client.client.event.FilterHandler; gernotbelger@9175: import org.dive4elements.river.client.client.event.RangeFilterEvent; gernotbelger@9175: import org.dive4elements.river.client.client.event.StringFilterEvent; gernotbelger@9175: import org.dive4elements.river.client.client.services.DistanceInfoService; gernotbelger@9175: import org.dive4elements.river.client.client.services.DistanceInfoServiceAsync; gernotbelger@9175: import org.dive4elements.river.client.client.ui.range.DistanceInfoDataSource; gernotbelger@9175: import org.dive4elements.river.client.shared.model.ArtifactDescription; gernotbelger@9175: import org.dive4elements.river.client.shared.model.Data; gernotbelger@9175: import org.dive4elements.river.client.shared.model.DataItem; gernotbelger@9175: import org.dive4elements.river.client.shared.model.DataList; gernotbelger@9175: import org.dive4elements.river.client.shared.model.DefaultData; gernotbelger@9175: import org.dive4elements.river.client.shared.model.DefaultDataItem; gernotbelger@9175: import org.dive4elements.river.client.shared.model.DistanceInfoObject; gernotbelger@9175: ingo@41: import com.google.gwt.core.client.GWT; ingo@562: import com.google.gwt.i18n.client.NumberFormat; christian@4131: import com.smartgwt.client.data.AdvancedCriteria; raimund@863: import com.smartgwt.client.data.Criteria; raimund@1536: import com.smartgwt.client.data.Criterion; christian@4131: import com.smartgwt.client.data.Record; christian@4131: import com.smartgwt.client.types.Alignment; christian@4131: import com.smartgwt.client.types.ListGridFieldType; raimund@1536: import com.smartgwt.client.types.OperatorId; ingo@41: import com.smartgwt.client.widgets.Canvas; ingo@41: import com.smartgwt.client.widgets.Label; ingo@41: import com.smartgwt.client.widgets.form.DynamicForm; christian@4131: import com.smartgwt.client.widgets.form.fields.FormItem; christian@4131: import com.smartgwt.client.widgets.form.fields.RadioGroupItem; christian@4131: import com.smartgwt.client.widgets.form.fields.SelectItem; christian@4131: import com.smartgwt.client.widgets.form.fields.StaticTextItem; ingo@41: import com.smartgwt.client.widgets.form.fields.events.BlurEvent; christian@4131: import com.smartgwt.client.widgets.form.fields.events.BlurHandler; christian@4131: import com.smartgwt.client.widgets.form.fields.events.ChangeEvent; ingo@41: import com.smartgwt.client.widgets.form.fields.events.ChangeHandler; raimund@1534: import com.smartgwt.client.widgets.form.fields.events.ChangedEvent; christian@4131: import com.smartgwt.client.widgets.form.fields.events.ChangedHandler; christian@4131: import com.smartgwt.client.widgets.grid.CellFormatter; raimund@235: import com.smartgwt.client.widgets.grid.ListGrid; raimund@235: import com.smartgwt.client.widgets.grid.ListGridField; raimund@906: import com.smartgwt.client.widgets.grid.ListGridRecord; raimund@235: import com.smartgwt.client.widgets.grid.events.RecordClickEvent; christian@4131: import com.smartgwt.client.widgets.grid.events.RecordClickHandler; christian@4131: import com.smartgwt.client.widgets.layout.HLayout; christian@4131: import com.smartgwt.client.widgets.layout.VLayout; christian@4131: import com.smartgwt.client.widgets.tab.Tab; christian@4131: import com.smartgwt.client.widgets.tab.TabSet; raimund@893: import com.smartgwt.client.widgets.tab.events.TabSelectedEvent; christian@4131: import com.smartgwt.client.widgets.tab.events.TabSelectedHandler; raimund@235: ingo@41: /** ingo@41: * This UIProvider creates a widget to enter locations or a distance. ingo@41: * ingo@41: * @author Ingo Weinzierl ingo@41: */ gernotbelger@9175: public class LocationDistancePanel extends AbstractUIProvider implements ChangeHandler, BlurHandler, FilterHandler { christian@4131: private static final long serialVersionUID = -10820092176039372L; christian@4131: felix@838: /** The message class that provides i18n strings. */ ingo@211: protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class); ingo@41: felix@838: /** The DistanceInfoService used to retrieve locations about rivers. */ gernotbelger@9175: protected DistanceInfoServiceAsync distanceInfoService = GWT.create(DistanceInfoService.class); ingo@41: ingo@516: public static final String FIELD_MODE = "mode"; ingo@43: gernotbelger@9175: /** The constant name of the input field to enter the start of a distance. */ ingo@41: public static final String FIELD_FROM = "from"; ingo@41: gernotbelger@9175: /** The constant name of the input field to enter the end of a distance. */ ingo@41: public static final String FIELD_TO = "to"; ingo@41: gernotbelger@9175: /** The constant name of the input field to enter locations. */ ingo@516: public static final String FIELD_VALUE_LOCATION = "location"; ingo@516: gernotbelger@9175: /** The constant name of the input field to enter distance. */ ingo@516: public static final String FIELD_VALUE_DISTANCE = "distance"; ingo@516: gernotbelger@9175: /** gernotbelger@9175: * The constant name of the input field to enter the step width of a gernotbelger@9175: * distance. gernotbelger@9175: */ ingo@41: public static final String FIELD_WIDTH = "width"; ingo@41: ingo@53: public static final int WIDTH = 250; ingo@53: gernotbelger@9175: /** The radio group for input mode selection. */ ingo@43: protected DynamicForm mode; ingo@41: gernotbelger@9175: /** A container that will contain the location or the distance panel. */ ingo@41: protected HLayout container; ingo@41: gernotbelger@9175: /** The min value for a distance. */ ingo@55: protected double min; ingo@55: gernotbelger@9175: /** The max value for a distance. */ ingo@55: protected double max; ingo@55: gernotbelger@9175: /** The 'from' value entered in the distance mode. */ ingo@43: protected double from; ingo@43: gernotbelger@9175: /** The 'to' value entered in the distance mode. */ ingo@43: protected double to; ingo@43: gernotbelger@9175: /** The 'step' value entered in the distance mode. */ ingo@43: protected double step; ingo@43: gernotbelger@9175: /** The values entered in the location mode. */ ingo@43: protected double[] values; ingo@43: felix@838: /** The input panel for locations. */ raimund@235: protected DoubleArrayPanel locationPanel; raimund@235: felix@838: /** The input panel for distances. */ raimund@235: protected DoubleRangePanel distancePanel; raimund@235: felix@838: /** The tab set containing the location and distance table. */ raimund@235: protected TabSet inputTables; raimund@235: raimund@235: /** The distance table. */ raimund@235: protected ListGrid distanceTable; raimund@235: felix@838: /** The locations table. */ raimund@235: protected ListGrid locationsTable; raimund@235: raimund@237: /** The table data. */ raimund@237: protected DistanceInfoObject[] tableData; raimund@237: gernotbelger@9175: /** The table filter. */ raimund@1534: protected TableFilter filterDescription; raimund@1534: protected RangeTableFilter filterRange; raimund@1534: raimund@1534: /** The Combobox for table filter criteria. */ raimund@1534: protected SelectItem filterCriteria; raimund@1567: protected StaticTextItem filterResultCount; raimund@1567: protected ListGrid currentFiltered; raimund@893: ingo@41: /** ingo@41: * Creates a new LocationDistancePanel instance. ingo@41: */ ingo@41: public LocationDistancePanel() { gernotbelger@9175: this.distanceTable = new ListGrid(); gernotbelger@9175: this.distanceTable.setAutoFetchData(true); raimund@863: gernotbelger@9175: this.locationsTable = new ListGrid(); gernotbelger@9175: this.locationsTable.setAutoFetchData(true); raimund@863: gernotbelger@9175: this.distanceTable.setShowHeaderContextMenu(false); gernotbelger@9175: this.locationsTable.setShowHeaderContextMenu(false); ingo@41: } ingo@41: ingo@41: /** ingo@41: * This method creates a widget that contains a label, a panel with ingo@41: * checkboxes to switch the input mode between location and distance input, ingo@41: * and a the mode specific panel. ingo@41: * gernotbelger@9175: * @param data gernotbelger@9175: * The data that might be inserted. ingo@41: * ingo@41: * @return a panel. ingo@41: */ christian@4131: @Override gernotbelger@9175: public Canvas create(final DataList data) { gernotbelger@9175: final VLayout layout = new VLayout(); ingo@83: layout.setMembersMargin(10); ingo@41: gernotbelger@9175: final Label label = getLabel(data);// new Label(MESSAGES.location_distance_state()); gernotbelger@9175: final Canvas widget = createWidget(data); gernotbelger@9175: final Canvas submit = getNextButton(); raimund@235: createDistanceInputPanel(); raimund@235: ingo@516: initDefaults(data); ingo@516: ingo@83: widget.setHeight(50); ingo@41: label.setHeight(25); ingo@41: ingo@41: layout.addMember(label); ingo@45: layout.addMember(widget); ingo@45: layout.addMember(submit); ingo@45: ingo@45: return layout; ingo@45: } ingo@45: gernotbelger@9175: protected Label getLabel(final DataList data) { gernotbelger@9175: final Data item = data.get(0); gernotbelger@9175: return new Label(item.getDescription());// gernotbelger@9175: // TODO: migrate distance_part_state to server gernotbelger@9175: // item.getDescription()); // holt das Label vom Server (funktoniert schon sehr oft so!) gernotbelger@9175: } ingo@45: raimund@235: /** andre@8449: * Setup a table for a DistanceInfoDataSource. andre@8449: * andre@8449: * Sets up a table to for input completion. The table andre@8449: * can be used either for single locations or distances. andre@8449: * Depending on the value of isDistance the table will andre@8449: * have a to and a from column or a single location column. andre@8449: * gernotbelger@9175: * @param table gernotbelger@9175: * the ListGrid to set up. gernotbelger@9175: * @param doublePins gernotbelger@9175: * wether or not to have. gernotbelger@9175: * @param isDistance gernotbelger@9175: * wether or not to and from should be included. raimund@235: */ gernotbelger@9175: protected void setupDistanceInfoTable(final ListGrid table, final boolean doublePins, final boolean isDistance) { raimund@863: gernotbelger@9175: final String baseUrl = GWT.getHostPageBaseURL(); raimund@1399: andre@8449: table.setWidth100(); andre@8449: table.setShowRecordComponents(true); andre@8449: table.setShowRecordComponentsByCell(true); andre@8449: table.setHeight100(); gernotbelger@9175: table.setEmptyMessage(this.MESSAGES.empty_filter()); andre@8449: table.setCanReorderFields(false); raimund@235: gernotbelger@9175: final CellFormatter cf = new CellFormatter() { christian@4131: @Override gernotbelger@9175: public String format(final Object value, final ListGridRecord record, final int rowNum, final int colNum) { gernotbelger@9175: if (value == null) gernotbelger@9175: return null; gernotbelger@9175: try { gernotbelger@9175: NumberFormat nf; gernotbelger@9175: final double v = Double.parseDouble((String) value); gernotbelger@9175: nf = NumberFormat.getFormat("###0.00##"); gernotbelger@9175: return nf.format(v); gernotbelger@9175: } gernotbelger@9175: catch (final Exception e) { gernotbelger@9175: return value.toString(); gernotbelger@9175: } raimund@1390: } raimund@1390: }; andre@8449: ListGridField pin1 = null; andre@8449: ListGridField pin2 = null; raimund@1390: andre@8449: if (doublePins) { gernotbelger@9175: pin1 = new ListGridField("fromIcon", this.MESSAGES.from()); gernotbelger@9175: pin1.setWidth(30); andre@8449: } else { gernotbelger@9175: pin1 = new ListGridField("fromIcon", this.MESSAGES.selection()); gernotbelger@9175: pin1.setWidth(60); andre@8449: } gernotbelger@9175: pin1.setType(ListGridFieldType.ICON); gernotbelger@9175: pin1.setCellIcon(baseUrl + this.MESSAGES.markerGreen()); andre@8449: andre@8449: if (doublePins) { gernotbelger@9175: pin2 = new ListGridField("toIcon", this.MESSAGES.to()); gernotbelger@9175: pin2.setType(ListGridFieldType.ICON); gernotbelger@9175: pin2.setWidth(30); gernotbelger@9175: pin2.setCellIcon(baseUrl + this.MESSAGES.markerRed()); andre@8449: } andre@8449: andre@8449: if (isDistance) { andre@8449: /* We have from / to fields */ gernotbelger@9175: pin1.addRecordClickHandler(new RecordClickHandler() { andre@8449: @Override gernotbelger@9175: public void onRecordClick(final RecordClickEvent e) { gernotbelger@9175: final Record r = e.getRecord(); gernotbelger@9175: if (!isLocationMode()) { andre@8449: /* distance panel and distance mode */ andre@8449: setFrom(r.getAttribute("from")); andre@8449: setTo(r.getAttribute("to")); andre@8449: } else { andre@8449: /* distance panel and location mode */ andre@8449: /* Pin 1 is the "from" pin */ andre@8449: appendLocation(r.getAttribute("from")); raimund@863: } raimund@235: } andre@8449: }); andre@8449: if (doublePins) { gernotbelger@9175: pin2.addRecordClickHandler(new RecordClickHandler() { andre@8449: @Override gernotbelger@9175: public void onRecordClick(final RecordClickEvent e) { gernotbelger@9175: final Record r = e.getRecord(); gernotbelger@9175: if (isLocationMode()) { andre@8449: appendLocation(r.getAttribute("to")); andre@8449: } else { gernotbelger@9175: /* gernotbelger@9175: * Distance and double pin behavior is only gernotbelger@9175: * defined for location mode. gernotbelger@9175: */ andre@8449: GWT.log("Unhandled input state."); andre@8449: } raimund@863: } andre@8449: }); andre@8449: } andre@8449: } else { andre@8449: /* We only have the from field */ gernotbelger@9175: pin1.addRecordClickHandler(new RecordClickHandler() { andre@8449: @Override gernotbelger@9175: public void onRecordClick(final RecordClickEvent e) { gernotbelger@9175: final Record r = e.getRecord(); gernotbelger@9175: if (!isLocationMode()) { andre@8449: /* Location panel and distance mode */ andre@8449: setFrom(r.getAttribute("from")); andre@8449: } else { andre@8449: /* Location panel and location mode */ andre@8449: appendLocation(r.getAttribute("from")); raimund@235: } andre@8449: } andre@8449: }); andre@8449: if (doublePins) { gernotbelger@9175: pin2.addRecordClickHandler(new RecordClickHandler() { andre@8449: @Override gernotbelger@9175: public void onRecordClick(final RecordClickEvent e) { gernotbelger@9175: final Record r = e.getRecord(); gernotbelger@9175: if (!isLocationMode()) { andre@8449: setTo(r.getAttribute("from")); andre@8449: } else { gernotbelger@9175: /* gernotbelger@9175: * Distance and double pin behavior is only gernotbelger@9175: * defined for location mode. gernotbelger@9175: */ andre@8449: GWT.log("Unhandled input state."); andre@8449: } raimund@235: } andre@8449: }); raimund@235: } andre@8449: } raimund@235: gernotbelger@9175: final ListGridField ddescr = new ListGridField("description", this.MESSAGES.description()); raimund@235: ddescr.setType(ListGridFieldType.TEXT); raimund@235: ddescr.setWidth("*"); andre@8449: andre@8449: ListGridField from; andre@8449: ListGridField to = null; andre@8449: andre@8449: if (isDistance) { gernotbelger@9175: from = new ListGridField("from", this.MESSAGES.from()); gernotbelger@9175: to = new ListGridField("to", this.MESSAGES.to()); andre@8449: to.setType(ListGridFieldType.FLOAT); andre@8449: to.setCellFormatter(cf); andre@8449: andre@8449: to.setWidth("12%"); andre@8449: to.setAlign(Alignment.LEFT); andre@8449: } else { gernotbelger@9175: from = new ListGridField("from", this.MESSAGES.locations()); andre@8449: } raimund@1390: from.setCellFormatter(cf); raimund@886: from.setWidth("12%"); raimund@906: gernotbelger@9175: final ListGridField dside = new ListGridField("riverside", this.MESSAGES.riverside()); raimund@235: dside.setType(ListGridFieldType.TEXT); raimund@886: dside.setWidth("12%"); raimund@235: gernotbelger@9175: final ListGridField bottom = new ListGridField("bottom", this.MESSAGES.bottom_edge()); sascha@568: bottom.setType(ListGridFieldType.TEXT); raimund@886: bottom.setWidth("10%"); raimund@1390: bottom.setCellFormatter(cf); sascha@568: gernotbelger@9175: final ListGridField top = new ListGridField("top", this.MESSAGES.top_edge()); sascha@568: top.setType(ListGridFieldType.TEXT); raimund@886: top.setWidth("10%"); raimund@1390: top.setCellFormatter(cf); sascha@568: andre@8449: if (doublePins && isDistance) { andre@8449: table.setFields(pin1, pin2, ddescr, from, to, dside, bottom, top); andre@8449: } else if (doublePins) { andre@8449: table.setFields(pin1, pin2, ddescr, from, dside, bottom, top); andre@8449: } else if (isDistance) { andre@8449: table.setFields(pin1, ddescr, from, to, dside, bottom, top); andre@8449: } else { andre@8449: table.setFields(pin1, ddescr, from, dside, bottom, top); andre@8449: } raimund@235: } raimund@235: christian@4131: @Override gernotbelger@9175: public Canvas createOld(final DataList dataList) { gernotbelger@9175: final List items = dataList.getAll(); ingo@53: gernotbelger@9175: final Data dMode = getData(items, "ld_mode"); gernotbelger@9175: final DataItem[] dItems = dMode.getItems(); ingo@516: ingo@516: boolean rangeMode = true; ingo@516: if (dItems != null && dItems[0] != null) { ingo@516: rangeMode = FIELD_VALUE_DISTANCE.equals(dItems[0].getStringValue()); ingo@516: } ingo@516: gernotbelger@9175: final HLayout layout = new HLayout(); ingo@516: layout.setWidth("400px"); ingo@516: gernotbelger@9175: final Label label = new Label(dataList.getLabel()); ingo@516: label.setWidth("200px"); ingo@516: gernotbelger@9175: final Canvas back = getBackButton(dataList.getState()); ingo@516: ingo@516: layout.addMember(label); ingo@516: ingo@516: if (rangeMode) { ingo@516: layout.addMember(getOldRangeSelection(dataList)); gernotbelger@9175: } else { ingo@516: layout.addMember(getOldLocationSelection(dataList)); ingo@516: } ingo@516: ingo@516: layout.addMember(back); ingo@516: ingo@516: return layout; ingo@516: } ingo@516: ingo@516: /** ingo@516: * Creates a label for the selected range. ingo@516: * gernotbelger@9175: * @param dataList gernotbelger@9175: * The DataList containing all values for this state. ingo@516: * ingo@516: * @return A label displaying the selected values. ingo@516: */ gernotbelger@9175: protected Label getOldRangeSelection(final DataList dataList) { gernotbelger@9175: final List items = dataList.getAll(); ingo@53: gernotbelger@9175: final Data dFrom = getData(items, "ld_from"); gernotbelger@9175: final Data dTo = getData(items, "ld_to"); gernotbelger@9175: final Data dStep = getData(items, "ld_step"); ingo@53: gernotbelger@9175: final DataItem[] from = dFrom.getItems(); gernotbelger@9175: final DataItem[] to = dTo.getItems(); gernotbelger@9175: final DataItem[] step = dStep.getItems(); gernotbelger@9175: gernotbelger@9175: final StringBuilder sb = new StringBuilder(); ingo@53: sb.append(from[0].getLabel()); gernotbelger@9175: sb.append(" " + this.MESSAGES.unitFrom() + " "); ingo@53: sb.append(to[0].getLabel()); gernotbelger@9175: sb.append(" " + this.MESSAGES.unitTo() + " "); ingo@53: sb.append(step[0].getLabel()); gernotbelger@9175: sb.append(" " + this.MESSAGES.unitWidth()); ingo@53: gernotbelger@9175: final Label selected = new Label(sb.toString()); raimund@91: selected.setWidth("130px"); raimund@91: ingo@516: return selected; ingo@516: } ingo@53: ingo@516: /** ingo@516: * Creates a label for the selected locations. ingo@516: * gernotbelger@9175: * @param dataList gernotbelger@9175: * The DataList containing all values for this state. ingo@516: * ingo@516: * @return A label displaying the selected values. ingo@516: */ gernotbelger@9175: protected Label getOldLocationSelection(final DataList dataList) { gernotbelger@9175: final List items = dataList.getAll(); ingo@516: gernotbelger@9175: final Data dLocations = getData(items, "ld_locations"); gernotbelger@9175: final DataItem[] lItems = dLocations.getItems(); gernotbelger@9175: gernotbelger@9175: final String[] splitted = lItems[0].getStringValue().split(" "); raimund@3542: String value = ""; gernotbelger@9175: for (final String element : splitted) { raimund@3542: try { gernotbelger@9175: final NumberFormat nf = NumberFormat.getDecimalFormat(); gernotbelger@9175: final double dv = Double.parseDouble(element); raimund@3542: value += nf.format(dv) + " "; raimund@3542: } gernotbelger@9175: catch (final NumberFormatException nfe) { gernotbelger@9175: value += element + " "; raimund@3542: } raimund@3542: } ingo@516: gernotbelger@9175: final Label selected = new Label(value); ingo@516: selected.setWidth(130); ingo@516: ingo@516: return selected; ingo@53: } ingo@53: ingo@53: /** ingo@55: * This method reads the default values defined in the DataItems of the Data ingo@55: * objects in list. ingo@55: * gernotbelger@9175: * @param list gernotbelger@9175: * The DataList container that stores the Data objects. ingo@55: */ gernotbelger@9175: protected void initDefaults(final DataList list) { gernotbelger@9175: final Data m = getData(list.getAll(), "ld_mode"); gernotbelger@9175: final Data l = getData(list.getAll(), "ld_locations"); gernotbelger@9175: final Data f = getData(list.getAll(), "ld_from"); gernotbelger@9175: final Data t = getData(list.getAll(), "ld_to"); gernotbelger@9175: final Data s = getData(list.getAll(), "ld_step"); ingo@55: gernotbelger@9175: final DataItem[] fItems = f.getItems(); gernotbelger@9175: final DataItem[] tItems = t.getItems(); gernotbelger@9175: final DataItem[] sItems = s.getItems(); ingo@516: gernotbelger@9175: this.min = Double.valueOf(fItems[0].getStringValue()); gernotbelger@9175: this.max = Double.valueOf(tItems[0].getStringValue()); gernotbelger@9175: this.step = Double.valueOf(sItems[0].getStringValue()); ingo@516: gernotbelger@9175: final DataItem mDef = m.getDefault(); gernotbelger@9175: final DataItem lDef = l.getDefault(); gernotbelger@9175: final DataItem fDef = f.getDefault(); gernotbelger@9175: final DataItem tDef = t.getDefault(); gernotbelger@9175: final DataItem sDef = s.getDefault(); ingo@516: gernotbelger@9175: final String mDefValue = mDef != null ? mDef.getStringValue() : null; gernotbelger@9175: final String theMode = mDefValue != null && mDefValue.length() > 0 ? mDef.getStringValue() : FIELD_VALUE_DISTANCE; gernotbelger@9175: gernotbelger@9175: this.mode.setValue(FIELD_MODE, theMode); gernotbelger@9175: gernotbelger@9175: final String fDefValue = fDef != null ? fDef.getStringValue() : null; gernotbelger@9175: setFrom(fDefValue != null && fDefValue.length() > 0 ? Double.valueOf(fDef.getStringValue()) : this.min); gernotbelger@9175: gernotbelger@9175: final String tDefValue = tDef != null ? tDef.getStringValue() : null; gernotbelger@9175: setTo(tDefValue != null && tDefValue.length() > 0 ? Double.valueOf(tDef.getStringValue()) : this.max); gernotbelger@9175: gernotbelger@9175: final String sDefValue = sDef != null ? sDef.getStringValue() : null; gernotbelger@9175: setStep(sDefValue != null && sDefValue.length() > 0 ? Double.valueOf(sDef.getStringValue()) : this.step); ingo@516: ingo@516: if (lDef != null) { gernotbelger@9175: final String lDefValue = lDef != null ? lDef.getStringValue() : null; ingo@517: ingo@517: if (lDefValue != null && lDefValue.length() > 0) { ingo@517: setLocationValues(lDef.getStringValue()); ingo@517: } ingo@53: } ingo@53: ingo@516: if (theMode.equals(FIELD_VALUE_DISTANCE)) { andre@8448: enableDistanceMode(); gernotbelger@9175: this.inputTables.selectTab(1); andre@8449: } else { andre@8449: enableLocationMode(); ingo@516: } gernotbelger@9175: this.currentFiltered = (ListGrid) this.inputTables.getSelectedTab().getPane(); andre@8446: gernotbelger@9175: this.distancePanel.setValues(getFrom(), getTo(), getStep()); ingo@53: } ingo@53: gernotbelger@9175: protected Canvas createWidget(final DataList data) { gernotbelger@9175: final VLayout layout = new VLayout(); gernotbelger@9175: this.container = new HLayout(); gernotbelger@9175: final Canvas checkboxPanel = createRadioButtonPanel(); ingo@45: gernotbelger@9175: this.locationPanel = new DoubleArrayPanel(this.MESSAGES.unitLocation(), getLocationValues(), this); andre@8446: gernotbelger@9175: this.distancePanel = new DoubleRangePanel(this.MESSAGES.unitFrom(), this.MESSAGES.unitTo(), this.MESSAGES.unitWidth(), 0, 0, 0, /* gernotbelger@9175: * initDefaults set the gernotbelger@9175: * default values for gernotbelger@9175: * this. gernotbelger@9175: */ gernotbelger@9175: 400, this); rrenkert@8262: gernotbelger@9175: this.container.addMember(this.locationPanel); gernotbelger@9175: this.container.addMember(this.distancePanel); gernotbelger@9175: this.container.hideMember(this.locationPanel); ingo@45: ingo@41: layout.addMember(checkboxPanel); gernotbelger@9175: layout.addMember(this.container); raimund@235: gernotbelger@9175: this.container.setMembersMargin(30); gernotbelger@9175: gernotbelger@9175: this.inputTables = new TabSet(); gernotbelger@9175: this.inputTables.addTabSelectedHandler(new TabSelectedHandler() { christian@4131: @Override gernotbelger@9175: public void onTabSelected(final TabSelectedEvent evt) { gernotbelger@9175: LocationDistancePanel.this.filterDescription.clear(); gernotbelger@9175: LocationDistancePanel.this.filterRange.clear(); gernotbelger@9175: LocationDistancePanel.this.filterResultCount.setValue(""); raimund@1567: andre@8448: // The assumption is that location is tab 0 and distance tab 1 andre@8448: gernotbelger@9175: final Canvas c = evt.getTabPane(); gernotbelger@9175: if (c instanceof ListGrid) { gernotbelger@9175: LocationDistancePanel.this.currentFiltered = (ListGrid) c; raimund@1567: } raimund@893: } raimund@893: }); raimund@893: gernotbelger@9175: final Tab locations = new Tab(this.MESSAGES.locations()); gernotbelger@9175: final Tab distances = new Tab(this.MESSAGES.distance()); raimund@1534: gernotbelger@9175: this.inputTables.setWidth100(); gernotbelger@9175: this.inputTables.setHeight100(); raimund@1534: gernotbelger@9175: locations.setPane(this.locationsTable); gernotbelger@9175: distances.setPane(this.distanceTable); gernotbelger@9175: gernotbelger@9175: this.inputTables.addTab(locations); gernotbelger@9175: this.inputTables.addTab(distances); gernotbelger@9175: gernotbelger@9175: this.filterResultCount = new StaticTextItem(this.MESSAGES.resultCount()); gernotbelger@9175: this.filterResultCount.setTitleAlign(Alignment.LEFT); gernotbelger@9175: this.filterResultCount.setTitleStyle("color: #000"); gernotbelger@9175: gernotbelger@9175: this.filterDescription = new TableFilter(); gernotbelger@9175: this.filterDescription.setHeight("30px"); gernotbelger@9175: this.filterDescription.addFilterHandler(this); gernotbelger@9175: gernotbelger@9175: this.filterRange = new RangeTableFilter(); gernotbelger@9175: this.filterRange.setHeight("30px"); gernotbelger@9175: this.filterRange.addFilterHandler(this); gernotbelger@9175: this.filterRange.setVisible(false); gernotbelger@9175: gernotbelger@9175: this.filterCriteria = new SelectItem(); gernotbelger@9175: this.filterCriteria.setShowTitle(false); gernotbelger@9175: this.filterCriteria.setWidth(100); gernotbelger@9175: this.filterCriteria.addChangedHandler(new ChangedHandler() { christian@4131: @Override gernotbelger@9175: public void onChanged(final ChangedEvent e) { gernotbelger@9175: if (e.getValue().toString().equals("range")) { gernotbelger@9175: LocationDistancePanel.this.filterRange.setVisible(true); gernotbelger@9175: LocationDistancePanel.this.filterDescription.setVisible(false); gernotbelger@9175: LocationDistancePanel.this.filterDescription.clear(); gernotbelger@9175: LocationDistancePanel.this.filterResultCount.setValue(""); gernotbelger@9175: } else { gernotbelger@9175: LocationDistancePanel.this.filterRange.setVisible(false); gernotbelger@9175: LocationDistancePanel.this.filterRange.clear(); gernotbelger@9175: LocationDistancePanel.this.filterDescription.setVisible(true); gernotbelger@9175: LocationDistancePanel.this.filterResultCount.setValue(""); raimund@1534: } raimund@1534: } raimund@1534: }); raimund@1534: gernotbelger@9175: final LinkedHashMap filterMap = new LinkedHashMap(); gernotbelger@9175: filterMap.put("description", this.MESSAGES.description()); gernotbelger@9175: filterMap.put("range", this.MESSAGES.range()); gernotbelger@9175: this.filterCriteria.setValueMap(filterMap); gernotbelger@9175: this.filterCriteria.setValue("description"); raimund@1534: gernotbelger@9175: final DynamicForm form = new DynamicForm(); gernotbelger@9175: form.setFields(this.filterCriteria); gernotbelger@9175: this.inputTables.setHeight("*"); gernotbelger@9175: final DynamicForm form2 = new DynamicForm(); gernotbelger@9175: form2.setFields(this.filterResultCount); raimund@863: gernotbelger@9175: final VLayout helper = new VLayout(); gernotbelger@9175: final HLayout filterLayout = new HLayout(); raimund@1534: raimund@1534: filterLayout.addMember(form); gernotbelger@9175: filterLayout.addMember(this.filterDescription); gernotbelger@9175: filterLayout.addMember(this.filterRange); raimund@1567: filterLayout.setHeight("30px"); gernotbelger@9175: helper.addMember(this.inputTables); raimund@1534: helper.addMember(filterLayout); raimund@1567: helper.addMember(form2); raimund@863: helper.setHeight100(); raimund@863: helper.setWidth100(); raimund@863: gernotbelger@9175: this.helperContainer.addMember(helper); raimund@1534: filterLayout.setWidth("200"); ingo@41: ingo@41: return layout; ingo@41: } ingo@41: christian@4131: @Override gernotbelger@9175: public void onFilterCriteriaChanged(final StringFilterEvent event) { gernotbelger@9175: final String search = event.getFilter(); raimund@863: raimund@863: if (search != null && search.length() > 0) { gernotbelger@9175: final Criteria c = new Criteria("description", search); raimund@863: gernotbelger@9175: this.locationsTable.filterData(c); gernotbelger@9175: this.distanceTable.filterData(c); gernotbelger@9175: this.filterResultCount.setValue(this.currentFiltered.getRecords().length); gernotbelger@9175: } else { gernotbelger@9175: this.locationsTable.clearCriteria(); gernotbelger@9175: this.distanceTable.clearCriteria(); gernotbelger@9175: this.filterResultCount.setValue(""); raimund@863: } raimund@863: } raimund@863: christian@4131: @Override gernotbelger@9175: public void onFilterCriteriaChanged(final RangeFilterEvent event) { gernotbelger@9175: final Float from = event.getFrom() - 0.001f; gernotbelger@9175: final Float to = event.getTo() + 0.001f; raimund@1536: GWT.log("filtering range: " + from + " to " + to); raimund@1536: raimund@1536: Criterion combinedFilter = null; raimund@1536: Criterion locationFilter = null; raimund@1536: if (from.equals(Float.NaN) && to.equals(Float.NaN)) { gernotbelger@9175: this.locationsTable.clearCriteria(); gernotbelger@9175: this.distanceTable.clearCriteria(); gernotbelger@9175: this.filterResultCount.setValue(""); raimund@1567: return; gernotbelger@9175: } else if (from.equals(Float.NaN)) { raimund@1536: combinedFilter = new Criterion("to", OperatorId.LESS_OR_EQUAL, to); gernotbelger@9175: locationFilter = new Criterion("from", OperatorId.LESS_OR_EQUAL, to); gernotbelger@9175: this.locationsTable.filterData(locationFilter); gernotbelger@9175: this.distanceTable.filterData(combinedFilter); gernotbelger@9175: this.filterResultCount.setValue(this.currentFiltered.getRecords().length); raimund@1536: return; gernotbelger@9175: } else if (to.equals(Float.NaN)) { gernotbelger@9175: combinedFilter = new Criterion("from", OperatorId.GREATER_OR_EQUAL, from); gernotbelger@9175: this.locationsTable.filterData(combinedFilter); gernotbelger@9175: this.distanceTable.filterData(combinedFilter); gernotbelger@9175: } else { gernotbelger@9175: final AdvancedCriteria c1 = new AdvancedCriteria(OperatorId.AND, gernotbelger@9175: new Criterion[] { new Criterion("from", OperatorId.GREATER_OR_EQUAL, from), new Criterion("from", OperatorId.LESS_OR_EQUAL, to) }); gernotbelger@9175: gernotbelger@9175: final AdvancedCriteria c2 = new AdvancedCriteria(OperatorId.AND, gernotbelger@9175: new Criterion[] { new Criterion("to", OperatorId.GREATER_OR_EQUAL, from), new Criterion("to", OperatorId.LESS_OR_EQUAL, to) }); gernotbelger@9175: gernotbelger@9175: final AdvancedCriteria c3 = new AdvancedCriteria(OperatorId.AND, gernotbelger@9175: new Criterion[] { new Criterion("from", OperatorId.LESS_OR_EQUAL, to), new Criterion("to", OperatorId.GREATER_OR_EQUAL, from) }); gernotbelger@9175: gernotbelger@9175: combinedFilter = new AdvancedCriteria(OperatorId.OR, new Criterion[] { c1, c2, c3 }); raimund@1536: } gernotbelger@9175: this.locationsTable.filterData(combinedFilter); gernotbelger@9175: this.distanceTable.filterData(combinedFilter); gernotbelger@9175: this.filterResultCount.setValue(this.currentFiltered.getRecords().length); raimund@1534: } raimund@863: ingo@562: @Override ingo@562: public List validate() { ingo@562: if (isLocationMode()) { ingo@562: return validateLocations(); gernotbelger@9175: } else { ingo@562: return validateRange(); ingo@562: } ingo@562: } ingo@562: ingo@562: protected List validateLocations() { gernotbelger@9175: final List errors = new ArrayList(); gernotbelger@9175: final NumberFormat nf = NumberFormat.getDecimalFormat(); ingo@562: ingo@562: try { gernotbelger@9175: saveLocationValues(this.locationPanel); ingo@562: } gernotbelger@9175: catch (final Exception e) { gernotbelger@9175: errors.add(this.MESSAGES.wrongFormat()); ingo@562: } ingo@562: gernotbelger@9175: final double[] values = getLocationValues(); gernotbelger@9175: final double[] good = new double[values.length]; gernotbelger@9175: int idx = 0; ingo@562: gernotbelger@9175: for (final double value : values) { gernotbelger@9175: if (value < this.min || value > this.max) { gernotbelger@9175: String tmp = this.MESSAGES.error_validate_range(); ingo@562: tmp = tmp.replace("$1", nf.format(value)); gernotbelger@9175: tmp = tmp.replace("$2", nf.format(this.min)); gernotbelger@9175: tmp = tmp.replace("$3", nf.format(this.max)); ingo@562: errors.add(tmp); gernotbelger@9175: } else { ingo@562: good[idx++] = value; ingo@562: } ingo@562: } ingo@562: gernotbelger@9175: final double[] justGood = new double[idx]; ingo@562: for (int i = 0; i < justGood.length; i++) { ingo@562: justGood[i] = good[i]; ingo@562: } ingo@562: ingo@562: if (!errors.isEmpty()) { gernotbelger@9175: this.locationPanel.setValues(justGood); ingo@562: } ingo@562: ingo@562: return errors; ingo@562: } ingo@562: ingo@562: protected List validateRange() { gernotbelger@9175: final List errors = new ArrayList(); gernotbelger@9175: final NumberFormat nf = NumberFormat.getDecimalFormat(); ingo@562: ingo@562: try { gernotbelger@9175: saveDistanceValues(this.distancePanel); ingo@562: } gernotbelger@9175: catch (final Exception e) { gernotbelger@9175: errors.add(this.MESSAGES.wrongFormat()); ingo@562: } ingo@562: ingo@562: double from = getFrom(); gernotbelger@9175: double to = getTo(); gernotbelger@9175: final double step = getStep(); ingo@562: gernotbelger@9175: if (from < this.min || from > this.max) { gernotbelger@9175: String tmp = this.MESSAGES.error_validate_range(); ingo@562: tmp = tmp.replace("$1", nf.format(from)); gernotbelger@9175: tmp = tmp.replace("$2", nf.format(this.min)); gernotbelger@9175: tmp = tmp.replace("$3", nf.format(this.max)); ingo@562: errors.add(tmp); gernotbelger@9175: from = this.min; ingo@562: } ingo@562: gernotbelger@9175: if (to < this.min || to > this.max) { gernotbelger@9175: String tmp = this.MESSAGES.error_validate_range(); ingo@562: tmp = tmp.replace("$1", nf.format(to)); gernotbelger@9175: tmp = tmp.replace("$2", nf.format(this.min)); gernotbelger@9175: tmp = tmp.replace("$3", nf.format(this.max)); ingo@562: errors.add(tmp); gernotbelger@9175: to = this.max; ingo@562: } ingo@562: ingo@562: if (!errors.isEmpty()) { gernotbelger@9175: this.distancePanel.setValues(from, to, step); ingo@562: } ingo@562: ingo@562: return errors; ingo@562: } ingo@562: ingo@41: /** ingo@41: * This method returns the selected data. ingo@41: * ingo@41: * @return the selected/inserted data. ingo@41: */ christian@4131: @Override ingo@41: public Data[] getData() { gernotbelger@9175: final List data = new ArrayList(); ingo@1277: christian@4131: // 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 (isLocationMode()) { gernotbelger@9175: final Canvas member = this.container.getMember(0); ingo@59: if (member instanceof DoubleArrayPanel) { gernotbelger@9175: final DoubleArrayPanel form = (DoubleArrayPanel) member; ingo@59: saveLocationValues(form); ingo@59: } ingo@1277: gernotbelger@9175: final Data dLocations = getDataLocations(); gernotbelger@9175: final DataItem dFrom = new DefaultDataItem("ld_from", "ld_from", ""); gernotbelger@9175: final DataItem dTo = new DefaultDataItem("ld_to", "ld_to", ""); gernotbelger@9175: final DataItem dStep = new DefaultDataItem("ld_step", "ld_step", ""); ingo@1277: ingo@1277: data.add(dLocations); gernotbelger@9175: data.add(new DefaultData("ld_from", null, null, new DataItem[] { dFrom })); gernotbelger@9175: data.add(new DefaultData("ld_to", null, null, new DataItem[] { dTo })); gernotbelger@9175: data.add(new DefaultData("ld_step", null, null, new DataItem[] { dStep })); gernotbelger@9175: } else { gernotbelger@9175: final Canvas member = this.container.getMember(0); ingo@59: if (member instanceof DoubleRangePanel) { gernotbelger@9175: final DoubleRangePanel form = (DoubleRangePanel) member; ingo@59: saveDistanceValues(form); ingo@59: } ingo@59: gernotbelger@9175: final Data dFrom = getDataFrom(); gernotbelger@9175: final Data dTo = getDataTo(); gernotbelger@9175: final Data dStep = getDataStep(); gernotbelger@9175: final DataItem loc = new DefaultDataItem("ld_locations", "ld_locations", ""); ingo@520: ingo@1277: data.add(dFrom); ingo@1277: data.add(dTo); ingo@1277: data.add(dStep); gernotbelger@9175: data.add(new DefaultData("ld_locations", null, null, new DataItem[] { loc })); ingo@520: } ingo@520: gernotbelger@9175: final Data dMode = getDataMode(); ingo@1277: if (dMode != null) { ingo@1277: data.add(dMode); ingo@520: } ingo@520: sascha@3379: return data.toArray(new Data[data.size()]); ingo@516: } ingo@516: ingo@516: /** ingo@516: * Returns the Data object for the 'mode' attribute. ingo@516: * ingo@516: * @return the Data object for the 'mode' attribute. ingo@516: */ ingo@516: protected Data getDataMode() { gernotbelger@9175: final String value = this.mode.getValueAsString(FIELD_MODE); gernotbelger@9175: final DataItem item = new DefaultDataItem("ld_mode", "ld_mode", value); ingo@516: return new DefaultData("ld_mode", null, null, new DataItem[] { item }); ingo@516: } ingo@516: ingo@516: protected Data getDataLocations() { gernotbelger@9175: final double[] locations = getLocationValues(); gernotbelger@9175: boolean first = true; ingo@516: ingo@520: if (locations == null) { ingo@520: return null; ingo@520: } ingo@520: gernotbelger@9175: final StringBuilder sb = new StringBuilder(); ingo@516: gernotbelger@9175: for (final double l : locations) { ingo@516: if (!first) { ingo@516: sb.append(" "); ingo@516: } ingo@516: ingo@516: sb.append(l); ingo@516: ingo@516: first = false; ingo@516: } ingo@516: gernotbelger@9175: final DataItem item = new DefaultDataItem("ld_locations", "ld_locations", sb.toString()); ingo@516: gernotbelger@9175: return new DefaultData("ld_locations", null, null, new DataItem[] { item }); ingo@46: } ingo@41: ingo@46: /** ingo@46: * Returns the Data object for the 'from' attribute. ingo@46: * ingo@46: * @return the Data object for the 'from' attribute. ingo@46: */ ingo@46: protected Data getDataFrom() { gernotbelger@9175: final String value = Double.valueOf(getFrom()).toString(); gernotbelger@9175: final DataItem item = new DefaultDataItem("ld_from", "ld_from", value); gernotbelger@9175: return new DefaultData("ld_from", null, null, new DataItem[] { item }); ingo@46: } ingo@46: ingo@46: /** ingo@46: * Returns the Data object for the 'to' attribute. ingo@46: * ingo@46: * @return the Data object for the 'to' attribute. ingo@46: */ ingo@46: protected Data getDataTo() { gernotbelger@9175: final String value = Double.valueOf(getTo()).toString(); gernotbelger@9175: final DataItem item = new DefaultDataItem("ld_to", "ld_to", value); gernotbelger@9175: return new DefaultData("ld_to", null, null, new DataItem[] { item }); ingo@46: } ingo@46: ingo@46: /** ingo@46: * Returns the Data object for the 'step' attribute. ingo@46: * ingo@46: * @return the Data object for the 'step' attribute. ingo@46: */ ingo@46: protected Data getDataStep() { gernotbelger@9175: final String value = Double.valueOf(getStep()).toString(); gernotbelger@9175: final DataItem item = new DefaultDataItem("ld_step", "ld_step", value); gernotbelger@9175: return new DefaultData("ld_step", null, null, new DataItem[] { item }); ingo@46: } ingo@46: ingo@46: /** ingo@46: * Determines the current input mode. ingo@46: * ingo@46: * @return true, if 'location' is the current input mode, otherwise false. ingo@46: */ ingo@46: public boolean isLocationMode() { gernotbelger@9175: final String inputMode = this.mode.getValueAsString(FIELD_MODE); ingo@46: ingo@516: return inputMode.equals(FIELD_VALUE_LOCATION) ? true : false; ingo@516: } ingo@516: ingo@516: /** ingo@516: * Activates the location panel. ingo@516: */ andre@8448: protected void enableLocationMode() { gernotbelger@9175: this.mode.setValue(FIELD_MODE, FIELD_VALUE_LOCATION); gernotbelger@9175: this.container.hideMember(this.distancePanel); gernotbelger@9175: this.container.showMember(this.locationPanel); gernotbelger@9175: setupDistanceInfoTable(this.locationsTable, false, false); gernotbelger@9175: setupDistanceInfoTable(this.distanceTable, true, true); gernotbelger@9175: this.inputTables.updateTab(0, this.locationsTable); gernotbelger@9175: this.inputTables.updateTab(1, this.distanceTable); ingo@516: } ingo@516: ingo@516: /** ingo@516: * Activates the distance panel. ingo@516: */ andre@8448: protected void enableDistanceMode() { gernotbelger@9175: this.mode.setValue(FIELD_MODE, FIELD_VALUE_DISTANCE); gernotbelger@9175: this.container.hideMember(this.locationPanel); gernotbelger@9175: this.container.showMember(this.distancePanel); gernotbelger@9175: setupDistanceInfoTable(this.locationsTable, true, false); gernotbelger@9175: setupDistanceInfoTable(this.distanceTable, false, true); gernotbelger@9175: this.inputTables.updateTab(0, this.locationsTable); gernotbelger@9175: this.inputTables.updateTab(1, this.distanceTable); ingo@41: } ingo@41: ingo@41: /** ingo@41: * This method switches the input mode between location and distance input. ingo@41: * gernotbelger@9175: * @param event gernotbelger@9175: * The click event fired by a RadioButtonGroupItem. ingo@41: */ christian@4131: @Override gernotbelger@9175: public void onChange(final ChangeEvent event) { gernotbelger@9175: final String value = (String) event.getValue(); ingo@41: ingo@41: if (value == null) { ingo@41: return; ingo@41: } ingo@516: if (value.equals(FIELD_VALUE_LOCATION)) { andre@8448: enableLocationMode(); gernotbelger@9175: this.filterDescription.clear(); gernotbelger@9175: this.filterRange.clear(); gernotbelger@9175: this.filterResultCount.setValue(""); raimund@1567: raimund@863: // Bring this tab to front. gernotbelger@9175: this.inputTables.selectTab(0); gernotbelger@9175: } else { andre@8448: enableDistanceMode(); gernotbelger@9175: this.filterDescription.clear(); gernotbelger@9175: this.filterRange.clear(); gernotbelger@9175: this.filterResultCount.setValue(""); raimund@1567: raimund@863: // Bring the distanceTable tab to front. gernotbelger@9175: this.inputTables.selectTab(1); ingo@41: } ingo@41: } ingo@41: ingo@41: /** ingo@41: * This method is used to validate the inserted data in the form fields. ingo@41: * gernotbelger@9175: * @param event gernotbelger@9175: * The BlurEvent that gives information about the FormItem that gernotbelger@9175: * has been modified and its value. ingo@41: */ christian@4131: @Override gernotbelger@9175: public void onBlur(final BlurEvent event) { gernotbelger@9175: final FormItem item = event.getItem(); gernotbelger@9175: final String field = item.getFieldName(); ingo@41: ingo@41: if (field == null) { ingo@41: return; ingo@41: } ingo@41: ingo@43: if (field.equals(DoubleArrayPanel.FIELD_NAME)) { gernotbelger@9175: final DoubleArrayPanel p = (DoubleArrayPanel) event.getForm(); ingo@41: ingo@59: saveLocationValue(p, item); gernotbelger@9175: } else { gernotbelger@9175: final DoubleRangePanel p = (DoubleRangePanel) event.getForm(); ingo@41: ingo@59: saveDistanceValue(p, item); ingo@59: } ingo@59: } ingo@59: ingo@59: /** ingo@59: * Validates and stores all values entered in the location mode. ingo@59: * gernotbelger@9175: * @param p gernotbelger@9175: * The DoubleArrayPanel. ingo@59: */ gernotbelger@9175: protected void saveLocationValues(final DoubleArrayPanel p) { gernotbelger@9175: final FormItem[] formItems = p.getFields(); ingo@59: gernotbelger@9175: for (final FormItem item : formItems) { ingo@59: if (item.getFieldName().equals(DoubleArrayPanel.FIELD_NAME)) { ingo@59: saveLocationValue(p, item); ingo@43: } ingo@41: } ingo@41: } ingo@41: ingo@41: /** ingo@59: * Validates and stores all values entered in the distance mode. ingo@59: * gernotbelger@9175: * @param p gernotbelger@9175: * The DoubleRangePanel. ingo@59: */ gernotbelger@9175: protected void saveDistanceValues(final DoubleRangePanel p) { gernotbelger@9175: final FormItem[] formItems = p.getFields(); ingo@59: gernotbelger@9175: for (final FormItem item : formItems) { ingo@59: saveDistanceValue(p, item); ingo@59: } ingo@59: } ingo@59: ingo@59: /** ingo@59: * Validates and stores a value entered in the location mode. ingo@59: * gernotbelger@9175: * @param p gernotbelger@9175: * The DoubleArrayPanel. gernotbelger@9175: * @param item gernotbelger@9175: * The item that needs to be validated. ingo@59: */ gernotbelger@9175: protected void saveLocationValue(final DoubleArrayPanel p, final FormItem item) { ingo@59: if (p.validateForm(item)) { ingo@59: setLocationValues(p.getInputValues(item)); ingo@59: } ingo@59: } ingo@59: ingo@59: /** ingo@59: * Validates and stores value entered in the distance mode. ingo@59: * gernotbelger@9175: * @param p gernotbelger@9175: * The DoubleRangePanel. gernotbelger@9175: * @param item gernotbelger@9175: * The item that needs to be validated. ingo@59: */ gernotbelger@9175: protected void saveDistanceValue(final DoubleRangePanel p, final FormItem item) { ingo@59: if (p.validateForm(item)) { ingo@59: setFrom(p.getFrom()); ingo@59: setTo(p.getTo()); ingo@59: setStep(p.getStep()); ingo@59: } ingo@59: } ingo@59: ingo@59: /** ingo@41: * This method creates the panel that contains the checkboxes to switch ingo@41: * between the input mode 'location' and 'distance'. ingo@41: * ingo@41: * @return the checkbox panel. ingo@41: */ ingo@41: protected Canvas createRadioButtonPanel() { gernotbelger@9175: this.mode = new DynamicForm(); ingo@41: gernotbelger@9175: final RadioGroupItem radio = new RadioGroupItem(FIELD_MODE); ingo@41: radio.setShowTitle(false); ingo@41: radio.setVertical(false); raimund@1394: radio.setWrap(false); ingo@41: gernotbelger@9175: final LinkedHashMap values = new LinkedHashMap(); gernotbelger@9175: values.put(FIELD_VALUE_LOCATION, this.MESSAGES.location()); gernotbelger@9175: values.put(FIELD_VALUE_DISTANCE, this.MESSAGES.distance()); ingo@43: gernotbelger@9175: final LinkedHashMap initial = new LinkedHashMap(); ingo@588: initial.put(FIELD_MODE, FIELD_VALUE_DISTANCE); ingo@45: ingo@43: radio.setValueMap(values); ingo@41: radio.addChangeHandler(this); ingo@41: gernotbelger@9175: this.mode.setFields(radio); gernotbelger@9175: this.mode.setValues(initial); ingo@41: gernotbelger@9175: return this.mode; ingo@41: } ingo@41: raimund@235: protected void createDistanceInputPanel() { gernotbelger@9175: final Config config = Config.getInstance(); gernotbelger@9175: final String url = config.getServerUrl(); gernotbelger@9175: String river = ""; raimund@235: gernotbelger@9175: final ArtifactDescription adescr = this.artifact.getArtifactDescription(); gernotbelger@9175: final DataList[] data = adescr.getOldData(); raimund@235: raimund@235: if (data != null && data.length > 0) { gernotbelger@9175: for (final DataList dl : data) { raimund@3526: if (dl.getState().endsWith("river")) { raimund@235: for (int j = 0; j < dl.size(); j++) { gernotbelger@9175: final Data d = dl.get(j); gernotbelger@9175: final DataItem[] di = d.getItems(); raimund@235: if (di != null && di.length == 1) { gernotbelger@9175: river = d.getItems()[0].getStringValue(); raimund@235: } raimund@235: } raimund@235: } raimund@235: } raimund@235: } raimund@235: gernotbelger@9175: this.distanceTable.setDataSource(new DistanceInfoDataSource(url, river, "distances")); gernotbelger@9175: this.locationsTable.setDataSource(new DistanceInfoDataSource(url, river, "locations")); raimund@235: } raimund@235: ingo@43: protected double getFrom() { gernotbelger@9175: return this.from; ingo@41: } ingo@41: gernotbelger@9175: protected void setTo(final String to) { gernotbelger@9175: try { gernotbelger@9175: final double toValue = Double.parseDouble(to); andre@8449: setTo(toValue); andre@8449: } gernotbelger@9175: catch (final NumberFormatException nfe) { andre@8449: // Is there anything to do? andre@8449: } andre@8449: } ingo@41: gernotbelger@9175: protected void setFrom(final String from) { gernotbelger@9175: try { gernotbelger@9175: final double fromValue = Double.parseDouble(from); gernotbelger@9175: setFrom(fromValue); gernotbelger@9175: } gernotbelger@9175: catch (final NumberFormatException nfe) { gernotbelger@9175: // Is there anything to do? gernotbelger@9175: } ingo@43: } ingo@41: gernotbelger@9175: protected void setFrom(final double from) { gernotbelger@9175: this.from = from; gernotbelger@9175: /* The doubling should be removed and this.from abolished */ gernotbelger@9175: this.distancePanel.setFrom(from); ingo@43: } ingo@41: gernotbelger@9175: protected double getTo() { gernotbelger@9175: return this.to; gernotbelger@9175: } gernotbelger@9175: gernotbelger@9175: protected void setTo(final double to) { gernotbelger@9175: this.to = to; gernotbelger@9175: /* The doubling should be removed and this.to abolished */ gernotbelger@9175: this.distancePanel.setTo(to); gernotbelger@9175: } ingo@43: ingo@43: protected double getStep() { gernotbelger@9175: return this.step; ingo@43: } ingo@43: gernotbelger@9175: protected void setStep(final double step) { ingo@43: this.step = step; ingo@43: } ingo@43: ingo@43: protected double[] getLocationValues() { gernotbelger@9175: return this.values; ingo@43: } ingo@43: gernotbelger@9175: protected void appendLocation(final String loc) { andre@8449: double[] selected; andre@8449: if (getLocationValues() != null) { gernotbelger@9175: final double[] val = getLocationValues(); andre@8449: selected = new double[val.length + 1]; gernotbelger@9175: for (int i = 0; i < val.length; i++) { andre@8449: selected[i] = val[i]; andre@8449: } andre@8449: try { andre@8449: selected[val.length] = Double.parseDouble(loc); andre@8449: } gernotbelger@9175: catch (final NumberFormatException nfe) { andre@8449: // Is there anything to do here? andre@8449: } gernotbelger@9175: } else { andre@8449: selected = new double[1]; andre@8449: selected[0] = Double.parseDouble(loc); andre@8449: } andre@8449: setLocationValues(selected); andre@8449: } ingo@43: gernotbelger@9175: protected void setLocationValues(final double[] values) { ingo@43: this.values = values; gernotbelger@9175: this.locationPanel.setValues(values); raimund@235: } raimund@235: gernotbelger@9175: protected void setLocationValues(final String values) { gernotbelger@9175: final String[] vs = values.split(" "); ingo@516: ingo@516: if (vs == null) { ingo@516: return; ingo@516: } ingo@516: gernotbelger@9175: final double[] ds = new double[vs.length]; gernotbelger@9175: int idx = 0; ingo@516: gernotbelger@9175: for (final String s : vs) { ingo@516: try { ingo@516: ds[idx++] = Double.valueOf(s); ingo@516: } gernotbelger@9175: catch (final NumberFormatException nfe) { ingo@516: // do nothing ingo@516: } ingo@516: } ingo@516: ingo@516: setLocationValues(ds); ingo@516: } ingo@516: gernotbelger@9175: protected void setDistanceValues(final double from, final double to) { raimund@235: setFrom(from); raimund@235: setTo(to); gernotbelger@9175: this.distancePanel.setValues(from, to, getStep()); ingo@41: } ingo@41: } ingo@41: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :