/** * Copyright (C) 2014 Premium Minds. * * This file is part of wicket-crudifier. * * wicket-crudifier 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 3 of the License, or (at your option) any * later version. * * wicket-crudifier 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. * * You should have received a copy of the GNU Lesser General Public License * along with wicket-crudifier. If not, see <http://www.gnu.org/licenses/>. */ package com.premiumminds.wicket.crudifier.form.elements; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; import org.apache.wicket.Application; import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.Localizer; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.form.FormComponent; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.StringResourceModel; import org.apache.wicket.util.convert.IConverter; import org.apache.wicket.util.string.Strings; import org.apache.wicket.util.string.interpolator.VariableInterpolator; import org.apache.wicket.validation.IErrorMessageSource; import com.premiumminds.webapp.wicket.validators.HibernateValidatorProperty; import com.premiumminds.wicket.crudifier.form.CrudifierEntitySettings; public abstract class AbstractControlGroup<T> extends Panel { private static final long serialVersionUID = 6551088390404506493L; private String propertyName; private Component resourceBase; private Class<?> type; private boolean required; private CrudifierEntitySettings entitySettings; public AbstractControlGroup(String id, IModel<T> model) { super(id, model); } public void init(String propertyName, Component resourceBase, boolean required, Class<?> type, CrudifierEntitySettings entitySettings){ this.propertyName = propertyName; this.resourceBase = resourceBase; this.type = type; this.required = required; this.entitySettings = entitySettings; } @Override protected void onInitialize() { super.onInitialize(); getFormComponent().add(new HibernateValidatorProperty(getResourceBase().getDefaultModel(), getPropertyName())); StringResourceModel labelModel = new StringResourceModel(getPropertyName()+".label", resourceBase, getModel()); labelModel.setDefaultValue(getPropertyName()); getFormComponent().setLabel(labelModel); getFormComponent().setRequired(required); } public abstract FormComponent<T> getFormComponent(); @SuppressWarnings("unchecked") public IModel<T> getModel(){ return (IModel<T>) getDefaultModel(); } public String getPropertyName() { return propertyName; } public Component getResourceBase(){ return resourceBase; } public Class<?> getType() { return type; } public CrudifierEntitySettings getEntitySettings(){ return entitySettings; } protected void addInputBoxGridSize(WebMarkupContainer inputBox){ String css = "col-lg-10"; // default if(getEntitySettings().getGridFieldsSizes().containsKey(getPropertyName())){ switch(getEntitySettings().getGridFieldsSizes().get(getPropertyName())){ case COL1: css = "col-lg-1"; break; case COL2: css = "col-lg-2"; break; case COL3: css = "col-lg-3"; break; case COL4: css = "col-lg-4"; break; case COL5: css = "col-lg-5"; break; case COL6: css = "col-lg-6"; break; case COL7: css = "col-lg-7"; break; case COL8: css = "col-lg-8"; break; case COL9: css = "col-lg-9"; break; default: break; } } inputBox.add(AttributeModifier.append("class", css)); } /** * Copiado do FormComponent.MessageSource * * {@link IErrorMessageSource} used for error messages against this form components. * * @author ivaynberg */ protected class MessageSource implements IErrorMessageSource { private final Set<String> triedKeys = new LinkedHashSet<String>(); public MessageSource() { // TODO Auto-generated constructor stub } /** * @see org.apache.wicket.validation.IErrorMessageSource#getMessage(String, java.util.Map) */ public String getMessage(String key, Map<String, Object> vars) { final AbstractControlGroup<T> formComponent = AbstractControlGroup.this; // Use the following log4j config for detailed logging on the property resolution // process // log4j.logger.org.apache.wicket.resource.loader=DEBUG // log4j.logger.org.apache.wicket.Localizer=DEBUG final Localizer localizer = formComponent.getLocalizer(); // retrieve prefix that will be used to construct message keys String prefix = getFormComponent().getValidatorKeyPrefix(); String message = null; // first try the full form of key [form-component-id].[prefix].[key] String resource = getPropertyName() + "." + prefix(prefix, key); message = getString(localizer, resource, resourceBase); // if not found, try a more general form (without prefix) // [form-component-id].[key] if (Strings.isEmpty(message) && Strings.isEmpty(prefix)) { resource = getPropertyName() + "." + key; message = getString(localizer, resource, resourceBase); } // If not found try a more general form [prefix].[key] if (Strings.isEmpty(message)) { resource = prefix(prefix, key); message = getString(localizer, resource, formComponent); } // If not found try the most general form [key] if (Strings.isEmpty(message)) { // Try a variation of the resource key message = getString(localizer, key, formComponent); } // convert empty string to null in case our default value of "" was // returned from localizer if (Strings.isEmpty(message)) { message = null; } else { message = substitute(message, addDefaultVars(vars)); } return message; } private String prefix(String prefix, String key) { if (!Strings.isEmpty(prefix)) { return prefix + "." + key; } else { return key; } } /** * * @param localizer * @param key * @param component * @return string */ private String getString(Localizer localizer, String key, Component component) { triedKeys.add(key); // Note: It is important that the default value of "" is // provided to getString() not to throw a MissingResourceException or to // return a default string like "[Warning: String ..." return localizer.getString(key, component, ""); } private String substitute(String string, final Map<String, Object> vars) throws IllegalStateException { return new VariableInterpolator(string, Application.get() .getResourceSettings() .getThrowExceptionOnMissingResource()) { private static final long serialVersionUID = 1L; @SuppressWarnings({ "rawtypes", "unchecked" }) @Override protected String getValue(String variableName) { Object value = vars.get(variableName); if (value == null) { return null; } else { IConverter converter = getConverter(value.getClass()); if (converter == null) { return Strings.toString(value); } else { return converter.convertToString(value, getLocale()); } } } }.toString(); } /** * Creates a new params map that additionally contains the default input, name, label * parameters * * @param params * original params map * @return new params map */ private Map<String, Object> addDefaultVars(Map<String, Object> params) { // create and fill the new params map final HashMap<String, Object> fullParams; if (params == null) { fullParams = new HashMap<String, Object>(6); } else { fullParams = new HashMap<String, Object>(params.size() + 6); fullParams.putAll(params); } // add the input param if not already present if (!fullParams.containsKey("input")) { fullParams.put("input", getFormComponent().getInput()); } // add the name param if not already present if (!fullParams.containsKey("name")) { fullParams.put("name", getPropertyName()); } // add the label param if not already present if (!fullParams.containsKey("label")) { fullParams.put("label", getLabel()); } return fullParams; } /** * @return value of label param for this form component */ private String getLabel() { String label = null; // first try the label model ... if (getFormComponent().getLabel() != null) { label = getFormComponent().getLabel().getObject(); } // ... then try a resource of format [form-component-id] with // default of '[form-component-id]' if (label == null) { label = getFormComponent().getDefaultLabel(); } return label; } } }