felix@1590: package de.intevation.flys.client.client.ui; felix@1590: felix@1590: import java.util.LinkedHashMap; felix@1590: felix@1590: import com.google.gwt.core.client.GWT; felix@1590: import com.google.gwt.i18n.client.NumberFormat; rrenkert@4221: import com.smartgwt.client.data.AdvancedCriteria; felix@1590: import com.smartgwt.client.data.Criteria; felix@1590: import com.smartgwt.client.data.Criterion; rrenkert@4221: import com.smartgwt.client.types.Alignment; rrenkert@4221: import com.smartgwt.client.types.ListGridFieldType; felix@1590: import com.smartgwt.client.types.OperatorId; felix@1590: import com.smartgwt.client.widgets.form.DynamicForm; felix@1590: import com.smartgwt.client.widgets.form.fields.SelectItem; felix@1590: import com.smartgwt.client.widgets.form.fields.StaticTextItem; rrenkert@4221: import com.smartgwt.client.widgets.form.fields.events.ChangedEvent; rrenkert@4221: import com.smartgwt.client.widgets.form.fields.events.ChangedHandler; rrenkert@4221: import com.smartgwt.client.widgets.grid.CellFormatter; felix@1590: import com.smartgwt.client.widgets.grid.ListGrid; felix@1590: import com.smartgwt.client.widgets.grid.ListGridField; felix@1590: import com.smartgwt.client.widgets.grid.ListGridRecord; rrenkert@4221: import com.smartgwt.client.widgets.grid.events.CellClickHandler; rrenkert@4221: import com.smartgwt.client.widgets.layout.HLayout; felix@1590: felix@1590: import de.intevation.flys.client.client.FLYSConstants; felix@1590: import de.intevation.flys.client.client.event.FilterHandler; rrenkert@4221: import de.intevation.flys.client.client.event.RangeFilterEvent; felix@1590: import de.intevation.flys.client.client.event.StringFilterEvent; felix@1590: felix@1590: /** felix@1590: * Bundle widgets and handler for a lacation input helper. felix@1590: * felix@1590: * Note that the construction is weird and driven by issues that arose due to felix@1590: * reasons not understood. felix@1590: */ felix@1590: public class LocationPicker felix@1590: implements FilterHandler felix@1590: { felix@1590: /** The message class that provides i18n strings.*/ felix@1590: protected FLYSConstants MSG = GWT.create(FLYSConstants.class); felix@1590: felix@1590: /** The locations table. */ felix@1590: protected ListGrid locationTable; felix@1590: felix@1590: protected HLayout filterLayout; felix@1590: felix@1590: DynamicForm resultCountForm; felix@1590: rrenkert@4221: CellClickHandler handler; rrenkert@4221: rrenkert@4221: boolean isDistance = false; felix@1590: felix@1590: /** Text to show number of matched items when filtered. */ felix@1590: protected StaticTextItem filterResultCount; felix@1590: felix@1590: rrenkert@4221: public LocationPicker(CellClickHandler handler) { felix@1590: locationTable = new ListGrid(); felix@1590: locationTable.setShowHeaderContextMenu(false); felix@1590: this.handler = handler; felix@1590: } felix@1590: felix@1590: public void prepareFilter() { felix@1590: felix@1590: filterResultCount = new StaticTextItem(MSG.resultCount()); felix@1590: filterResultCount.setTitleAlign(Alignment.LEFT); felix@1590: filterResultCount.setTitleStyle("color: #000"); felix@1590: felix@1590: final TableFilter filter = new TableFilter(); felix@1590: filter.setHeight("30px"); felix@1590: filter.addFilterHandler(this); felix@1590: felix@1590: final RangeTableFilter filterRange = new RangeTableFilter(); felix@1590: filterRange.setHeight("30px"); felix@1590: filterRange.addFilterHandler(this); felix@1590: filterRange.setVisible(false); felix@1590: felix@1590: SelectItem filterCriteria = new SelectItem(); felix@1590: filterCriteria.setShowTitle(false); felix@1590: filterCriteria.setWidth(100); felix@1590: filterCriteria.addChangedHandler(new ChangedHandler() { felix@1590: public void onChanged(ChangedEvent e) { felix@1590: if(e.getValue().toString().equals("range")) { felix@1590: filterRange.setVisible(true); felix@1590: filter.setVisible(false); felix@1590: filter.clear(); felix@1590: filterResultCount.setValue(""); felix@1590: } felix@1590: else { felix@1590: filterRange.setVisible(false); felix@1590: filterRange.clear(); felix@1590: filter.setVisible(true); felix@1590: filterResultCount.setValue(""); felix@1590: } felix@1590: } felix@1590: }); felix@1590: felix@1590: LinkedHashMap filterMap = felix@1590: new LinkedHashMap(); felix@1590: filterMap.put("description", MSG.description()); felix@1590: filterMap.put("range", MSG.range()); felix@1590: filterCriteria.setValueMap(filterMap); felix@1590: filterCriteria.setValue("description"); felix@1590: felix@1590: DynamicForm form = new DynamicForm(); felix@1590: form.setFields(filterCriteria); felix@1590: felix@1590: resultCountForm = new DynamicForm(); felix@1590: resultCountForm.setFields(filterResultCount); felix@1590: felix@1590: filterLayout = new HLayout(); felix@1590: filterLayout.addMember(form); felix@1590: filterLayout.addMember(filter); felix@1590: filterLayout.addMember(filterRange); felix@1590: } felix@1590: felix@1590: felix@1590: /** Access the main widget, a table in which locations can be chosen. */ felix@1590: public ListGrid getLocationTable() { felix@1590: return locationTable; felix@1590: } felix@1590: felix@1590: felix@1590: /** Access the 'form' that shows the filter result count. */ felix@1590: public DynamicForm getResultCountForm() { felix@1590: return resultCountForm; felix@1590: } felix@1590: felix@1590: felix@1590: /** Access the layout containing filter stuff. */ felix@1590: public HLayout getFilterLayout() { felix@1590: return filterLayout; felix@1590: } felix@1590: felix@1590: felix@1590: /** felix@1590: * This method creates a table that contains the location values. felix@1590: */ rrenkert@4221: public void createLocationTable(/*RecordClickHandler handler*/) { felix@1590: GWT.log("Create Location Table in LocationPicker"); felix@1590: felix@1590: String baseUrl = GWT.getHostPageBaseURL(); felix@1590: felix@1590: locationTable.setWidth100(); felix@1590: locationTable.setShowRecordComponents(true); felix@1590: locationTable.setShowRecordComponentsByCell(true); felix@1590: locationTable.setHeight100(); felix@1590: locationTable.setEmptyMessage(MSG.empty_filter()); felix@1590: locationTable.setCanReorderFields(false); felix@1590: felix@1590: ListGridField addLocation = new ListGridField ("", ""); felix@1590: addLocation.setType (ListGridFieldType.ICON); felix@1590: addLocation.setWidth (20); felix@1590: addLocation.setCellIcon (baseUrl + MSG.markerGreen()); rrenkert@4221: ListGridField addTo = new ListGridField ("", ""); rrenkert@4221: addTo.setType (ListGridFieldType.ICON); rrenkert@4221: addTo.setWidth (20); rrenkert@4221: addTo.setCellIcon (baseUrl + MSG.markerRed()); rrenkert@4221: felix@1590: ListGridField ldescr = new ListGridField("description", felix@1590: MSG.description()); felix@1590: ldescr.setType(ListGridFieldType.TEXT); felix@1590: ldescr.setWidth("*"); felix@1590: ListGridField lside = new ListGridField("riverside", felix@1590: MSG.riverside()); felix@1590: lside.setType(ListGridFieldType.TEXT); felix@1590: lside.setWidth("10%"); felix@1590: felix@1590: ListGridField loc = new ListGridField("from", MSG.location()); felix@1590: loc.setCellFormatter(new CellFormatter() { felix@1590: public String format( felix@1590: Object value, felix@1590: ListGridRecord record, felix@1590: int rowNum, int colNum) { felix@1590: if (value == null) return null; felix@1590: try { felix@1590: NumberFormat nf; felix@1590: double v = Double.parseDouble((String)value); felix@1590: nf = NumberFormat.getFormat("###0.00##"); felix@1590: return nf.format(v); felix@1590: } felix@1590: catch (Exception e) { felix@1590: return value.toString(); felix@1590: } felix@1590: } felix@1590: } felix@1590: ); felix@1590: loc.setType(ListGridFieldType.FLOAT); felix@1590: felix@1590: loc.setWidth("10%"); felix@1590: felix@1590: ListGridField bottom = felix@1590: new ListGridField("bottom", MSG.bottom_edge()); felix@1590: bottom.setType(ListGridFieldType.TEXT); felix@1590: bottom.setWidth("10%"); felix@1590: felix@1590: ListGridField top = felix@1590: new ListGridField("top", MSG.top_edge()); felix@1590: top.setType(ListGridFieldType.TEXT); felix@1590: top.setWidth("10%"); rrenkert@4221: locationTable.addCellClickHandler(handler); rrenkert@4221: if (isDistance) { rrenkert@4221: locationTable.setFields( rrenkert@4221: addLocation, addTo, ldescr, loc, lside, bottom, top); rrenkert@4221: } rrenkert@4221: else { rrenkert@4221: locationTable.setFields( rrenkert@4221: addLocation, ldescr, loc, lside, bottom, top); rrenkert@4221: } felix@1590: } felix@1590: felix@1590: felix@1590: @Override felix@1590: public void onFilterCriteriaChanged(StringFilterEvent event) { felix@1590: String search = event.getFilter(); felix@1590: felix@1590: if (search != null && search.length() > 0) { felix@1590: Criteria c = new Criteria("description", search); felix@1590: locationTable.filterData(c); felix@1590: filterResultCount.setValue(locationTable.getRecords().length); felix@1590: } felix@1590: else { raimund@2454: locationTable.clearCriteria(); raimund@2454: filterResultCount.setValue(""); felix@1590: } felix@1590: } felix@1590: felix@1590: felix@1590: @Override felix@1590: public void onFilterCriteriaChanged(RangeFilterEvent event) { felix@1590: Float from = event.getFrom() - 0.001f; felix@1590: Float to = event.getTo() + 0.001f; felix@1590: felix@1590: Criterion combinedFilter = null; felix@1590: if (from.equals(Float.NaN) && to.equals(Float.NaN)) { felix@1590: locationTable.clearCriteria(); felix@1590: filterResultCount.setValue(""); felix@1590: return; felix@1590: } felix@1590: else if (from.equals(Float.NaN)) { felix@1590: combinedFilter = felix@1590: new Criterion("from", OperatorId.LESS_OR_EQUAL, to); felix@1590: } felix@1590: else if (to.equals(Float.NaN)) { felix@1590: combinedFilter = felix@1590: new Criterion("from", OperatorId.GREATER_OR_EQUAL, from); felix@1590: } felix@1590: else { felix@1590: combinedFilter = felix@1590: new AdvancedCriteria(OperatorId.AND, new Criterion[] { felix@1590: new Criterion("from", OperatorId.GREATER_OR_EQUAL, from), felix@1590: new Criterion("from", OperatorId.LESS_OR_EQUAL, to) felix@1590: }); felix@1590: } felix@1590: locationTable.filterData(combinedFilter); felix@1590: filterResultCount.setValue(locationTable.getRecords().length); felix@1590: } rrenkert@4221: rrenkert@4221: public void setIsDistance(boolean value) { rrenkert@4221: this.isDistance = value; rrenkert@4221: } rrenkert@4221: rrenkert@4221: public boolean isDistance() { rrenkert@4221: return this.isDistance; rrenkert@4221: } felix@1590: } felix@1590: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :