From 92439335bc60766056dea3f930f4fe841c0c4893 Mon Sep 17 00:00:00 2001 From: greg Date: Mon, 13 Jul 2009 20:03:37 +0400 Subject: [PATCH] fix broken xml support & add undo --- .../intelliLang/inject/UnInjectLanguageAction.java | 111 ++++++++++++++------- 1 file changed, 73 insertions(+), 38 deletions(-) diff --git a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/UnInjectLanguageAction.java b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/UnInjectLanguageAction.java index 26d3918456..f3825203af 100644 --- a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/UnInjectLanguageAction.java +++ b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/UnInjectLanguageAction.java @@ -1,6 +1,11 @@ package org.intellij.plugins.intelliLang.inject; +import com.intellij.openapi.application.Result; import com.intellij.openapi.command.WriteCommandAction; +import com.intellij.openapi.command.undo.DocumentReference; +import com.intellij.openapi.command.undo.UndoManager; +import com.intellij.openapi.command.undo.UndoableAction; +import com.intellij.openapi.command.undo.UnexpectedUndoException; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Pair; @@ -9,19 +14,24 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.xml.XmlAttributeValue; import com.intellij.psi.xml.XmlTag; -import com.intellij.util.FileContentUtil; +import com.intellij.psi.xml.XmlText; import com.intellij.util.IncorrectOperationException; import com.intellij.util.NullableFunction; import com.intellij.util.Processor; +import com.intellij.util.FileContentUtil; import com.intellij.util.containers.ContainerUtil; import org.intellij.plugins.intelliLang.Configuration; +import org.intellij.plugins.intelliLang.inject.config.BaseInjection; import org.intellij.plugins.intelliLang.inject.config.MethodParameterInjection; import org.intellij.plugins.intelliLang.inject.config.XmlAttributeInjection; import org.intellij.plugins.intelliLang.inject.config.XmlTagInjection; import org.intellij.plugins.intelliLang.util.AnnotationUtilEx; import org.jetbrains.annotations.NotNull; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Collections; /** * @author Dmitry Avdeev @@ -42,28 +52,27 @@ public class UnInjectLanguageAction extends InjectLanguageAction { return injectedPsi != null && !injectedPsi.isEmpty(); } - public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException { - PsiLanguageInjectionHost host = findInjectionHost(editor, file); + public void invoke(@NotNull final Project project, Editor editor, PsiFile file) throws IncorrectOperationException { + final PsiLanguageInjectionHost host = findInjectionHost(editor, file); final Configuration configuration = Configuration.getInstance(); + final ArrayList injectionsToRemove = new ArrayList(); + final ArrayList annotationsToRemove = new ArrayList(); if (host instanceof XmlAttributeValue) { - for (Iterator it = configuration.getAttributeInjections().iterator(); it.hasNext();) { - XmlAttributeInjection injection = it.next(); + for (final XmlAttributeInjection injection : configuration.getAttributeInjections()) { if (injection.isApplicable((XmlAttributeValue)host)) { - it.remove(); - break; + injectionsToRemove.add(injection); } } - } else if (host instanceof XmlTag) { - for (Iterator it = configuration.getTagInjections().iterator(); it.hasNext();) { - XmlTagInjection injection = it.next(); - if (injection.isApplicable((XmlTag)host)) { - it.remove(); - break; + } else if (host instanceof XmlText) { + final XmlTag tag = ((XmlText)host).getParentTag(); + if (tag != null) { + for (XmlTagInjection injection : configuration.getTagInjections()) { + if (injection.isApplicable(tag)) { + injectionsToRemove.add(injection); + } } } } else if (host instanceof PsiLiteralExpression) { - final ArrayList annotationsToRemove = new ArrayList(); - final ArrayList injectionsToRemove = new ArrayList(); ConcatenationInjector.processLiteralExpressionInjectionsInner(configuration, new Processor() { public boolean process(final ConcatenationInjector.Info info) { final PsiAnnotation[] annotations = AnnotationUtilEx.getAnnotationFrom(info.owner, configuration.getLanguageAnnotationPair(), true); @@ -76,31 +85,57 @@ public class UnInjectLanguageAction extends InjectLanguageAction { return true; } }, host); - if (!injectionsToRemove.isEmpty()) { - new WriteCommandAction.Simple(project) { - public void run() { - for (MethodParameterInjection injection : injectionsToRemove) { - configuration.getParameterInjections().remove(injection); + } + if (!injectionsToRemove.isEmpty() || !annotationsToRemove.isEmpty()) { + final List psiFiles = ContainerUtil.mapNotNull(annotationsToRemove, new NullableFunction() { + public PsiFile fun(final PsiAnnotation psiAnnotation) { + return psiAnnotation instanceof PsiCompiledElement ? null : psiAnnotation.getContainingFile(); + } + }); + final UndoableAction action = new UndoableAction() { + public void undo() throws UnexpectedUndoException { + for (BaseInjection injection : injectionsToRemove) { + if (injection instanceof XmlTagInjection) { + configuration.getTagInjections().add((XmlTagInjection)injection); } - } - }.execute(); - } - if (!annotationsToRemove.isEmpty()) { - final List psiFiles = ContainerUtil.mapNotNull(annotationsToRemove, new NullableFunction() { - public PsiFile fun(final PsiAnnotation psiAnnotation) { - return psiAnnotation instanceof PsiCompiledElement ? null : psiAnnotation.getContainingFile(); - } - }); - new WriteCommandAction.Simple(project, psiFiles.toArray(new PsiFile[psiFiles.size()])) { - protected void run() throws Throwable { - for (PsiAnnotation annotation : annotationsToRemove) { - annotation.delete(); + else if (injection instanceof XmlAttributeInjection) { + configuration.getAttributeInjections().add((XmlAttributeInjection)injection); + } + else if (injection instanceof MethodParameterInjection) { + configuration.getParameterInjections().add((MethodParameterInjection)injection); } } - }.execute(); - } + configuration.configurationModified(); + FileContentUtil.reparseFiles(project, Collections.emptyList(), true); + } + + public void redo() throws UnexpectedUndoException { + configuration.getTagInjections().removeAll(injectionsToRemove); + configuration.getAttributeInjections().removeAll(injectionsToRemove); + configuration.getParameterInjections().removeAll(injectionsToRemove); + configuration.configurationModified(); + FileContentUtil.reparseFiles(project, Collections.emptyList(), true); + + } + + public DocumentReference[] getAffectedDocuments() { + return DocumentReference.EMPTY_ARRAY; + } + + public boolean isComplex() { + return true; + } + }; + new WriteCommandAction(project, psiFiles.toArray(new PsiFile[psiFiles.size()])) { + @Override + protected void run(final Result result) throws Throwable { + for (PsiAnnotation annotation : annotationsToRemove) { + annotation.delete(); + } + action.redo(); + UndoManager.getInstance(project).undoableActionPerformed(action); + } + }.execute(); } - configuration.configurationModified(); - FileContentUtil.reparseFiles(project, Collections.emptyList(), true); } } -- 2.11.4.GIT