/////////////////////////////////////////////////////////////////////////////
//
// Project ProjectForge Community Edition
// www.projectforge.org
//
// Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de)
//
// ProjectForge is dual-licensed.
//
// This community edition is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation; version 3 of the License.
//
// This community edition 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 General
// Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, see http://www.gnu.org/licenses/.
//
/////////////////////////////////////////////////////////////////////////////
package org.projectforge.web.wicket.components;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.wicket.Component;
import org.apache.wicket.markup.html.form.IChoiceRenderer;
import org.projectforge.common.ILabelValueBean;
import org.projectforge.core.BaseDO;
import org.projectforge.core.I18nEnum;
/**
* @author Kai Reinhard (k.reinhard@micromata.de)
*/
public class LabelValueChoiceRenderer<T> implements IChoiceRenderer<T>
{
private static final long serialVersionUID = -5832080496659840226L;
private List<T> values;
private Map<T, String> displayValues;
/**
*/
public LabelValueChoiceRenderer()
{
this.values = new ArrayList<T>();
this.displayValues = new HashMap<T, String>();
}
/**
* Creates already entries from the given enum. Works only if T is from type I18nEnum.
* @param parent Only needed for internationalization.
* @param i18nEnum if not enum and not from type T a class cast exception will be thrown.
* @see Component#getString(String)
*/
@SuppressWarnings("unchecked")
public LabelValueChoiceRenderer(final Component parent, final I18nEnum[] values)
{
this();
for (final I18nEnum value : values) {
addValue((T) value, parent.getString(value.getI18nKey()));
}
}
/**
* Works only if T is from type String.
* @param values if the elements are not from type ILabelValueBean<String, T> a class cast exception will be thrown.
* @see Component#getString(String)
*/
@SuppressWarnings("unchecked")
public LabelValueChoiceRenderer(final String... values)
{
this();
for (final String value : values) {
addValue((T) value, value);
}
}
/**
* Creates already entries from the given enum.
* @param values if the elements are not from type ILabelValueBean<String, T> a class cast exception will be thrown.
* @see Component#getString(String)
*/
public LabelValueChoiceRenderer(final List<T> values)
{
this();
if (values == null) {
return;
}
for (final Object value : values) {
@SuppressWarnings("unchecked")
final ILabelValueBean<String, T> labelValue = (ILabelValueBean<String, T>) value;
addValue(labelValue.getValue(), labelValue.getLabel());
}
}
/**
* @param values if the elements are not from type ILabelValueBean<String, T> a class cast exception will be thrown.
* @return This for chaining.
*/
public LabelValueChoiceRenderer<T> setValues(final T... values)
{
for (final Object value : values) {
@SuppressWarnings("unchecked")
final ILabelValueBean<String, T> labelValue = (ILabelValueBean<String, T>) value;
addValue(labelValue.getValue(), labelValue.getLabel());
}
return this;
}
/**
* @return This for chaining.
*/
@SuppressWarnings("unchecked")
public LabelValueChoiceRenderer<T> setValueArray(final String[] values)
{
for (final String value : values) {
addValue((T) value, value);
}
return this;
}
/**
* @return This for chaining.
*/
public LabelValueChoiceRenderer<T> clear() {
this.values.clear();
this.displayValues.clear();
return this;
}
public LabelValueChoiceRenderer<T> addValue(final T value, final String displayValue)
{
this.values.add(value);
this.displayValues.put(value, displayValue);
return this;
}
public LabelValueChoiceRenderer<T> addValue(final int index, final T value, final String displayValue)
{
this.values.add(index, value);
this.displayValues.put(value, displayValue);
return this;
}
/**
* Sort the entries by label.
* @return This for chaining.
*/
public LabelValueChoiceRenderer<T> sortLabels()
{
Collections.sort(values, new Comparator<T>() {
@Override
public int compare(final T value1, final T value2)
{
final String label1 = displayValues.get(value1).toLowerCase();
final String label2 = displayValues.get(value2).toLowerCase();
return label1.compareTo(label2);
}
});
return this;
}
public List<T> getValues()
{
return values;
}
/**
* Please note: This method does not check wether the given object is an entry of the year list or not.
* @return given integer as String or "[minYear]-[maxYear]" if value is -1.
* @see org.apache.wicket.markup.html.form.IChoiceRenderer#getDisplayValue(java.lang.Object)
*/
public Object getDisplayValue(final T object)
{
return this.displayValues.get(object);
}
public String getIdValue(final T object, final int index)
{
if (object == null) {
return "";
}
if (object instanceof BaseDO) {
return String.valueOf(((BaseDO<?>)object).getId());
}
return object.toString();
}
}