/******************************************************************************* * Copyright (c) 2012 Pivotal Software, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Pivotal Software, Inc. - initial API and implementation *******************************************************************************/ package org.springsource.ide.eclipse.dashboard.internal.ui.editors; import java.text.DateFormat; import java.util.Date; import java.util.Map; import org.apache.commons.lang.StringEscapeUtils; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.IColorProvider; import org.eclipse.jface.viewers.IFontProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.mylyn.commons.ui.CommonImages; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Image; import org.springsource.ide.eclipse.dashboard.internal.ui.IIdeUiConstants; import org.springsource.ide.eclipse.dashboard.internal.ui.IdeUiPlugin; import org.springsource.ide.eclipse.dashboard.internal.ui.editors.DashboardMainPage.FeedType; import com.sun.syndication.feed.synd.SyndEntry; import com.sun.syndication.feed.synd.SyndFeed; /** * Label provider for displaying RSS feeds on the dashboard * @author Terry Denney * @author Christian Dupuis */ public class FeedsLabelProvider implements IFontProvider, IColorProvider, ITableLabelProvider { private final IPreferenceStore prefStore; private FeedsReader feedReader; private Map<SyndEntry, SyndFeed> feedsMap; // private final FormToolkit toolkit; private static final String ICON_BLOG_BLANK = "rss/blank.png"; private static final String ICON_BLOG_INCOMING = "rss/overlay-incoming.png"; private final FeedType feedType; private final Color feedColor; public FeedsLabelProvider(IPreferenceStore prefStore, DashboardMainPage.FeedType feedType, Color feedColor) { this.prefStore = prefStore; // this.toolkit = toolkit; this.feedType = feedType; this.feedColor = feedColor; } public void addListener(ILabelProviderListener listener) { // TODO Auto-generated method stub } public void dispose() { // TODO Auto-generated method stub } public Color getBackground(Object element) { return null; } public Image getColumnImage(Object element, int index) { // // TODO Auto-generated method stub // return super.getImage(element); // } // public Image getColumnImage(Object element, int columnIndex) { if (element instanceof SyndEntry) { SyndEntry entry = (SyndEntry) element; SyndFeed feed = feedsMap.get(entry); if (feed == null) { return CommonImages.getImage(IdeUiPlugin.getImageDescriptor(ICON_BLOG_BLANK)); } // // ImageDescriptor incoming = null; ImageDescriptor feedImageDesc = feedReader.getImageDescriptorForFeed(feed); if (feedType.equals(DashboardMainPage.FeedType.BLOG)) { if (!prefStore.getBoolean(IIdeUiConstants.PREF_FEED_ENTRY_READ_STATE + ":" + entry.getLink())) { return IdeUiPlugin.getImage(ICON_BLOG_INCOMING); // incoming = // IdeUiPlugin.getImageDescriptor(ICON_BLOG_INCOMING); } } if (feedImageDesc == null) { return IdeUiPlugin.getImage(ICON_BLOG_BLANK); } return CommonImages.getImage(feedImageDesc); // if (incoming != null) { // return CommonImages.getImageWithOverlay(feedImageDesc, incoming, // true, true); // } // return CommonImages.getImage(feedImageDesc); } return null; } public String getColumnText(Object element, int index) { // // TODO Auto-generated method stub // return super.getText(element); // } // public String getColumnText(Object element, int columnIndex) { if (element instanceof StubSyndEntryImpl) { return removeHtmlEntities(((StubSyndEntryImpl) element).getText()); } if (element instanceof SyndEntry) { SyndEntry entry = (SyndEntry) element; SyndFeed feed = feedsMap.get(entry); if (feed == null) { return null; } String title = entry.getTitle(); Date entryDate = new Date(0); if (entry.getUpdatedDate() != null) { entryDate = entry.getUpdatedDate(); } else { entryDate = entry.getPublishedDate(); } String dateString = ""; if (entryDate != null) { dateString = DateFormat.getDateInstance(DateFormat.SHORT).format(entryDate); } String entryAuthor = ""; if (entry.getAuthor() != null && entry.getAuthor().trim() != "") { entryAuthor = " by " + entry.getAuthor(); } if (feedType.equals(DashboardMainPage.FeedType.BLOG) && dateString.length() > 0 && entryAuthor.length() > 0) { return removeHtmlEntities(title + " (" + dateString + entryAuthor + ")"); } return removeHtmlEntities(title); } return null; } public Font getFont(Object element) { return null; } public Color getForeground(Object element) { if (!(element instanceof StubSyndEntryImpl)) { return feedColor; } return null; } public boolean isLabelProperty(Object element, String property) { // TODO Auto-generated method stub return false; } private String removeHtmlEntities(String s) { // Remove html encoded entities s = StringEscapeUtils.unescapeHtml(s); // Remove line breaks and tabs s = s.replace("\n", " "); s = s.replace("\t", " "); // Remove whitespace between text String[] vals = s.split(" "); StringBuilder sb = new StringBuilder(); for (String v : vals) { if (v.trim().length() > 0) { sb.append(v).append(" "); } } return sb.toString(); } public void removeListener(ILabelProviderListener listener) { // TODO Auto-generated method stub } public void setFeedsMap(Map<SyndEntry, SyndFeed> feedsMap, FeedsReader feedReader) { this.feedsMap = feedsMap; this.feedReader = feedReader; } }