com.tysanclan.site.projectewok.components.PostPanel.java Source code

Java tutorial

Introduction

Here is the source code for com.tysanclan.site.projectewok.components.PostPanel.java

Source

/**
 * Tysan Clan Website
 * Copyright (C) 2008-2013 Jeroen Steenbeeke and Ties van de Ven
 *
 * 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 com.tysanclan.site.projectewok.components;

import java.util.Calendar;
import java.util.LinkedList;
import java.util.List;

import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Session;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.image.ContextImage;
import org.apache.wicket.markup.html.link.Link;
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.Model;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;

import com.jeroensteenbeeke.hyperion.data.ModelMaker;
import com.tysanclan.rest.api.data.Rank;
import com.tysanclan.site.projectewok.TysanSession;
import com.tysanclan.site.projectewok.beans.ForumService;
import com.tysanclan.site.projectewok.components.IconLink.DefaultClickResponder;
import com.tysanclan.site.projectewok.entities.ForumPost;
import com.tysanclan.site.projectewok.entities.GameAccount;
import com.tysanclan.site.projectewok.entities.User;
import com.tysanclan.site.projectewok.entities.UserGameRealm;
import com.tysanclan.site.projectewok.pages.MemberPage;
import com.tysanclan.site.projectewok.pages.forum.ConfirmForumPostDeletePage;
import com.tysanclan.site.projectewok.pages.forum.EditForumPostPage;
import com.tysanclan.site.projectewok.pages.member.MessageListPage;
import com.tysanclan.site.projectewok.util.DateUtil;
import com.tysanclan.site.projectewok.util.MemberUtil;
import com.tysanclan.site.projectewok.util.bbcode.BBCodeUtil;

/**
 * @author Jeroen Steenbeeke
 */
public class PostPanel extends Panel {
    private static final long serialVersionUID = 1L;

    @SpringBean
    private ForumService forumService;

    public PostPanel(String id, ForumPost post) {
        this(id, post, true);
    }

