/** * */ package org.gcube.portlets.user.newsfeed.client.templates; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import org.gcube.portal.databook.client.GCubeSocialNetworking; import org.gcube.portal.databook.shared.Comment; import org.gcube.portal.databook.shared.Feed; import org.gcube.portal.databook.shared.UserInfo; import org.gcube.portlets.user.newsfeed.client.event.AddLikeEvent; import org.gcube.portlets.user.newsfeed.client.event.DeleteCommentEvent; import org.gcube.portlets.user.newsfeed.client.event.DeleteFeedEvent; import org.gcube.portlets.user.newsfeed.client.event.SeeCommentsEvent; import org.gcube.portlets.user.newsfeed.client.event.SeeLikesEvent; import org.gcube.portlets.user.newsfeed.client.event.StopTimerEvent; import org.gcube.portlets.user.newsfeed.client.panels.NewsFeedPanel; import org.gcube.portlets.user.newsfeed.shared.EnhancedFeed; import org.gcube.portlets.user.wsmail.client.forms.MailForm; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.RunAsyncCallback; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.MouseOutEvent; import com.google.gwt.event.dom.client.MouseOverEvent; import com.google.gwt.event.shared.HandlerManager; import com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; /** * @author Massimiliano Assante. ISTI-CNR * */ public class TweetTemplate extends Composite { private static TweetTemplateUiBinder uiBinder = GWT .create(TweetTemplateUiBinder.class); interface TweetTemplateUiBinder extends UiBinder { } public static final String loading = GWT.getModuleBaseURL() + "../images/loading-comments.gif"; private static final int MAX_SHOWTEXT_LENGTH = 256; private EnhancedFeed myFeed; private UserInfo myUserInfo; private HandlerManager eventBus; private ArrayList myComments; private boolean commentingDisabled = false; private boolean commentsFetched = false; private int totalComments = 0; private HTML showAllComments = new HTML(); private boolean isAppFeed = false; /** * tell if this tweet is belonging to the current user */ private boolean isUsers = false; @UiField HTML contentArea; @UiField HTML seeMore; @UiField HTML timeArea; @UiField HTML likeArea; @UiField HTML commentArea; @UiField HTML messageArea; @UiField Image avatarImage; @UiField HTMLPanel mainHTML; @UiField HTML likesNo; @UiField HTML commentsNo; @UiField VerticalPanel commentsPanel; @UiField HTML closeImage; @UiField VerticalPanel previewPanel; @UiField Label messageSeparator; /** * used when fetching tweets from server * @param myUserInfo * @param myFeed * @param isUsers * @param eventBus */ public TweetTemplate(UserInfo myUserInfo, EnhancedFeed myFeed, HandlerManager eventBus) { initWidget(uiBinder.createAndBindUi(this)); this.myUserInfo = myUserInfo; this.myFeed = myFeed; isAppFeed = myFeed.getFeed().isApplicationFeed(); Feed feed = myFeed.getFeed(); if (feed.getUri() != null && feed.getUri().compareTo("") != 0 && feed.getLinkTitle() != null && feed.getLinkTitle().compareTo("") != 0 ) { previewPanel.add(new LinkPreviewer(feed.getLinkTitle(), feed.getLinkDescription(), feed.getLinkHost(), feed.getUriThumbnail(), feed.getUri())); } this.eventBus = eventBus; this.isUsers = myFeed.isUsers(); myComments = new ArrayList(); if (isUsers) { closeImage.setStyleName("closeImage"); closeImage.setTitle("Delete"); } //show if the user has already liked this if (myFeed.isLiked()) { likeArea.setHTML(NewsFeedPanel.LIKED_LABEL); } else likeArea.setHTML("" + NewsFeedPanel.LIKE_LABEL + ""); commentArea.setHTML("" + NewsFeedPanel.COMMENT_LABEL + ""); String feedText = feed.getDescription(); if ( (! feedText.startsWith(" MAX_SHOWTEXT_LENGTH) { feedText = feedText.substring(0, MAX_SHOWTEXT_LENGTH) + "..."; seeMore.setHTML(" See More "); } if (! isAppFeed) { messageArea.setHTML("" + NewsFeedPanel.MESSAGE_LABEL + ""); contentArea.setHTML(""+feed.getFullName()+" " + feedText); } else { // messageSeparator.setVisible(false); contentArea.setHTML(""+feed.getFullName()+" " + feedText); closeImage.setTitle("Delete this Application feed (Administrator Only)"); if (isAppFeed) { try{ String vreName = feed.getVreid().substring(feed.getVreid().lastIndexOf("/")+1); messageArea.setHTML(" go App [" +vreName + "]"); } catch (Exception e) {} } } avatarImage.setUrl(feed.getThumbnailURL()); avatarImage.setPixelSize(50, 50); try { String formattedTime = DateTimeFormat.getFormat("MMMM dd, h:mm a").format(feed.getTime()); timeArea.setHTML(formattedTime); if (! feed.getCommentsNo().equals("0")) { commentsNo.setHTML(feed.getCommentsNo()); commentsNo.setStyleName("comments-number"); commentsNo.setTitle("People commented this."); } if (! feed.getLikesNo().equals("0")) { likesNo.setHTML(feed.getLikesNo()); likesNo.setStyleName("likes-number"); likesNo.setTitle("Show People who have " + NewsFeedPanel.LIKED_LABEL + " this."); } totalComments = Integer.parseInt(feed.getCommentsNo()); } catch (NumberFormatException e) { totalComments = 0; } catch (Exception e) { timeArea.setHTML("just now"); } commentsPanel.setStyleName("commentsPanel"); if (myFeed.getComments() != null && myFeed.getComments().size() > 0) { if (totalComments > 2) { showAllComments = getShowAllCommentsLink(totalComments); commentsPanel.add(showAllComments); commentsNo.setStyleName("show-comments-number"); commentsNo.setTitle("Show all Comments"); } for (Comment comment : myFeed.getComments()) { addComment(new SingleComment(comment, this, (comment.getUserid().equals(myUserInfo.getUsername())))); } } } /** * used when getting tweets from the client * @param myUserInfo * @param feed * @param eventBus * @param hidden */ public TweetTemplate(UserInfo myUserInfo, EnhancedFeed feed, HandlerManager eventBus, boolean hidden) { this(myUserInfo, feed, eventBus); contentArea.getElement().getParentElement().getParentElement().setClassName("div-table-col content hidden"); } @UiHandler("contentArea") public void onHover(MouseOutEvent event) { if (isUsers) closeImage.removeStyleName("uiCloseButton"); } @UiHandler("contentArea") public void onHover(MouseOverEvent event) { if (isUsers) closeImage.addStyleName("uiCloseButton"); } @UiHandler("closeImage") void onDeleteFeedClick(ClickEvent e) { if (isUsers) eventBus.fireEvent(new DeleteFeedEvent(this)); } @UiHandler("seeMore") void onSeeMoreClick(ClickEvent e) { contentArea.setHTML(""+myFeed.getFeed().getFullName()+" " + myFeed.getFeed().getDescription()); seeMore.setHTML(""); } @UiHandler("likeArea") void onLikeClick(ClickEvent e) { if (!likeArea.getText().equals(NewsFeedPanel.LIKED_LABEL)) { try { eventBus.fireEvent(new StopTimerEvent(true)); //reset the refresh page timer int cur = Integer.parseInt(myFeed.getFeed().getLikesNo()); cur++; if (cur == 1) { myFeed.getFeed().setLikesNo("1"); likesNo.setHTML("1"); likesNo.setStyleName("likes-number"); likesNo.setTitle("People who have " + NewsFeedPanel.LIKED_LABEL + " this"); } else { myFeed.getFeed().setLikesNo(""+cur); likesNo.setHTML(""+cur); } eventBus.fireEvent(new AddLikeEvent(this, myFeed.getFeed().getKey())); likeArea.setHTML(NewsFeedPanel.LIKED_LABEL); } catch (NumberFormatException ex) { likeArea.setHTML("Error on the server"); } } } @UiHandler("commentArea") void onAddCommentClick(ClickEvent e) { if (! commentingDisabled) { if (! commentsFetched && totalComments > 2) { //if so, need to load all comments before adding a comment fireSeeComments(true); } showAddCommentForm(); eventBus.fireEvent(new StopTimerEvent(false)); //stop the refresh page timer } else GWT.log("Commenting disabled"); } @UiHandler("messageArea") void onMessageClick(ClickEvent e) { if (! isAppFeed) { eventBus.fireEvent(new StopTimerEvent(false)); //stop the refresh page timer final List listToLogin = new ArrayList(); listToLogin.add(myFeed.getFeed().getEntityId()); GWT.runAsync(new RunAsyncCallback() { @Override public void onSuccess() { new MailForm(listToLogin); } public void onFailure(Throwable reason) { Window.alert("Could not load this component: " + reason.getMessage()); } }); } } public void showAddCommentForm() { final AddCommentTemplate toAdd = new AddCommentTemplate(this, myUserInfo, eventBus); commentsPanel.add(toAdd); commentingDisabled = true; final Timer t = new Timer() { @Override public void run() { toAdd.setStyleName("comment-show"); toAdd.setFocus(); } }; t.schedule(10); } private HTML getShowAllCommentsLink(int commentsNo) { final HTML toReturn = new HTML(""); toReturn.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { fireSeeComments(false); } }); return toReturn; } private void fireSeeComments(boolean commentForm2Add) { eventBus.fireEvent(new SeeCommentsEvent(this, commentForm2Add)); } @UiHandler("likesNo") void onSeeLikes(ClickEvent e) { eventBus.fireEvent(new SeeLikesEvent(myFeed.getFeed().getKey())); } @UiHandler("commentsNo") void onSeeComments(ClickEvent e) { fireSeeComments(false); } public void setcontentAreaStyle(String cssclass) { contentArea.getElement().getParentElement().getParentElement().setClassName("div-table-col content visible"); } public boolean isCommenting() { return commentingDisabled; } public void setCommentingDisabled(boolean commenting) { this.commentingDisabled = commenting; } public String getFeedKey() { return myFeed.getFeed().getKey(); } public void remove(Widget w) { mainHTML.remove(w); } public void addComment(SingleComment comment) { myComments.add(comment); commentsPanel.add(comment); } public void clearComments() { myComments.clear(); commentsPanel.clear(); } public void showLoadingComments() { showAllComments.setHTML("
"); } public boolean isCommentsFetched() { return commentsFetched; } public void setCommentsFetched(boolean commentsFetched) { this.commentsFetched = commentsFetched; } public HandlerManager getEventBus() { return eventBus; } public void updateCommentsNumberCount() { if (myComments.size() == 1) { commentsNo.setStyleName("comments-number"); commentsNo.setTitle("Persons who have commented this."); } commentsNo.setHTML(""+myComments.size()); } public UserInfo getMyUserInfo() { return myUserInfo; } public String getMyFeedUserId() { return myFeed.getFeed().getEntityId(); } public String getMyFeedText() { return myFeed.getFeed().getDescription(); } }