/* (c) 2014 Open Source Geospatial Foundation - all rights reserved * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.geofence.gui.client.widget.rule.detail; import org.geoserver.geofence.gui.client.GeofenceEvents; import org.geoserver.geofence.gui.client.i18n.I18nProvider; import org.geoserver.geofence.gui.client.model.BeanKeyValue; import org.geoserver.geofence.gui.client.model.RuleModel; import org.geoserver.geofence.gui.client.model.data.LayerDetailsInfo; import org.geoserver.geofence.gui.client.model.data.LayerStyle; import org.geoserver.geofence.gui.client.service.WorkspacesManagerRemoteServiceAsync; import org.geoserver.geofence.gui.client.widget.GeofenceFormBindingWidget; import it.geosolutions.geogwt.gui.client.Resources; import java.util.List; import com.extjs.gxt.ui.client.data.BaseListLoader; import com.extjs.gxt.ui.client.data.ListLoadResult; import com.extjs.gxt.ui.client.data.ModelData; import com.extjs.gxt.ui.client.data.RpcProxy; import com.extjs.gxt.ui.client.event.ButtonEvent; import com.extjs.gxt.ui.client.event.Events; import com.extjs.gxt.ui.client.event.FieldEvent; import com.extjs.gxt.ui.client.event.Listener; import com.extjs.gxt.ui.client.event.SelectionListener; import com.extjs.gxt.ui.client.mvc.Dispatcher; import com.extjs.gxt.ui.client.store.ListStore; import com.extjs.gxt.ui.client.widget.button.Button; import com.extjs.gxt.ui.client.widget.form.ComboBox; import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction; import com.extjs.gxt.ui.client.widget.form.FieldSet; import com.extjs.gxt.ui.client.widget.form.FormPanel; import com.extjs.gxt.ui.client.widget.form.TextArea; import com.extjs.gxt.ui.client.widget.layout.FormLayout; import com.google.gwt.user.client.rpc.AsyncCallback; import org.geoserver.geofence.gui.client.model.data.ClientCatalogMode; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; /** * The Class RuleDetailsInfoWidget. * * @author Tobia di Pisa * */ public class RuleDetailsInfoWidget extends GeofenceFormBindingWidget<LayerDetailsInfo> { /** The rule. */ private RuleModel theRule; /** The workspaces service. */ private WorkspacesManagerRemoteServiceAsync workspacesService; /** The rule details widget. */ private RuleDetailsWidget ruleDetailsWidget; /** The combo styles. */ private ComboBox<LayerStyle> comboStyles; /** The cql filter read. */ private TextArea cqlFilterRead; /** The cql filter write. */ private TextArea cqlFilterWrite; private ComboBox<ClientCatalogMode> catalogModeBox; /** The allowed area. */ private TextArea allowedArea; private Button draw; private Map<String, ClientCatalogMode> nameMode = new HashMap<String, ClientCatalogMode>(); /** * Instantiates a new rule details info widget. * * @param model * the model * @param workspacesService * the workspaces service * @param ruleDetailsWidget * the rule details widget */ public RuleDetailsInfoWidget(RuleModel model, WorkspacesManagerRemoteServiceAsync workspacesService, RuleDetailsWidget ruleDetailsWidget) { this.theRule = model; this.workspacesService = workspacesService; this.ruleDetailsWidget = ruleDetailsWidget; formPanel = createFormPanel(); initModeMap(); } /* (non-Javadoc) * @see org.geoserver.geofence.gui.client.widget.GeofenceFormBindingWidget#createFormPanel() */ @Override public FormPanel createFormPanel() { FormPanel fp = new FormPanel(); fp.setFrame(true); fp.setHeaderVisible(false); fp.setHeight(400); fp.setWidth(650); FieldSet fieldSet = new FieldSet(); fieldSet.setHeading("Layer Details"); fieldSet.setCheckboxToggle(false); fieldSet.setCollapsible(false); FormLayout layout = new FormLayout(); fieldSet.setLayout(layout); comboStyles = new ComboBox<LayerStyle>(); comboStyles.setFieldLabel("Default Style"); comboStyles.setEmptyText("Select a Style"); comboStyles.setId(BeanKeyValue.STYLES_COMBO.getValue()); comboStyles.setName(BeanKeyValue.STYLES_COMBO.getValue()); comboStyles.setDisplayField(BeanKeyValue.STYLES_COMBO.getValue()); comboStyles.setEditable(false); comboStyles.setAllowBlank(true); comboStyles.setForceSelection(false); comboStyles.setStore(getAvailableStyles(theRule)); comboStyles.setTypeAhead(true); comboStyles.setTriggerAction(TriggerAction.ALL); comboStyles.addListener(Events.Select, new Listener<FieldEvent>() { public void handleEvent(FieldEvent be) { ruleDetailsWidget.enableSaveButton(); } }); fieldSet.add(comboStyles); cqlFilterRead = new TextArea(); cqlFilterRead.setFieldLabel("CQL Read"); cqlFilterRead.setWidth(200); cqlFilterRead.setPreventScrollbars(true); cqlFilterRead.addListener(Events.Change, new Listener<FieldEvent>() { public void handleEvent(FieldEvent be) { ruleDetailsWidget.enableSaveButton(); } }); fieldSet.add(cqlFilterRead); cqlFilterWrite = new TextArea(); cqlFilterWrite.setFieldLabel("CQL Write"); cqlFilterWrite.setWidth(200); cqlFilterWrite.setEnabled(true); cqlFilterWrite.setPreventScrollbars(true); cqlFilterWrite.addListener(Events.Change, new Listener<FieldEvent>() { public void handleEvent(FieldEvent be) { ruleDetailsWidget.enableSaveButton(); } }); fieldSet.add(cqlFilterWrite); catalogModeBox = new ComboBox<ClientCatalogMode>(); catalogModeBox.setFieldLabel("Catalog Mode"); catalogModeBox.setId(BeanKeyValue.CATALOG_MODE.getValue()); catalogModeBox.setName(BeanKeyValue.CATALOG_MODE.getValue()); catalogModeBox.setDisplayField(BeanKeyValue.CATALOG_MODE.getValue()); catalogModeBox.setWidth(70); catalogModeBox.setEditable(false); catalogModeBox.setStore(getAvailableCatalogModes()); catalogModeBox.setTriggerAction(ComboBox.TriggerAction.ALL); catalogModeBox.addListener(Events.Select, new Listener<FieldEvent>() { public void handleEvent(FieldEvent be) { ruleDetailsWidget.enableSaveButton(); } } ); fieldSet.add(catalogModeBox); allowedArea = new TextArea(); allowedArea.setFieldLabel("Allowed Area"); allowedArea.setWidth(200); allowedArea.setPreventScrollbars(true); allowedArea.addListener(Events.Change, new Listener<FieldEvent>() { public void handleEvent(FieldEvent be) { ruleDetailsWidget.enableSaveButton(); } }); fieldSet.add(allowedArea); draw = new Button(I18nProvider.getMessages().drawAoiButton(), new SelectionListener<ButtonEvent>() { @Override public void componentSelected(ButtonEvent ce) { Dispatcher.forwardEvent(GeofenceEvents.ACTIVATE_DRAW_FEATURES, RuleDetailsInfoWidget.this); Dispatcher.forwardEvent(GeofenceEvents.RULE_EDITOR_DIALOG_HIDE); } }); draw.setIcon(Resources.ICONS.drawFeature()); fp.add(fieldSet); ruleDetailsWidget.getToolBar().add(draw); return fp; } /** * Gets the model data. * * @return the model data */ public LayerDetailsInfo getModelData() { LayerDetailsInfo layerDetailsForm = new LayerDetailsInfo(); String area = allowedArea.getValue(); String wkt, srid; if (area != null) { if (area.indexOf("SRID=") != -1) { String[] allowedAreaArray = area.split(";"); srid = allowedAreaArray[0].split("=")[1]; wkt = allowedAreaArray[1]; } else { srid = "4326"; wkt = area; } } else { srid = null; wkt = null; } layerDetailsForm.setAllowedArea(wkt); layerDetailsForm.setSrid(srid); layerDetailsForm.setCqlFilterRead(cqlFilterRead.getValue()); layerDetailsForm.setCqlFilterWrite(cqlFilterWrite.getValue()); LayerStyle layerStyle = comboStyles.getValue(); if (layerStyle != null) { layerDetailsForm.setDefaultStyle(layerStyle.getStyle()); } else { layerDetailsForm.setDefaultStyle(null); } layerDetailsForm.setCatalogMode(catalogModeBox.getValue()); layerDetailsForm.setRuleId(theRule.getId()); return layerDetailsForm; } /** * @return the ruleDetailsWidget */ public RuleDetailsWidget getRuleDetailsWidget() { return ruleDetailsWidget; } /** * Bind model data. * * @param layerDetailsInfo * the layer details info */ public void bindModelData(LayerDetailsInfo layerDetailsInfo) { this.bindModel(layerDetailsInfo); String defaultStyle = layerDetailsInfo.getDefaultStyle(); if (defaultStyle != null) { comboStyles.setValue(new LayerStyle(defaultStyle)); } String cqlRead = layerDetailsInfo.getCqlFilterRead(); if (cqlRead != null) { cqlFilterRead.setValue(cqlRead); } String cqlWrite = layerDetailsInfo.getCqlFilterWrite(); if (cqlWrite != null) { cqlFilterWrite.setValue(cqlWrite); } String area = layerDetailsInfo.getAllowedArea(); String srid = layerDetailsInfo.getSrid(); if ((area != null) && (srid != null)) { allowedArea.setValue("SRID=" + srid + ";" + area); } if(layerDetailsInfo.getCatalogMode() != null) { // get local instance ClientCatalogMode lcm = nameMode.get(layerDetailsInfo.getCatalogMode().getCatalogMode()); catalogModeBox.setValue(lcm); } else { catalogModeBox.setValue(ClientCatalogMode.DEFAULT); Dispatcher.forwardEvent( GeofenceEvents.SEND_INFO_MESSAGE, new String[] { "Info", "CatalogMode is null"}); } } /** * Gets the available styles. * * @param rule * the rule * @return the available styles */ private ListStore<LayerStyle> getAvailableStyles(final RuleModel rule) { RpcProxy<List<LayerStyle>> workspacesProxy = new RpcProxy<List<LayerStyle>>() { @Override protected void load(Object loadConfig, AsyncCallback<List<LayerStyle>> callback) { workspacesService.getStyles(rule, callback); } }; BaseListLoader<ListLoadResult<ModelData>> workspacesLoader = new BaseListLoader<ListLoadResult<ModelData>>( workspacesProxy); workspacesLoader.setRemoteSort(false); ListStore<LayerStyle> geoserverStyles = new ListStore<LayerStyle>(workspacesLoader); return geoserverStyles; } private ListStore<ClientCatalogMode> getAvailableCatalogModes() { ListStore<ClientCatalogMode> ret = new ListStore<ClientCatalogMode>(); List<ClientCatalogMode> list = new ArrayList<ClientCatalogMode>(); list.add(ClientCatalogMode.DEFAULT); list.add(ClientCatalogMode.HIDE); list.add(ClientCatalogMode.MIXED); list.add(ClientCatalogMode.CHALLENGE); ret.add(list); return ret; } /** * @param allowedArea the allowedArea to set */ public void setAllowedArea(TextArea allowedArea) { this.allowedArea = allowedArea; } /** * @return the allowedArea */ public TextArea getAllowedArea() { return allowedArea; } /** * Disable cql filter buttons. */ public void disableCQLFilterButtons() { this.cqlFilterRead.disable(); this.cqlFilterWrite.disable(); } /** * Enable cql filter buttons. */ public void enableCQLFilterButtons() { this.cqlFilterRead.enable(); this.cqlFilterWrite.enable(); } private void initModeMap() { nameMode.put(ClientCatalogMode.NAME_DEFAULT, ClientCatalogMode.DEFAULT); nameMode.put(ClientCatalogMode.NAME_HIDE, ClientCatalogMode.HIDE); nameMode.put(ClientCatalogMode.NAME_MIXED, ClientCatalogMode.MIXED); nameMode.put(ClientCatalogMode.NAME_CHALLENGE, ClientCatalogMode.CHALLENGE); } }