/****************************************************************************** * Copyright (C) 2010-2013 Fabio Zadrozny * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Fabio Zadrozny <fabiofz@gmail.com> - initial API and implementation ******************************************************************************/ package org.python.pydev.refactoring.core.base; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.text.IDocument; import org.eclipse.ltk.core.refactoring.Change; import org.eclipse.ltk.core.refactoring.DocumentChange; import org.eclipse.ltk.core.refactoring.TextChange; import org.python.pydev.core.log.Log; import org.python.pydev.shared_ui.utils.RunInUiThread; public class PyDocumentChange extends DocumentChange { /** Construct with factory method **/ private PyDocumentChange(String name, IDocument document) { super(name, document); } @Override public Change perform(final org.eclipse.core.runtime.IProgressMonitor pm) throws CoreException { final Object[] superPerform = new Object[1]; //We need to sync it to have UI access because otherwise we're unable to start a document rewrite session. RunInUiThread.sync(new Runnable() { @Override public void run() { try { superPerform[0] = superPerform(pm); } catch (CoreException e) { superPerform[0] = e; Log.log(e); } catch (Throwable e) { superPerform[0] = e; throw new RuntimeException(e); } } }); Object object = superPerform[0]; if (object == null) { return null; } if (object instanceof Change) { return (Change) object; } if (object instanceof CoreException) { throw (CoreException) object; } else { throw (RuntimeException) object; } } public Change superPerform(org.eclipse.core.runtime.IProgressMonitor pm) throws CoreException { return super.perform(pm); } public static TextChange create(String name, IDocument document) { if (ResourcesPlugin.getPlugin() != null) { return new PyDocumentChange(name, document); } else { return new PyDocumentChangeForTests(name, document); } } @Override public String getTextType() { return "py"; } }