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

Java tutorial

Introduction

Here is the source code for dk.frankbille.scoreboard.components.PlayerStatisticsPanel.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.text.DecimalFormat;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.apache.wicket.Application;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Localizer;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.html.WebComponent;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
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;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;

import dk.frankbille.scoreboard.domain.League;
import dk.frankbille.scoreboard.domain.Player;
import dk.frankbille.scoreboard.domain.PlayerResult;
import dk.frankbille.scoreboard.player.PlayerPage;
import dk.frankbille.scoreboard.ratings.RatingCalculator;
import dk.frankbille.scoreboard.service.ScoreBoardService;

public class PlayerStatisticsPanel extends Panel {
    private static final long serialVersionUID = 1L;

    @SpringBean
    private ScoreBoardService scoreBoardService;

    public PlayerStatisticsPanel(String id, final IModel<Player> selectedPlayerModel, final League league,
            final RatingCalculator rating) {
        super(id);

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

            @Override
            protected List<PlayerResult> load() {
                List<PlayerResult> playerResults = scoreBoardService.getPlayerResults(league);

                Collections.sort(playerResults, new Comparator<PlayerResult>() {
                    @Override
                    public int compare(PlayerResult o1, PlayerResult o2) {
                        double rating1 = rating.getPlayerRating(o1.getPlayer().getId()).getRating();
                        Double rating2 = rating.getPlayerRating(o2.getPlayer().getId()).getRating();
                        int compare = rating2.compareTo(rating1);

                        if (compare == 0) {
                            compare = new Double(o2.getGamesWonRatio()).compareTo(o1.getGamesWonRatio());
                        }

                        if (compare == 0) {
                            compare = new Integer(o2.getGamesWon()).compareTo(o1.getGamesWon());
                        }

                        if (compare == 0) {
                            compare = new Integer(o1.getGamesLost()).compareTo(o2.getGamesLost());
                        }

                        if (compare == 0) {
                            compare = new Integer(o1.getGamesCount()).compareTo(o2.getGamesCount());
                        }

                        if (compare == 0) {
                            compare = o1.getPlayer().getName().compareTo(o2.getPlayer().getName());
                        }

                        if (compare == 0) {
                            compare = o1.getPlayer().getId().compareTo(o2.getPlayer().getId());
                        }

                        return compare;
                    }
                });

                return playerResults;
            }
        };

        add(new ListView<PlayerResult>("players", playerResultsModel) {
            private static final long serialVersionUID = 1L;

            @Override
            protected void populateItem(final ListItem<PlayerResult> item) {
                final PlayerResult playerResult = item.getModelObject();
                Player player = playerResult.getPlayer();
                Player selectedPlayer = selectedPlayerModel.getObject();

                item.add(new TooltipBehavior(new AbstractReadOnlyModel<CharSequence>() {
                    private static final long serialVersionUID = 1L;

                    @Override
                    public CharSequence getObject() {
                        StringBuilder b = new StringBuilder();
                        Localizer localizer = Application.get().getResourceSettings().getLocalizer();
                        b.append(localizer.getString("won", item)).append(": ").append(playerResult.getGamesWon());
                        b.append(", ");
                        b.append(localizer.getString("lost", item)).append(": ")
                                .append(playerResult.getGamesLost());
                        return b;
                    }
                }));

                item.add(RowColorModifier.create(item));
                if (selectedPlayer != null && player.getId().equals(selectedPlayer.getId())) {
                    item.add(new AttributeAppender("class", new Model<String>("highlighted"), " "));
                }
                item.add(new Label("number", "" + (item.getIndex() + 1)));
                PageParameters pp = new PageParameters();
                pp.set(0, player.getId());
                BookmarkablePageLink<Void> playerLink = new BookmarkablePageLink<Void>("playerLink",
                        PlayerPage.class, pp);
                item.add(playerLink);
                playerLink.add(new Label("name", new PropertyModel<Integer>(item.getModel(), "player.name")));
                WebComponent medal = new WebComponent("medal") {
                    private static final long serialVersionUID = 1L;

                    @Override
                    public boolean isVisible() {
                        return item.getIndex() < 3;
                    }
                };
                medal.add(AttributeModifier.append("class", new AbstractReadOnlyModel<String>() {
                    private static final long serialVersionUID = 1L;

                    @Override
                    public String getObject() {
                        if (item.getIndex() == 0) {
                            return "gold";
                        } else if (item.getIndex() == 1) {
                            return "silver";
                        } else if (item.getIndex() == 2) {
                            return "bronze";
                        }

                        return null;
                    }
                }));
                item.add(medal);
                item.add(new Label("gamesCount", new PropertyModel<Integer>(item.getModel(), "gamesCount")));
                item.add(new Label("winRatio", new FormatModel(new DecimalFormat("0.00"),
                        new PropertyModel<Double>(item.getModel(), "gamesWonRatio"))));
                item.add(new Label("rating", new FormatModel(new DecimalFormat("#"),
                        rating.getPlayerRating(player.getId()).getRating())));
                item.add(new Label("trend",
                        new StringResourceModel(item.getModelObject().getTrend().name().toLowerCase(), null)));
            }
        });
    }

}