/* * 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); } }