package com.intellij.lang.javascript.flex.run;
import com.intellij.execution.configurations.RunConfigurationBase;
import com.intellij.lang.javascript.flex.FlexRefactoringListenerProvider;
import com.intellij.lang.javascript.flex.flexunit.FlexUnitRunConfiguration;
import com.intellij.lang.javascript.flex.flexunit.FlexUnitRunnerParameters;
import com.intellij.lang.javascript.psi.JSFunction;
import com.intellij.lang.javascript.psi.ecmal4.JSClass;
import com.intellij.lang.javascript.psi.ecmal4.JSPackage;
import com.intellij.lang.javascript.psi.ecmal4.JSPackageStatement;
import com.intellij.lang.javascript.psi.ecmal4.JSQualifiedNamedElement;
import com.intellij.openapi.roots.impl.DirectoryIndex;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiDirectoryContainer;
import com.intellij.psi.PsiElement;
import com.intellij.refactoring.listeners.RefactoringElementAdapter;
import org.jetbrains.annotations.NotNull;
public abstract class FlexRunConfigRefactoringListener extends RefactoringElementAdapter {
protected final RunConfigurationBase myRunConfiguration;
public FlexRunConfigRefactoringListener(final RunConfigurationBase runConfiguration) {
assert runConfiguration instanceof FlashRunConfiguration || runConfiguration instanceof FlexUnitRunConfiguration
: runConfiguration.getType().getDisplayName();
myRunConfiguration = runConfiguration;
}
protected void elementRenamedOrMoved(@NotNull PsiElement newElement) {
updateParams(newElement);
}
public void undoElementMovedOrRenamed(@NotNull final PsiElement newElement, @NotNull final String oldQualifiedName) {
undo(newElement, oldQualifiedName);
}
protected abstract void updateParams(PsiElement newElement);
protected abstract void undo(final PsiElement element, final String name);
private static void updatePackage(final RunConfigurationBase runConfiguration, final String newPackage) {
if (runConfiguration instanceof FlexUnitRunConfiguration) {
final FlexUnitRunnerParameters params = ((FlexUnitRunConfiguration)runConfiguration).getRunnerParameters();
if (params.getScope() == FlexUnitRunnerParameters.Scope.Package) {
params.setPackageName(newPackage);
}
else {
final String oldFqn = params.getClassName();
params.setClassName(StringUtil.getQualifiedName(newPackage, StringUtil.getShortName(oldFqn)));
}
}
else {
final FlashRunnerParameters params = ((FlashRunConfiguration)runConfiguration).getRunnerParameters();
final String oldFqn = params.getOverriddenMainClass();
params.setOverriddenMainClass(StringUtil.getQualifiedName(newPackage, StringUtil.getShortName(oldFqn)));
}
}
public static class JSClassRefactoringListener extends FlexRunConfigRefactoringListener {
public JSClassRefactoringListener(final RunConfigurationBase runConfiguration) {
super(runConfiguration);
}
protected void updateParams(final PsiElement newElement) {
final JSClass newClass = FlexRefactoringListenerProvider.getJSClass(newElement);
if (newClass == null) return;
final String qName = newClass.getQualifiedName();
if (StringUtil.isNotEmpty(qName)) {
if (myRunConfiguration instanceof FlexUnitRunConfiguration) {
((FlexUnitRunConfiguration)myRunConfiguration).getRunnerParameters().setClassName(qName);
}
else {
((FlashRunConfiguration)myRunConfiguration).getRunnerParameters().setOverriddenMainClass(qName);
}
}
}
@Override
public void undo(@NotNull PsiElement newElement, @NotNull String oldQualifiedName) {
if (myRunConfiguration instanceof FlexUnitRunConfiguration) {
((FlexUnitRunConfiguration)myRunConfiguration).getRunnerParameters().setClassName(oldQualifiedName);
}
else {
((FlashRunConfiguration)myRunConfiguration).getRunnerParameters().setOverriddenMainClass(oldQualifiedName);
}
}
}
public static class PsiDirectoryRefactoringListener extends FlexRunConfigRefactoringListener {
public PsiDirectoryRefactoringListener(final RunConfigurationBase runConfiguration) {
super(runConfiguration);
}
protected void updateParams(final PsiElement newElement) {
if (!(newElement instanceof PsiDirectory)) return;
updatePackage(myRunConfiguration,
DirectoryIndex.getInstance(newElement.getProject()).getPackageName(((PsiDirectory)newElement).getVirtualFile()));
}
@Override
public void undo(@NotNull PsiElement newElement, @NotNull String oldQualifiedName) {
updatePackage(myRunConfiguration, oldQualifiedName);
}
}
public static class JSFunctionRefactoringListener extends FlexRunConfigRefactoringListener {
public JSFunctionRefactoringListener(final FlexUnitRunConfiguration runConfiguration) {
super(runConfiguration);
}
protected void updateParams(final PsiElement newElement) {
if (!(newElement instanceof JSFunction)) return;
final String newName = ((JSFunction)newElement).getName();
if (newName != null && StringUtil.isNotEmpty(newName)) {
((FlexUnitRunConfiguration)myRunConfiguration).getRunnerParameters().setMethodName(newName);
}
}
@Override
public void undo(@NotNull PsiElement newElement, @NotNull String oldQualifiedName) {
final int methodIdx = oldQualifiedName.lastIndexOf(".") + 1;
if (methodIdx > 0 && methodIdx < oldQualifiedName.length()) {
((FlexUnitRunConfiguration)myRunConfiguration).getRunnerParameters().setMethodName(oldQualifiedName.substring(methodIdx));
}
}
}
public static class PackageRefactoringListener extends FlexRunConfigRefactoringListener {
public PackageRefactoringListener(final RunConfigurationBase runConfiguration) {
super(runConfiguration);
}
protected void updateParams(final PsiElement newElement) {
if (newElement instanceof PsiDirectoryContainer) {
updatePackage(myRunConfiguration, FlexRefactoringListenerProvider.getPackageName(newElement));
}
else if (newElement instanceof JSPackage || newElement instanceof JSPackageStatement) {
updatePackage(myRunConfiguration, ((JSQualifiedNamedElement)newElement).getQualifiedName());
}
}
@Override
public void undo(@NotNull PsiElement newElement, @NotNull String oldQualifiedName) {
updatePackage(myRunConfiguration, oldQualifiedName);
}
}
}