    public PostPanel(String id, ForumPost post, boolean moderatorOptions) {
        super(id, ModelMaker.wrap(post));

        if (post == null) {
            WebMarkupContainer container = new WebMarkupContainer("container");
            container.setVisible(false);

            addRealms(container, null);

            container.add(new WebMarkupContainer("lucky").setVisible(false));
            container.add(new WebMarkupContainer("poster").setVisible(false));
            container.add(new WebMarkupContainer("customtitle").setVisible(false));
            container.add(new WebMarkupContainer("posttime").setVisible(false));
            container.add(new WebMarkupContainer("rank").setVisible(false));
            container.add(new WebMarkupContainer("donations").setVisible(false));
            container.add(new WebMarkupContainer("rankname").setVisible(false));
            container.add(new WebMarkupContainer("avatar").setVisible(false));
            container.add(new WebMarkupContainer("body").setVisible(false));

            WebMarkupContainer branchNote = new WebMarkupContainer("branchnote");
            branchNote.add(new WebMarkupContainer("source").setVisible(false));

            container.add(branchNote);

            container.add(new WebMarkupContainer("signature").setVisible(false));
            container.add(new WebMarkupContainer("icon").setVisible(false));
            container.add(new WebMarkupContainer("edit").setVisible(false));
            container.add(new WebMarkupContainer("delete").setVisible(false));

            add(container);

        } else {
            TysanSession sess = (TysanSession) Session.get();
            User u = sess != null ? sess.getUser() : null;

            WebMarkupContainer container = new WebMarkupContainer("container");

            addRealms(container, post.getPoster());

            Integer luckyScore = post.getPoster() != null && post.getPoster().getLuckyScore() != null
                    ? post.getPoster().getLuckyScore()
                    : 0;

            Label lucky = new Label("lucky", new Model<Integer>(luckyScore != null ? luckyScore : 0));

            Calendar cal = DateUtil.getCalendarInstance();

            // Feeling lucky score visible after april 1st 2010
            lucky.setVisible(luckyScore != null && luckyScore > 0 && (cal.get(Calendar.YEAR) > 2010
                    || (cal.get(Calendar.YEAR) == 2010 && cal.get(Calendar.MONTH) >= 3)

            ));

            container.add(lucky);

            final Long posterId = post.getPoster() != null ? post.getPoster().getId() : null;

            WebMarkupContainer poster = new WebMarkupContainer("poster");
            poster.add(AttributeModifier.replace("name", post.getId().toString()));

            poster.add(new Label("name", post.getPosterVisibleName()).setRenderBodyOnly(true));

            container.add(new IconLink.Builder("images/icons/email_add.png",
                    new DefaultClickResponder<User>(ModelMaker.wrap(post.getPoster())) {
                        private static final long serialVersionUID = 1L;

                        @Override
                        public void onClick() {
                            setResponsePage(new MessageListPage(getModelObject()));

                        }
                    }).newInstance("sendMessage")
                            .setVisible(
                                    u != null && MemberUtil.isMember(u) && MemberUtil.isMember(post.getPoster()))
                            .add(AttributeModifier.replace("style", "display: inline;")));

            container.add(new IconLink.Builder("images/icons/vcard.png",
                    new DefaultClickResponder<User>(ModelMaker.wrap(u)) {
                        private static final long serialVersionUID = 1L;

                        @Override
                        public void onClick() {

                            PageParameters params = new PageParameters();

                            params.add("userid", Long.toString(posterId));

                            setResponsePage(MemberPage.class, params);
                        }
                    }).newInstance("viewProfile")
                            .setVisible(posterId != null && u != null && MemberUtil.isMember(u)
                                    && MemberUtil.isMember(post.getPoster()))
                            .add(AttributeModifier.replace("style", "display: inline;")));

            container.add(poster);

            container.add(new BBCodePanel("customtitle",
                    post.getPoster() != null ? post.getPoster().getCustomTitle() : ""));

            container.add(new DateTimeLabel("posttime", post.getTime()));

            container.add(new RankIcon("rank", post.getPoster() != null ? post.getPoster().getRank() : Rank.FORUM)
                    .setVisible(post.getPoster() != null
                            ? post.getPoster().getRank() != Rank.FORUM && post.getPoster().getRank() != Rank.BANNED
                            : false));
            container.add(new DonatorPanel("donations", post.getPoster()));
            container.add(new Label("rankName",
                    post.getPoster() != null ? post.getPoster().getRank().toString() : "Forum User"));

            WebMarkupContainer image = new WebMarkupContainer("avatar");
            final String url = post.getPoster() != null ? BBCodeUtil.filterURL(post.getPoster().getImageURL()) : "";
            if (url != null && (url.isEmpty() || "#".equals(url))) {
                image.setVisible(false);
            } else {
                image.add(AttributeModifier.replace("src", url));
            }
            container.add(image);

            BBCodePanel body = new BBCodePanel("body", new Model<String>(aprilFilter(post.getContent())));

            WebMarkupContainer branchnote = new WebMarkupContainer("branchnote");
            if (post.getBranchTo() != null) {
                branchnote.add(new AutoThreadLink("source", post.getBranchTo()));
            } else {
                branchnote.add(new WebMarkupContainer("source"));
            }

            branchnote.setVisible(post.getBranchTo() != null);
            container.add(branchnote);

            container.add(body);
            container.add(
                    new BBCodePanel("signature", post.getPoster() != null ? post.getPoster().getSignature() : "")
                            .setVisible(post.getPoster() != null && !post.getPoster().getSignature().isEmpty()));
            container.add(new ContextImage("icon", "images/icons/new.png")
                    .setVisible(sess != null ? forumService.isPostUnread(u, post) : false));

            if (sess != null) {
                forumService.markForumPostRead(u, post);
            }

            boolean canEdit = moderatorOptions && forumService.canEditPost(u, post);

            Link<ForumPost> edit = new Link<ForumPost>("edit", ModelMaker.wrap(post)) {
                private static final long serialVersionUID = 1L;

                @Override
                public void onClick() {
                    setResponsePage(new EditForumPostPage(getModelObject()));
                }
            };

            edit.setVisible(canEdit);
            container.add(edit);

            container.add(new Link<ForumPost>("delete", ModelMaker.wrap(post)) {
                /**
                 * 
                 */
                private static final long serialVersionUID = 1L;

                @Override
                public void onClick() {
                    setResponsePage(new ConfirmForumPostDeletePage(getModelObject()));

                }
            });

            add(container);
        }

    }

    private String aprilFilter(String content) {
        Calendar cal = DateUtil.getCalendarInstance();

        if (cal.get(Calendar.MONTH) == Calendar.APRIL && cal.get(Calendar.DAY_OF_MONTH) == 1) {
            if (cal.get(Calendar.YEAR) == 2011) {
                return content + "<p>On a less serious note: I love ponies!</p>";
            }
        }

        return content;
    }

    private void addRealms(WebMarkupContainer parent, User poster) {
        List<UserGameRealm> realms = new LinkedList<UserGameRealm>();

        if (MemberUtil.isMember(poster)) {
            for (UserGameRealm ugr : poster.getPlayedGames()) {
                if (!ugr.getAccounts().isEmpty()) {
                    realms.add(ugr);
                }
            }
        }

        parent.add(new ListView<UserGameRealm>("realms", ModelMaker.wrap(realms)) {
            private static final long serialVersionUID = 1L;

            @Override
            protected void populateItem(ListItem<UserGameRealm> item) {
                UserGameRealm ugr = item.getModelObject();

                StringBuilder accountList = new StringBuilder();

                for (GameAccount acc : ugr.getAccounts()) {
                    if (accountList.length() > 0) {
                        accountList.append(", ");
                    }

                    accountList.append(acc.toString());
                }

                item.add(new Label("realm", ugr.getRealm().getName()));
                item.add(new Label("accounts", accountList.toString()));

            }
        });
    }
}