com.apress.progwt.client.forum.ForumDisplay.java Source code

Java tutorial

Introduction

Here is the source code for com.apress.progwt.client.forum.ForumDisplay.java

Source

/*
 * Copyright 2008 Jeff Dwyer
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.apress.progwt.client.forum;

import com.allen_sauer.gwt.log.client.Log;
import com.apress.progwt.client.college.gui.UserLink;
import com.apress.progwt.client.college.gui.ext.TableWithHeaders;
import com.apress.progwt.client.domain.ForumPost;
import com.apress.progwt.client.domain.dto.PostsList;
import com.apress.progwt.client.domain.forum.ForumTopic;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Hyperlink;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.VerticalPanel;

public class ForumDisplay extends Composite {

    private static final DateTimeFormat df = DateTimeFormat.getFormat("MMM, d yyyy HH:mm");

    private VerticalPanel allPosts;
    private ForumApp forumApp;

    private CreatePostButton createB;

    public ForumDisplay(ForumApp forumApp) {
        this.forumApp = forumApp;
        allPosts = new VerticalPanel();
        allPosts.setStylePrimaryName("ForumPosts");
        initWidget(allPosts);
    }

    public void load(int start, PostsList result, ForumTopic original, ForumTopic topic, boolean isReply,
            int maxPerPage) {

        allPosts.clear();

        Log.debug("ORIGINAL " + original);

        if (original != null) {
            Hyperlink originalL = new Hyperlink("Forum: " + original.getUniqueForumID(),
                    original.getUniqueForumID());
            allPosts.add(originalL);
        }

        if (topic.doThreadListView()) {
            for (ForumPost post : result.getPosts()) {
                allPosts.add(new PostDisplay(post));
            }
        } else {
            TableWithHeaders table = new TableWithHeaders(result.getPosts().size(), "Thread", "Replies", "Date",
                    "Author");
            int row = 0;
            for (ForumPost post : result.getPosts()) {
                addShortDisplay(table, row, post);
                row++;
            }
            table.getColumnFormatter().setStyleName(0, "title");
            table.getColumnFormatter().setStyleName(1, "replies");
            table.getColumnFormatter().setStyleName(3, "author");
            allPosts.add(table);
        }

        if (result.getPosts().size() == 0) {
            allPosts.add(new Label("No Posts Yet"));
        }

        // no reply button when we're just browsing 'recent forum posts'
        if (original != null) {
            createB = new CreatePostButton(forumApp, isReply, topic);
            allPosts.add(createB);
        }

        ForumControlPanel fcb = new ForumControlPanel(topic, result, start, maxPerPage);
        allPosts.add(fcb);

    }

    private void addShortDisplay(TableWithHeaders table, int row, ForumPost post) {

        Hyperlink postT = new Hyperlink(post.getPostTitle(), post.getUniqueForumID());

        Label replies = new Label("" + post.getReplyCount());

        UserLink author = new UserLink(post.getAuthor());

        Label date = new Label(df.format(post.getDate()));
        date.setStylePrimaryName("date");

        table.setWidget(row, 0, postT);
        table.setWidget(row, 1, replies);
        table.setWidget(row, 2, date);
        table.setWidget(row, 3, author);

        if (row % 2 == 1) {
            table.getRowFormatter().setStyleName(row, "Odd");
        }

    }

    /**
     * Note the use of new HTML(). This exposes us to XSS attacks. We need
     * to be very sure that the postString() is not going to bite us here.
     * See the HTMLInputFilter usage in SaveForumPostCommand() for our
     * attempt to stop these attacks.
     * 
     * @author Jeff Dwyer
     * 
     */
    private class PostDisplay extends Composite {

        public PostDisplay(ForumPost post) {

            HorizontalPanel mainP = new HorizontalPanel();

            FlowPanel authorSide = new FlowPanel();
            authorSide.setStylePrimaryName("AuthorSide");
            VerticalPanel postSide = new VerticalPanel();
            postSide.setStylePrimaryName("PostSide");

            authorSide.add(new Label("Author: "));
            UserLink author = new UserLink(post.getAuthor());
            authorSide.add(author);

            Label date = new Label(df.format(post.getDate()));
            date.addStyleDependentName("Date");
            authorSide.add(date);

            Label postT = new Label(post.getPostTitle());
            postT.addStyleDependentName("title");
            postSide.add(postT);

            Label postS = new HTML(post.getPostString());
            postSide.add(postS);

            mainP.add(authorSide);
            mainP.add(postSide);

            initWidget(mainP);
            mainP.setStylePrimaryName("ForumPost");
        }
    }

    /**
     * create a post
     */
    public void create() {
        createB.onClick(createB);
    }

}