/** * This file is protected by Copyright. * Please refer to the COPYRIGHT file distributed with this source distribution. * * This file is part of REDHAWK IDE. * * 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. * */ package gov.redhawk.sca.model.provider.refresh.internal.ui; import gov.redhawk.model.sca.DataProviderObject; import gov.redhawk.model.sca.commands.ScaModelCommandWithResult; import gov.redhawk.model.sca.services.IScaDataProvider; import gov.redhawk.sca.model.provider.refresh.internal.RefreshTasker; import gov.redhawk.sca.model.provider.refresh.ui.RefreshProviderUIActivator; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.viewers.IDecoration; import org.eclipse.jface.viewers.ILightweightLabelDecorator; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.LabelProviderChangedEvent; /** * */ public class RefreshDataProviderDecorator extends LabelProvider implements ILightweightLabelDecorator { private class PropertyListener implements PropertyChangeListener { private final EObject element; public PropertyListener(final EObject element) { this.element = element; } @Override public void propertyChange(final PropertyChangeEvent evt) { if (RefreshDataProviderDecorator.this.disposed) { if (evt.getSource() instanceof RefreshTasker) { final RefreshTasker job = (RefreshTasker) evt.getSource(); job.removePropertyChangeListener(this); return; } } if (RefreshTasker.PROP_ACTIVE.equals(evt.getPropertyName())) { fireStatusChanged(element); } } }; private boolean disposed; private void fireStatusChanged(final Object object) { final LabelProviderChangedEvent event = new LabelProviderChangedEvent(this, object); fireLabelProviderChanged(event); } @Override public void dispose() { this.disposed = true; super.dispose(); } /** * {@inheritDoc} */ @Override public void decorate(final Object element, final IDecoration decoration) { if (element instanceof DataProviderObject) { final DataProviderObject dataProvider = (DataProviderObject) element; final RefreshTasker task = ScaModelCommandWithResult.execute(dataProvider, new ScaModelCommandWithResult<RefreshTasker>() { @Override public void execute() { for (final IScaDataProvider provider : dataProvider.getDataProviders()) { if (provider instanceof RefreshTasker) { final RefreshTasker job = (RefreshTasker) provider; setResult(job); return; } } } }); if (task != null) { if (!task.isActive()) { decoration.addOverlay(RefreshProviderUIActivator.getDefault().getImageDescriptor("icons/stock-media-pause.png"), IDecoration.TOP_RIGHT); } // Don't add a second listener if we have already added one for (PropertyChangeListener l : task.getPropertyChangeListeners()) { if (l instanceof PropertyListener && ((PropertyListener) l).element == dataProvider) { return; } } task.addPropertyChangeListener(new PropertyListener(dataProvider)); } } } }