/*******************************************************************************
* Copyright (C) 2003-2007, 2013, Guillaume Brocker
* Copyright (C) 2015-2016, Andre Bossert
*
* 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:
* Guillaume Brocker - Initial API and implementation
* Andre Bossert - Add ability to use Doxyfile not in project scope
*
******************************************************************************/
package eclox.core.ui;
import java.util.Collection;
import java.util.Iterator;
import java.util.Vector;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.jface.resource.ImageDescriptor;
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 eclox.core.doxyfiles.Doxyfile;
import eclox.core.doxygen.BuildJob;
public class DoxyfileDecorator implements ILightweightLabelDecorator {
/**
* Implements a job change listener
*/
/**
* @author gbrocker
*
*/
private class MyJobListener extends JobChangeAdapter {
/**
* @see org.eclipse.core.runtime.jobs.JobChangeAdapter#done(org.eclipse.core.runtime.jobs.IJobChangeEvent)
*/
public void done(IJobChangeEvent event) {
Job job = event.getJob();
if( job.belongsTo(BuildJob.FAMILY) ) {
BuildJob buildJob = (BuildJob) job;
fireProviderChangedEvent( buildJob.getDoxyfile() );
}
}
/**
* @see org.eclipse.core.runtime.jobs.JobChangeAdapter#running(org.eclipse.core.runtime.jobs.IJobChangeEvent)
*/
public void running(IJobChangeEvent event) {
Job job = event.getJob();
if( job.belongsTo(BuildJob.FAMILY) ) {
BuildJob buildJob = (BuildJob) job;
fireProviderChangedEvent( buildJob.getDoxyfile() );
}
}
}
/**
* the collection of attached listeners
*/
private Collection<ILabelProviderListener> listeners = new Vector<ILabelProviderListener>();
/**
* the job listener
*/
private MyJobListener jobManagerListener = new MyJobListener();
/**
* Constructor
*/
public DoxyfileDecorator() {
Job.getJobManager().addJobChangeListener(jobManagerListener);
}
/**
* @see org.eclipse.jface.viewers.ILightweightLabelDecorator#decorate(java.lang.Object, org.eclipse.jface.viewers.IDecoration)
*/
public void decorate(Object element, IDecoration decoration) {
if( Doxyfile.isDoxyfile(element) ) {
Doxyfile doxyfile = new Doxyfile((IFile) element, null);
BuildJob job = BuildJob.findJob(doxyfile);
if( job != null && job.getState() == BuildJob.RUNNING ) {
decoration.addOverlay( ImageDescriptor.createFromFile(this.getClass(), "build_co.gif"), IDecoration.BOTTOM_LEFT );
decoration.addSuffix(" (building...)");
}
}
}
/**
* @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
*/
public void addListener(ILabelProviderListener listener) {
listeners.add(listener);
}
/**
* @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
*/
public void dispose() {
Job.getJobManager().removeJobChangeListener(jobManagerListener);
}
/**
* @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
*/
public boolean isLabelProperty(Object element, String property) {
return false;
}
/**
* @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
*/
public void removeListener(ILabelProviderListener listener) {
listeners.remove(listener);
}
/**
* Notifies listerners that the given resource'l decoration need to be updated
*
* @param resource a resource to refresh
*/
private void fireProviderChangedEvent( Object resource ) {
Iterator<ILabelProviderListener> i = listeners.iterator();
LabelProviderChangedEvent event = new LabelProviderChangedEvent(this, resource);
while( i.hasNext() ) {
ILabelProviderListener listener = (ILabelProviderListener) i.next();
listener.labelProviderChanged(event);
}
}
}