Bug 162805 [Undo] [IDE] Navigator Undo happens in UI thread with no progress
Build: I20061030-1200 Perform a large copy in a project that takes a few seconds to run Edit > Undo Copy Resources Edit > Redo Copy Resources The "redo" happens in the UI thread so the application stops painting (on Vista the window turns white). This should happen in a modal context thread. 4XESTACKTRACE at org/eclipse/core/internal/resources/Resource.copy(Resource.java:482) 4XESTACKTRACE at org/eclipse/ui/ide/undo/WorkspaceUndoUtil.copy(WorkspaceUndoUtil.java:327) 4XESTACKTRACE at org/eclipse/ui/ide/undo/CopyResourcesOperation.copy(CopyResourcesOperation.java:157) 4XESTACKTRACE at org/eclipse/ui/ide/undo/CopyResourcesOperation.doExecute(CopyResourcesOperation.java:125) 4XESTACKTRACE at org/eclipse/ui/ide/undo/AbstractWorkspaceOperation$2.run(AbstractWorkspaceOperation.java:250) 4XESTACKTRACE at org/eclipse/core/internal/resources/Workspace.run(Workspace.java:1742(Compiled Code)) 4XESTACKTRACE at org/eclipse/ui/ide/undo/AbstractWorkspaceOperation.redo(AbstractWorkspaceOperation.java:248) 4XESTACKTRACE at org/eclipse/core/commands/operations/DefaultOperationHistory.doRedo(DefaultOperationHistory.java:353) 4XESTACKTRACE at org/eclipse/core/commands/operations/DefaultOperationHistory.redo(DefaultOperationHistory.java:1095) 4XESTACKTRACE at org/eclipse/ui/operations/RedoActionHandler.runCommand(RedoActionHandler.java:64) 4XESTACKTRACE at org/eclipse/ui/operations/OperationHistoryActionHandler$4.run(OperationHistoryActionHandler.java:280) 4XESTACKTRACE at org/eclipse/jface/operation/ModalContext.runInCurrentThread(ModalContext.java:369) 4XESTACKTRACE at org/eclipse/jface/operation/ModalContext.run(ModalContext.java:313) 4XESTACKTRACE at org/eclipse/jface/dialogs/ProgressMonitorDialog.run(ProgressMonitorDialog.java:479) 4XESTACKTRACE at org/eclipse/ui/internal/operations/TimeTriggeredProgressMonitorDialog.access$6(TimeTriggeredProgressMonitorDialog.java:1) 4XESTACKTRACE at org/eclipse/ui/internal/operations/TimeTriggeredProgressMonitorDialog$2.run(TimeTriggeredProgressMonitorDialog.java:203) 4XESTACKTRACE at org/eclipse/swt/custom/BusyIndicator.showWhile(BusyIndicator.java:67(Compiled Code)) 4XESTACKTRACE at org/eclipse/ui/internal/operations/TimeTriggeredProgressMonitorDialog.run(TimeTriggeredProgressMonitorDialog.java:216) 4XESTACKTRACE at org/eclipse/ui/operations/OperationHistoryActionHandler.run(OperationHistoryActionHandler.java:290) 4XESTACKTRACE at org/eclipse/jface/action/Action.runWithEvent(Action.java:499) 4XESTACKTRACE at org/eclipse/ui/actions/RetargetAction.runWithEvent(RetargetAction.java:229) 4XESTACKTRACE at org/eclipse/jface/action/ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:539) 4XESTACKTRACE at org/eclipse/jface/action/ActionContributionItem.access$2(ActionContributionItem.java:488) 4XESTACKTRACE at org/eclipse/jface/action/ActionContributionItem$5.handleEvent(ActionContributionItem.java:400) 4XESTACKTRACE at org/eclipse/swt/widgets/EventTable.sendEvent(EventTable.java:66(Compiled Code)) 4XESTACKTRACE at org/eclipse/swt/widgets/Widget.sendEvent(Widget.java:925(Compiled Code)) 4XESTACKTRACE at org/eclipse/swt/widgets/Display.runDeferredEvents(Display.java:3455(Compiled Code)) 4XESTACKTRACE at org/eclipse/swt/widgets/Display.readAndDispatch(Display.java:3072(Compiled Code)) 4XESTACKTRACE at org/eclipse/ui/internal/Workbench.runEventLoop(Workbench.java:1924)
bundles/org.eclipse.core.commands/src/org/eclipse/core/commands/operations/IAdvancedUndoableOperation2.java
/**
	 * Return a status indicating the projected outcome of executing the
	 * receiver.
	 * 
	 * This method should be used to report the possible outcome of executing an
	 * operation when computing the validity of an execute is too expensive to
	 * perform in {@link IUndoableOperation#canExecute()}. It is not called by
	 * the operation history, but instead is used by clients (such as
	 * implementers of {@link IOperationApprover2}) who wish to perform
	 * advanced validation of an operation before attempting to execute it.
	 * 
	 * If the result of this method is the discovery that an operation can in
	 * fact not be executed, then the operation is expected to correctly answer
	 * <code>false</code> on subsequent calls to
	 * {@link IUndoableOperation#canExecute()}.
	 * 
	 * @param monitor
	 *            the progress monitor (or <code>null</code>) to use for
	 *            reporting progress to the user while computing the validity.
	 * 
	 * @return the IStatus indicating the validity of the execute. The status
	 *         severity should be set to <code>OK</code> if the execute can
	 *         successfully be performed, and <code>ERROR</code> if it cannot.
	 *         Any other severity is assumed to represent an ambiguous state.
	 * @throws ExecutionException
	 *             if an exception occurs while computing the validity.
	 */
	IStatus computeExecutionStatus(IProgressMonitor monitor)