dk.frankbille.scoreboard.components.NavigationPanel.java Source code

Java tutorial

Introduction

Here is the source code for dk.frankbille.scoreboard.components.NavigationPanel.java

Source

/*
 * ScoreBoard
 * Copyright (C) 2012-2013 Frank Bille
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package dk.frankbille.scoreboard.components;

import java.util.ArrayList;
import java.util.List;

import org.apache.wicket.AttributeModifier;
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.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;

public abstract class NavigationPanel<T> extends Panel {
    private static final long serialVersionUID = 1L;

    public NavigationPanel(String id, final PaginationModel<T> paginationModel) {
        super(id);

        setOutputMarkupId(true);

        AjaxLink<Void> previousLink = new AjaxLink<Void>("previousLink") {
            private static final long serialVersionUID = 1L;

            @Override
            public void onClick(AjaxRequestTarget target) {
                pageChanged(target, paginationModel.previousPage());
            }

            @Override
            public boolean isEnabled() {
                return paginationModel.isPreviousPossible();
            }
        };
        previousLink.add(AttributeModifier.append("class", new AbstractReadOnlyModel<String>() {
            private static final long serialVersionUID = 1L;

            @Override
            public String getObject() {
                if (paginationModel.isPreviousPossible()) {
                    return null;
                }

                return "disabled";
            }
        }));
        add(previousLink);

        IModel<List<Integer>> pagesModel = new LoadableDetachableModel<List<Integer>>() {
            private static final long serialVersionUID = 1L;

            @Override
            protected List<Integer> load() {
                List<Integer> pages = new ArrayList<Integer>();
                for (int page = 1; page <= paginationModel.getMaxPage(); page++) {
                    pages.add(page);
                }
                return pages;
            }
        };
        add(new ListView<Integer>("pageLinks", pagesModel) {
            private static final long serialVersionUID = 1L;

            @Override
            protected void populateItem(final ListItem<Integer> item) {
                AjaxLink<Void> pageLink = new AjaxLink<Void>("pageLink") {
                    private static final long serialVersionUID = 1L;

                    @Override
                    public void onClick(AjaxRequestTarget target) {
                        paginationModel.setPage(item.getModelObject());
                        pageChanged(target, paginationModel.getPage());
                    }

                    @Override
                    public boolean isEnabled() {
                        return paginationModel.getPage() != item.getModelObject();
                    }
                };
                pageLink.add(AttributeModifier.append("class", new AbstractReadOnlyModel<String>() {
                    private static final long serialVersionUID = 1L;

                    @Override
                    public String getObject() {
                        if (paginationModel.getPage() == item.getModelObject()) {
                            return "btn-primary disabled";
                        }

                        return null;
                    }
                }));
                item.add(pageLink);

                pageLink.add(new Label("pageLabel", item.getModel()));
            }
        });

        AjaxLink<Void> nextLink = new AjaxLink<Void>("nextLink") {
            private static final long serialVersionUID = 1L;

            @Override
            public void onClick(AjaxRequestTarget target) {
                pageChanged(target, paginationModel.nextPage());
            }

            @Override
            public boolean isEnabled() {
                return paginationModel.isNextPossible();
            }
        };
        nextLink.add(AttributeModifier.append("class", new AbstractReadOnlyModel<String>() {
            private static final long serialVersionUID = 1L;

            @Override
            public String getObject() {
                if (paginationModel.isNextPossible()) {
                    return null;
                }

                return "disabled";
            }
        }));
        add(nextLink);
    }

    private void pageChanged(AjaxRequestTarget target, int selectedPage) {
        target.add(this);
        onPageChanged(target, selectedPage);
    }

    protected abstract void onPageChanged(AjaxRequestTarget target, int selectedPage);

}