blob: 5b9758c5ffc3abba06fca211be3cd6305e25899f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2010 IBM Corporation and others.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.dltk.javascript.ui.actions;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.dltk.core.IMethod;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.dltk.core.ModelException;
import org.eclipse.dltk.internal.javascript.corext.refactoring.structure.ChangeSignatureProcessor;
import org.eclipse.dltk.internal.ui.actions.ActionUtil;
import org.eclipse.dltk.internal.ui.actions.SelectionConverter;
import org.eclipse.dltk.internal.ui.editor.ModelTextSelection;
import org.eclipse.dltk.internal.ui.editor.ScriptEditor;
import org.eclipse.dltk.internal.ui.refactoring.RefactoringMessages;
import org.eclipse.dltk.internal.ui.refactoring.actions.RefactoringStarter;
import org.eclipse.dltk.javascript.internal.ui.refactoring.ChangeSignatureWizard;
import org.eclipse.dltk.ui.DLTKUIPlugin;
import org.eclipse.dltk.ui.util.ExceptionHandler;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ltk.core.refactoring.Refactoring;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.core.refactoring.participants.ProcessorBasedRefactoring;
import org.eclipse.ui.IEditorActionDelegate;
import org.eclipse.ui.IEditorPart;
/**
* Action to start the modify parameters refactoring. The refactoring supports
* swapping and renaming of arguments.
* <p>
* This action is applicable to selections containing a method with one or more
* arguments.
*
* <p>
* This class may be instantiated; it is not intended to be subclassed.
* </p>
*
* @since 2.0
*
* @noextend This class is not intended to be subclassed by clients.
*/
public class ModifyParametersAction implements IEditorActionDelegate {
private ScriptEditor editor;
private ISelection selection;
public void selectionChanged(IAction action, ISelection selection) {
if (selection instanceof ITextSelection)
this.selection = (ITextSelection) selection;
else
this.selection = null;
checkEnabled(action);
}
public void setActiveEditor(IAction action, IEditorPart targetEditor) {
if (targetEditor instanceof ScriptEditor)
editor = (ScriptEditor) targetEditor;
else
editor = null;
checkEnabled(action);
}
private void checkEnabled(IAction action) {
IMethod method = null;
if (selection instanceof IStructuredSelection)
method = getSingleSelectedMethod((IStructuredSelection) selection);
else if (selection instanceof ITextSelection) {
ITextSelection text = (ITextSelection) selection;
if (!(text instanceof ModelTextSelection) && text.getLength() == 0) {
action.setEnabled(true);
return;
}
try {
method = getSingleSelectedMethod(text);
} catch (ModelException e) {
DLTKUIPlugin.log(e);
} catch (StringIndexOutOfBoundsException e) {
// we're initialized with (-1,-1) selection
}
}
action.setEnabled(editor != null && selection != null && method != null);
}
public void run(IAction action) {
try {
if (!ActionUtil.isEditable(editor))
return;
IMethod method = null;
if (selection instanceof IStructuredSelection)
method = getSingleSelectedMethod((IStructuredSelection) selection);
else if (selection instanceof ITextSelection)
method = getSingleSelectedMethod((ITextSelection) selection);
if (method != null)
startChangeSignatureRefactoring(method);
else {
MessageDialog
.openInformation(
editor.getEditorSite().getShell(),
RefactoringMessages.OpenRefactoringWizardAction_unavailable,
RefactoringMessages.ModifyParametersAction_unavailable);
}
} catch (ModelException e) {
ExceptionHandler
.handle(e,
RefactoringMessages.OpenRefactoringWizardAction_refactoring,
RefactoringMessages.OpenRefactoringWizardAction_exception);
}
}
private static IMethod getSingleSelectedMethod(
IStructuredSelection selection) {
if (selection.isEmpty() || selection.size() != 1)
return null;
if (selection.getFirstElement() instanceof IMethod)
return (IMethod) selection.getFirstElement();
return null;
}
private IMethod getSingleSelectedMethod(ITextSelection selection)
throws ModelException {
// - when caret/selection on method name (call or declaration) -> that
// method
// - otherwise: caret position's enclosing method declaration
// - when caret inside argument list of method declaration -> enclosing
// method declaration
// - when caret inside argument list of method call -> enclosing method
// declaration (and NOT method call)
IModelElement[] elements = SelectionConverter.codeResolve(editor);
if (elements.length > 1)
return null;
if (elements.length == 1 && elements[0] instanceof IMethod)
return (IMethod) elements[0];
final ISourceModule sourceModule = SelectionConverter
.getInputAsSourceModule(editor);
if (sourceModule != null) {
IModelElement elementAt = sourceModule.getElementAt(selection
.getOffset());
if (elementAt instanceof IMethod)
return (IMethod) elementAt;
}
return null;
}
private void startChangeSignatureRefactoring(final IMethod method)
throws ModelException {
// if
// (!RefactoringAvailabilityTester.isChangeSignatureAvailable(method))
// return;
try {
ChangeSignatureProcessor processor = new ChangeSignatureProcessor(
method);
RefactoringStatus status = processor
.checkInitialConditions(new NullProgressMonitor());
Refactoring refactoring = new ProcessorBasedRefactoring(processor);
ChangeSignatureWizard wizard = new ChangeSignatureWizard(processor,
refactoring);
new RefactoringStarter().activate(refactoring, wizard, editor
.getEditorSite().getShell(), wizard.getDefaultPageTitle(),
false);
} catch (CoreException e) {
ExceptionHandler
.handle(e,
RefactoringMessages.OpenRefactoringWizardAction_refactoring,
RefactoringMessages.RefactoringStarter_unexpected_exception);
}
}
}