All Downloads are FREE. Search and download functionalities are using the official Maven repository.

uk.co.crystalmark.wicket.components.BootstrapDropdownPanel Maven / Gradle / Ivy

The newest version!
package uk.co.crystalmark.wicket.components;

import java.util.List;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.IChoiceRenderer;
import org.apache.wicket.markup.html.form.ILabelProvider;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.util.ListModel;

public abstract class BootstrapDropdownPanel extends Panel implements ILabelProvider {
    private static final long serialVersionUID = 1L;

    private IModel model;

    private IModel> availableList;

    private IChoiceRenderer renderer;

    public BootstrapDropdownPanel(final String id, final IModel model, final IModel> availableList) {
        super(id, model);
        this.model = model;
        this.availableList = availableList;
    }

    public BootstrapDropdownPanel(final String id, final IModel model, final List availableList) {
        this(id, model, new ListModel(availableList));
    }

    @Override
    protected void onInitialize() {
        super.onInitialize();

        IModel labelModel = new LoadableDetachableModel() {
            private static final long serialVersionUID = 1L;

            @Override
            protected String load() {
                if (model.getObject() == null) {
                    return "Please select";
                }
                if (renderer == null) {
                    return model.getObject().toString();
                } else {
                    return renderer.getDisplayValue(model.getObject()) + "";
                }
            }
        };
        add(new Label("triggerLabel", labelModel));

        add(new ListView("options", availableList) {
            private static final long serialVersionUID = 1L;

            @Override
            protected void populateItem(final ListItem item) {
                AjaxLink link = new AjaxLink("link") {
                    private static final long serialVersionUID = 1L;

                    @Override
                    public void onClick(final AjaxRequestTarget target) {
                        model.setObject(item.getModelObject());
                        onChange(target, item.getModelObject());
                    }
                };
                item.add(link);

                IModel labelModel = new LoadableDetachableModel() {
                    private static final long serialVersionUID = 1L;

                    @Override
                    protected String load() {
                        if (item.getModelObject() == null) {
                            return null;
                        }
                        if (renderer == null) {
                            return item.getModelObject().toString();
                        } else {
                            return renderer.getDisplayValue(item.getModelObject()) + "";
                        }
                    }
                };

                link.add(new Label("label", labelModel));
            }

        });
    }

    public BootstrapDropdownPanel setRenderer(final IChoiceRenderer renderer) {
        this.renderer = renderer;
        return this;
    }

    @Override
    public IModel getLabel() {
        return model;
    }

    public abstract void onChange(AjaxRequestTarget target, T changedTo);
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy