/**
* 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.view;
import java.beans.PropertyDescriptor;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.wicket.IGenericComponent;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.RepeatingView;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.StringResourceModel;
import com.premiumminds.wicket.crudifier.IObjectRenderer;
import com.premiumminds.wicket.crudifier.LabelProperty;
import com.premiumminds.wicket.crudifier.form.CrudifierEntitySettings;
public class CrudifierView<T> extends Panel implements IGenericComponent<T> {
private static final long serialVersionUID = -151637566983702881L;
private CrudifierEntitySettings entitySettings = new CrudifierEntitySettings();
private Map<Class<?>, IObjectRenderer<?>> renderers = new HashMap<Class<?>, IObjectRenderer<?>>();
public CrudifierView(String id, IModel<T> model) {
super(id, model);
StringResourceModel stringResourceModel = new StringResourceModel("legend", this, getModel());
stringResourceModel.setDefaultValue("Unknown");
add(new Label("legend", stringResourceModel){
private static final long serialVersionUID = -7854751811138463187L;
@Override
protected void onConfigure() {
super.onConfigure();
setVisible(!getDefaultModelObjectAsString().isEmpty());
}
});
}
@Override
protected void onConfigure() {
RepeatingView view = new RepeatingView("control");
if(null != getModelObject()) {
for(final String property : getPropertiesByOrder(getModelObject().getClass())){
WebMarkupContainer control = new WebMarkupContainer(view.newChildId());
view.addOrReplace(control);
StringResourceModel stringResourceModel = new StringResourceModel("controls."+property+".label", this, getModel());
stringResourceModel.setDefaultValue("Unknown");
control.addOrReplace(new Label("label", stringResourceModel));
control.addOrReplace(new LabelProperty("input", new PropertyModel<Object>(getModel(), property), renderers) {
private static final long serialVersionUID = 8561120757563362569L;
@Override
protected String getResourceString(String key, String defaultValue) {
return getLocalizer().getStringIgnoreSettings("controls."+property+"."+key, CrudifierView.this, null, defaultValue);
}
});
}
}
addOrReplace(view);
}
@Override
protected void onInitialize() {
super.onInitialize();
}
private Set<String> getPropertiesByOrder(Class<?> modelClass) {
Set<String> properties = new LinkedHashSet<String>();
for(String property : entitySettings.getOrderOfFields()){
if(!entitySettings.getHiddenFields().contains(property))
properties.add(property);
}
for(PropertyDescriptor descriptor : PropertyUtils.getPropertyDescriptors(modelClass)){
if(!entitySettings.getHiddenFields().contains(descriptor.getName()) &&
!properties.contains(descriptor.getName()) &&
!descriptor.getName().equals("class"))
properties.add(descriptor.getName());
}
return properties;
}
@SuppressWarnings("unchecked")
public IModel<T> getModel() {
return (IModel<T>) getDefaultModel();
}
public void setModel(IModel<T> model) {
setDefaultModel(model);
}
public void setModelObject(T object) {
setModelObject(object);
}
public T getModelObject() {
return getModel().getObject();
}
public CrudifierEntitySettings getEntitySettings() {
return entitySettings;
}
public void setEntitySettings(CrudifierEntitySettings entitySettings) {
this.entitySettings = entitySettings;
}
public Map<Class<?>, IObjectRenderer<?>> getRenderers() {
return renderers;
}
public void setRenderers(Map<Class<?>, IObjectRenderer<?>> renderers) {
this.renderers = renderers;
}
}