package org.nocket.gen.page.element; import java.lang.reflect.Method; import java.util.List; import org.apache.commons.lang.StringUtils; import org.apache.wicket.markup.html.form.ChoiceRenderer; import org.apache.wicket.markup.html.form.IChoiceRenderer; import org.apache.wicket.model.IModel; import org.apache.wicket.model.PropertyModel; import org.jsoup.nodes.Element; import org.nocket.gen.page.DMDWebGenPageContext; import org.nocket.gen.page.element.synchronizer.BooleanChoiceRenderer; import org.nocket.gen.page.element.synchronizer.EnumChoicesRenderer; import org.nocket.gen.page.element.synchronizer.GeneratedChoicesModel; import org.nocket.gen.page.element.synchronizer.SynchronizerHelper; import org.nocket.gen.page.visitor.PageElementVisitorI; public class SelectElement extends AbstractDomainPageElement<Object> { public static final String SELECTIONTYPE_ATTRIBUTE = "multiple"; public static final String MULTISELECT_VALURE = "multiple"; Integer numberOfVisibleEntries; public SelectElement(DMDWebGenPageContext context, Element element) { super(context, element); String sizeAttr = element.attr("size"); if (StringUtils.isNotBlank(sizeAttr)) { try { numberOfVisibleEntries = Integer.parseInt(sizeAttr.trim()); } catch (NumberFormatException nfx) { System.err.println("Ignored illegal number format in selection size attribute: " + sizeAttr); } } } public Integer getNumberOfVisibleEntries() { return numberOfVisibleEntries; } @Override public IModel<Object> innerGetModel() { return new PropertyModel<Object>(getPropertyModelObject(), getPropertyExpression()); } @Override public void accept(PageElementVisitorI visitor) { visitor.visitSelect(this); } public IModel<List<Object>> getChoicesModel() { return new GeneratedChoicesModel(this); } public boolean isMultiselect() { return getElement().attr(SELECTIONTYPE_ATTRIBUTE).equals(MULTISELECT_VALURE); } public IChoiceRenderer getChoicesRenderer() { Method method = getDomainElement().getMethod(); Class<?> returnType = method.getReturnType(); if (returnType.isEnum()) { return new EnumChoicesRenderer(getContext()); } else if (SynchronizerHelper.isBooleanType(method)) { return new BooleanChoiceRenderer(this); } else { return new ChoiceRenderer(); } } }