IDEADEV-39346 Finish inplace rename in XML with SPACE in addition to TAB & ENTER

This commit is contained in:
Alexey Pegov
2009-09-23 19:30:57 +04:00
parent a1cad414c2
commit 6d60f7c081
4 changed files with 45 additions and 8 deletions
@@ -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<String, String> callback);
public abstract boolean startTemplate(@NotNull Editor editor, char shortcutChar);
public abstract TemplateContextType getContextType(@NotNull PsiFile file, int offset);
@@ -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<String, String> processor) {
startTemplate(editor, null, template, listener, processor);
}
private void startTemplate(final Editor editor, final String selectionString, final Template template, TemplateEditingListener listener,
final PairProcessor<String, String> 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<String, String> 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
@@ -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<String, String> 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<String, String> 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() {
@@ -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<String, String>() {
public boolean process(final String variableName, final String value) {
return value.length() == 0 || value.charAt(value.length() - 1) != ' ';
}
});
// restore old offset