List of usage examples for org.apache.wicket.markup.html.list ListView ListView
public ListView(final String id, final List<T> list)
From source file:de.jetwick.ese.ui.FacetPanel.java
License:Apache License
public FacetPanel(String id) { super(id);/* w w w . jav a 2 s . c o m*/ tr.put("userName", "User"); tagView = new ListView("filterNames", normalFacetFields) { @Override public void populateItem(final ListItem item) { final Entry<String, List<FacetHelper>> entry = (Entry<String, List<FacetHelper>>) item .getModelObject(); String keyValue = translate(entry.getKey()); String filter = getFilterName(entry.getKey()); if (filter != null) { item.add(new LabeledLink("filterName", "< " + keyValue) { @Override public void onClick(AjaxRequestTarget target) { onFacetChange(target, entry.getKey(), null, true); } }.add(new AttributeAppender("title", new Model("Remove all filters from '" + keyValue + "'"), " "))); } else item.add(new Label("filterName", keyValue)); item.add(new ListView("filterValues", entry.getValue()) { @Override protected void populateItem(ListItem li) { final FacetHelper h = (FacetHelper) li.getModelObject(); final String filter = h.getFilter(); final boolean selected = alreadyFiltered.contains(filter); Link link = new IndicatingAjaxFallbackLink("filterValueLink") { @Override public void onClick(AjaxRequestTarget target) { onFacetChange(target, h.key, h.value, selected); } }; // change style if filter is selected if (selected) link.add(new AttributeAppender("class", new Model("filter-rm"), " ")); else link.add(new AttributeAppender("class", new Model("filter-add"), " ")); link.add(new Label("filterValue", h.displayName)); // not clickable if filter would result in 0 docs if (h.count == 0) { link.setEnabled(false); link.add(new AttributeAppender("class", new Model("gray"), " ")); } li.add(new Label("filterCount", " (" + h.count + ")")); li.add(link); } }); } }; add(tagView); }
From source file:de.jetwick.ese.ui.ResultsPanel.java
License:Apache License
public ResultsPanel(String id) { super(id);// w w w . j av a2 s.c om add(new Label("qm", new PropertyModel(this, "queryMessage"))); add(new Label("qmWarn", new PropertyModel(this, "queryMessageWarn")) { @Override public boolean isVisible() { return queryMessageWarn != null && queryMessageWarn.length() > 0; } }); add(createSortLink("sortRelevance", "")); add(createSortLink("sortName", MySearch.NAME + " asc")); add(createSortLink("sortLatest", MySearch.CREATED_AT + " desc")); add(createSortLink("sortOldest", MySearch.CREATED_AT + " asc")); userView = new ListView("users", tweets) { @Override public void populateItem(final ListItem item) { final MyTweet tweet = (MyTweet) item.getModelObject(); String twitterUrl = Helper.TURL + "/" + tweet.getUserName(); ExternalLink userNameLink = new ExternalLink("userNameLink", twitterUrl, tweet.getUserName()); item.add(userNameLink); item.add(new Label("tweetText", tweet.getText())); item.add(new Label("createdAt", Helper.toLocalDateTime(tweet.getCreatedAt()))); } }; add(userView); }
From source file:de.jetwick.ui.FacetPanel.java
License:Apache License
public FacetPanel(String id) { super(id);/*from ww w . java 2 s. co m*/ // No Massive Tweeter tr.put(USER, "Tweeters"); tr.put("loc", "Location"); tr.put(DATE, "Date"); tr.put(LANG, "Language"); tr.put(IS_RT, "Content"); tr.put(IS_RT + ":true", "retweet"); tr.put(IS_RT + ":false", "original"); tr.put(DUP_COUNT, "Duplicates"); tr.put(FILTER_NO_DUPS, "without"); tr.put(FILTER_ONLY_DUPS, "only duplicated"); tr.put(URL_COUNT, "Links"); tr.put(FILTER_URL_ENTRY, "with"); tr.put(FILTER_NO_URL_ENTRY, "without"); tr.put(RT_COUNT, "Retweets"); tr.put(RT_COUNT + ":[5 TO *]", "5 and more"); tr.put(RT_COUNT + ":[20 TO *]", "20 and more"); tr.put(RT_COUNT + ":[50 TO *]", "50 and more"); tr.put(QUALITY, "Spam"); tr.put(FILTER_NO_SPAM, "without"); tr.put(FILTER_SPAM, "only spam"); tr.put(LANG + ":" + UNKNOWN_LANG, "Other"); tr.put(LANG + ":" + DE, "Deutsch"); tr.put(LANG + ":" + EN, "English"); tr.put(LANG + ":" + NL, "Nederlandse"); tr.put(LANG + ":" + RU, "P??"); tr.put(LANG + ":" + ES, "Espaol"); // backward compatibility tr.put(LANG + ":sp", "Espaol"); tr.put(LANG + ":" + FR, "Franais"); tr.put(LANG + ":" + PT, "Portugus"); tagView = new ListView("filterNames", normalFacetFields) { @Override public void populateItem(final ListItem item) { final Entry<String, List<FacetHelper>> entry = (Entry<String, List<FacetHelper>>) item .getModelObject(); String dtVal = translate(entry.getKey()); String filter = getFilterName(entry.getKey()); if (filter != null) { item.add(new LabeledLink("filterName", "< " + dtVal) { @Override public void onClick(AjaxRequestTarget target) { onRemoveAllFilter(target, entry.getKey()); } }.add(new AttributeAppender("title", new Model("Remove all filters from '" + dtVal + "'"), " "))); } else item.add(new Label("filterName", dtVal)); item.add(new ListView("filterValues", entry.getValue()) { @Override protected void populateItem(ListItem li) { final FacetHelper h = (FacetHelper) li.getModelObject(); final boolean selected = isAlreadyFiltered(h.getFilter()); final boolean excluded = isAlreadyExcluded(h.getFilter()); Link link = new IndicatingAjaxFallbackLink("filterValueLink") { @Override public void onClick(AjaxRequestTarget target) { if (selected) onFilterChange(target, h.key, h.value, null); else onFilterChange(target, h.key, h.value, false); } }; Link excludeLink = new IndicatingAjaxFallbackLink("filterExcludeLink") { @Override public void onClick(AjaxRequestTarget target) { if (excluded) onFilterChange(target, h.key, h.value, null); else onFilterChange(target, h.key, h.value, true); } }; li.add(new Label("filterCount", " (" + h.count + ")")); li.add(link); li.add(excludeLink); /* exlude does not work for filter queries like RT_COUNT.contains(h.key)*/ if (USER.contains(h.key) || LANG.contains(h.key)) excludeLink.setVisible(true); else excludeLink.setVisible(false); if (excluded) link.add(new AttributeAppender("class", new Model("filter-ex"), " ")); // change style if filter is selected if (selected) link.add(new AttributeAppender("class", new Model("filter-rm"), " ")); else link.add(new AttributeAppender("class", new Model("filter-add"), " ")); // TODO strike through if filter is excluded link.add(new Label("filterValue", h.displayName)); // not clickable if filter would result in 0 docs if (h.count == 0) { link.setEnabled(false); link.add(new AttributeAppender("class", new Model("gray"), " ")); } } }); } }; add(tagView); }
From source file:de.jetwick.ui.jschart.JSDateFilter.java
License:Apache License
public JSDateFilter(String id) { super(id);//from w w w .ja v a 2s.c o m final String dtVal = "Date Filter"; List<String> dateFilterList = new ArrayList<String>(); dateFilterList.add(dtKey); // TODO WICKET update dateFilter even if we call only update(rsp) ListView dateFilter = new ListView("dateFilterParent", dateFilterList) { @Override public void populateItem(final ListItem item) { String filter = getFilterName(dtKey); if (filter != null) { item.add(new LabeledLink("dateFilter", "Click to remove custom date filter") { @Override public void onClick(AjaxRequestTarget target) { onFilterChange(target, dtKey, null); } }.add(new AttributeAppender("title", new Model("Remove all filters from '" + dtVal + "'"), " "))); } else { String str = ""; if (totalHits > 0) str = "Select a date to filter results"; Label label = new Label("dateFilter", str); label.add(new AttributeAppender("class", new Model("gray"), " ")); item.add(label); } } }; add(dateFilter); ListView items = new ListView("items", facetList) { @Override public void populateItem(final ListItem item) { float zoomer = MAX_HEIGHT_IN_PX / max; final FacetHelper entry = (FacetHelper) item.getModelObject(); Label bar = new Label("itemSpan"); String additionalDateInfo = entry.count + " tweets"; String displayName = entry.displayName; try { Date date = Helper.toDate(displayName); int index = displayName.indexOf("T"); if (index > 0) additionalDateInfo += " on " + Helper.getMonthDay(date); displayName = Helper.getWeekDay(date); } catch (Exception ex) { } AttributeAppender app = new AttributeAppender("title", new Model(additionalDateInfo), " "); bar.add(app).add(new AttributeAppender("style", new Model("height:" + (int) (zoomer * entry.count) + "px"), " ")); final boolean selected = isAlreadyFiltered(entry.key, entry.value); Link link = new /*Indicating*/ AjaxFallbackLink("itemLink") { @Override public void onClick(AjaxRequestTarget target) { JSDateFilter.this.onFilterChange(target, entry.getFilter(), !selected); } }; link.add(app); Label label = new Label("itemLabel", displayName); link.add(bar).add(label); if (entry.count == 0) { link.setEnabled(false); link.add(new AttributeAppender("class", new Model("gray"), " ")); } if (selected) link.add(new AttributeAppender("class", new Model("filter-rm"), " ")); else link.add(new AttributeAppender("class", new Model("filter-add"), " ")); item.add(link); } }; add(items); }
From source file:de.jetwick.ui.MobilePage.java
License:Apache License
private void doSearch() { Collection<JUser> users = new LinkedHashSet<JUser>(); JetwickQuery query = new TweetQuery(queryString).setEscape(true) .setSort(ElasticTweetSearch.RT_COUNT, "desc").addLatestDateFilter(24).addNoDupsFilter() .addNoSpamFilter().addIsOriginalTweetFilter().setSize(10); long start = System.currentTimeMillis(); long totalHits = 0; SearchResponse rsp = null;/*w w w . j av a2 s . c om*/ try { rsp = getTweetSearch().query(users, query); totalHits = rsp.getHits().getTotalHits(); logger.info(addIP("[mstats] " + totalHits + " hits for: " + query.toString())); } catch (Exception ex) { logger.error("Error while searching " + query.toString(), ex); } String msg = ""; if (totalHits > 0) { float time = (System.currentTimeMillis() - start) / 100.0f; time = Math.round(time) / 10f; msg = totalHits + " tweets, " + time + " s"; } else msg = "Sorry, nothing found"; add(new Label("msg", msg)); ListView userView = new ListView("users", new ArrayList(users)) { @Override public void populateItem(final ListItem item) { final JUser user = (JUser) item.getModelObject(); String twitterUrl = Helper.TURL + "/" + user.getScreenName(); item.add(new ExternalLink("userUrl", twitterUrl, user.getScreenName())); item.add(new ListView("tweets", new ArrayList<JTweet>(user.getOwnTweets())) { @Override public void populateItem(final ListItem item) { final JTweet tweet = (JTweet) item.getModelObject(); final Label label = new Label("tweet", new Model<String>() { @Override public String getObject() { return new Extractor().setTweet(tweet).setText(tweet.getText()).run().toString(); // return tweet.getText(); } }); label.setEscapeModelStrings(false); item.add(label); item.add(new Label("tweetDate", Helper.toSimpleDateTime(tweet.getCreatedAt()))); item.add(new Label("retweets", "retweets: " + tweet.getRetweetCount())); } }); } }; // for (JUser user : users) { // res += user.getScreenName() + "=" + user.getOwnTweets().iterator().next().getText(); // } add(userView); }
From source file:de.jetwick.ui.OneTweet.java
License:Apache License
public OneTweet init(IModel<JTweet> model, boolean showUser) { setOutputMarkupId(true);// ww w. jav a2s . com 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; }
From source file:de.jetwick.ui.PrinterPage.java
License:Apache License
public PrinterPage() { add(new ListView("users", results) { @Override//w w w . j a v a 2 s. c om public void populateItem(final ListItem item) { final JTweet tw = (JTweet) item.getModelObject(); item.add(new ExternalLink("userName", Helper.JETWICK_URL + "?user=" + Helper.urlEncode(tw.getFromUser().getScreenName()), tw.getFromUser().getScreenName())); item.add(new ExternalLink("statusLink", Helper.toTwitterHref(tw.getFromUser().getScreenName(), tw.getTwitterId()))); Label label = new Label("tweetText", new Extractor().setTweet(tw).run().toString()); label.setEscapeModelStrings(false); item.add(label); } }); }
From source file:de.jetwick.ui.ResultsPanel.java
License:Apache License
public ResultsPanel(String id, final String toLanguage) { super(id);/*w ww . j a va 2s.c o m*/ add(new Label("qm", new PropertyModel(this, "queryMessage"))); add(new Label("qmWarn", new PropertyModel(this, "queryMessageWarn")) { @Override public boolean isVisible() { return queryMessageWarn != null && queryMessageWarn.length() > 0; } }); add(createHitLink(15)); add(createHitLink(30)); add(createHitLink(60)); Model qModel = new Model() { @Override public Serializable getObject() { if (query == null) return ""; String str = query; if (str.length() > 20) str = str.substring(0, 20) + ".."; return "Find origin of '" + str + "'"; } }; findOriginLink = new LabeledLink("findOriginLink", null, qModel, false) { @Override public void onClick(AjaxRequestTarget target) { PageParameters pp = new PageParameters(); pp.add("findOrigin", query); setResponsePage(TweetSearchPage.class, pp); } }; add(findOriginLink); translateAllLink = new LabeledLink("translateAllLink", null, new Model<String>() { @Override public String getObject() { if (translateAll) return "Show original language"; else // get english name of iso language chars return "Translate tweets into " + new Locale(toLanguage).getDisplayLanguage(new Locale("en")); } }) { @Override public void onClick(AjaxRequestTarget target) { if (target == null) return; translateAll = !translateAll; if (!translateAll) translateMap.clear(); target.addComponent(ResultsPanel.this); } }; add(translateAllLink); add(createSortLink("sortRelevance", ElasticTweetSearch.RELEVANCE, "desc")); add(createSortLink("sortRetweets", ElasticTweetSearch.RT_COUNT, "desc")); add(createSortLink("sortLatest", ElasticTweetSearch.DATE, "desc")); add(createSortLink("sortOldest", ElasticTweetSearch.DATE, "asc")); add(new DialogUtilsBehavior()); userView = new ListView("users", users) { @Override public void populateItem(final ListItem item) { final JUser user = (JUser) item.getModelObject(); String name = user.getScreenName(); if (user.getRealName() != null) name = user.getRealName() + " (" + name + ")"; LabeledLink userNameLink = new LabeledLink("userNameLink", name, false) { @Override public void onClick(AjaxRequestTarget target) { onUserClick(user.getScreenName(), null); } }; item.add(userNameLink); Link showLatestTweets = new Link("profileUrl") { @Override public void onClick() { onUserClick(user.getScreenName(), null); } }; item.add(showLatestTweets.add(new ContextImage("profileImg", user.getProfileImageUrl()))); final List<JTweet> tweets = new ArrayList<JTweet>(); int counter = 0; for (JTweet tw : user.getOwnTweets()) { if (tweetsPerUser > 0 && counter >= tweetsPerUser) break; tweets.add(tw); allTweets.put(tw.getTwitterId(), tw); counter++; } ListView tweetView = new ListView("tweets", tweets) { @Override public void populateItem(final ListItem item) { item.add(createOneTweet("oneTweet", toLanguage).init(item.getModel(), false)); } }; item.add(tweetView); } }; add(userView); WebResource export = new WebResource() { @Override public IResourceStream getResourceStream() { return new StringResourceStream(getTweetsAsString(), "text/plain"); } @Override protected void setHeaders(WebResponse response) { super.setHeaders(response); response.setAttachmentHeader("tweets.txt"); } }; export.setCacheable(false); add(new ResourceLink("exportTsvLink", export)); add(new Link("exportHtmlLink") { @Override public void onClick() { onHtmlExport(); } }); }
From source file:de.jetwick.ui.SavedSearchPanel.java
License:Apache License
public SavedSearchPanel(String id) { super(id);/* w ww .java 2 s . com*/ tr.put(SAVED_SEARCHES, "Saved Searches"); Link saveSearch = new IndicatingAjaxFallbackLink("saveSearch") { @Override public void onClick(AjaxRequestTarget target) { SavedSearchPanel.this.onSave(target, new Date().getTime()); } }; add(saveSearch); AjaxFallbackLink link = new IndicatingAjaxFallbackLink("saveInfo") { @Override public void onClick(AjaxRequestTarget target) { SavedSearchPanel.this.onSave(target, new Date().getTime()); } @Override public boolean isVisible() { return isInitialized && savedSearches.isEmpty(); } }; add(link.setOutputMarkupId(true)); add(new WebMarkupContainer("indicatorImage") { @Override public boolean isVisible() { return !isInitialized; } }.setOutputMarkupId(true)); // don't know how to utilize IAjaxIndicatorAware + getAjaxIndicatorMarkupId() { return indicator.getMarkupId(); //add(indicator); savedSearchesView = new ListView("filterValues", savedSearches) { @Override protected void populateItem(ListItem li) { final FacetHelper<Long> h = (FacetHelper<Long>) li.getModelObject(); long tmp = h.value; final long ssId = tmp; Link link = new IndicatingAjaxFallbackLink("filterValueLink") { @Override public void onClick(AjaxRequestTarget target) { SavedSearchPanel.this.onClick(target, ssId); } }; String name = h.displayName; if (name.length() > 20) name = name.substring(0, 20) + ".."; else if (name.length() < 1) name = "<empty>"; if (ssId == 0) name = "last:" + name; link.add(new Label("filterValue", name)); link.add(new AttributeAppender("title", true, new Model(h.displayName), " ")); Label label4count = new Label("filterCount", " (" + h.count + ")"); if (h.count < 1) { link.add(new AttributeAppender("class", new Model("gray"), " ")); label4count.add(new AttributeAppender("class", new Model("gray"), " ")); } li.add(label4count); li.add(link); final Dialog dialog = new Dialog("confirmation").setWidth(400) .setTitle("Delete Saved Search " + name + "?"); dialog.add(new AjaxFallbackLink("button") { @Override public void onClick(AjaxRequestTarget target) { dialog.close(target); SavedSearchPanel.this.onRemove(target, ssId); } }); li.add(dialog); Link removeLink = new AjaxFallbackLink("removeLink") { @Override public void onClick(AjaxRequestTarget target) { if (target != null) dialog.open(target); } }; li.add(removeLink); } }; add(savedSearchesView); // execute one time add(new AjaxSelfUpdatingTimerBehavior(Duration.seconds(0.1)) { @Override protected void onPostProcessTarget(AjaxRequestTarget target) { updateSSCounts(target); isInitialized = true; stop(); } }); // execute forever add(new AjaxSelfUpdatingTimerBehavior(Duration.seconds(60)) { @Override protected void onPostProcessTarget(AjaxRequestTarget target) { // update count of all queries updateSSCounts(target); } }); }
From source file:de.jetwick.ui.TagCloudPanel.java
License:Apache License
public TagCloudPanel(String id) { super(id);/*from ww w .j a va 2s. c o m*/ tagListView = new ListView("tags", tags) { @Override public void populateItem(final ListItem item) { final Entry<String, Long> tag = (Entry) item.getModelObject(); Link link = new Link("tagLink") { @Override public void onClick() { onTagClick(tag.getKey()); } }; link.add(new AttributeAppender("class", new Model("var-size-" + toInt(tag.getValue())), " ")); link.add(new AttributeAppender("title", new Model("Search '" + tag.getKey() + "'"), " ")); link.add(new Label("tagLabel", tag.getKey())); item.add(link); // no ajax Link originLink = new Link("tagOrigin") { @Override public void onClick() { onFindOriginClick(tag.getKey()); } }; originLink.add(new AttributeAppender("title", new Model("Find origin of trend '" + tag.getKey() + "'"), " ")); item.add(originLink); } }; add(tagListView); }