/*******************************************************************************
* Copyright (c) 2006 Mountainminds GmbH & Co. KG
* This software is provided under the terms of the Eclipse Public License v1.0
* See http://www.eclipse.org/legal/epl-v10.html.
*
* $Id: CoverageDecorator.java 394 2007-08-28 13:08:46Z mtnminds $
*
* Contributors:
* Benjamin Muskalla - coverage decorators (SF #1659429)
******************************************************************************/
package com.mountainminds.eclemma.internal.ui.decorators;
import java.text.DecimalFormat;
import java.text.Format;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
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 org.eclipse.ui.IWorkbench;
import com.mountainminds.eclemma.core.CoverageTools;
import com.mountainminds.eclemma.core.analysis.ICounter;
import com.mountainminds.eclemma.core.analysis.IJavaCoverageListener;
import com.mountainminds.eclemma.core.analysis.IJavaElementCoverage;
import com.mountainminds.eclemma.internal.ui.EclEmmaUIPlugin;
import com.mountainminds.eclemma.internal.ui.UIMessages;
/**
* Decorator to show code coverage for Java elements.
*
* @author Benjamin Muskalla, Marc R. Hoffmann
* @version $Revision: 394 $
*/
public class CoverageDecorator implements ILightweightLabelDecorator {
private static final Format SUFFIX_FORMAT =
new DecimalFormat(UIMessages.CoverageDecoratorSuffix_label);
private List listeners = new ArrayList();
private IJavaCoverageListener coverageListener = null;
public CoverageDecorator() {
super();
}
public void decorate(Object element, IDecoration decoration) {
IJavaElementCoverage coverage = CoverageTools.getCoverageInfo(element);
if (coverage == null) {
// no coverage data
return;
}
// TODO obtain counter from preferences
ICounter counter = coverage.getInstructionCounter();
ImageDescriptor overlay = EclEmmaUIPlugin.getCoverageOverlay(counter.getRatio());
decoration.addOverlay(overlay, IDecoration.TOP_LEFT);
decoration.addSuffix(SUFFIX_FORMAT.format(new Double(counter.getRatio())));
}
protected void fireEvent() {
final IWorkbench workbench = EclEmmaUIPlugin.getInstance().getWorkbench();
if(workbench == null) return;
final LabelProviderChangedEvent event = new LabelProviderChangedEvent(this);
workbench.getDisplay().asyncExec(new Runnable() {
public void run() {
Iterator i = listeners.iterator();
while (i.hasNext()) {
((ILabelProviderListener) i.next()).labelProviderChanged(event);
}
}
});
}
public void addListener(ILabelProviderListener listener) {
if (!listeners.contains(listener)) {
listeners.add(listener);
}
if (coverageListener == null) {
coverageListener = new IJavaCoverageListener() {
public void coverageChanged() {
fireEvent();
}
};
CoverageTools.addJavaCoverageListener(coverageListener);
}
}
public void removeListener(ILabelProviderListener listener) {
listeners.remove(listener);
}
public boolean isLabelProperty(Object element, String property) {
// coverage does not depend on IJavaElement properties
return false;
}
public void dispose() {
if (coverageListener != null) {
CoverageTools.removeJavaCoverageListener(coverageListener);
coverageListener = null;
}
}
}