/**
* Copyright (C) 2010 Asterios Raptis
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.alpharogroup.wicket.components.form;
import java.util.List;
import org.apache.wicket.markup.html.form.IChoiceRenderer;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.IModel;
import org.apache.wicket.util.convert.IConverter;
/**
* A base ListView that provides conveniences for rendering its items using an IChoiceRenderer.
*
* This class is inspired from fiftyfive.wicket.core project. Some changes with the generic types
* was done.
*
* @param <T>
* the generic type
*/
public abstract class ChoicesListView<T> extends ListView<T>
{
/**
* The serialVersionUID.
*/
private static final long serialVersionUID = 1L;
/** The choice renderer. */
private final IChoiceRenderer<T> choiceRenderer;
/**
* Construct a list view that will expose the specified IChoiceRenderer for rendering its list
* items.
*
* @param id
* the id
* @param choices
* the list of choices
* @param renderer
* the choice renderer
*/
public ChoicesListView(final String id, final IModel<List<T>> choices,
final IChoiceRenderer<T> renderer)
{
super(id, choices);
this.choiceRenderer = renderer;
}
/**
* Convenience method exposed to subclasses for determining the display value of a given list
* item. This delegates to {@link IChoiceRenderer#getDisplayValue getDisplayValue()} on the
* IChoiceRenderer. The display value will be coverted to a String if necessary using Wicket's
* {@link IConverter} system.
*
* @param choice
* The current value of the list that is being rendered.
* @return the choice label
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
protected String getChoiceLabel(final T choice)
{
// This code was copied from Wicket's CheckBoxMultipleChoice.java
final Object displayValue = getChoiceRenderer().getDisplayValue(choice);
final Class<?> objectClass = displayValue == null ? null : displayValue.getClass();
// Get label for choice
String label = "";
if ((objectClass != null) && (objectClass != String.class))
{
final IConverter converter = getConverter(objectClass);
label = converter.convertToString(displayValue, getLocale());
}
else if (displayValue != null)
{
label = displayValue.toString();
}
return label;
}
/**
* Returns the IChoiceRenderer that was passed to the constructor.
*
* @return the choice renderer
*/
public IChoiceRenderer<T> getChoiceRenderer()
{
return this.choiceRenderer;
}
/**
* Convenience method exposed to subclasses for determining the unique ID of the given list
* item. This delegates to {@link IChoiceRenderer#getIdValue getIdValue()} on the
* IChoiceRenderer.
*
* @param choice
* The current value of the list that is being rendered.
* @param index
* The zero-indexed position of that value in the list.
* @return the choice value
*/
protected String getChoiceValue(final T choice, final int index)
{
return getChoiceRenderer().getIdValue(choice, index);
}
}