/* ********************************************************************** ** ** Copyright notice ** ** ** ** (c) 2005-2009 RSSOwl Development Team ** ** http://www.rssowl.org/ ** ** ** ** 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.rssowl.org/legal/epl-v10.html ** ** ** ** A copy is found in the file epl-v10.html and important notices to the ** ** license from the team is found in the textfile LICENSE.txt distributed ** ** in this package. ** ** ** ** This copyright notice MUST APPEAR in all copies of the file! ** ** ** ** Contributors: ** ** RSSOwl Development Team - initial API and implementation ** ** ** ** ********************************************************************** */ package org.rssowl.ui.internal.filter; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtensionRegistry; import org.eclipse.core.runtime.InvalidRegistryObjectException; import org.eclipse.core.runtime.Platform; import org.eclipse.swt.SWT; import org.rssowl.core.INewsAction; import org.rssowl.core.util.StringUtils; import org.rssowl.ui.filter.INewsActionPresentation; import org.rssowl.ui.internal.Activator; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.TreeSet; /** * Helper to load {@link INewsAction} and {@link INewsActionPresentation} * contributions. * * @author bpasero */ public class NewsActionPresentationManager { /* ID of the contributed News Actions */ private static final String NEWS_ACTION_EXTENSION_POINT = "org.rssowl.core.NewsAction"; //$NON-NLS-1$ /* ID of the contributed News Action Presentations */ private static final String NEWS_ACTION_PRESENTATION_EXTENSION_POINT = "org.rssowl.ui.NewsActionPresentation"; //$NON-NLS-1$ /* Singleton Instance */ private static NewsActionPresentationManager fgInstance = new NewsActionPresentationManager(); private Map<String, NewsActionDescriptor> fNewsActions = new HashMap<String, NewsActionDescriptor>(); private Set<NewsActionDescriptor> fSortedNewsActions = new TreeSet<NewsActionDescriptor>(); private Map<String, IConfigurationElement> fNewsActionPresentations = new HashMap<String, IConfigurationElement>(); /** * @return the singleton instance. */ public static NewsActionPresentationManager getInstance() { return fgInstance; } private NewsActionPresentationManager() { loadNewsActions(); loadNewsActionPresentations(); } /** * @param actionId the unique ID of the contributed {@link INewsAction}. * @return the {@link INewsActionPresentation} for the given ID or * <code>null</code> if none. The instance is created on every call and never * shared. */ public INewsActionPresentation getPresentation(String actionId) { try { IConfigurationElement element = fNewsActionPresentations.get(actionId); if (element != null) return (INewsActionPresentation) element.createExecutableExtension("class"); //$NON-NLS-1$ } catch (CoreException e) { Activator.getDefault().logError(e.getMessage(), e); } return null; } /** * @return a list of {@link NewsActionDescriptor} describing the contributed * {@link INewsAction}. The list is sorted by the sortKey as defined in the * contribution. */ public Collection<NewsActionDescriptor> getSortedNewsActions() { return fSortedNewsActions; } /** * @param actionId the unique ID of the contributed {@link INewsAction}. * @return the {@link NewsActionDescriptor} for the contributed * {@link INewsAction}. */ public NewsActionDescriptor getNewsActionDescriptor(String actionId) { return fNewsActions.get(actionId); } /** * @param actionId the unique ID of the contributed {@link INewsAction}. * @return <code>true</code> if the action is contributed and supported for * the current platform and <code>false</code> otherwise. */ public boolean hasNewsAction(String actionId) { return fNewsActions.containsKey(actionId); } private void loadNewsActions() { IExtensionRegistry reg = Platform.getExtensionRegistry(); IConfigurationElement elements[] = reg.getConfigurationElementsFor(NEWS_ACTION_EXTENSION_POINT); for (IConfigurationElement element : elements) { try { /* Check if this Action is only available to a certain platform */ String platform = element.getAttribute("platform"); //$NON-NLS-1$ if (StringUtils.isSet(platform) && !SWT.getPlatform().equals(platform)) continue; String id = element.getAttribute("id"); //$NON-NLS-1$ INewsAction newsAction = (INewsAction) element.createExecutableExtension("class"); //$NON-NLS-1$ String name = element.getAttribute("name"); //$NON-NLS-1$ String description = element.getAttribute("description"); //$NON-NLS-1$ String sortKey = element.getAttribute("sortKey"); //$NON-NLS-1$ String forcable = element.getAttribute("forcable"); //$NON-NLS-1$ NewsActionDescriptor filterAction = new NewsActionDescriptor(id, newsAction, name, description, sortKey, Boolean.parseBoolean(forcable)); fNewsActions.put(id, filterAction); fSortedNewsActions.add(filterAction); } catch (InvalidRegistryObjectException e) { Activator.getDefault().logError(e.getMessage(), e); } catch (CoreException e) { Activator.getDefault().logError(e.getMessage(), e); } } } private void loadNewsActionPresentations() { IExtensionRegistry reg = Platform.getExtensionRegistry(); IConfigurationElement elements[] = reg.getConfigurationElementsFor(NEWS_ACTION_PRESENTATION_EXTENSION_POINT); for (IConfigurationElement element : elements) { try { String id = element.getAttribute("actionId"); //$NON-NLS-1$ fNewsActionPresentations.put(id, element); } catch (InvalidRegistryObjectException e) { Activator.getDefault().logError(e.getMessage(), e); } } } }