Free4U
public class DropDownChoiceWithStylingOptions<T> extends DropDownChoice<T> {
private String previouslyAppendedOptGroupLabel;
private int choices;
/**
* @param id
* @param choices
* @param renderer
*/
public DropDownChoiceWithStylingOptions(String id,
IModel<? extends List<? extends T>> choices,
IChoiceRenderer<? super T> renderer) {
super(id, choices, renderer);
}
/**
* @param id
* @param choices
*/
public DropDownChoiceWithStylingOptions(String id,
IModel<? extends List<? extends T>> choices) {
super(id, choices);
}
/**
* @param id
* @param model
* @param choices
* @param renderer
*/
public DropDownChoiceWithStylingOptions(String id, IModel<T> model,
IModel<? extends List<? extends T>> choices,
IChoiceRenderer<? super T> renderer) {
super(id, model, choices, renderer);
}
/**
* @param id
* @param model
* @param choices
*/
public DropDownChoiceWithStylingOptions(String id, IModel<T> model,
IModel<? extends List<? extends T>> choices) {
super(id, model, choices);
}
/**
* @param id
* @param model
* @param data
* @param renderer
*/
public DropDownChoiceWithStylingOptions(String id, IModel<T> model,
List<? extends T> data, IChoiceRenderer<? super T> renderer) {
super(id, model, data, renderer);
}
/**
* @param id
* @param model
* @param choices
*/
public DropDownChoiceWithStylingOptions(String id, IModel<T> model,
List<? extends T> choices) {
super(id, model, choices);
}
/**
* @param id
* @param data
* @param renderer
*/
public DropDownChoiceWithStylingOptions(String id, List<? extends T> data,
IChoiceRenderer<? super T> renderer) {
super(id, data, renderer);
}
/**
* @param id
* @param choices
*/
public DropDownChoiceWithStylingOptions(String id, List<? extends T>
choices) {
super(id, choices);
}
/**
* @param id
*/
public DropDownChoiceWithStylingOptions(String id) {
super(id);
}
/**
* @see
org.apache.wicket.markup.html.form.AbstractChoice#onComponentTagBody(org.apache.wicket.markup.MarkupStream,
org.apache.wicket.markup.ComponentTag)
*/
@Override
protected void onComponentTagBody(MarkupStream markupStream,
ComponentTag openTag) {
previouslyAppendedOptGroupLabel = null;
choices = getChoices().size();
super.onComponentTagBody(markupStream, openTag);
}
/**
* @see
org.apache.wicket.markup.html.form.AbstractChoice#appendOptionHtml(org.apache.wicket.util.string.AppendingStringBuffer,
java.lang.Object, int, java.lang.String)
*/
@Override
protected void appendOptionHtml(AppendingStringBuffer buffer, T choice,
int index, String selected) {
AppendingStringBuffer tmp = new AppendingStringBuffer(50);
super.appendOptionHtml(tmp, choice, index, selected);
if (getChoiceRenderer() instanceof IStyledChoiceRenderer) {
IStyledChoiceRenderer<T> styledChoiceRenderer =
(IStyledChoiceRenderer<T>) getChoiceRenderer();
String currentOptGroupLabel =
styledChoiceRenderer.getOptGroupLabel(choice);
if (!Utils.equalsOrNull(currentOptGroupLabel,
previouslyAppendedOptGroupLabel)) {
// OptGroup changed
if (previouslyAppendedOptGroupLabel != null) {
endOptGroup(tmp);
}
if (currentOptGroupLabel != null) {
// OptGroup started
int start = tmp.indexOf("<option");
StringBuilder label = new
StringBuilder(currentOptGroupLabel.length() + 19);
label.append("<optgroup
label=\"").append(currentOptGroupLabel).append("\">");
tmp.insert(start, label);
}
}
if ((currentOptGroupLabel != null) && (index == (choices-1))) {
// Last option group must end too
endOptGroup(tmp);
}
{
String cssClass = styledChoiceRenderer.getOptionCssClassName(choice);
if (cssClass != null) {
int start = tmp.indexOf("<option");
tmp.insert(start + 7, new StringBuilder("
class=\"").append(cssClass).append("\""));
}
}
previouslyAppendedOptGroupLabel = currentOptGroupLabel;
}
buffer.append(tmp);
}
/**
* @param tmp
*/
private void endOptGroup(AppendingStringBuffer tmp) {
// OptGroup ended
int start = tmp.indexOf("</option>");
tmp.insert(start + 9, "</optgroup>");
}
}
public interface IStyledChoiceRenderer<T> extends IChoiceRenderer<T> {
/**
* @param t
* @return String
*/
public String getOptGroupLabel(T t);
/**
* @param t
* @return String
*/
public String getOptionCssClassName(T t);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]