package org.xtest.ui.outline;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.swt.widgets.Display;
import org.eclipse.xtext.ui.editor.outline.IOutlineNode;
import org.eclipse.xtext.ui.editor.outline.impl.OutlinePage;
import org.eclipse.xtext.ui.editor.outline.impl.OutlineRefreshJob;
import org.eclipse.xtext.ui.editor.outline.impl.OutlineTreeState;
/**
* Custom outline refresh job to grey-out the outline view while tests are running and automatically
* expand failed tests.
*
* @author Michael Barry
*/
public class XtestOutlineRefreshJob extends OutlineRefreshJob {
private OutlinePage outlinePage;
/**
* Executes a task in the UI thread to enable or disable the outline view
*
* @param enable
* True to enable, false to disable
*/
public void setControlEnabled(final boolean enable) {
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
outlinePage.getTreeViewer().getControl().setEnabled(enable);
}
});
}
@Override
public void setOutlinePage(OutlinePage outlinePage) {
this.outlinePage = outlinePage;
super.setOutlinePage(outlinePage);
}
@Override
protected IOutlineNode refreshOutlineModel(IProgressMonitor monitor,
OutlineTreeState formerState, OutlineTreeState newState) {
// TODO run while edit - refresh on annotation change
// TODO run on save - refresh on new result
IOutlineNode refreshOutlineModel = super
.refreshOutlineModel(monitor, formerState, newState);
if (!monitor.isCanceled()) {
setControlEnabled(true);
}
return refreshOutlineModel;
}
@Override
protected void restoreChildrenSelectionAndExpansion(IOutlineNode parent, Resource resource,
OutlineTreeState formerState, OutlineTreeState newState) {
super.restoreChildrenSelectionAndExpansion(parent, resource, formerState, newState);
List<IOutlineNode> children = parent.getChildren();
for (IOutlineNode child : children) {
if (child instanceof XTestEObjectNode && ((XTestEObjectNode) child).getFailed()) {
// Show failed nodes
newState.addExpandedNode(parent);
} else if (containsUsingComparer(formerState.getExpandedNodes(), child)) {
newState.addExpandedNode(child);
}
restoreChildrenSelectionAndExpansion(child, resource, formerState, newState);
if (containsUsingComparer(formerState.getSelectedNodes(), child)) {
newState.addSelectedNode(child);
}
}
}
@Override
protected IStatus run(IProgressMonitor monitor) {
IStatus status = org.eclipse.core.runtime.Status.OK_STATUS;
if (outlinePage != null && outlinePage.getTreeViewer() != null) {
status = super.run(monitor);
}
return status;
}
}