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: ingo@41: import com.google.gwt.core.client.GWT; ingo@562: import com.google.gwt.i18n.client.NumberFormat; ingo@41: 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; christian@4131: import com.smartgwt.client.widgets.grid.events.CellClickEvent; christian@4131: import com.smartgwt.client.widgets.grid.events.CellClickHandler; 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: teichmann@5835: import org.dive4elements.river.client.client.Config; teichmann@5835: import org.dive4elements.river.client.client.FLYSConstants; teichmann@5835: import org.dive4elements.river.client.client.event.FilterHandler; teichmann@5835: import org.dive4elements.river.client.client.event.RangeFilterEvent; teichmann@5835: import org.dive4elements.river.client.client.event.StringFilterEvent; teichmann@5835: import org.dive4elements.river.client.client.services.DistanceInfoService; teichmann@5835: import org.dive4elements.river.client.client.services.DistanceInfoServiceAsync; teichmann@5835: import org.dive4elements.river.client.client.ui.range.DistanceInfoDataSource; teichmann@5835: import org.dive4elements.river.client.shared.model.ArtifactDescription; teichmann@5835: import org.dive4elements.river.client.shared.model.Data; teichmann@5835: import org.dive4elements.river.client.shared.model.DataItem; teichmann@5835: import org.dive4elements.river.client.shared.model.DataList; teichmann@5835: import org.dive4elements.river.client.shared.model.DefaultData; teichmann@5835: import org.dive4elements.river.client.shared.model.DefaultDataItem; teichmann@5835: import org.dive4elements.river.client.shared.model.DistanceInfoObject; raimund@235: christian@4131: import java.util.ArrayList; christian@4131: import java.util.LinkedHashMap; christian@4131: import java.util.List; ingo@41: ingo@41: ingo@41: /** ingo@41: * This UIProvider creates a widget to enter locations or a distance. ingo@41: * ingo@41: * @author Ingo Weinzierl ingo@41: */ ingo@41: public class LocationDistancePanel ingo@41: extends AbstractUIProvider raimund@863: implements ChangeHandler, BlurHandler, FilterHandler ingo@41: { 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. */ raimund@235: protected DistanceInfoServiceAsync distanceInfoService = raimund@235: GWT.create(DistanceInfoService.class); ingo@41: ingo@516: public static final String FIELD_MODE = "mode"; ingo@43: ingo@41: /** 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: ingo@41: /** 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: ingo@516: /** The constant name of the input field to enter locations.*/ ingo@516: public static final String FIELD_VALUE_LOCATION = "location"; ingo@516: ingo@516: /** The constant name of the input field to enter distance.*/ ingo@516: public static final String FIELD_VALUE_DISTANCE = "distance"; ingo@516: ingo@41: /** The constant name of the input field to enter the step width of a ingo@41: * distance.*/ ingo@41: public static final String FIELD_WIDTH = "width"; ingo@41: ingo@53: public static final int WIDTH = 250; ingo@53: ingo@41: ingo@41: /** The radio group for input mode selection.*/ ingo@43: protected DynamicForm mode; ingo@41: ingo@41: /** A container that will contain the location or the distance panel.*/ ingo@41: protected HLayout container; ingo@41: ingo@55: /** The min value for a distance.*/ ingo@55: protected double min; ingo@55: ingo@55: /** The max value for a distance.*/ ingo@55: protected double max; ingo@55: ingo@43: /** The 'from' value entered in the distance mode.*/ ingo@43: protected double from; ingo@43: ingo@43: /** The 'to' value entered in the distance mode.*/ ingo@43: protected double to; ingo@43: ingo@43: /** The 'step' value entered in the distance mode.*/ ingo@43: protected double step; ingo@43: ingo@43: /** 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@235: /** The locations table for distance input. */ raimund@235: protected ListGrid locationDistanceTable; ingo@41: raimund@237: /** The table data. */ raimund@237: protected DistanceInfoObject[] tableData; raimund@237: raimund@893: /** 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() { raimund@235: distanceTable = new ListGrid(); raimund@863: distanceTable.setAutoFetchData(true); raimund@863: raimund@235: locationsTable = new ListGrid(); raimund@863: locationsTable.setAutoFetchData(true); raimund@863: raimund@235: locationDistanceTable = new ListGrid(); raimund@863: locationDistanceTable.setAutoFetchData(true); raimund@863: raimund@284: locationDistanceTable.setShowHeaderContextMenu(false); raimund@284: distanceTable.setShowHeaderContextMenu(false); raimund@284: locationsTable.setShowHeaderContextMenu(false); ingo@41: } 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: * ingo@41: * @param data The data that might be inserted. ingo@41: * ingo@41: * @return a panel. ingo@41: */ christian@4131: @Override ingo@51: public Canvas create(DataList data) { ingo@41: VLayout layout = new VLayout(); ingo@83: layout.setMembersMargin(10); ingo@41: ingo@57: Label label = new Label(MESSAGES.location_distance_state()); ingo@57: Canvas widget = createWidget(data); ingo@57: Canvas submit = getNextButton(); raimund@235: createDistanceInputPanel(); raimund@235: ingo@516: initDefaults(data); ingo@516: raimund@863: createLocationTableDistance (); raimund@235: createDistanceTable(); raimund@235: createLocationTable(); ingo@41: 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: ingo@45: raimund@235: /** raimund@235: * This method creates a table that contains the distance values. raimund@235: */ raimund@235: protected void createDistanceTable() { raimund@863: raimund@1399: String baseUrl = GWT.getHostPageBaseURL(); raimund@1399: raimund@235: distanceTable.setWidth100(); raimund@235: distanceTable.setShowRecordComponents(true); raimund@235: distanceTable.setShowRecordComponentsByCell(true); raimund@235: distanceTable.setHeight100(); raimund@876: distanceTable.setEmptyMessage(MESSAGES.empty_filter()); raimund@876: distanceTable.setCanReorderFields(false); raimund@235: raimund@1390: CellFormatter cf = new CellFormatter() { christian@4131: @Override raimund@1390: public String format( raimund@1390: Object value, raimund@1390: ListGridRecord record, raimund@1390: int rowNum, int colNum) { raimund@1390: if (value == null) return null; raimund@1390: try { raimund@1390: NumberFormat nf; raimund@1390: double v = Double.parseDouble((String)value); raimund@1390: nf = NumberFormat.getFormat("###0.00##"); raimund@1390: return nf.format(v); raimund@1390: } raimund@1390: catch (Exception e) { raimund@1390: return value.toString(); raimund@1390: } raimund@1390: } raimund@1390: }; raimund@1390: raimund@235: ListGridField addDistance = new ListGridField ("", ""); raimund@235: addDistance.setType (ListGridFieldType.ICON); rrenkert@7941: addDistance.setWidth (30); raimund@235: addDistance.addRecordClickHandler (new RecordClickHandler () { christian@4131: @Override raimund@235: public void onRecordClick (RecordClickEvent e) { raimund@235: if (!isLocationMode ()) { raimund@235: Record r = e.getRecord(); raimund@863: try { raimund@863: double min = Double.parseDouble(r.getAttribute("from")); raimund@863: double max = Double.parseDouble(r.getAttribute("to")); raimund@863: setDistanceValues(min, max); raimund@863: } raimund@863: catch(NumberFormatException nfe) { raimund@863: // Is there anything to do? raimund@863: } raimund@235: } raimund@235: else { raimund@235: double[] selected; raimund@261: Record r = e.getRecord(); raimund@863: double min = 0, max = 0; raimund@863: try { raimund@863: min = Double.parseDouble(r.getAttribute("from")); raimund@863: max = Double.parseDouble(r.getAttribute("to")); raimund@863: } raimund@863: catch(NumberFormatException nfe) { raimund@863: // Is there anything to do? raimund@863: } raimund@235: if (getLocationValues() != null) { raimund@235: double[] val = getLocationValues(); raimund@235: selected = new double[val.length + 2]; raimund@235: for(int i = 0; i < val.length; i++){ raimund@235: selected[i] = val[i]; raimund@235: } raimund@235: selected[val.length] = min; raimund@235: selected[val.length + 1] = max; raimund@235: } raimund@235: else { raimund@235: selected = new double[2]; raimund@235: selected[0] = min; raimund@235: selected[1] = max; raimund@235: } raimund@235: setLocationValues(selected); raimund@235: } raimund@235: } raimund@235: }); raimund@1399: addDistance.setCellIcon(baseUrl + MESSAGES.markerGreen()); raimund@235: raimund@235: ListGridField ddescr = new ListGridField("description", raimund@235: MESSAGES.description()); raimund@235: ddescr.setType(ListGridFieldType.TEXT); raimund@235: ddescr.setWidth("*"); raimund@235: ListGridField from = new ListGridField("from", MESSAGES.from()); raimund@1390: from.setCellFormatter(cf); raimund@906: raimund@886: from.setWidth("12%"); raimund@235: ListGridField to = new ListGridField("to", MESSAGES.to()); raimund@903: to.setType(ListGridFieldType.FLOAT); raimund@1390: to.setCellFormatter(cf); raimund@906: raimund@886: to.setWidth("12%"); raimund@1390: to.setAlign(Alignment.LEFT); raimund@235: ListGridField dside = new ListGridField("riverside", raimund@235: MESSAGES.riverside()); raimund@235: dside.setType(ListGridFieldType.TEXT); raimund@886: dside.setWidth("12%"); raimund@235: sascha@568: ListGridField bottom = sascha@568: new ListGridField("bottom", MESSAGES.bottom_edge()); sascha@568: bottom.setType(ListGridFieldType.TEXT); raimund@886: bottom.setWidth("10%"); raimund@1390: bottom.setCellFormatter(cf); sascha@568: sascha@568: ListGridField top = sascha@568: new ListGridField("top", MESSAGES.top_edge()); sascha@568: top.setType(ListGridFieldType.TEXT); raimund@886: top.setWidth("10%"); raimund@1390: top.setCellFormatter(cf); sascha@568: sascha@568: distanceTable.setFields( sascha@568: addDistance, ddescr, from, to, dside, bottom, top); raimund@235: } raimund@235: raimund@235: raimund@235: /** raimund@235: * This method creates a table that contains the location values. raimund@235: */ raimund@235: protected void createLocationTable() { raimund@1399: raimund@1399: String baseUrl = GWT.getHostPageBaseURL(); raimund@1399: raimund@235: locationsTable.setWidth100(); raimund@235: locationsTable.setShowRecordComponents(true); raimund@235: locationsTable.setShowRecordComponentsByCell(true); raimund@235: locationsTable.setHeight100(); raimund@876: locationsTable.setEmptyMessage(MESSAGES.empty_filter()); raimund@876: locationsTable.setCanReorderFields(false); raimund@235: raimund@1390: CellFormatter cf = new CellFormatter() { christian@4131: @Override raimund@1390: public String format( raimund@1390: Object value, raimund@1390: ListGridRecord record, raimund@1390: int rowNum, int colNum) { raimund@1390: if (value == null) return null; raimund@1390: try { raimund@1390: NumberFormat nf; raimund@1390: double v = Double.parseDouble((String)value); raimund@1390: nf = NumberFormat.getFormat("###0.00##"); raimund@1390: return nf.format(v); raimund@1390: } raimund@1390: catch (Exception e) { raimund@1390: return value.toString(); raimund@1390: } raimund@1390: } raimund@1390: }; raimund@1390: raimund@1390: raimund@1390: raimund@235: ListGridField addLocation = new ListGridField ("", ""); raimund@235: addLocation.setType (ListGridFieldType.ICON); sascha@568: addLocation.setWidth (20); sascha@568: raimund@235: addLocation.addRecordClickHandler (new RecordClickHandler () { christian@4131: @Override raimund@235: public void onRecordClick (RecordClickEvent e) { raimund@863: Record record = e.getRecord(); raimund@235: double[] selected; raimund@235: if (getLocationValues() != null) { raimund@235: double[] val = getLocationValues(); raimund@235: selected = new double[val.length + 1]; raimund@235: for(int i = 0; i < val.length; i++){ raimund@235: selected[i] = val[i]; raimund@235: } raimund@863: try { raimund@863: selected[val.length] = raimund@863: Double.parseDouble(record.getAttribute("from")); raimund@863: } raimund@863: catch(NumberFormatException nfe) { raimund@863: // Is there anything to do here? raimund@863: } raimund@235: } raimund@235: else { raimund@235: selected = new double[1]; raimund@863: selected[0] = raimund@863: Double.parseDouble(record.getAttribute("from")); raimund@235: } raimund@235: setLocationValues(selected); raimund@235: } raimund@235: }); raimund@1399: addLocation.setCellIcon (baseUrl + MESSAGES.markerGreen ()); raimund@235: raimund@235: ListGridField ldescr = new ListGridField("description", raimund@235: MESSAGES.description()); raimund@235: ldescr.setType(ListGridFieldType.TEXT); raimund@235: ldescr.setWidth("*"); raimund@235: ListGridField lside = new ListGridField("riverside", raimund@235: MESSAGES.riverside()); raimund@235: lside.setType(ListGridFieldType.TEXT); raimund@886: lside.setWidth("12%"); ingo@570: ListGridField loc = new ListGridField("from", MESSAGES.locations()); raimund@1390: loc.setAlign(Alignment.LEFT); raimund@903: loc.setType(ListGridFieldType.FLOAT); raimund@886: loc.setWidth("12%"); raimund@1390: loc.setCellFormatter(cf); sascha@615: sascha@568: ListGridField bottom = sascha@568: new ListGridField("bottom", MESSAGES.bottom_edge()); sascha@568: bottom.setType(ListGridFieldType.TEXT); raimund@886: bottom.setWidth("10%"); raimund@1390: bottom.setCellFormatter(cf); sascha@568: sascha@568: ListGridField top = sascha@568: new ListGridField("top", MESSAGES.top_edge()); sascha@568: top.setType(ListGridFieldType.TEXT); raimund@886: top.setWidth("10%"); raimund@1390: top.setCellFormatter(cf); sascha@568: sascha@568: locationsTable.setFields(addLocation, ldescr, loc, lside, bottom, top); raimund@235: } raimund@235: raimund@235: raimund@235: /** raimund@235: * This method creates a table that contains the location values. raimund@235: */ raimund@235: protected void createLocationTableDistance (){ raimund@1399: raimund@1399: String baseUrl = GWT.getHostPageBaseURL(); raimund@1399: raimund@235: locationDistanceTable.setWidth100(); raimund@235: locationDistanceTable.setShowRecordComponents(true); raimund@235: locationDistanceTable.setShowRecordComponentsByCell(true); raimund@235: locationDistanceTable.setHeight100(); raimund@876: locationDistanceTable.setEmptyMessage(MESSAGES.empty_filter()); raimund@876: locationDistanceTable.setCanReorderFields(false); raimund@235: raimund@1390: CellFormatter cf = new CellFormatter() { christian@4131: @Override raimund@1390: public String format( raimund@1390: Object value, raimund@1390: ListGridRecord record, raimund@1390: int rowNum, int colNum) { raimund@1390: if (value == null) return null; raimund@1390: try { raimund@1390: NumberFormat nf; raimund@1390: double v = Double.parseDouble((String)value); raimund@1390: nf = NumberFormat.getFormat("###0.00##"); raimund@1390: return nf.format(v); raimund@1390: } raimund@1390: catch (Exception e) { raimund@1390: return value.toString(); raimund@1390: } raimund@1390: } raimund@1390: }; raimund@1390: rrenkert@7941: ListGridField addfrom = new ListGridField ("fromIcon", MESSAGES.from()); raimund@235: addfrom.setType (ListGridFieldType.ICON); christian@3712: addfrom.setWidth (30); raimund@1399: addfrom.setCellIcon(baseUrl + MESSAGES.markerGreen()); raimund@235: rrenkert@7941: ListGridField addto2 = new ListGridField ("toIcon", MESSAGES.to()); raimund@235: addto2.setType (ListGridFieldType.ICON); christian@3712: addto2.setWidth (30); raimund@1399: addto2.setCellIcon(baseUrl + MESSAGES.markerRed()); raimund@235: raimund@863: locationDistanceTable.addCellClickHandler (new CellClickHandler () { christian@4131: @Override raimund@863: public void onCellClick (CellClickEvent e) { raimund@863: if (e.getColNum() == 0) { raimund@863: Record r = e.getRecord (); raimund@863: try { raimund@863: double fromvalue = raimund@863: Double.parseDouble(r.getAttribute("from")); raimund@863: double tovalue = getTo (); raimund@863: setDistanceValues (fromvalue, tovalue); raimund@863: } raimund@863: catch(NumberFormatException nfe) { raimund@863: // Is there anything to do in here? raimund@863: } raimund@863: } raimund@863: else if (e.getColNum() == 1) { raimund@863: Record r = e.getRecord (); raimund@863: try { raimund@863: double fromvalue = getFrom (); raimund@863: double tovalue = raimund@863: Double.parseDouble(r.getAttribute("from")); raimund@863: setDistanceValues (fromvalue, tovalue); raimund@863: } raimund@863: catch(NumberFormatException nfe) { raimund@863: // Is there anything to do in here? raimund@863: } raimund@863: } raimund@863: } raimund@863: }); raimund@863: ListGridField bottom = raimund@863: new ListGridField("bottom", MESSAGES.bottom_edge()); raimund@863: bottom.setType(ListGridFieldType.TEXT); raimund@886: bottom.setWidth("10%"); raimund@1390: bottom.setCellFormatter(cf); raimund@863: raimund@863: ListGridField top = raimund@863: new ListGridField("top", MESSAGES.top_edge()); raimund@863: top.setType(ListGridFieldType.TEXT); raimund@886: top.setWidth("10%"); raimund@1390: top.setCellFormatter(cf); raimund@235: raimund@235: ListGridField ldescr = new ListGridField("description", raimund@235: MESSAGES.description()); raimund@235: ldescr.setType(ListGridFieldType.TEXT); raimund@235: ldescr.setWidth("*"); raimund@235: ListGridField lside = new ListGridField("riverside", raimund@235: MESSAGES.riverside()); raimund@235: lside.setType(ListGridFieldType.TEXT); raimund@886: lside.setWidth("12%"); ingo@570: ListGridField loc = new ListGridField("from", MESSAGES.locations()); raimund@903: loc.setType(ListGridFieldType.FLOAT); raimund@1390: loc.setAlign(Alignment.LEFT); raimund@886: loc.setWidth("12%"); raimund@1390: loc.setCellFormatter(cf); sascha@568: sascha@568: locationDistanceTable.setFields( sascha@568: addfrom, addto2, ldescr, loc, lside, bottom, top); raimund@235: } raimund@235: raimund@235: christian@4131: @Override ingo@53: public Canvas createOld(DataList dataList) { ingo@53: List items = dataList.getAll(); ingo@53: ingo@516: Data dMode = getData(items, "ld_mode"); ingo@516: 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: ingo@516: HLayout layout = new HLayout(); ingo@516: layout.setWidth("400px"); ingo@516: ingo@516: Label label = new Label(dataList.getLabel()); ingo@516: label.setWidth("200px"); ingo@516: ingo@516: Canvas back = getBackButton(dataList.getState()); ingo@516: ingo@516: layout.addMember(label); ingo@516: ingo@516: if (rangeMode) { ingo@516: layout.addMember(getOldRangeSelection(dataList)); ingo@516: } ingo@516: 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: /** ingo@516: * Creates a label for the selected range. ingo@516: * ingo@516: * @param dataList The DataList containing all values for this state. ingo@516: * ingo@516: * @return A label displaying the selected values. ingo@516: */ ingo@516: protected Label getOldRangeSelection(DataList dataList) { ingo@516: List items = dataList.getAll(); ingo@516: ingo@53: Data dFrom = getData(items, "ld_from"); ingo@53: Data dTo = getData(items, "ld_to"); ingo@53: Data dStep = getData(items, "ld_step"); ingo@53: ingo@53: DataItem[] from = dFrom.getItems(); ingo@53: DataItem[] to = dTo.getItems(); ingo@53: DataItem[] step = dStep.getItems(); ingo@53: ingo@53: StringBuilder sb = new StringBuilder(); ingo@53: sb.append(from[0].getLabel()); ingo@53: sb.append(" " + MESSAGES.unitFrom() + " "); ingo@53: sb.append(to[0].getLabel()); ingo@53: sb.append(" " + MESSAGES.unitTo() + " "); ingo@53: sb.append(step[0].getLabel()); ingo@53: sb.append(" " + MESSAGES.unitWidth()); ingo@53: raimund@91: 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: /** ingo@516: * Creates a label for the selected locations. ingo@516: * ingo@516: * @param dataList The DataList containing all values for this state. ingo@516: * ingo@516: * @return A label displaying the selected values. ingo@516: */ ingo@516: protected Label getOldLocationSelection(DataList dataList) { ingo@516: List items = dataList.getAll(); ingo@516: ingo@516: Data dLocations = getData(items, "ld_locations"); ingo@516: DataItem[] lItems = dLocations.getItems(); ingo@516: raimund@3542: String[] splitted = lItems[0].getStringValue().split(" "); raimund@3542: String value = ""; raimund@3542: for (int i = 0; i < splitted.length; i++) { raimund@3542: try { raimund@3542: NumberFormat nf = NumberFormat.getDecimalFormat(); raimund@3542: double dv = Double.parseDouble(splitted[i]); raimund@3542: value += nf.format(dv) + " "; raimund@3542: } raimund@3542: catch(NumberFormatException nfe) { raimund@3542: value += splitted[i] + " "; raimund@3542: } raimund@3542: } ingo@516: ingo@516: Label selected = new Label(value); ingo@516: selected.setWidth(130); ingo@516: ingo@516: return selected; ingo@53: } 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: * ingo@55: * @param list The DataList container that stores the Data objects. ingo@55: */ ingo@55: protected void initDefaults(DataList list) { ingo@516: Data m = getData(list.getAll(), "ld_mode"); ingo@516: Data l = getData(list.getAll(), "ld_locations"); ingo@55: Data f = getData(list.getAll(), "ld_from"); ingo@55: Data t = getData(list.getAll(), "ld_to"); ingo@55: Data s = getData(list.getAll(), "ld_step"); ingo@55: ingo@55: DataItem[] fItems = f.getItems(); ingo@55: DataItem[] tItems = t.getItems(); ingo@55: DataItem[] sItems = s.getItems(); ingo@55: ingo@55: min = Double.valueOf(fItems[0].getStringValue()); ingo@55: max = Double.valueOf(tItems[0].getStringValue()); ingo@55: step = Double.valueOf(sItems[0].getStringValue()); ingo@55: ingo@516: DataItem mDef = m.getDefault(); ingo@516: DataItem lDef = l.getDefault(); ingo@516: DataItem fDef = f.getDefault(); ingo@516: DataItem tDef = t.getDefault(); ingo@516: DataItem sDef = s.getDefault(); ingo@55: ingo@517: String mDefValue = mDef != null ? mDef.getStringValue() : null; ingo@517: String theMode = mDefValue != null && mDefValue.length() > 0 ingo@516: ? mDef.getStringValue() ingo@588: : FIELD_VALUE_DISTANCE; ingo@516: ingo@516: mode.setValue(FIELD_MODE, theMode); ingo@516: ingo@517: String fDefValue = fDef != null ? fDef.getStringValue() : null; ingo@517: setFrom(fDefValue != null && fDefValue.length() > 0 ingo@516: ? Double.valueOf(fDef.getStringValue()) ingo@516: : min); ingo@516: ingo@517: String tDefValue = tDef != null ? tDef.getStringValue() : null; ingo@517: setTo(tDefValue != null && tDefValue.length() > 0 ingo@516: ? Double.valueOf(tDef.getStringValue()) ingo@516: : max); ingo@516: ingo@517: String sDefValue = sDef != null ? sDef.getStringValue() : null; ingo@517: setStep(sDefValue != null && sDefValue.length() > 0 ingo@516: ? Double.valueOf(sDef.getStringValue()) ingo@516: : step); ingo@516: ingo@516: if (lDef != null) { ingo@517: 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)) { ingo@516: enableDistancePanel(); ingo@588: inputTables.selectTab(1); ingo@516: } raimund@1567: currentFiltered = (ListGrid)inputTables.getSelectedTab().getPane(); ingo@53: } ingo@53: ingo@53: ingo@51: protected Canvas createWidget(DataList data) { ingo@45: VLayout layout = new VLayout(); ingo@45: container = new HLayout(); ingo@45: Canvas checkboxPanel = createRadioButtonPanel(); ingo@45: ingo@45: // the initial view will display the location input mode raimund@235: locationPanel = new DoubleArrayPanel( ingo@45: MESSAGES.unitLocation(), ingo@45: getLocationValues(), ingo@45: this); ingo@45: container.addMember(locationPanel); ingo@45: ingo@41: layout.addMember(checkboxPanel); ingo@41: layout.addMember(container); ingo@41: raimund@235: container.setMembersMargin(30); raimund@235: raimund@235: inputTables = new TabSet(); raimund@893: inputTables.addTabSelectedHandler(new TabSelectedHandler() { christian@4131: @Override raimund@893: public void onTabSelected(TabSelectedEvent evt) { raimund@1534: filterDescription.clear(); raimund@1537: filterRange.clear(); raimund@1567: filterResultCount.setValue(""); raimund@1567: raimund@1567: Canvas c = evt.getTabPane(); raimund@1567: if(c instanceof ListGrid) { raimund@1567: currentFiltered = (ListGrid)c; raimund@1567: } raimund@893: } raimund@893: }); raimund@893: ingo@570: Tab locations = new Tab(MESSAGES.locations()); raimund@235: Tab distances = new Tab(MESSAGES.distance()); raimund@235: raimund@272: inputTables.setWidth100(); raimund@272: inputTables.setHeight100(); raimund@235: raimund@863: locations.setPane(locationDistanceTable); raimund@235: distances.setPane(distanceTable); raimund@235: raimund@235: inputTables.addTab(locations); raimund@235: inputTables.addTab(distances); raimund@235: raimund@1567: filterResultCount = new StaticTextItem(MESSAGES.resultCount()); raimund@1567: filterResultCount.setTitleAlign(Alignment.LEFT); raimund@1567: filterResultCount.setTitleStyle("color: #000"); raimund@1567: raimund@1534: filterDescription = new TableFilter(); raimund@1534: filterDescription.setHeight("30px"); raimund@1534: filterDescription.addFilterHandler(this); raimund@1534: raimund@1534: filterRange = new RangeTableFilter(); raimund@1534: filterRange.setHeight("30px"); raimund@1534: filterRange.addFilterHandler(this); raimund@1534: filterRange.setVisible(false); raimund@1534: raimund@1534: filterCriteria = new SelectItem(); raimund@1534: filterCriteria.setShowTitle(false); raimund@1534: filterCriteria.setWidth(100); raimund@1534: filterCriteria.addChangedHandler(new ChangedHandler() { christian@4131: @Override raimund@1534: public void onChanged(ChangedEvent e) { raimund@1534: if(e.getValue().toString().equals("range")) { raimund@1534: filterRange.setVisible(true); raimund@1534: filterDescription.setVisible(false); raimund@1534: filterDescription.clear(); raimund@1567: filterResultCount.setValue(""); raimund@1534: } raimund@1534: else { raimund@1534: filterRange.setVisible(false); raimund@1534: filterRange.clear(); raimund@1534: filterDescription.setVisible(true); raimund@1567: filterResultCount.setValue(""); raimund@1534: } raimund@1534: } raimund@1534: }); raimund@1534: raimund@1534: LinkedHashMap filterMap = raimund@1534: new LinkedHashMap(); raimund@1534: filterMap.put("description", MESSAGES.description()); raimund@1534: filterMap.put("range", MESSAGES.range()); raimund@1534: filterCriteria.setValueMap(filterMap); raimund@1534: filterCriteria.setValue("description"); raimund@1534: raimund@1534: DynamicForm form = new DynamicForm(); raimund@1534: form.setFields(filterCriteria); raimund@863: inputTables.setHeight("*"); raimund@1567: DynamicForm form2 = new DynamicForm(); raimund@1567: form2.setFields(filterResultCount); raimund@863: raimund@863: VLayout helper = new VLayout(); raimund@1534: HLayout filterLayout = new HLayout(); raimund@1534: raimund@1534: filterLayout.addMember(form); raimund@1534: filterLayout.addMember(filterDescription); raimund@1534: filterLayout.addMember(filterRange); raimund@1567: filterLayout.setHeight("30px"); raimund@863: helper.addMember(inputTables); raimund@1534: helper.addMember(filterLayout); raimund@1567: helper.addMember(form2); raimund@863: helper.setHeight100(); raimund@863: helper.setWidth100(); raimund@863: raimund@869: helperContainer.addMember(helper); raimund@1534: filterLayout.setWidth("200"); ingo@41: ingo@41: return layout; ingo@41: } ingo@41: ingo@41: christian@4131: @Override raimund@863: public void onFilterCriteriaChanged(StringFilterEvent event) { raimund@863: String search = event.getFilter(); raimund@863: raimund@863: if (search != null && search.length() > 0) { raimund@863: Criteria c = new Criteria("description", search); raimund@863: raimund@863: locationsTable.filterData(c); raimund@863: distanceTable.filterData(c); raimund@863: locationDistanceTable.filterData(c); raimund@1567: filterResultCount.setValue(currentFiltered.getRecords().length); raimund@863: } raimund@863: else { raimund@893: locationsTable.clearCriteria(); raimund@893: distanceTable.clearCriteria(); raimund@893: locationDistanceTable.clearCriteria(); raimund@1567: filterResultCount.setValue(""); raimund@863: } raimund@863: } raimund@863: raimund@863: christian@4131: @Override raimund@1534: public void onFilterCriteriaChanged(RangeFilterEvent event) { raimund@1536: Float from = event.getFrom() - 0.001f; raimund@1536: Float to = event.getTo() + 0.001f; raimund@1536: GWT.log("filtering range: " + from + " to " + to); raimund@1536: raimund@1536: raimund@1536: Criterion combinedFilter = null; raimund@1536: Criterion locationFilter = null; raimund@1536: if (from.equals(Float.NaN) && to.equals(Float.NaN)) { raimund@1536: locationsTable.clearCriteria(); raimund@1536: distanceTable.clearCriteria(); raimund@1536: locationDistanceTable.clearCriteria(); raimund@1567: filterResultCount.setValue(""); raimund@1567: return; raimund@1536: } raimund@1536: else if (from.equals(Float.NaN)) { raimund@1536: combinedFilter = new Criterion("to", OperatorId.LESS_OR_EQUAL, to); raimund@1536: locationFilter = raimund@1536: new Criterion("from", OperatorId.LESS_OR_EQUAL, to); raimund@1536: locationsTable.filterData(locationFilter); raimund@1536: distanceTable.filterData(combinedFilter); raimund@1536: locationDistanceTable.filterData(combinedFilter); raimund@1567: filterResultCount.setValue(currentFiltered.getRecords().length); raimund@1536: return; raimund@1536: } raimund@1536: else if (to.equals(Float.NaN)) { raimund@1536: combinedFilter = raimund@1536: new Criterion("from", OperatorId.GREATER_OR_EQUAL, from); raimund@1536: locationsTable.filterData(combinedFilter); raimund@1536: distanceTable.filterData(combinedFilter); raimund@1536: locationDistanceTable.filterData(combinedFilter); raimund@1536: } raimund@1536: else { raimund@1536: AdvancedCriteria c1 = raimund@1536: new AdvancedCriteria(OperatorId.AND, new Criterion[] { raimund@1536: new Criterion("from", OperatorId.GREATER_OR_EQUAL, from), raimund@1536: new Criterion("from", OperatorId.LESS_OR_EQUAL, to) raimund@1536: }); raimund@1536: raimund@1536: AdvancedCriteria c2 = raimund@1536: new AdvancedCriteria(OperatorId.AND, new Criterion[] { raimund@1536: new Criterion("to", OperatorId.GREATER_OR_EQUAL, from), raimund@1536: new Criterion("to", OperatorId.LESS_OR_EQUAL, to) raimund@1536: }); raimund@1536: raimund@1537: AdvancedCriteria c3 = raimund@1537: new AdvancedCriteria(OperatorId.AND, new Criterion[] { raimund@1537: new Criterion("from", OperatorId.LESS_OR_EQUAL, to), raimund@1537: new Criterion("to", OperatorId.GREATER_OR_EQUAL, from) raimund@1537: }); raimund@1537: raimund@1536: combinedFilter = raimund@1536: new AdvancedCriteria(OperatorId.OR, new Criterion[] { raimund@1537: c1, c2, c3 raimund@1536: }); raimund@1536: } raimund@1536: locationsTable.filterData(combinedFilter); raimund@1536: distanceTable.filterData(combinedFilter); raimund@1536: locationDistanceTable.filterData(combinedFilter); raimund@1567: filterResultCount.setValue(currentFiltered.getRecords().length); raimund@1534: } raimund@863: raimund@863: ingo@562: @Override ingo@562: public List validate() { ingo@562: if (isLocationMode()) { ingo@562: return validateLocations(); ingo@562: } ingo@562: else { ingo@562: return validateRange(); ingo@562: } ingo@562: } ingo@562: ingo@562: ingo@562: protected List validateLocations() { ingo@562: List errors = new ArrayList(); ingo@562: NumberFormat nf = NumberFormat.getDecimalFormat(); ingo@562: ingo@562: try { ingo@562: saveLocationValues(locationPanel); ingo@562: } ingo@562: catch (Exception e) { ingo@562: errors.add(MESSAGES.wrongFormat()); ingo@562: } ingo@562: ingo@562: double[] values = getLocationValues(); ingo@562: double[] good = new double[values.length]; ingo@562: int idx = 0; ingo@562: ingo@562: for (double value: values) { ingo@562: if (value < min || value > max) { ingo@562: String tmp = MESSAGES.error_validate_range(); ingo@562: tmp = tmp.replace("$1", nf.format(value)); ingo@562: tmp = tmp.replace("$2", nf.format(min)); ingo@562: tmp = tmp.replace("$3", nf.format(max)); ingo@562: errors.add(tmp); ingo@562: } ingo@562: else { ingo@562: good[idx++] = value; ingo@562: } ingo@562: } ingo@562: ingo@562: 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()) { ingo@562: locationPanel.setValues(justGood); ingo@562: } ingo@562: ingo@562: return errors; ingo@562: } ingo@562: ingo@562: ingo@562: protected List validateRange() { ingo@562: List errors = new ArrayList(); ingo@562: NumberFormat nf = NumberFormat.getDecimalFormat(); ingo@562: ingo@562: try { ingo@562: saveDistanceValues(distancePanel); ingo@562: } ingo@562: catch (Exception e) { ingo@562: errors.add(MESSAGES.wrongFormat()); ingo@562: } ingo@562: ingo@562: double from = getFrom(); ingo@562: double to = getTo(); ingo@562: double step = getStep(); ingo@562: ingo@562: if (from < min || from > max) { tom@6996: String tmp = MESSAGES.error_validate_range(); ingo@562: tmp = tmp.replace("$1", nf.format(from)); ingo@562: tmp = tmp.replace("$2", nf.format(min)); tom@6996: tmp = tmp.replace("$3", nf.format(max)); ingo@562: errors.add(tmp); ingo@562: from = min; ingo@562: } ingo@562: ingo@562: if (to < min || to > max) { tom@6996: String tmp = MESSAGES.error_validate_range(); ingo@562: tmp = tmp.replace("$1", nf.format(to)); tom@6996: tmp = tmp.replace("$2", nf.format(min)); tom@6996: tmp = tmp.replace("$3", nf.format(max)); ingo@562: errors.add(tmp); ingo@562: to = max; ingo@562: } ingo@562: ingo@562: if (!errors.isEmpty()) { ingo@562: distancePanel.setValues(from, to, step); ingo@562: } ingo@562: ingo@562: return errors; ingo@562: } 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() { ingo@1277: 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()) { ingo@59: Canvas member = container.getMember(0); ingo@59: if (member instanceof DoubleArrayPanel) { ingo@59: DoubleArrayPanel form = (DoubleArrayPanel) member; ingo@59: saveLocationValues(form); ingo@59: } ingo@1277: ingo@1277: Data dLocations = getDataLocations(); ingo@1277: DataItem dFrom = new DefaultDataItem("ld_from", "ld_from", ""); ingo@1277: DataItem dTo = new DefaultDataItem("ld_to", "ld_to", ""); ingo@1277: DataItem dStep = new DefaultDataItem("ld_step", "ld_step", ""); ingo@1277: ingo@1277: data.add(dLocations); ingo@1277: data.add(new DefaultData( ingo@1277: "ld_from", null, null, new DataItem[] { dFrom } )); ingo@1277: data.add(new DefaultData( ingo@1277: "ld_to", null, null, new DataItem[] { dTo } )); ingo@1277: data.add(new DefaultData( ingo@1277: "ld_step", null, null, new DataItem[] { dStep } )); 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: saveDistanceValues(form); ingo@59: } ingo@59: ingo@1277: Data dFrom = getDataFrom(); ingo@1277: Data dTo = getDataTo(); ingo@1277: Data dStep = getDataStep(); ingo@1277: 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); ingo@1277: data.add(new DefaultData( ingo@1277: "ld_locations", null, null, new DataItem[] { loc } )); ingo@520: } ingo@520: ingo@1277: 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: /** 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() { ingo@516: String value = mode.getValueAsString(FIELD_MODE); ingo@516: 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: ingo@516: protected Data getDataLocations() { ingo@516: double[] locations = getLocationValues(); ingo@516: boolean first = true; ingo@516: ingo@520: if (locations == null) { ingo@520: return null; ingo@520: } ingo@520: ingo@516: StringBuilder sb = new StringBuilder(); ingo@516: ingo@516: for (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: ingo@516: DataItem item = new DefaultDataItem( ingo@516: "ld_locations", ingo@516: "ld_locations", ingo@516: sb.toString()); ingo@516: ingo@516: return new DefaultData( ingo@516: "ld_locations", ingo@516: null, ingo@516: null, ingo@516: new DataItem[] { item }); ingo@46: } ingo@41: ingo@46: 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() { ingo@516: String value = Double.valueOf(getFrom()).toString(); ingo@46: DataItem item = new DefaultDataItem("ld_from", "ld_from", value); ingo@46: return new DefaultData( ingo@51: "ld_from", null, null, new DataItem[] { item }); ingo@46: } 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() { ingo@516: String value = Double.valueOf(getTo()).toString(); ingo@46: DataItem item = new DefaultDataItem("ld_to", "ld_to", value); ingo@46: return new DefaultData( ingo@51: "ld_to", null, null, new DataItem[] { item }); ingo@46: } 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() { ingo@516: String value = Double.valueOf(getStep()).toString(); ingo@46: DataItem item = new DefaultDataItem("ld_step","ld_step", value); ingo@46: return new DefaultData( ingo@51: "ld_step", null, null, new DataItem[] { item }); ingo@46: } 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() { ingo@516: String inputMode = mode.getValueAsString(FIELD_MODE); ingo@46: ingo@516: return inputMode.equals(FIELD_VALUE_LOCATION) ? true : false; ingo@516: } ingo@516: ingo@516: ingo@516: /** ingo@516: * Activates the location panel. ingo@516: */ ingo@516: protected void enableLocationPanel() { ingo@516: locationPanel = new DoubleArrayPanel( ingo@516: MESSAGES.unitLocation(), ingo@516: getLocationValues(), ingo@516: this); ingo@516: ingo@516: container.removeMembers(container.getMembers()); ingo@516: container.addMember(locationPanel); ingo@516: } ingo@516: ingo@516: ingo@516: /** ingo@516: * Activates the distance panel. ingo@516: */ ingo@516: protected void enableDistancePanel() { ingo@516: distancePanel = new DoubleRangePanel( ingo@516: MESSAGES.unitFrom(), MESSAGES.unitTo(), MESSAGES.unitWidth(), ingo@516: getFrom(), getTo(), getStep(), ingo@1491: 400, ingo@516: this); ingo@516: ingo@516: container.removeMembers(container.getMembers()); ingo@516: container.addMember(distancePanel); ingo@41: } ingo@41: ingo@41: ingo@41: /** ingo@41: * This method switches the input mode between location and distance input. ingo@41: * ingo@41: * @param event The click event fired by a RadioButtonGroupItem. ingo@41: */ christian@4131: @Override ingo@41: public void onChange(ChangeEvent event) { ingo@41: 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)) { ingo@516: enableLocationPanel(); raimund@1534: filterDescription.clear(); raimund@1537: filterRange.clear(); raimund@1567: filterResultCount.setValue(""); raimund@1567: raimund@863: // Remove the tab containing the locationDistanceTable. raimund@863: // The 'updateTab()' avoids the tab content to be destroyed. raimund@863: inputTables.updateTab(0, null); raimund@863: inputTables.removeTab(0); ingo@43: raimund@863: // Create a new tab containing the locationTable ingo@570: Tab t1 = new Tab (MESSAGES.locations()); raimund@235: t1.setPane(locationsTable); raimund@863: inputTables.addTab(t1, 0); raimund@237: raimund@863: // Bring this tab to front. raimund@235: inputTables.selectTab(0); ingo@41: } ingo@43: else { ingo@516: enableDistancePanel(); raimund@1534: filterDescription.clear(); raimund@1537: filterRange.clear(); raimund@1567: filterResultCount.setValue(""); raimund@1567: raimund@863: // Remove the tab containing the locationTable. raimund@863: // The 'updateTab()' avoids the tab content to be destroyed. raimund@863: inputTables.updateTab(0, null); raimund@863: inputTables.removeTab(0); ingo@43: felix@5334: // Create a new tab containing the locationDistanceTable. ingo@570: Tab t1 = new Tab(MESSAGES.locations()); raimund@235: t1.setPane(locationDistanceTable); raimund@863: inputTables.addTab(t1, 0); raimund@237: raimund@863: // Bring the distanceTable tab to front. raimund@235: inputTables.selectTab(1); ingo@41: } 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: * ingo@41: * @param event The BlurEvent that gives information about the FormItem that ingo@41: * has been modified and its value. ingo@41: */ christian@4131: @Override ingo@41: public void onBlur(BlurEvent event) { ingo@41: FormItem item = event.getItem(); ingo@41: 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)) { ingo@43: DoubleArrayPanel p = (DoubleArrayPanel) event.getForm(); ingo@41: ingo@59: saveLocationValue(p, item); ingo@41: } ingo@43: else { ingo@43: DoubleRangePanel p = (DoubleRangePanel) event.getForm(); ingo@41: ingo@59: saveDistanceValue(p, item); ingo@59: } ingo@59: } ingo@59: ingo@59: raimund@235: ingo@59: /** ingo@59: * Validates and stores all values entered in the location mode. ingo@59: * ingo@59: * @param p The DoubleArrayPanel. ingo@59: */ ingo@59: protected void saveLocationValues(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: saveLocationValue(p, item); ingo@43: } ingo@41: } ingo@41: } ingo@41: ingo@41: ingo@41: /** ingo@59: * Validates and stores all values entered in the distance mode. ingo@59: * ingo@59: * @param p The DoubleRangePanel. ingo@59: */ ingo@59: protected void saveDistanceValues(DoubleRangePanel p) { ingo@59: FormItem[] formItems = p.getFields(); ingo@59: ingo@59: for (FormItem item: formItems) { ingo@59: saveDistanceValue(p, item); ingo@59: } ingo@59: } ingo@59: ingo@59: ingo@59: /** ingo@59: * Validates and stores a value entered in the location mode. ingo@59: * ingo@59: * @param p The DoubleArrayPanel. ingo@59: * @param item The item that needs to be validated. ingo@59: */ ingo@59: protected void saveLocationValue(DoubleArrayPanel p, FormItem item) { ingo@59: if (p.validateForm(item)) { ingo@59: setLocationValues(p.getInputValues(item)); ingo@59: } ingo@59: } ingo@59: ingo@59: ingo@59: /** ingo@59: * Validates and stores value entered in the distance mode. ingo@59: * ingo@59: * @param p The DoubleRangePanel. ingo@59: * @param item The item that needs to be validated. ingo@59: */ ingo@59: protected void saveDistanceValue(DoubleRangePanel p, 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@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() { ingo@43: mode = new DynamicForm(); ingo@41: ingo@516: RadioGroupItem radio = new RadioGroupItem(FIELD_MODE); ingo@41: radio.setShowTitle(false); ingo@41: radio.setVertical(false); raimund@1394: radio.setWrap(false); ingo@41: christian@4131: LinkedHashMap values = new LinkedHashMap(); ingo@516: values.put(FIELD_VALUE_LOCATION, MESSAGES.location()); ingo@516: values.put(FIELD_VALUE_DISTANCE, MESSAGES.distance()); ingo@43: christian@4131: 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: ingo@43: mode.setFields(radio); ingo@45: mode.setValues(initial); ingo@41: ingo@43: return mode; ingo@41: } ingo@41: ingo@41: raimund@235: protected void createDistanceInputPanel() { raimund@235: Config config = Config.getInstance(); raimund@235: String url = config.getServerUrl(); raimund@235: String river = ""; raimund@235: raimund@235: ArtifactDescription adescr = artifact.getArtifactDescription(); raimund@235: DataList[] data = adescr.getOldData(); raimund@235: raimund@235: if (data != null && data.length > 0) { raimund@235: for (int i = 0; i < data.length; i++) { raimund@235: DataList dl = data[i]; raimund@3526: if (dl.getState().endsWith("river")) { raimund@235: for (int j = 0; j < dl.size(); j++) { raimund@235: Data d = dl.get(j); raimund@235: DataItem[] di = d.getItems(); raimund@235: if (di != null && di.length == 1) { raimund@235: river = d.getItems()[0].getStringValue(); raimund@235: } raimund@235: } raimund@235: } raimund@235: } raimund@235: } raimund@235: raimund@863: distanceTable.setDataSource(new DistanceInfoDataSource( raimund@863: url, river, "distances")); raimund@863: locationsTable.setDataSource(new DistanceInfoDataSource( raimund@863: url, river, "locations")); raimund@863: locationDistanceTable.setDataSource(new DistanceInfoDataSource( raimund@863: url, river, "locations")); raimund@235: } raimund@235: raimund@235: ingo@43: protected double getFrom() { ingo@43: return from; ingo@41: } ingo@41: ingo@41: ingo@43: protected void setFrom(double from) { ingo@43: this.from = from; ingo@43: } ingo@41: ingo@41: ingo@43: protected double getTo() { ingo@43: return to; ingo@43: } ingo@41: ingo@41: ingo@43: protected void setTo(double to) { ingo@43: this.to = to; ingo@43: } ingo@41: ingo@43: ingo@43: protected double getStep() { ingo@43: return step; ingo@43: } ingo@43: ingo@43: ingo@43: protected void setStep(double step) { ingo@43: this.step = step; ingo@43: } ingo@43: ingo@43: ingo@43: protected double[] getLocationValues() { ingo@43: return values; ingo@43: } ingo@43: ingo@43: ingo@43: protected void setLocationValues(double[] values) { ingo@43: this.values = values; raimund@235: locationPanel.setValues(values); raimund@235: } raimund@235: raimund@235: ingo@516: protected void setLocationValues(String values) { ingo@516: String[] vs = values.split(" "); ingo@516: ingo@516: if (vs == null) { ingo@516: return; ingo@516: } ingo@516: ingo@516: double[] ds = new double[vs.length]; ingo@516: int idx = 0; ingo@516: ingo@516: for (String s: vs) { ingo@516: try { ingo@516: ds[idx++] = Double.valueOf(s); ingo@516: } ingo@516: catch (NumberFormatException nfe) { ingo@516: // do nothing ingo@516: } ingo@516: } ingo@516: ingo@516: setLocationValues(ds); ingo@516: } ingo@516: ingo@516: raimund@235: protected void setDistanceValues (double from, double to) { raimund@235: setFrom(from); raimund@235: setTo(to); raimund@235: distancePanel.setValues(from, to, getStep()); ingo@41: } ingo@41: } ingo@41: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :