/* * Copyright (c) 2004-2011 Marco Maccaferri and others. * 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: * Marco Maccaferri - initial API and implementation */ package org.eclipsetrader.news.internal.ui; import org.eclipse.core.runtime.ListenerList; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.jface.util.SafeRunnable; import org.eclipse.jface.viewers.IDecoration; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ILightweightLabelDecorator; import org.eclipse.jface.viewers.LabelProviderChangedEvent; import org.eclipse.swt.widgets.Display; import org.eclipsetrader.core.instruments.ISecurity; import org.eclipsetrader.core.views.IViewItem; import org.eclipsetrader.news.core.INewsService; import org.eclipsetrader.news.core.INewsServiceListener; import org.eclipsetrader.news.core.NewsEvent; import org.eclipsetrader.news.internal.Activator; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; public class NewsDecorator implements ILightweightLabelDecorator { private ImageDescriptor unreadedDescriptor; private ImageDescriptor readedDescriptor; private boolean enabled; private INewsService newsService; private ListenerList listeners = new ListenerList(ListenerList.IDENTITY); private INewsServiceListener newsListener = new INewsServiceListener() { @Override public void newsServiceUpdate(NewsEvent event) { fireLabelProviderChanged(new LabelProviderChangedEvent(NewsDecorator.this)); } }; IPropertyChangeListener propertyChangeListener = new IPropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent event) { if (event.getProperty().equals(Activator.PREFS_ENABLE_DECORATORS)) { enabled = ((Boolean) event.getNewValue()).booleanValue(); fireLabelProviderChanged(new LabelProviderChangedEvent(NewsDecorator.this)); } } }; public NewsDecorator() { if (Activator.getDefault() != null) { unreadedDescriptor = Activator.getDefault().getImageRegistry().getDescriptor("unreaded_ovr"); readedDescriptor = Activator.getDefault().getImageRegistry().getDescriptor("readed_ovr"); IPreferenceStore store = Activator.getDefault().getPreferenceStore(); store.addPropertyChangeListener(propertyChangeListener); enabled = store.getBoolean(Activator.PREFS_ENABLE_DECORATORS); } newsService = getNewsService(); newsService.addNewsServiceListener(newsListener); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener) */ @Override public void addListener(ILabelProviderListener listener) { listeners.add(listener); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose() */ @Override public void dispose() { if (Activator.getDefault() != null) { IPreferenceStore store = Activator.getDefault().getPreferenceStore(); store.removePropertyChangeListener(propertyChangeListener); } newsService.removeNewsServiceListener(newsListener); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String) */ @Override public boolean isLabelProperty(Object element, String property) { return false; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener) */ @Override public void removeListener(ILabelProviderListener listener) { listeners.remove(listener); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ILightweightLabelDecorator#decorate(java.lang.Object, org.eclipse.jface.viewers.IDecoration) */ @Override public void decorate(Object element, IDecoration decoration) { if (enabled) { if (element instanceof IViewItem) { IViewItem viewItem = (IViewItem) element; ISecurity security = (ISecurity) viewItem.getAdapter(ISecurity.class); if (security != null) { if (newsService.hasUnreadedHeadLinesFor(security)) { decoration.addOverlay(unreadedDescriptor); } else if (newsService.hasHeadLinesFor(security)) { decoration.addOverlay(readedDescriptor); } } } } } protected void fireLabelProviderChanged(final LabelProviderChangedEvent event) { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { Object[] listeners = NewsDecorator.this.listeners.getListeners(); for (int i = 0; i < listeners.length; ++i) { final ILabelProviderListener l = (ILabelProviderListener) listeners[i]; SafeRunnable.run(new SafeRunnable() { @Override public void run() { l.labelProviderChanged(event); } }); } } }); } protected INewsService getNewsService() { if (newsService == null) { BundleContext context = Activator.getDefault().getBundle().getBundleContext(); ServiceReference serviceReference = context.getServiceReference(INewsService.class.getName()); if (serviceReference != null) { newsService = (INewsService) context.getService(serviceReference); context.ungetService(serviceReference); } } return newsService; } }