content: /*******************************************************************************
   * Copyright (c) 2005, 2009 IBM Corporation and others.
   * 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:
   *     IBM Corporation - initial API and implementation
   *******************************************************************************/
  package org.eclipse.wst.jsdt.internal.corext.refactoring;
  
  import java.lang.reflect.InvocationTargetException;
  import java.util.Arrays;
  import java.util.HashSet;
  import java.util.Set;
  
  import org.eclipse.core.resources.IResource;
  import org.eclipse.core.runtime.CoreException;
  import org.eclipse.core.runtime.IStatus;
  import org.eclipse.core.runtime.NullProgressMonitor;
  import org.eclipse.jface.dialogs.MessageDialog;
  import org.eclipse.jface.dialogs.ProgressMonitorDialog;
  import org.eclipse.jface.operation.IRunnableContext;
  import org.eclipse.jface.text.ITextSelection;
  import org.eclipse.jface.viewers.IStructuredSelection;
  import org.eclipse.jface.viewers.StructuredSelection;
  import org.eclipse.ltk.core.refactoring.Refactoring;
  import org.eclipse.ltk.core.refactoring.RefactoringCore;
  import org.eclipse.ltk.core.refactoring.RefactoringStatus;
  import org.eclipse.ltk.core.refactoring.RefactoringStatusEntry;
  import org.eclipse.ltk.core.refactoring.participants.CopyRefactoring;
  import org.eclipse.ltk.core.refactoring.participants.DeleteRefactoring;
  import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
  import org.eclipse.swt.widgets.Shell;
  import org.eclipse.ui.PlatformUI;
  import org.eclipse.wst.jsdt.core.IClassFile;
  import org.eclipse.wst.jsdt.core.IField;
  import org.eclipse.wst.jsdt.core.IFunction;
  import org.eclipse.wst.jsdt.core.IJavaScriptElement;
  import org.eclipse.wst.jsdt.core.IJavaScriptProject;
  import org.eclipse.wst.jsdt.core.IJavaScriptUnit;
  import org.eclipse.wst.jsdt.core.ILocalVariable;
  import org.eclipse.wst.jsdt.core.IMember;
  import org.eclipse.wst.jsdt.core.IPackageFragment;
  import org.eclipse.wst.jsdt.core.IPackageFragmentRoot;
  import org.eclipse.wst.jsdt.core.IType;
  import org.eclipse.wst.jsdt.core.ITypeRoot;
  import org.eclipse.wst.jsdt.core.JavaScriptModelException;
  import org.eclipse.wst.jsdt.core.dom.JavaScriptUnit;
  import org.eclipse.wst.jsdt.internal.corext.fix.CleanUpRefactoring;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.base.RefactoringStatusCodes;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.code.ConvertAnonymousToNestedRefactoring;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.code.InlineConstantRefactoring;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.code.InlineMethodRefactoring;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.code.InlineTempRefactoring;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.code.IntroduceFactoryRefactoring;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.code.IntroduceIndirectionRefactoring;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.code.IntroduceParameterRefactoring;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.code.ReplaceInvocationsRefactoring;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.rename.JavaRenameRefactoring;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.rename.RenameResourceProcessor;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.reorg.JavaCopyProcessor;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.reorg.JavaCopyRefactoring;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.reorg.JavaDeleteProcessor;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.reorg.JavaDeleteRefactoring;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.reorg.JavaMoveProcessor;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.reorg.ReorgPolicyFactory;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.reorg.IReorgPolicy.ICopyPolicy;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.reorg.IReorgPolicy.IMovePolicy;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.sef.SelfEncapsulateFieldRefactoring;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.structure.ChangeSignatureRefactoring;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.structure.ChangeTypeRefactoring;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.structure.ExtractSupertypeProcessor;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.structure.ExtractSupertypeRefactoring;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.structure.JavaMoveRefactoring;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.structure.MoveInnerToTopRefactoring;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.structure.MoveInstanceMethodProcessor;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.structure.MoveInstanceMethodRefactoring;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.structure.MoveStaticMembersProcessor;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.structure.PullUpRefactoring;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.structure.PullUpRefactoringProcessor;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.structure.PushDownRefactoring;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.structure.PushDownRefactoringProcessor;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.structure.UseSuperTypeProcessor;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.structure.UseSuperTypeRefactoring;
  import org.eclipse.wst.jsdt.internal.ui.actions.ActionMessages;
  import org.eclipse.wst.jsdt.internal.ui.fix.CleanUpRefactoringWizard;
  import org.eclipse.wst.jsdt.internal.ui.fix.ICleanUp;
  import org.eclipse.wst.jsdt.internal.ui.preferences.JavaPreferencesSettings;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.ChangeSignatureWizard;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.ChangeTypeWizard;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.ConvertAnonymousToNestedWizard;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.ExtractSupertypeWizard;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.InlineConstantWizard;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.InlineTempWizard;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.IntroduceFactoryWizard;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.IntroduceIndirectionWizard;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.IntroduceParameterWizard;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.MoveInnerToTopWizard;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.MoveInstanceMethodWizard;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.MoveMembersWizard;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.PullUpWizard;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.PushDownWizard;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.RefactoringExecutionHelper;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.RefactoringMessages;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.RefactoringSaveHelper;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.UseSupertypeWizard;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.UserInterfaceStarter;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.actions.RefactoringStarter;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.code.InlineMethodWizard;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.code.ReplaceInvocationsWizard;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.reorg.CreateTargetQueries;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.reorg.DeleteUserInterfaceManager;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.reorg.NewNameQueries;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.reorg.RenameUserInterfaceManager;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.reorg.ReorgCopyWizard;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.reorg.ReorgMoveWizard;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.reorg.ReorgQueries;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.sef.SelfEncapsulateFieldWizard;
  import org.eclipse.wst.jsdt.internal.ui.util.ExceptionHandler;
  import org.eclipse.wst.jsdt.ui.actions.SelectionDispatchAction;
  import org.eclipse.wst.jsdt.ui.refactoring.RenameSupport;
  
  /**
   * Helper class to run refactorings from action code.
   * <p>
   * This class has been introduced to decouple actions from the refactoring code,
   * in order not to eagerly load refactoring classes during action
   * initialization.
   * </p>
   * 
   * 
   */
  public final class RefactoringExecutionStarter {
  
  	private static RenameSupport createRenameSupport(IJavaScriptElement element, String newName, int flags) throws CoreException {
  		switch (element.getElementType()) {
  			case IJavaScriptElement.JAVASCRIPT_PROJECT:
  				return RenameSupport.create((IJavaScriptProject) element, newName, flags);
  			case IJavaScriptElement.PACKAGE_FRAGMENT_ROOT:
  				return RenameSupport.create((IPackageFragmentRoot) element, newName);
  			case IJavaScriptElement.PACKAGE_FRAGMENT:
  				return RenameSupport.create((IPackageFragment) element, newName, flags);
  			case IJavaScriptElement.JAVASCRIPT_UNIT:
  				return RenameSupport.create((IJavaScriptUnit) element, newName, flags);
  			case IJavaScriptElement.TYPE:
  				return RenameSupport.create((IType) element, newName, flags);
  			case IJavaScriptElement.METHOD:
  				final IFunction method= (IFunction) element;
  				if (method.isConstructor())
  					return createRenameSupport(method.getDeclaringType(), newName, flags);
  				else
  					return RenameSupport.create((IFunction) element, newName, flags);
  			case IJavaScriptElement.FIELD:
  				return RenameSupport.create((IField) element, newName, flags);
  			case IJavaScriptElement.LOCAL_VARIABLE:
  				return RenameSupport.create((ILocalVariable) element, newName, flags);
  		}
  		return null;
  	}
  
  	public static void startChangeSignatureRefactoring(final IFunction method, final SelectionDispatchAction action, final Shell shell) throws JavaScriptModelException {
  		if (!RefactoringAvailabilityTester.isChangeSignatureAvailable(method))
  			return;
  		final ChangeSignatureRefactoring refactoring= new ChangeSignatureRefactoring(method);
  		final UserInterfaceStarter starter= new UserInterfaceStarter() {
  
  			public final boolean activate(final Refactoring ref, final Shell parent, final int saveMode) throws CoreException {
  				final RefactoringStatus status= ref.checkInitialConditions(new NullProgressMonitor());
  				if (status.hasFatalError()) {
  					final RefactoringStatusEntry entry= status.getEntryMatchingSeverity(RefactoringStatus.FATAL);
  					if (entry.getCode() == RefactoringStatusCodes.OVERRIDES_ANOTHER_METHOD || entry.getCode() == RefactoringStatusCodes.METHOD_DECLARED_IN_INTERFACE) {
  
  						String message= entry.getMessage();
  						final Object element= entry.getData();
  						message= message + RefactoringMessages.RefactoringErrorDialogUtil_okToPerformQuestion;
  						if (element != null && MessageDialog.openQuestion(shell, RefactoringMessages.OpenRefactoringWizardAction_refactoring, message)) {
  
  							final IStructuredSelection selection= new StructuredSelection(element);
  							// TODO: should not hijack this
  							// ModifiyParametersAction.
  							// The action is set up on an editor, but we use it
  							// as if it were set up on a ViewPart.
  							boolean wasEnabled= action.isEnabled();
  							action.selectionChanged(selection);
  							if (action.isEnabled()) {
  								action.run(selection);
  							} else {
  								MessageDialog.openInformation(shell, ActionMessages.ModifyParameterAction_problem_title, ActionMessages.ModifyParameterAction_problem_message);
  							}
  							action.setEnabled(wasEnabled);
  						}
  						return false;
  					}
  				}
  				return super.activate(ref, parent, saveMode);
  			}
  		};
  		starter.initialize(new ChangeSignatureWizard(refactoring));
  		try {
  			starter.activate(refactoring, shell, RefactoringSaveHelper.SAVE_JAVA_ONLY_UPDATES);
  		} catch (CoreException e) {
  			ExceptionHandler.handle(e, RefactoringMessages.OpenRefactoringWizardAction_refactoring, RefactoringMessages.RefactoringStarter_unexpected_exception);
  		}
  	}
  
  	public static void startChangeTypeRefactoring(final IJavaScriptUnit unit, final Shell shell, final int offset, final int length) throws JavaScriptModelException {
  		final ChangeTypeRefactoring refactoring= new ChangeTypeRefactoring(unit, offset, length);
  		new RefactoringStarter().activate(refactoring, new ChangeTypeWizard(refactoring), shell, RefactoringMessages.ChangeTypeAction_dialog_title, RefactoringSaveHelper.SAVE_JAVA_ONLY_UPDATES);
  	}
  	
  	public static void startCleanupRefactoring(IJavaScriptUnit[] cus, ICleanUp[] cleanUps, Shell shell, boolean showWizard, String actionName) throws InvocationTargetException, JavaScriptModelException {
  		final CleanUpRefactoring refactoring= new CleanUpRefactoring(actionName);
  		for (int i= 0; i < cus.length; i++) {
  			refactoring.addCompilationUnit(cus[i]);
  		}
  		
  		if (!showWizard) {
  			for (int i= 0; i < cleanUps.length; i++) {
  				refactoring.addCleanUp(cleanUps[i]);
  			}
  			
  			IRunnableContext context;
  			if (refactoring.getCompilationUnits().length > 1) {
  				context= new ProgressMonitorDialog(shell);
  			} else {
  				context= PlatformUI.getWorkbench().getActiveWorkbenchWindow();
  			}
  			
  			RefactoringExecutionHelper helper= new RefactoringExecutionHelper(refactoring, IStatus.INFO, RefactoringSaveHelper.SAVE_JAVA_ONLY_UPDATES, shell, context);
  			try {
  				helper.perform(true, true);
  			} catch (InterruptedException e) {
  			}
  		} else {
  			CleanUpRefactoringWizard refactoringWizard= new CleanUpRefactoringWizard(refactoring, RefactoringWizard.WIZARD_BASED_USER_INTERFACE);
  			RefactoringStarter starter= new RefactoringStarter();
  			starter.activate(refactoring, refactoringWizard, shell, actionName, RefactoringSaveHelper.SAVE_JAVA_ONLY_UPDATES);			
  		}
  	}
  
  	public static void startConvertAnonymousRefactoring(final IJavaScriptUnit unit, final int offset, final int length, final Shell shell) throws JavaScriptModelException {
  		final ConvertAnonymousToNestedRefactoring refactoring= new ConvertAnonymousToNestedRefactoring(unit, offset, length);
  		new RefactoringStarter().activate(refactoring, new ConvertAnonymousToNestedWizard(refactoring), shell, RefactoringMessages.ConvertAnonymousToNestedAction_dialog_title, RefactoringSaveHelper.SAVE_JAVA_ONLY_UPDATES);
  	}
  
  	public static void startCopyRefactoring(IResource[] resources, IJavaScriptElement[] javaElements, Shell shell) throws JavaScriptModelException {
  		ICopyPolicy copyPolicy= ReorgPolicyFactory.createCopyPolicy(resources, javaElements);
  		if (copyPolicy.canEnable()) {
  			JavaCopyProcessor processor= new JavaCopyProcessor(copyPolicy);
  			CopyRefactoring refactoring= new JavaCopyRefactoring(processor);
  			RefactoringWizard wizard= new ReorgCopyWizard(refactoring);
  			processor.setNewNameQueries(new NewNameQueries(wizard));
  			processor.setReorgQueries(new ReorgQueries(wizard));
  			new RefactoringStarter().activate(refactoring, wizard, shell, RefactoringMessages.OpenRefactoringWizardAction_refactoring, RefactoringSaveHelper.SAVE_NOTHING);
  		}
  	}
  
  	public static void startCutRefactoring(final Object[] elements, final Shell shell) throws CoreException, InterruptedException, InvocationTargetException {
  		final JavaDeleteProcessor processor= new JavaDeleteProcessor(elements);
  		processor.setSuggestGetterSetterDeletion(false);
  		processor.setQueries(new ReorgQueries(shell));
  		new RefactoringExecutionHelper(new JavaDeleteRefactoring(processor), RefactoringCore.getConditionCheckingFailedSeverity(), RefactoringSaveHelper.SAVE_NOTHING, shell, new ProgressMonitorDialog(shell)).perform(false, false);
  	}
  
  	public static void startDeleteRefactoring(final Object[] elements, final Shell shell) throws CoreException {
  		final DeleteRefactoring refactoring= new JavaDeleteRefactoring(new JavaDeleteProcessor(elements));
  		DeleteUserInterfaceManager.getDefault().getStarter(refactoring).activate(refactoring, shell, RefactoringSaveHelper.SAVE_NOTHING);
  	}
  
  	public static void startExtractSupertypeRefactoring(final IMember[] members, final Shell shell) throws JavaScriptModelException {
  		if (!RefactoringAvailabilityTester.isExtractSupertypeAvailable(members))
  			return;
  		IJavaScriptProject project= null;
  		if (members != null && members.length > 0)
  			project= members[0].getJavaScriptProject();
  		final ExtractSupertypeRefactoring refactoring= new ExtractSupertypeRefactoring(new ExtractSupertypeProcessor(members, JavaPreferencesSettings.getCodeGenerationSettings(project)));
  		new RefactoringStarter().activate(refactoring, new ExtractSupertypeWizard(refactoring), shell, RefactoringMessages.OpenRefactoringWizardAction_refactoring, RefactoringSaveHelper.SAVE_JAVA_ONLY_UPDATES);
  	}
  
  	public static boolean startInlineConstantRefactoring(final IJavaScriptUnit unit, final JavaScriptUnit node, final int offset, final int length, final Shell shell) throws JavaScriptModelException {
  		final InlineConstantRefactoring refactoring= new InlineConstantRefactoring(unit, node, offset, length);
  		if (! refactoring.checkStaticFinalConstantNameSelected().hasFatalError()) {
  			new RefactoringStarter().activate(refactoring, new InlineConstantWizard(refactoring), shell, RefactoringMessages.InlineConstantAction_dialog_title, RefactoringSaveHelper.SAVE_JAVA_ONLY_UPDATES);
  			return true;
  		}
  		return false;
  	}
  
  	public static boolean startInlineMethodRefactoring(final ITypeRoot typeRoot, final JavaScriptUnit node, final int offset, final int length, final Shell shell) throws JavaScriptModelException {
  		final InlineMethodRefactoring refactoring= InlineMethodRefactoring.create(typeRoot, node, offset, length);
  		if (refactoring != null) {
  			new RefactoringStarter().activate(refactoring, new InlineMethodWizard(refactoring), shell, RefactoringMessages.InlineMethodAction_dialog_title, RefactoringSaveHelper.SAVE_JAVA_ONLY_UPDATES);
  			return true;
  		}
  		return false;
  	}
  
  	public static boolean startInlineTempRefactoring(final IJavaScriptUnit unit, JavaScriptUnit node, final ITextSelection selection, final Shell shell) throws JavaScriptModelException {
  		final InlineTempRefactoring refactoring= new InlineTempRefactoring(unit, node, selection.getOffset(), selection.getLength());
  		if (! refactoring.checkIfTempSelected().hasFatalError()) {
  			new RefactoringStarter().activate(refactoring, new InlineTempWizard(refactoring), shell, RefactoringMessages.InlineTempAction_inline_temp, RefactoringSaveHelper.SAVE_NOTHING);
  			return true;
  		}
  		return false;
  	}
  
  	public static void startIntroduceFactoryRefactoring(final IJavaScriptUnit unit, final ITextSelection selection, final Shell shell) throws JavaScriptModelException {
  		final IntroduceFactoryRefactoring refactoring= new IntroduceFactoryRefactoring(unit, selection.getOffset(), selection.getLength());
  		new RefactoringStarter().activate(refactoring, new IntroduceFactoryWizard(refactoring, RefactoringMessages.IntroduceFactoryAction_use_factory), shell, RefactoringMessages.IntroduceFactoryAction_dialog_title, RefactoringSaveHelper.SAVE_JAVA_ONLY_UPDATES);
  	}
  
  	public static void startIntroduceIndirectionRefactoring(final IClassFile file, final int offset, final int length, final Shell shell) throws JavaScriptModelException {
  		final IntroduceIndirectionRefactoring refactoring= new IntroduceIndirectionRefactoring(file, offset, length);
  		new RefactoringStarter().activate(refactoring, new IntroduceIndirectionWizard(refactoring, RefactoringMessages.IntroduceIndirectionAction_dialog_title), shell, RefactoringMessages.IntroduceIndirectionAction_dialog_title, RefactoringSaveHelper.SAVE_JAVA_ONLY_UPDATES);
  	}
  
  	public static void startIntroduceIndirectionRefactoring(final IJavaScriptUnit unit, final int offset, final int length, final Shell shell) throws JavaScriptModelException {
  		final IntroduceIndirectionRefactoring refactoring= new IntroduceIndirectionRefactoring(unit, offset, length);
  		new RefactoringStarter().activate(refactoring, new IntroduceIndirectionWizard(refactoring, RefactoringMessages.IntroduceIndirectionAction_dialog_title), shell, RefactoringMessages.IntroduceIndirectionAction_dialog_title, RefactoringSaveHelper.SAVE_JAVA_ONLY_UPDATES);
  	}
  
  	public static void startIntroduceIndirectionRefactoring(final IFunction method, final Shell shell) throws JavaScriptModelException {
  		final IntroduceIndirectionRefactoring refactoring= new IntroduceIndirectionRefactoring(method);
  		new RefactoringStarter().activate(refactoring, new IntroduceIndirectionWizard(refactoring, RefactoringMessages.IntroduceIndirectionAction_dialog_title), shell, RefactoringMessages.IntroduceIndirectionAction_dialog_title, RefactoringSaveHelper.SAVE_JAVA_ONLY_UPDATES);
  	}
  
  	public static void startIntroduceParameter(IJavaScriptUnit unit, int offset, int length, Shell shell) throws JavaScriptModelException {
  		final IntroduceParameterRefactoring refactoring= new IntroduceParameterRefactoring(unit, offset, length);
  		new RefactoringStarter().activate(refactoring, new IntroduceParameterWizard(refactoring), shell, RefactoringMessages.IntroduceParameterAction_dialog_title, RefactoringSaveHelper.SAVE_JAVA_ONLY_UPDATES);
  	}
  
  	public static void startMoveInnerRefactoring(final IType type, final Shell shell) throws JavaScriptModelException {
  		if (!RefactoringAvailabilityTester.isMoveInnerAvailable(type))
  			return;
  		final MoveInnerToTopRefactoring refactoring= new MoveInnerToTopRefactoring(type, JavaPreferencesSettings.getCodeGenerationSettings(type.getJavaScriptProject()));
  		new RefactoringStarter().activate(refactoring, new MoveInnerToTopWizard(refactoring), shell, RefactoringMessages.OpenRefactoringWizardAction_refactoring, RefactoringSaveHelper.SAVE_JAVA_ONLY_UPDATES);
  	}
  
  	public static void startMoveMethodRefactoring(final IFunction method, final Shell shell) throws JavaScriptModelException {
  		final MoveInstanceMethodRefactoring refactoring= new MoveInstanceMethodRefactoring(new MoveInstanceMethodProcessor(method, JavaPreferencesSettings.getCodeGenerationSettings(method.getJavaScriptProject())));
  		new RefactoringStarter().activate(refactoring, new MoveInstanceMethodWizard(refactoring), shell, RefactoringMessages.MoveInstanceMethodAction_dialog_title, RefactoringSaveHelper.SAVE_JAVA_ONLY_UPDATES);
  	}
  
  	public static void startMoveRefactoring(final IResource[] resources, final IJavaScriptElement[] elements, final Shell shell) throws JavaScriptModelException {
  		IMovePolicy policy= ReorgPolicyFactory.createMovePolicy(resources, elements);
  		if (policy.canEnable()) {
  			final JavaMoveProcessor processor= new JavaMoveProcessor(policy);
  			final JavaMoveRefactoring refactoring= new JavaMoveRefactoring(processor);
  			final RefactoringWizard wizard= new ReorgMoveWizard(refactoring);
  			processor.setCreateTargetQueries(new CreateTargetQueries(wizard));
  			processor.setReorgQueries(new ReorgQueries(wizard));
  			new RefactoringStarter().activate(refactoring, wizard, shell, RefactoringMessages.OpenRefactoringWizardAction_refactoring, RefactoringSaveHelper.SAVE_ALL);
  		}
  	}
  
  	public static void startMoveStaticMembersRefactoring(final IMember[] members, final Shell shell) throws JavaScriptModelException {
  		if (!RefactoringAvailabilityTester.isMoveStaticAvailable(members))
  			return;
  		final Set set= new HashSet();
  		set.addAll(Arrays.asList(members));
  		final IMember[] elements= (IMember[]) set.toArray(new IMember[set.size()]);
  		IJavaScriptProject project= null;
  		if (elements.length > 0)
  			project= elements[0].getJavaScriptProject();
  		final JavaMoveRefactoring refactoring= new JavaMoveRefactoring(new MoveStaticMembersProcessor(elements, JavaPreferencesSettings.getCodeGenerationSettings(project)));
  		new RefactoringStarter().activate(refactoring, new MoveMembersWizard(refactoring), shell, RefactoringMessages.OpenRefactoringWizardAction_refactoring, RefactoringSaveHelper.SAVE_NON_JAVA_UPDATES);
  	}
  
  	public static void startPullUpRefactoring(final IMember[] members, final Shell shell) throws JavaScriptModelException {
  		if (!RefactoringAvailabilityTester.isPullUpAvailable(members))
  			return;
  		IJavaScriptProject project= null;
  		if (members != null && members.length > 0)
  			project= members[0].getJavaScriptProject();
  		final PullUpRefactoring refactoring= new PullUpRefactoring(new PullUpRefactoringProcessor(members, JavaPreferencesSettings.getCodeGenerationSettings(project)));
  		new RefactoringStarter().activate(refactoring, new PullUpWizard(refactoring), shell, RefactoringMessages.OpenRefactoringWizardAction_refactoring, RefactoringSaveHelper.SAVE_JAVA_ONLY_UPDATES);
  	}
  
  	public static void startPushDownRefactoring(final IMember[] members, final Shell shell) throws JavaScriptModelException {
  		if (!RefactoringAvailabilityTester.isPushDownAvailable(members))
  			return;
  		final PushDownRefactoring refactoring= new PushDownRefactoring(new PushDownRefactoringProcessor(members));
  		new RefactoringStarter().activate(refactoring, new PushDownWizard(refactoring), shell, RefactoringMessages.OpenRefactoringWizardAction_refactoring, RefactoringSaveHelper.SAVE_JAVA_ONLY_UPDATES);
  	}
  
  	public static void startRenameRefactoring(final IJavaScriptElement element, final Shell shell) throws CoreException {
  		final RenameSupport support= createRenameSupport(element, null, RenameSupport.UPDATE_REFERENCES);
  		if (support != null && support.preCheck().isOK())
  			support.openDialog(shell);
  	}
  
  	public static void startRenameResourceRefactoring(final IResource resource, final Shell shell) throws CoreException {
  		final JavaRenameRefactoring refactoring= new JavaRenameRefactoring(new RenameResourceProcessor(resource));
  		RenameUserInterfaceManager.getDefault().getStarter(refactoring).activate(refactoring, shell, RefactoringSaveHelper.SAVE_ALL);
  	}
  
  	public static void startReplaceInvocationsRefactoring(final ITypeRoot typeRoot, final int offset, final int length, final Shell shell) throws JavaScriptModelException {
  		final ReplaceInvocationsRefactoring refactoring= new ReplaceInvocationsRefactoring(typeRoot, offset, length);
  		new RefactoringStarter().activate(refactoring, new ReplaceInvocationsWizard(refactoring), shell, RefactoringMessages.ReplaceInvocationsAction_dialog_title, RefactoringSaveHelper.SAVE_JAVA_ONLY_UPDATES);
  	}
  
  	public static void startReplaceInvocationsRefactoring(final IFunction method, final Shell shell) throws JavaScriptModelException {
  		final ReplaceInvocationsRefactoring refactoring= new ReplaceInvocationsRefactoring(method);
  		new RefactoringStarter().activate(refactoring, new ReplaceInvocationsWizard(refactoring), shell, RefactoringMessages.ReplaceInvocationsAction_dialog_title, RefactoringSaveHelper.SAVE_JAVA_ONLY_UPDATES);
  	}
  
  	public static void startSelfEncapsulateRefactoring(final IField field, final Shell shell) {
  		try {
  			if (!RefactoringAvailabilityTester.isSelfEncapsulateAvailable(field))
  				return;
  			final SelfEncapsulateFieldRefactoring refactoring= new SelfEncapsulateFieldRefactoring(field);
  			new RefactoringStarter().activate(refactoring, new SelfEncapsulateFieldWizard(refactoring), shell, "", RefactoringSaveHelper.SAVE_JAVA_ONLY_UPDATES); //$NON-NLS-1$
  		} catch (JavaScriptModelException e) {
  			ExceptionHandler.handle(e, ActionMessages.SelfEncapsulateFieldAction_dialog_title, ActionMessages.SelfEncapsulateFieldAction_dialog_cannot_perform);
  		}
  	}
  
  	public static void startUseSupertypeRefactoring(final IType type, final Shell shell) throws JavaScriptModelException {
  		final UseSuperTypeRefactoring refactoring= new UseSuperTypeRefactoring(new UseSuperTypeProcessor(type));
  		new RefactoringStarter().activate(refactoring, new UseSupertypeWizard(refactoring), shell, RefactoringMessages.OpenRefactoringWizardAction_refactoring, RefactoringSaveHelper.SAVE_JAVA_ONLY_UPDATES);
  	}
  
  	private RefactoringExecutionStarter() {
  		// Not for instantiation
  	}
  	
  //	public static void startIntroduceParameterObject(IJavaScriptUnit unit, int offset, int length, Shell shell) throws CoreException {
  //		IJavaScriptElement javaElement= unit.getElementAt(offset);
  //		if (javaElement instanceof IFunction) {
  //			IFunction method= (IFunction) javaElement;
  //			startIntroduceParameterObject(method, shell);
  //		}
  //	}
  //
  //	public static void startIntroduceParameterObject(IFunction method, Shell shell) throws CoreException {
  //		RefactoringStatus availability= Checks.checkAvailability(method);
  //		if (availability.hasError()){
  //			MessageDialog.openError(shell, RefactoringMessages.RefactoringExecutionStarter_IntroduceParameterObject_problem_title, RefactoringMessages.RefactoringExecutionStarter_IntroduceParameterObject_problem_description);
  //			return;
  //		}
  //		IntroduceParameterObjectRefactoring refactoring= new IntroduceParameterObjectRefactoring(method);
  //		final RefactoringStatus status= refactoring.checkInitialConditions(new NullProgressMonitor());
  //		if (status.hasFatalError()) {
  //			final RefactoringStatusEntry entry= status.getEntryMatchingSeverity(RefactoringStatus.FATAL);
  //			if (entry.getCode() == RefactoringStatusCodes.OVERRIDES_ANOTHER_METHOD || entry.getCode() == RefactoringStatusCodes.METHOD_DECLARED_IN_INTERFACE) {
  //
  //				String message= entry.getMessage();
  //				final Object element= entry.getData();
  //				IFunction superMethod= (IFunction) element;
  //				availability= Checks.checkAvailability(superMethod);
  //				if (availability.hasError()){
  //					MessageDialog.openError(shell, RefactoringMessages.RefactoringExecutionStarter_IntroduceParameterObject_problem_title, RefactoringMessages.RefactoringExecutionStarter_IntroduceParameterObject_problem_description);
  //					return;
  //				}
  //				message= message + RefactoringMessages.RefactoringErrorDialogUtil_okToPerformQuestion;
  //				if (element != null && MessageDialog.openQuestion(shell, RefactoringMessages.OpenRefactoringWizardAction_refactoring, message)) {
  //					refactoring=new IntroduceParameterObjectRefactoring(superMethod);
  //				}
  //				else refactoring=null;
  //			}
  //		}
  //		if (refactoring!=null)
  //			new RefactoringStarter().activate(refactoring, new IntroduceParameterObjectWizard(refactoring), shell, RefactoringMessages.OpenRefactoringWizardAction_refactoring, RefactoringSaveHelper.SAVE_JAVA_ONLY_UPDATES);
  //	}
  }
  