/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 org.apache.wicket.markup.html.form; import org.apache.wicket.Application; import org.apache.wicket.Component; import org.apache.wicket.util.lang.Classes; /** * {@link IChoiceRenderer} implementation that makes it easy to work with java 5 enums. This * renderer will attempt to lookup strings used for the display value using a localizer of a given * component. If the component is not specified, the global instance of localizer will be used for * lookups. * <p> * display value resource key format: {@code <enum.getSimpleClassName()>.<enum.name()>} * </p> * <p> * id value format: {@code <enum.name()>} * </p> * * @author igor.vaynberg * * @param <T> */ public class EnumChoiceRenderer<T extends Enum<T>> extends ChoiceRenderer<T> { private static final long serialVersionUID = 1L; /** * component used to resolve i18n resources for this renderer. */ private final Component resourceSource; /** * Constructor that creates the choice renderer that will use global instance of localizer to * resolve resource keys. */ public EnumChoiceRenderer() { this(null); } /** * Constructor * * @param resourceSource */ public EnumChoiceRenderer(Component resourceSource) { this.resourceSource = resourceSource; } /** {@inheritDoc} */ @Override public Object getDisplayValue(T object) { final String value; String key = resourceKey(object); if (resourceSource != null) { value = resourceSource.getString(key); } else { value = Application.get().getResourceSettings().getLocalizer().getString(key, null); } return value; } /** * Translates the {@code object} into resource key that will be used to lookup the value shown * to the user * * @param object * @return resource key */ protected String resourceKey(T object) { return Classes.simpleName(object.getDeclaringClass()) + '.' + object.name(); } /** {@inheritDoc} */ @Override public String getIdValue(T object, int index) { return object.name(); } }