/* * 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.WicketRuntimeException; import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.model.IModel; import org.apache.wicket.util.convert.ConversionException; import org.apache.wicket.util.visit.IVisit; import org.apache.wicket.util.visit.IVisitor; /** * Component used to connect instances of Radio components into a group. Instances of Radio have to * be in the component hierarchy somewhere below the group component. The model object of the group * is set to the model object of the selected radio component or null if none selected. * * ie * * <pre> * <span wicket:id="radiochoicegroup"> * ... * <input type="radio" wicket:id="singleradiochoice1"/>choice 1 * ... * <input type="radio" wicket:id="singleradiochoice2"/>choice 2 * ... * </span> * </pre> * * @author Igor Vaynberg * @author Sven Meier (svenmeier) * * @param <T> * The model object type */ public class RadioGroup<T> extends FormComponent<T> { private static final long serialVersionUID = 1L; /** * @see WebMarkupContainer#WebMarkupContainer(String) */ public RadioGroup(String id) { super(id); setRenderBodyOnly(true); } /** * @param id * @param model * @see WebMarkupContainer#WebMarkupContainer(String, IModel) */ public RadioGroup(String id, IModel<T> model) { super(id, model); setRenderBodyOnly(true); } @Override protected String getModelValue() { String radioValue = visitChildren(Radio.class, new IVisitor<Radio<T>, String>() { @Override public void component(Radio<T> radio, IVisit<String> visit) { if (getModelComparator().compare(RadioGroup.this, radio.getDefaultModelObject())) { visit.stop(radio.getValue()); } } }); return radioValue; } /** * @see org.apache.wicket.markup.html.form.FormComponent#convertValue(String[]) */ @Override protected T convertValue(String[] input) throws ConversionException { if (input != null && input.length > 0) { final String value = input[0]; // retrieve the selected single radio choice component Radio<T> choice = visitChildren(Radio.class, new org.apache.wicket.util.visit.IVisitor<Radio<T>, Radio<T>>() { @Override public void component(final Radio<T> radio, final IVisit<Radio<T>> visit) { if (radio.getValue().equals(value)) { visit.stop(radio); } } }); if (choice == null) { throw new WicketRuntimeException( "submitted http post value [" + value + "] for RadioGroup component [" + getPath() + "] is illegal because it does not point to a Radio component. " + "Due to this the RadioGroup component cannot resolve the selected Radio component pointed to by the illegal value. A possible reason is that component hierarchy changed between rendering and form submission."); } // assign the value of the group's model return choice.getModelObject(); } return null; } /** * @see org.apache.wicket.markup.html.form.FormComponent#onComponentTag(org.apache.wicket.markup.ComponentTag) */ @Override protected void onComponentTag(ComponentTag tag) { super.onComponentTag(tag); // No longer applicable, breaks XHTML validation. tag.remove("disabled"); tag.remove("name"); } }