/** * Copyright 2014 55 Minutes (http://www.55minutes.com) * * 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 fiftyfive.wicket.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. * * @since 2.0 */ public abstract class ChoicesListView<T> extends ListView<T> { private IChoiceRenderer<? super T> choiceRenderer; /** * Construct a list view that will expose the specified IChoiceRenderer for * rendering its list items. */ public ChoicesListView(String id, IModel<? extends List<? extends T>> choices, IChoiceRenderer<? super T> renderer) { super(id, choices); this.choiceRenderer = renderer; } /** * Returns the IChoiceRenderer that was passed to the constructor. */ public IChoiceRenderer<? super T> getChoiceRenderer() { return this.choiceRenderer; } /** * 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. */ protected String getChoiceLabel(T choice) { // This code was copied from Wicket's CheckBoxMultipleChoice.java Object displayValue = getChoiceRenderer().getDisplayValue(choice); Class<?> objectClass = displayValue == null ? null : displayValue.getClass(); // Get label for choice String label = ""; if (objectClass != null && objectClass != String.class) { IConverter converter = getConverter(objectClass); label = converter.convertToString(displayValue, getLocale()); } else if (displayValue != null) { label = displayValue.toString(); } return label; } /** * 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. */ protected String getChoiceValue(T choice, int index) { return getChoiceRenderer().getIdValue(choice, index); } }