/** * Copyright (C) 2010 Peter Karich <jetwick_@_pannous_._info> * * 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 de.jetwick.ui; import de.jetwick.ui.util.LabeledLink; import com.google.api.translate.Language; import de.jetwick.data.JTweet; import de.jetwick.data.JUser; import de.jetwick.tw.Extractor; import de.jetwick.util.Helper; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxFallbackLink; import org.apache.wicket.ajax.markup.html.form.AjaxFallbackButton; import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxFallbackLink; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.ExternalLink; 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.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; import org.odlabs.wiquery.core.commons.IWiQueryPlugin; import org.odlabs.wiquery.core.commons.WiQueryResourceManager; import org.odlabs.wiquery.core.effects.Effect; import org.odlabs.wiquery.core.events.Event; import org.odlabs.wiquery.core.events.MouseEvent; import org.odlabs.wiquery.core.events.WiQueryEventBehavior; import org.odlabs.wiquery.core.javascript.JsScope; import org.odlabs.wiquery.core.javascript.JsStatement; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * * @author Peter Karich, peat_hal 'at' users 'dot' sourceforge 'dot' net */ public class OneTweet extends Panel implements IWiQueryPlugin { private final Logger logger = LoggerFactory.getLogger(getClass()); private String language; private List<JTweet> subTweets = new ArrayList<JTweet>(); private boolean rtClicked = false; private boolean rpClicked = false; private boolean clickedTranslate = false; private boolean inReplyOfClicked = false; public OneTweet(String id) { super(id); } public OneTweet init(IModel<JTweet> model, boolean showUser) { setOutputMarkupId(true); final JTweet tweet = model.getObject(); if (tweet == null) { setVisible(false); return this; } final JUser user = tweet.getFromUser(); if (showUser) { LabeledLink userNameLink = new LabeledLink("userNameLink", user.getScreenName() + ":", false) { @Override public void onClick(AjaxRequestTarget target) { onUserClick(user.getScreenName()); } }; add(userNameLink); } else add(new Label("userNameLink", "")); WebMarkupContainer spamIndicator = new WebMarkupContainer("spamIndicator"); spamIndicator.setVisible(tweet.isSpam()); add(spamIndicator); // final DialogUtilsBehavior dialogUtilsBehavior = new DialogUtilsBehavior(); // add(dialogUtilsBehavior); final Label label = new Label("tweetText", new Model<String>() { int counter = 0; @Override public String getObject() { return new Extractor() { @Override public String createTagMarkup(String tag, String cleanTag) { // String url = Helper.TSURL + cleanTag; return "<a class=\"i-tw-link tw-tag\" " + "clean=\"" + cleanTag + "\" " + "tag=\"" + tag + " \" " + ">" + tag + "</a>"; } }.setTweet(tweet).setText(translate(tweet)).run().toString(); } }); label.setEscapeModelStrings(false); label.setOutputMarkupId(true); add(label); ExternalLink dateLink = new ExternalLink("tweetDate", Helper.toTwitterHref(user.getScreenName(), tweet.getTwitterId())); String str = "status"; if (tweet.getCreatedAt() != null) str = Helper.toSimpleDateTime(tweet.getCreatedAt()); Label dateLabel = new Label("tweetDateLabel", str); dateLink.add(dateLabel); add(dateLink); add(new ExternalLink("tweetFav", Helper.twitterIntentFav(tweet.getTwitterId()))); add(new ExternalLink("tweetReply", Helper.twitterIntentReply(tweet.getTwitterId()))); add(new AjaxFallbackLink("tweetRetweet") { @Override public void onClick(AjaxRequestTarget target) { onRetweet(tweet, target); } }); IndicatingAjaxFallbackLink inReplyOfButton = new IndicatingAjaxFallbackLink("inreplyof") { @Override public void onClick(AjaxRequestTarget target) { if (target != null) { subTweets.clear(); target.addComponent(OneTweet.this); if (!inReplyOfClicked) subTweets.addAll(onInReplyOfClick(tweet.getInReplyTwitterId())); inReplyOfClicked = !inReplyOfClicked; } } }; add(inReplyOfButton); if (JTweet.isDefaultInReplyId(tweet.getInReplyTwitterId())) inReplyOfButton.setVisible(false); IndicatingAjaxFallbackLink rtLink = new IndicatingAjaxFallbackLink("retweeters") { @Override public void onClick(AjaxRequestTarget target) { if (target != null) { subTweets.clear(); target.addComponent(OneTweet.this); if (!rtClicked) subTweets.addAll(onReplyClick(tweet.getTwitterId(), true)); rtClicked = !rtClicked; } } }; add(rtLink.add(new Label("retweetersLabel", "retweets " + tweet.getRetweetCount()))); if (tweet.getRetweetCount() == 0) rtLink.setVisible(false); IndicatingAjaxFallbackLink replyLink = new IndicatingAjaxFallbackLink("replies") { @Override public void onClick(AjaxRequestTarget target) { if (target != null) { subTweets.clear(); target.addComponent(OneTweet.this); if (!rpClicked) subTweets.addAll(onReplyClick(tweet.getTwitterId(), false)); rpClicked = !rpClicked; } } }; add(replyLink.add(new Label("repliesLabel", "replies " + (tweet.getReplyCount() - tweet.getRetweetCount())))); if (tweet.getReplyCount() == tweet.getRetweetCount()) replyLink.setVisible(false); add(new AjaxFallbackLink("similarLink") { @Override public void onClick(AjaxRequestTarget target) { onFindSimilarClick(tweet, target); } }); add(new IndicatingAjaxFallbackLink("translateLink") { @Override public void onClick(AjaxRequestTarget target) { if (target == null) return; clickedTranslate = !clickedTranslate; //translate(tweet, label); target.addComponent(label); } }); ListView subTweetsView = new ListView("subtweets", new PropertyModel(this, "subTweets")) { @Override public void populateItem(final ListItem item) { item.add(new OneTweet("suboneTweet") { @Override public Collection<JTweet> onReplyClick(long id, boolean retweet) { return OneTweet.this.onReplyClick(id, retweet); } @Override public void onUserClick(String screenName) { OneTweet.this.onUserClick(screenName); } @Override public void onFindSimilarClick(JTweet tweet, AjaxRequestTarget target) { OneTweet.this.onFindSimilarClick(tweet, target); } @Override public Collection<JTweet> onInReplyOfClick(long id) { return OneTweet.this.onInReplyOfClick(id); } }.init(item.getModel(), true).setLanguage(language)); } }; add(subTweetsView); return this; } private void addButtonWithEffect(String buttonId, final String clazz, final Effect effect) { WebMarkupContainer button = new WebMarkupContainer(buttonId); button.add(new WiQueryEventBehavior(new Event(MouseEvent.CLICK) { private static final long serialVersionUID = 1L; @Override public JsScope callback() { return JsScope.quickScope(new JsStatement().$(null, "." + clazz).chain(effect).render()); } })); add(button); } public String translate(JTweet tweet) { String trText = getTextFromTranslateAllAction(tweet.getTwitterId()); if (trText != null) return trText; trText = tweet.getText(); if (clickedTranslate) { try { trText = Helper.translate(trText, Language.AUTO_DETECT, Language.fromString(language)); } catch (Exception ex) { logger.error("cannot translate tweet:" + tweet + " " + ex.getMessage()); } } return trText; } public String getTextFromTranslateAllAction(long id) { return null; } public OneTweet setLanguage(String lang) { language = lang; return this; } public Collection<JTweet> onReplyClick(long id, boolean retweet) { return Collections.EMPTY_LIST; } public Collection<JTweet> onInReplyOfClick(long id) { return Collections.EMPTY_LIST; } public void onUserClick(String screenName) { } public void onFindSimilarClick(JTweet tweet, AjaxRequestTarget target) { } public void onRetweet(JTweet tweet, AjaxRequestTarget target) { } @Override public void contribute(WiQueryResourceManager wiQueryResourceManager) { } @Override public JsStatement statement() { return new JsStatement(); } }