/* * 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); }