/* * This library is part of OpenCms - * the Open Source Content Management System * * Copyright (c) Alkacon Software GmbH (http://www.alkacon.com) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * For further information about Alkacon Software, please see the * company website: http://www.alkacon.com * * For further information about OpenCms, please see the * project website: http://www.opencms.org * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package org.opencms.gwt.client.ui.input.form; import org.opencms.gwt.client.ui.input.CmsRegexValidator; import org.opencms.gwt.client.ui.input.I_CmsFormField; import org.opencms.gwt.client.ui.input.I_CmsFormWidget; import org.opencms.gwt.client.ui.input.I_CmsHasGhostValue; import org.opencms.gwt.client.ui.input.I_CmsStringModel; import org.opencms.gwt.client.validation.I_CmsValidator; import org.opencms.util.CmsStringUtil; import org.opencms.xml.content.CmsXmlContentProperty; import java.util.Collection; import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.event.shared.HandlerRegistration; /** * Basic implementation of the I_CmsFormField class.<p> * * @since 8.0.0 */ public class CmsBasicFormField implements I_CmsFormField { /** The default value of the form field. */ private Object m_defaultValue; /** Description for the form field. */ private String m_description; /** Handler registration of the ValueChangeHandler for the string model object, if available. */ private HandlerRegistration m_handlerRegistration; /** Id of the form field.*/ private String m_id; /** Label of the form field. */ private String m_label; /** A map of strings containing layout information for rendering the field's widget. */ private LayoutData m_layoutData = new LayoutData(); /** The string model. */ private I_CmsStringModel m_model; /** The current validation status (only used if the field has a validator). */ private I_CmsFormField.ValidationStatus m_validationStatus = I_CmsFormField.ValidationStatus.unknown; /** Validator of the form field. */ private I_CmsValidator m_validator; /** Widget of the form field. */ private I_CmsFormWidget m_widget; /** * Constructs a new form field.<p> * * @param id the id of the form field * @param description the description of the form field * @param label the label of the form field * @param defaultValue the default value of the form field * @param widget the widget of the form field */ public CmsBasicFormField(String id, String description, String label, Object defaultValue, I_CmsFormWidget widget) { super(); m_id = id; m_description = description; m_label = label; m_widget = widget; m_defaultValue = defaultValue; } /** * Utility method for creating a single basic form field from an id and a property configuration. * * @param propertyConfig the configuration of the property * * @return the newly created form field */ public static CmsBasicFormField createField(CmsXmlContentProperty propertyConfig) { return createField(propertyConfig, Collections.<String, String> emptyMap()); } /** * Utility method for creating a basic form field.<p> * * @param propertyConfig the property configuration * @param additionalParams the additional parameters * * @return the newly created form fields */ public static CmsBasicFormField createField( CmsXmlContentProperty propertyConfig, Map<String, String> additionalParams) { return createField( propertyConfig, propertyConfig.getName(), CmsWidgetFactoryRegistry.instance(), additionalParams, false); } /** * Utility method for creating a single basic form field from an id and a property configuration. * * @param propertyConfig the configuration of the property * @param fieldId the field id * @param factory a factory for creating form widgets * @param additionalParams * @param alwaysAllowEmpty * * @return the newly created form field */ public static CmsBasicFormField createField( CmsXmlContentProperty propertyConfig, String fieldId, I_CmsFormWidgetMultiFactory factory, Map<String, String> additionalParams, boolean alwaysAllowEmpty) { String widgetConfigStr = propertyConfig.getWidgetConfiguration(); if (widgetConfigStr == null) { widgetConfigStr = ""; } String label = propertyConfig.getNiceName(); if (label == null) { label = propertyConfig.getName(); } String description = propertyConfig.getDescription(); if (CmsStringUtil.isEmpty(description)) { description = ""; } Map<String, String> widgetConfig = CmsStringUtil.splitAsMap(widgetConfigStr, "|", ":"); widgetConfig.putAll(additionalParams); String widgetType = propertyConfig.getWidget(); I_CmsFormWidget widget = factory.createFormWidget(widgetType, widgetConfig); CmsBasicFormField field = new CmsBasicFormField( fieldId, description, label, propertyConfig.getDefault(), widget); String ruleRegex = propertyConfig.getRuleRegex(); if (!CmsStringUtil.isEmpty(ruleRegex)) { field.setValidator(new CmsRegexValidator(ruleRegex, propertyConfig.getError(), alwaysAllowEmpty)); } return field; } /** * Creates a map of fields from a map of field configurations.<p> * * @param propertyConfigurations the map of field configurations * * @return a map of form fields */ public static Map<String, I_CmsFormField> createFields(Collection<CmsXmlContentProperty> propertyConfigurations) { // using LinkedHashMap to preserve the order Map<String, I_CmsFormField> result = new LinkedHashMap<String, I_CmsFormField>(); for (CmsXmlContentProperty propConfig : propertyConfigurations) { CmsBasicFormField field = createField(propConfig); result.put(propConfig.getName(), field); } return result; } /** * @see org.opencms.gwt.client.ui.input.I_CmsFormField#bind(org.opencms.gwt.client.ui.input.I_CmsStringModel) */ public void bind(I_CmsStringModel model) { assert m_model == null; m_model = model; m_handlerRegistration = m_model.addValueChangeHandler(new ValueChangeHandler<String>() { public void onValueChange(ValueChangeEvent<String> event) { I_CmsFormWidget widget = getWidget(); if (widget instanceof I_CmsHasGhostValue) { ((I_CmsHasGhostValue)widget).setGhostMode(false); } widget.setFormValueAsString(event.getValue()); } }); } /** * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object o) { return (o instanceof CmsBasicFormField) && ((CmsBasicFormField)o).getId().equals(m_id); } /** * @see org.opencms.gwt.client.ui.input.I_CmsFormField#getDefaultValue() */ public Object getDefaultValue() { return m_defaultValue; } /** * @see org.opencms.gwt.client.ui.input.I_CmsFormField#getDescription() */ public String getDescription() { return m_description; } /** * @see org.opencms.gwt.client.ui.input.I_CmsFormField#getId() */ public String getId() { return m_id; } /** * @see org.opencms.gwt.client.ui.input.I_CmsFormField#getLabel() */ public String getLabel() { return m_label; } /** * @see org.opencms.gwt.client.ui.input.I_CmsFormField#getLayoutData() */ public LayoutData getLayoutData() { return m_layoutData; } /** * @see org.opencms.gwt.client.ui.input.I_CmsFormField#getModel() */ public I_CmsStringModel getModel() { return m_model; } /** * @see org.opencms.gwt.client.ui.input.I_CmsFormField#getModelId() */ public String getModelId() { if (m_model != null) { return m_model.getId(); } return getId(); } /** * @see org.opencms.gwt.client.ui.input.I_CmsFormField#getModelValue() */ public String getModelValue() { if (m_model != null) { return m_model.getValue(); } return getWidget().getFormValueAsString(); } /** * @see org.opencms.gwt.client.ui.input.I_CmsFormField#getValidationStatus() */ public I_CmsFormField.ValidationStatus getValidationStatus() { return m_validator != null ? m_validationStatus : I_CmsFormField.ValidationStatus.valid; } /** * @see org.opencms.gwt.client.ui.input.I_CmsFormField#getValidator() */ public I_CmsValidator getValidator() { return m_validator; } /** * @see org.opencms.gwt.client.ui.input.I_CmsFormField#getWidget() */ public I_CmsFormWidget getWidget() { return m_widget; } /** * @see java.lang.Object#hashCode() */ @Override public int hashCode() { return m_id.hashCode(); } /** * @see org.opencms.gwt.client.ui.input.I_CmsFormField#setId(java.lang.String) */ public void setId(String id) { m_id = id; } /** * @see org.opencms.gwt.client.ui.input.I_CmsFormField#setValidationStatus(org.opencms.gwt.client.ui.input.I_CmsFormField.ValidationStatus) */ public void setValidationStatus(I_CmsFormField.ValidationStatus validationStatus) { if (m_validator != null) { m_validationStatus = validationStatus; } } /** * @see org.opencms.gwt.client.ui.input.I_CmsFormField#setValidator(org.opencms.gwt.client.validation.I_CmsValidator) */ public void setValidator(I_CmsValidator validator) { m_validator = validator; } /** * @see org.opencms.gwt.client.ui.input.I_CmsFormField#unbind() */ public void unbind() { if (m_handlerRegistration != null) { m_handlerRegistration.removeHandler(); m_handlerRegistration = null; } } }