Sure, here it is below. Test selects a non-default value from
'publicLocationChoices' drop down. Problems are:
-on form submit, LocationSelectionPanel.convertInput() is not called (have
breakpoint there)
-in debugger, I can see dropDown's rawInput changing on form submit, but
model's object ('data') value is never updated
Test
public void testLocationSelectionPanel_SelectCohost() {
final WicketTester t = getTester();
final VirtualEventFormBean formBean = new VirtualEventFormBean();
formBean.setEventId(EVENT_ID);
formBean.setOrganizerId(currentUser.getId());
final EventLocation initialLocation =
virtualEventService.getCustomSpaceEventLocation(currentUser.getId());
formBean.setLocation(initialLocation);
LocationSelectionPanelTestPage p = new
LocationSelectionPanelTestPage(formBean);
t.startPage(p);
t.assertRenderedPage(LocationSelectionPanelTestPage.class);
DropDownChoice publicLocationsChoice = (DropDownChoice)
t.getComponentFromLastRenderedPage("form:location:publicLocationChoices");
//selecting component
FormTester ft = t.newFormTester("form");
//select cohost
ft.select("location:publicLocationChoices", 1); //select 1st public
location
//submit
ft.submit();
EventLocation newLocation = p.getFormBean().getLocation();
assertNotSame(initialLocation, newLocation);
assertTrue(newLocation instanceof PublicEventLocation);
}
Test Page
public class LocationSelectionPanelTestPage extends AbstractWebPage {
@SpringBean private VirtualEventService virtualEventService;
private final VirtualEventFormBean formBean;
private CompoundPropertyModel model;
public LocationSelectionPanelTestPage(VirtualEventFormBean formBean) {
assert formBean != null;
this.formBean = formBean;
model = new CompoundPropertyModel(formBean);
Form form = new Form("form", model);
add(form);
//location selection
final CustomSpaceEventLocation organizerLocation =
virtualEventService.getCustomSpaceEventLocation(formBean.getOrganizerId());
//assemble cohost models
List<CustomSpaceEventLocation> cohostLocations = new
ArrayList<CustomSpaceEventLocation>();
for (Serializable cohostId : formBean.getCohosts()) {
CustomSpaceEventLocation cohostLocation =
virtualEventService.getCustomSpaceEventLocation(cohostId);
cohostLocations.add(cohostLocation);
}
LocationSelectionPanel locationSelectionPanel = new
LocationSelectionPanel(
"location",
organizerLocation,
cohostLocations,
virtualEventService.getPublicEventLocations(),
formBean);
form.add(locationSelectionPanel);
}
public VirtualEventFormBean getFormBean() {
return formBean;
}
}
Custom Component In Question
public class LocationSelectionPanel extends FormComponentPanel {
//final private PublicLocationRadio publicLocationRadio;
final private RadioGroup locationGroup;
final private PublicLocationDropDownChoice publicLocationDropDown;
final private VirtualEventFormBean formBean;
//final private BoundCompoundPropertyModel model;
//final static String LOCATION_PROPERTY = "location";
final private Model publicLocationModel = new Model();
final private Model locationGroupModel = new Model();
final private CustomSpaceEventLocation organizerLocation;
public LocationSelectionPanel(
String wicketId,
CustomSpaceEventLocation organizerLocation,
List<CustomSpaceEventLocation> cohostLocations,
List<PublicEventLocation> publicLocations,
VirtualEventFormBean formBean) {
super(wicketId);
assert organizerLocation != null;
assert cohostLocations != null;
assert publicLocations != null;
assert formBean != null;
this.formBean = formBean;
this.organizerLocation = organizerLocation;
this.setRequired(true);
//model = new BoundCompoundPropertyModel(formBean);
this.setModel(new Model(formBean.getLocation()));
//model.bind(this, LOCATION_PROPERTY);
//group will default to location specified in formBean.location
locationGroup = new RadioGroup("locationGroup", locationGroupModel);
locationGroup.setRequired(true);
add(locationGroup); //bind RadioGroup's model object to location
property of this.model's formBean
// organizer's apt
CustomSpaceRadio organizerRadio = new
CustomSpaceRadio("organizerLocation", organizerLocation);
locationGroup.add(organizerRadio);
//co-hosts' places
//create radio controls for cohosts' locations
ListView participantChoices = new
CohostLocationListView("cohostLocationChoices", cohostLocations);
locationGroup.add(participantChoices);
//drop down for public locations
publicLocationDropDown = new
PublicLocationDropDownChoice("publicLocationChoices", publicLocations);
add(publicLocationDropDown);
// radio for selecting public location
PublicLocationRadio publicLocationRadio = new
PublicLocationRadio("publicLocation");
locationGroup.add(publicLocationRadio);
}
@Override
protected void onBeforeRender() {
//set child model's based on location property
final Object modelObject = getModelObject();
EventLocation location = (EventLocation) modelObject;
assert location != null;
if (location instanceof CustomSpaceEventLocation) {
locationGroupModel.setObject(location);
publicLocationModel.setObject(null);
} else if (location instanceof PublicEventLocation) {
publicLocationModel.setObject(location);
locationGroupModel.setObject(location);
} else {
throw new IllegalStateException("location property of unknown
type: " + location);
}
//enable drop-down only if public location radio is selected
//publicLocationDropDown.setEnabled(location instanceof
PublicEventLocation);
//render children
super.onBeforeRender();
}
/**
* check whether publicLocationRadio is selected. if so,
setConvertedInput
* to publicLocationDropDown's model object, else to radioGroup's
*/
@Override
protected void convertInput() {
Object convertedInput = null;
EventLocation locGroupModelObject = (EventLocation)
locationGroup.getConvertedInput();
assert locGroupModelObject != null;
if (locGroupModelObject instanceof CustomSpaceEventLocation) {
//TODO always true because locationGroup's model is never null
convertedInput = locationGroup.getConvertedInput();
} else {
convertedInput =
publicLocationDropDown.getConvertedInput();//publicLocationModel.getObject();
}
setConvertedInput(convertedInput);
}
private class PublicLocationDropDownChoice extends DropDownChoice {
public PublicLocationDropDownChoice(String wicketId,
List<PublicEventLocation> publicLocations) {
super(wicketId, publicLocationModel, publicLocations, new
PublicEventLocationChoiceRenderer());
}
}
private class PublicLocationRadio extends Radio {
public PublicLocationRadio(String wicketId) {
super(wicketId);
setModel(publicLocationModel);
}
}
private class PublicEventLocationChoiceRenderer implements
IChoiceRenderer {
public Object getDisplayValue(Object object) {
if (object instanceof PublicEventLocation) {
return ((PublicEventLocation) object).getName();
}
return null;
}
public String getIdValue(Object object, int index) {
return String.valueOf(index);
}
}
private class CohostLocationListView extends ListView {
public CohostLocationListView(String wicketId,
List<CustomSpaceEventLocation> cohostLocations) {
super(wicketId, cohostLocations);
}
protected void populateItem(ListItem item) {
item.add(new CustomSpaceRadio("cohostLocation",
(CustomSpaceEventLocation) item.getModelObject()));
}
}
}
-----
----------------
Nikita Tovstoles
vside.com
----------------
--
View this message in context:
http://www.nabble.com/Custom-Radio-component-with-children--tp19804341p19846733.html
Sent from the Wicket - User mailing list archive at Nabble.com.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]