Platform.run(safeRunnable);
SafeRunner.run(safeRunnable);
	protected void executeChange(final IProgressMonitor pm) throws CoreException {		if (fDisplay != null && !fDisplay.isDisposed()) {			final Throwable[] exception= new Throwable[1];			final ISchedulingRule rule= ResourcesPlugin.getWorkspace().getRoot();			final Thread callerThread= Thread.currentThread();			final ISafeRunnable safeRunnable= new ISafeRunnable() {				public void run() {					try {						final Button cancel= getCancelButton();						boolean enabled= true;						if (cancel != null && !cancel.isDisposed()) {							enabled= cancel.isEnabled();							cancel.setEnabled(false);						}						try {							UIPerformChangeOperation.super.executeChange(pm);						} finally {							if (cancel != null && !cancel.isDisposed()) {								cancel.setEnabled(enabled);							}						}					} catch(CoreException e) {						exception[0]= e;					} finally {						Platform.getJobManager().transferRule(rule, callerThread);					}				}				public void handleException(Throwable e) {					exception[0]= e;				}			};			Runnable r= new Runnable() {				public void run() {					Platform.run(safeRunnable);				}			};			Platform.getJobManager().transferRule(rule, fDisplay.getThread());			fDisplay.syncExec(r);			if (exception[0] != null) {				if (exception[0] instanceof CoreException) {					IStatus status= ((CoreException)exception[0]).getStatus();					// it is more important to get the original cause of the					// exception. Therefore create a new status and take					// over the exception trace from the UI thread.					throw new CoreException(new MultiStatus(							RefactoringUIPlugin.getPluginId(), IStatus.ERROR,							new IStatus[] {status}, status.getMessage(), exception[0]));				} else {					String message= exception[0].getMessage();					throw new CoreException(new Status(						IStatus.ERROR, RefactoringUIPlugin.getPluginId(),IStatus.ERROR,						message == null							? RefactoringUIMessages.ChangeExceptionHandler_no_details							: message,						exception[0]));				}			}		} else {			super.executeChange(pm);		}	}