/*
* This is part of Geomajas, a GIS framework, http://www.geomajas.org/.
*
* Copyright 2008-2015 Geosparc nv, http://www.geosparc.com/, Belgium.
*
* The program is available in open source according to the GNU Affero
* General Public License. All contributions in this program are covered
* by the Geomajas Contributors License Agreement. For full licensing
* details, see LICENSE.txt in the project root.
*/
package org.geomajas.widget.searchandfilter.client.widget.configuredsearch;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.FormItem;
import com.smartgwt.client.widgets.form.fields.SelectItem;
import com.smartgwt.client.widgets.form.fields.SpinnerItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
import org.geomajas.gwt.client.map.layer.VectorLayer;
import org.geomajas.gwt.client.widget.MapWidget;
import org.geomajas.widget.searchandfilter.client.util.AttributeCriterionUtil;
import org.geomajas.widget.searchandfilter.client.widget.search.AbstractSearchPanel;
import org.geomajas.widget.searchandfilter.search.dto.AndCriterion;
import org.geomajas.widget.searchandfilter.search.dto.AttributeCriterion;
import org.geomajas.widget.searchandfilter.search.dto.ConfiguredSearch;
import org.geomajas.widget.searchandfilter.search.dto.ConfiguredSearchAttribute;
import org.geomajas.widget.searchandfilter.search.dto.Criterion;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
/**
* Extension of {@link AbstractSearchPanel} for {@link ConfiguredSearch}.
*
* @author Jan Venstermans
*/
public class ConfiguredSearchPanel extends AbstractSearchPanel {
private List<SearchAttributeFormItem> attributeFormItems = new ArrayList<SearchAttributeFormItem>();
private DynamicForm dynamicForm;
private ConfiguredSearch searchConfig;
private VectorLayer vectorLayer;
public ConfiguredSearchPanel(MapWidget mapWidget) {
super(mapWidget);
}
@Override
public boolean validate() {
return dynamicForm.validate();
}
@Override
public Criterion getFeatureSearchCriterion() {
return convertAttributesToAndCriterion();
}
@Override
public VectorLayer getFeatureSearchVectorLayer() {
return vectorLayer;
}
@Override
public void reset() {
}
@Override
public void initialize(Criterion featureSearch) {
}
public void setSearchConfig(final ConfiguredSearch searchConfig, final String clientLayerId) {
this.searchConfig = searchConfig;
setLayerId(clientLayerId);
buildUi();
}
public void setLayerId(final String clientLayerId) {
this.vectorLayer = getMapWidget().getMapModel().getVectorLayer(clientLayerId);
}
private void buildUi() {
clear();
dynamicForm = new DynamicForm();
dynamicForm.setWidth100();
dynamicForm.setColWidths(130, 200);
attributeFormItems.clear();
List<FormItem> formItemsList = new ArrayList<FormItem>();
for (ConfiguredSearchAttribute attribute : searchConfig.getAttributes()) {
SearchAttributeFormItem attributeFormItem = new SearchAttributeFormItem(getFormItem(attribute), attribute);
attributeFormItems.add(attributeFormItem);
formItemsList.add(attributeFormItem.getFormItem());
}
dynamicForm.setFields(formItemsList.toArray(new FormItem[formItemsList.size()]));
setAlign(Alignment.CENTER);
setWidth(430);
setHeight(100);
addChild(dynamicForm);
}
private FormItem getFormItem(ConfiguredSearchAttribute attribute) {
FormItem formItem = null;
switch (attribute.getInputType()) {
case FreeValue:
switch (attribute.getAttributeType()) {
case String:
formItem = new TextItem();
break;
case Integer:
formItem = new SpinnerItem();
break;
}
break;
case DropDown:
formItem = new SelectItem();
formItem.setValueMap(convertToMap(attribute.getInputTypeDropDownValues()));
break;
}
if (formItem != null) {
formItem.setTitle(attribute.getDisplayText());
}
return formItem;
}
private LinkedHashMap<String, String> convertToMap(List<String> values) {
LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
for (String value : values) {
map.put(value, value);
}
return map;
}
private AndCriterion convertAttributesToAndCriterion() {
AndCriterion criterion = new AndCriterion();
for (SearchAttributeFormItem attributeFormItem : attributeFormItems) {
criterion.getCriteria().add(attributeFormItem.getSearchCriterion());
}
return criterion;
}
/**
* Inner class for displaying a {@link ConfiguredSearchAttribute} as a {@link FormItem}.
* It also provides a getter for the {@link AttributeCriterion} to use in a search.
*/
private class SearchAttributeFormItem {
private FormItem formItem;
private ConfiguredSearchAttribute searchAttribute;
public SearchAttributeFormItem(FormItem formItem, ConfiguredSearchAttribute searchAttribute) {
this.formItem = formItem;
this.searchAttribute = searchAttribute;
}
public FormItem getFormItem() {
return formItem;
}
public void setFormItem(FormItem formItem) {
this.formItem = formItem;
}
public ConfiguredSearchAttribute getSearchAttribute() {
return searchAttribute;
}
public void setSearchAttribute(ConfiguredSearchAttribute searchAttribute) {
this.searchAttribute = searchAttribute;
}
public String getOperatorString() {
if (searchAttribute != null) {
return searchAttribute.getOperation().getOperatorCode();
}
return null;
}
/**
* Return the actual search criterion object, or null if not all fields have been properly filled.
*
* @return search criterion
*/
public AttributeCriterion getSearchCriterion() {
return AttributeCriterionUtil.getSearchCriterion(vectorLayer.getServerLayerId(),
AttributeCriterionUtil.getAbstractReadOnlyAttributeInfo(vectorLayer, searchAttribute),
formItem, getOperatorString());
}
}
}