/*
* Copyright (c) 2010-2012 Research In Motion Limited. All rights reserved.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Public License, Version 1.0,
* which accompanies this distribution and is available at
*
* http://www.eclipse.org/legal/epl-v10.html
*
*/
package net.rim.ejde.internal.core;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.jface.operation.IRunnableContext;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation;
import org.eclipse.ui.texteditor.ISchedulingRuleProvider;
/**
* This WorkspaceOperationRunner is used to run a {@link WorkspaceOperation} to avoid conflict with any workspace operations, e.g.
* buiding.
*
*/
public class WorkspaceOperationRunner implements IRunnableContext {
private IProgressMonitor fProgressMonitor;
public WorkspaceOperationRunner() {
}
/**
* Sets the progress monitor.
*
* @param progressMonitor
* the progress monitor to set
*/
public void setProgressMonitor( IProgressMonitor progressMonitor ) {
fProgressMonitor = progressMonitor;
}
/**
* Returns the progress monitor. It there is no progress monitor the monitor\ is set to the <code>NullProgressMonitor</code>.
*
* @return the progress monitor
*/
public IProgressMonitor getProgressMonitor() {
if( fProgressMonitor == null )
fProgressMonitor = new NullProgressMonitor();
return fProgressMonitor;
}
/*
* @see org.eclipse.jface.operation.IRunnableContext#run(boolean, boolean, org.eclipse.jface.operation.IRunnableWithProgress)
*/
public void run( boolean fork, boolean cancelable, IRunnableWithProgress runnable ) throws InvocationTargetException,
InterruptedException {
if( runnable instanceof ISchedulingRuleProvider )
run( runnable, ( (ISchedulingRuleProvider) runnable ).getSchedulingRule() );
else
run( runnable, ResourcesPlugin.getWorkspace().getRoot() );
}
/*
* @see org.eclipse.jface.operation.IRunnableContext#run(boolean, boolean, org.eclipse.jface.operation.IRunnableWithProgress)
*/
private void run( IRunnableWithProgress runnable, ISchedulingRule schedulingRule ) throws InvocationTargetException,
InterruptedException {
WorkspaceModifyDelegatingOperation operation = new WorkspaceModifyDelegatingOperation( runnable, schedulingRule );
operation.run( getProgressMonitor() );
}
}