package net.sourceforge.pmd.eclipse.ui.views.actions;
import java.lang.reflect.InvocationTargetException;
import net.sourceforge.pmd.eclipse.ui.PMDUiConstants;
import net.sourceforge.pmd.eclipse.ui.model.AbstractPMDRecord;
import net.sourceforge.pmd.eclipse.ui.model.FileRecord;
import net.sourceforge.pmd.eclipse.ui.model.PackageRecord;
import net.sourceforge.pmd.eclipse.ui.nls.StringKeys;
import net.sourceforge.pmd.eclipse.ui.views.ViolationOverview;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.TreeItem;
public class CalculateStatisticsAction extends AbstractPMDAction {
public final ViolationOverview violationView;
public CalculateStatisticsAction(ViolationOverview view) {
super();
violationView = view;
}
protected String imageId() { return PMDUiConstants.ICON_BUTTON_CALCULATE; }
protected String tooltipMsgId() { return StringKeys.VIEW_TOOLTIP_CALCULATE_STATS; }
private TreeViewer getViewer() {
return violationView.getViewer();
}
/**
* Executes the Action
*/
public void run() {
try {
final ProgressMonitorDialog dialog = new ProgressMonitorDialog(Display.getCurrent().getActiveShell());
dialog.setCancelable(true);
dialog.run(false, false, new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
final TreeItem[] items = getViewer().getTree().getItems();
final int unitCount = calculateWorkUnits(items);
monitor.beginTask(getString(StringKeys.MONITOR_CALC_STATS_TASK), unitCount);
for (TreeItem item : items) {
if (monitor.isCanceled()) {
break;
}
if (item.getData() instanceof PackageRecord) {
final PackageRecord record = (PackageRecord) item.getData();
final AbstractPMDRecord[] children = record.getChildren();
monitor.subTask(getString(StringKeys.MONITOR_CALC_STATS_OF_PACKAGE) + ": " + record.getName());
for (AbstractPMDRecord kid : children) {
if (kid instanceof FileRecord) {
calculateFileRecord((FileRecord)kid);
monitor.worked(1);
}
}
} else if (item.getData() instanceof FileRecord) {
calculateFileRecord((FileRecord) item.getData());
monitor.worked(1);
}
}
getViewer().refresh(true);
}
});
} catch (InvocationTargetException e) {
logErrorByKey(StringKeys.ERROR_INVOCATIONTARGET_EXCEPTION, e);
} catch (InterruptedException e) {
logErrorByKey(StringKeys.ERROR_INTERRUPTED_EXCEPTION, e);
}
}
private void calculateFileRecord(FileRecord fileRecord) {
if (fileRecord.getLOC() == 0) {
fileRecord.calculateLinesOfCode();
fileRecord.calculateNumberOfMethods();
}
}
private int calculateWorkUnits(TreeItem[] items) {
int count = 0;
for (TreeItem item : items) {
Object data = item.getData();
if (data instanceof PackageRecord) {
count += ((PackageRecord) data).getChildren().length;
} else if (data instanceof FileRecord) {
count++;
}
}
return count;
}
}