diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/TemplateManager.java b/platform/lang-impl/src/com/intellij/codeInsight/template/TemplateManager.java index 5dd8e43400fd..3336d5a6a722 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/TemplateManager.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/TemplateManager.java @@ -4,9 +4,10 @@ package com.intellij.codeInsight.template; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiFile; -import org.jetbrains.annotations.Nullable; +import com.intellij.util.PairProcessor; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public abstract class TemplateManager { public static TemplateManager getInstance(Project project) { @@ -19,6 +20,9 @@ public abstract class TemplateManager { public abstract void startTemplate(@NotNull Editor editor, @NotNull Template template, TemplateEditingListener listener); + public abstract void startTemplate(@NotNull Editor editor, @NotNull Template template, TemplateEditingListener listener, + final PairProcessor callback); + public abstract boolean startTemplate(@NotNull Editor editor, char shortcutChar); public abstract TemplateContextType getContextType(@NotNull PsiFile file, int offset); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateManagerImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateManagerImpl.java index c78be652c077..00b69f8e9e87 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateManagerImpl.java @@ -19,6 +19,7 @@ import com.intellij.openapi.util.Key; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; import com.intellij.psi.util.PsiUtilBase; +import com.intellij.util.PairProcessor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -107,7 +108,7 @@ public class TemplateManagerImpl extends TemplateManager implements ProjectCompo } public boolean startTemplate(@NotNull Editor editor, char shortcutChar) { - return startTemplate(this, editor, shortcutChar); + return startTemplate(this, editor, shortcutChar, null); } public void startTemplate(@NotNull final Editor editor, @NotNull Template template) { @@ -115,10 +116,16 @@ public class TemplateManagerImpl extends TemplateManager implements ProjectCompo } public void startTemplate(@NotNull Editor editor, String selectionString, @NotNull Template template) { - startTemplate(editor, selectionString, template, null); + startTemplate(editor, selectionString, template, null, null); } - private void startTemplate(final Editor editor, final String selectionString, final Template template, TemplateEditingListener listener) { + public void startTemplate(@NotNull Editor editor, @NotNull Template template, TemplateEditingListener listener, + final PairProcessor processor) { + startTemplate(editor, null, template, listener, processor); + } + + private void startTemplate(final Editor editor, final String selectionString, final Template template, TemplateEditingListener listener, + final PairProcessor processor) { final TemplateState templateState = initTemplateState(editor); templateState.getProperties().put(ExpressionContext.SELECTION, selectionString); @@ -138,7 +145,7 @@ public class TemplateManagerImpl extends TemplateManager implements ProjectCompo } else { editor.getSelectionModel().removeSelection(); } - templateState.start((TemplateImpl) template); + templateState.start((TemplateImpl) template, processor); } }, CodeInsightBundle.message("insert.code.template.command"), null @@ -154,10 +161,14 @@ public class TemplateManagerImpl extends TemplateManager implements ProjectCompo } public void startTemplate(@NotNull final Editor editor, @NotNull final Template template, TemplateEditingListener listener) { - startTemplate(editor, null, template, listener); + startTemplate(editor, null, template, listener, null); } public boolean startTemplate(TemplateManagerImpl templateManager, final Editor editor, char shortcutChar) { + return startTemplate(templateManager, editor, shortcutChar, null); + } + + public boolean startTemplate(TemplateManagerImpl templateManager, final Editor editor, char shortcutChar, final PairProcessor processor) { final Document document = editor.getDocument(); PsiFile file = PsiUtilBase.getPsiFileInEditor(editor, myProject); if (file == null) return false; @@ -221,7 +232,7 @@ public class TemplateManagerImpl extends TemplateManager implements ProjectCompo editor.getCaretModel().moveToOffset(wordStart0); editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE); editor.getSelectionModel().removeSelection(); - templateState0.start(template0); + templateState0.start(template0, processor); } }, CodeInsightBundle.message("insert.code.template.command"), null diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateState.java b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateState.java index 20829b9c4b50..4854dcddfaec 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateState.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateState.java @@ -32,6 +32,7 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.PairProcessor; import com.intellij.util.containers.HashMap; import com.intellij.util.containers.IntArrayList; import org.jetbrains.annotations.NonNls; @@ -72,6 +73,7 @@ public class TemplateState implements Disposable { private boolean myTemplateIndented = false; private Document myDocument; private boolean myFinished; + private PairProcessor myProcessor; public TemplateState(@NotNull Project project, final Editor editor) { myProject = project; @@ -119,6 +121,8 @@ public class TemplateState implements Disposable { myCommandListener = null; } + myProcessor = null; + //Avoid the leak of the editor releaseEditor(); myDocument = null; @@ -210,9 +214,11 @@ public class TemplateState implements Disposable { } } - public void start(TemplateImpl template) { + public void start(TemplateImpl template, final PairProcessor processor) { PsiDocumentManager.getInstance(myProject).commitAllDocuments(); + myProcessor = processor; + final DocumentReference[] refs = myDocument == null ? null : new DocumentReference[] {DocumentReferenceManager.getInstance().create(myDocument) }; @@ -499,6 +505,17 @@ public class TemplateState implements Disposable { } private void calcResults(final boolean isQuick) { + if (myProcessor != null && myCurrentVariableNumber >= 0) { + final String variableName = myTemplate.getVariableNameAt(myCurrentVariableNumber); + final TextResult value = getVariableValue(variableName); + if (value != null && value.getText().length() > 0) { + if (!myProcessor.process(variableName, value.getText())) { + finishTemplateEditing(); // nextTab(); ? + return; + } + } + } + ApplicationManager.getApplication().runWriteAction( new Runnable() { public void run() { diff --git a/xml/impl/src/com/intellij/xml/refactoring/XmlTagInplaceRenamer.java b/xml/impl/src/com/intellij/xml/refactoring/XmlTagInplaceRenamer.java index a444e06f63e4..b7f6e288fbbc 100644 --- a/xml/impl/src/com/intellij/xml/refactoring/XmlTagInplaceRenamer.java +++ b/xml/impl/src/com/intellij/xml/refactoring/XmlTagInplaceRenamer.java @@ -24,6 +24,7 @@ import com.intellij.psi.xml.XmlChildRole; import com.intellij.psi.xml.XmlTag; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.util.CommonRefactoringUtil; +import com.intellij.util.PairProcessor; import com.intellij.util.containers.Stack; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -89,6 +90,10 @@ public class XmlTagInplaceRenamer { public void templateCancelled(final Template template) { finish(); } + }, new PairProcessor() { + public boolean process(final String variableName, final String value) { + return value.length() == 0 || value.charAt(value.length() - 1) != ' '; + } }); // restore old offset