/*
* Copyright (C) 2006, 2007 Dennis Hunziker, Ueli Kistler
* Copyright (C) 2007 Reto Schuettel, Robin Stocker
*
* IFS Institute for Software, HSR Rapperswil, Switzerland
*
*/
package org.python.pydev.refactoring.ui.actions.internal;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
import org.eclipse.ui.IEditorActionDelegate;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.texteditor.ITextEditor;
import org.python.pydev.core.log.Log;
import org.python.pydev.editor.PyEdit;
import org.python.pydev.editor.actions.PyAction;
import org.python.pydev.plugin.PydevPlugin;
import org.python.pydev.refactoring.core.base.AbstractPythonRefactoring;
import org.python.pydev.refactoring.core.base.RefactoringInfo;
import org.python.pydev.refactoring.ui.core.PythonRefactoringWizard;
public abstract class AbstractRefactoringAction extends Action implements IEditorActionDelegate {
protected AbstractPythonRefactoring refactoring;
protected PyEdit targetEditor;
public void setActiveEditor(IAction action, IEditorPart targetEditor) {
if (targetEditor instanceof ITextEditor) {
if (targetEditor instanceof PyEdit) {
this.targetEditor = (PyEdit) targetEditor;
} else {
this.targetEditor = null;
Log.log(new RuntimeException("Editor not a PyEdit."));
}
}
}
public void selectionChanged(IAction action, ISelection selection) {
}
/**
* Save all dirty editors in the workbench.. Opens a dialog to prompt the
* user. Return true if successful. Return false if the user has canceled
* the command.
*
* @return <code>true</code> if the command succeeded, and
* <code>false</code> if the operation was canceled by the user or
* an error occurred while saving
*/
protected static boolean saveAll() {
IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
return IDE.saveAllEditors(new IResource[] { workspaceRoot }, true);
}
protected int getWizardFlags() {
return RefactoringWizard.WIZARD_BASED_USER_INTERFACE;
}
public void run(IAction action) {
if (targetEditor == null) {
Status status = PydevPlugin.makeStatus(IStatus.ERROR, "Unable to do refactoring.", null);
ErrorDialog.openError(PyAction.getShell(), "Unable to do refactoring.",
"Target editor is null (not PyEdit).", status);
return;
}
boolean allFilesSaved = saveAll();
if (!allFilesSaved) {
return;
}
RefactoringInfo info;
try {
info = new RefactoringInfo(this.targetEditor);
PythonRefactoringWizard wizard = new PythonRefactoringWizard(this.createRefactoring(info),
this.targetEditor, this.createPage(info), this.getWizardFlags());
wizard.run();
this.targetEditor.getDocumentProvider().changed(this.targetEditor.getEditorInput());
} catch (Throwable e) {
Log.log(e);
Throwable initial = e;
while (e.getCause() != null) {
e = e.getCause();
}
//get the root cause
Status status = PydevPlugin.makeStatus(IStatus.ERROR, "Error making refactoring", initial);
ErrorDialog.openError(PyAction.getShell(), "Error making refactoring", e.getMessage(), status);
}
}
/**
* Create a refactoring.
*
* Has to be implemented in the subclass
*/
protected abstract AbstractPythonRefactoring createRefactoring(RefactoringInfo info);
protected abstract IWizardPage createPage(RefactoringInfo info);
}