private FileType myFileType;
- private final LiveTemplateBuilder myBuilder = new LiveTemplateBuilder();
+ private LiveTemplateBuilder myBuilder = new LiveTemplateBuilder();
private int myOffset = 0;
public CustomTemplateCallback(Editor editor, PsiFile file) {
@Nullable
public TemplateImpl findApplicableTemplate(@NotNull String key) {
+ List<TemplateImpl> templates = findApplicableTemplates(key);
+ return templates.size() > 0 ? templates.get(0) : null;
+ }
+
+ @NotNull
+ public List<TemplateImpl> findApplicableTemplates(String key) {
List<TemplateImpl> templates = getMatchingTemplates(key);
templates = filterApplicableCandidates(templates);
- return templates.size() > 0 ? templates.get(0) : null;
+ return templates;
}
private List<TemplateImpl> filterApplicableCandidates(Collection<TemplateImpl> candidates) {
* @param predefinedVarValues
* @param listener @return returns if template invokation is finished
*/
- public void startTemplate(@NotNull String key,
- Map<String, String> predefinedVarValues) {
- List<TemplateImpl> templates = getMatchingTemplates(key);
- templates = filterApplicableCandidates(templates);
+ public void expandTemplate(@NotNull String key,
+ Map<String, String> predefinedVarValues) {
+ List<TemplateImpl> templates = findApplicableTemplates(key);
if (templates.size() > 0) {
TemplateImpl template = templates.get(0);
- startTemplate(template, predefinedVarValues);
+ expandTemplate(template, predefinedVarValues);
}
}
- public void startTemplate(@NotNull TemplateImpl template,
- Map<String, String> predefinedVarValues) {
+ public void expandTemplate(@NotNull TemplateImpl template,
+ Map<String, String> predefinedVarValues) {
int offset = myBuilder.insertTemplate(myOffset, template, predefinedVarValues);
moveToOffset(offset);
}
}
}
- public void finish() {
+ public void startAllExpandedTemplates() {
/*myEditor.getScrollingModel().scrollToCaret(ScrollType.MAKE_VISIBLE);
final CodeStyleManager style = CodeStyleManager.getInstance(myProject);
if (myGlobalMarker != null) {
style.reformatText(myFile, myGlobalMarker.getStartOffset(), myGlobalMarker.getEndOffset());
}*/
+ if (myBuilder.getText().length() == 0) {
+ return;
+ }
gotoEndOffset();
if (myOffset < myBuilder.getText().length()) {
myBuilder.insertVariableSegment(myOffset, TemplateImpl.END);
}
TemplateImpl template = myBuilder.buildTemplate();
myTemplateManager.startTemplate(myEditor, template, false, myBuilder.getPredefinedValues(), null);
+ myBuilder = new LiveTemplateBuilder();
+ myEndOffsetMarker = null;
+ myCheckpoints.clear();
+ }
+
+ public boolean startTemplate() {
+ Map<TemplateImpl, String> template2Argument =
+ ((TemplateManagerImpl)myTemplateManager).findMatchingTemplates(myFile, myEditor, null, TemplateSettings.getInstance());
+ return ((TemplateManagerImpl)myTemplateManager).startNonCustomTemplates(template2Argument, myEditor, null);
}
private static List<TemplateImpl> getMatchingTemplates(@NotNull String templateKey) {
public void insertString(int offset, String text) {
myBuilder.insertText(offset, text);
}
+
+ public void deleteTemplateKey(String key) {
+ int caretAt = myEditor.getCaretModel().getOffset();
+ myEditor.getDocument().deleteString(caretAt - key.length(), caretAt);
+ }
}
for (TemplateImpl template : template2argument.keySet()) {
String argument = template2argument.get(template);
int templateStart = getTemplateStart(template, argument, caretOffset, text);
- if (templateStart <= offset) {
+ if (templateStart < offset) {
return true;
}
}
int offsetBeforeKey = caretOffset - key.length();
CharSequence text = editor.getDocument().getCharsSequence();
if (template2argument == null || !containsTemplateStartingBefore(template2argument, offsetBeforeKey, caretOffset, text)) {
- callback.getEditor().getDocument().deleteString(offsetBeforeKey, caretOffset);
customLiveTemplate.expand(key, callback);
- callback.finish();
+ callback.startAllExpandedTemplates();
return true;
}
}
return templateStart;
}
- private Map<TemplateImpl, String> findMatchingTemplates(final PsiFile file,
+ public Map<TemplateImpl, String> findMatchingTemplates(final PsiFile file,
Editor editor,
- char shortcutChar,
+ Character shortcutChar,
TemplateSettings templateSettings) {
final Document document = editor.getDocument();
CharSequence text = document.getCharsSequence();
return candidate2Argument;
}
- private boolean startNonCustomTemplates(Map<TemplateImpl, String> template2argument,
+ public boolean startNonCustomTemplates(Map<TemplateImpl, String> template2argument,
Editor editor,
PairProcessor<String, String> processor) {
final int caretOffset = editor.getCaretModel().getOffset();
public static List<TemplateImpl> findMatchingTemplates(CharSequence text,
int caretOffset,
- char shortcutChar,
+ Character shortcutChar,
TemplateSettings settings,
boolean hasArgument) {
String key;
return mySchemesManager.getAllSchemes();
}
- public List<TemplateImpl> collectMatchingCandidates(String key, char shortcutChar, boolean hasArgument) {
+ public List<TemplateImpl> collectMatchingCandidates(String key, Character shortcutChar, boolean hasArgument) {
final Collection<TemplateImpl> templates = getTemplates(key);
List<TemplateImpl> candidates = new ArrayList<TemplateImpl>();
for (TemplateImpl template : templates) {
if (template.isDeactivated()) {
continue;
}
- if (getShortcutChar(template) != shortcutChar) {
+ if (shortcutChar != null && getShortcutChar(template) != shortcutChar) {
continue;
}
if (template.isSelectionTemplate()) {
final CustomTemplateCallback callback = new CustomTemplateCallback(myEditor, myFile);
myTemplate.wrap(selection, callback, new TemplateInvokationListener() {
public void finished() {
- callback.finish();
+ callback.startAllExpandedTemplates();
}
});
}
}
template.setToReformat(true);
Map<String, String> predefinedValues = buildPredefinedValues(attr2value, numberInIteration);
- callback.startTemplate(template, predefinedValues);
+ callback.expandTemplate(template, predefinedValues);
}
}
modifiedTemplate.setString(text);
removeVariablesWhichHasNoSegment(modifiedTemplate);
Map<String, String> predefinedValues = buildPredefinedValues(attr2value, numberInIteration);
- callback.startTemplate(modifiedTemplate, predefinedValues);
+ callback.expandTemplate(modifiedTemplate, predefinedValues);
return;
}
}
- callback.startTemplate(token.myTemplate, null);
+ callback.expandTemplate(token.myTemplate, null);
}
else {
Map<String, String> predefinedValues = buildPredefinedValues(attr2value, numberInIteration);
- callback.startTemplate(token.myKey, predefinedValues);
+ callback.expandTemplate(token.myKey, predefinedValues);
}
}
}
public String computeTemplateKey(@NotNull CustomTemplateCallback callback) {
+ return computeKey(callback);
+ }
+
+ static String computeKey(CustomTemplateCallback callback) {
Editor editor = callback.getEditor();
PsiElement element = callback.getContext();
int line = editor.getCaretModel().getLogicalPosition().line;
String surroundedText) {
List<Token> tokens = parse(key, callback);
assert tokens != null;
+ if (surroundedText == null) {
+ if (tokens.size() == 2) {
+ Token token = tokens.get(0);
+ if (token instanceof TemplateToken) {
+ if (key.equals(((TemplateToken)token).myKey) && callback.findApplicableTemplates(key).size() > 1) {
+ callback.startTemplate();
+ return;
+ }
+ }
+ }
+ callback.deleteTemplateKey(key);
+ }
XmlZenCodingInterpreter.interpret(tokens, 0, callback, State.WORD, surroundedText);
}
selection = selection.trim();
doWrap(selection, abbreviation, callback, new TemplateInvokationListener() {
public void finished() {
- callback.finish();
+ callback.startAllExpandedTemplates();
}
});
}
XmlZenCodingTemplate template = new XmlZenCodingTemplate();
String key = template.computeTemplateKey(callback);
if (key != null) {
- int offsetBeforeKey = caretAt - key.length();
- callback.getEditor().getDocument().deleteString(offsetBeforeKey, caretAt);
template.expand(key, callback);
- callback.finish();
+ callback.startAllExpandedTemplates();
return true;
}
// if it is simple live template invokation, we should start it using TemplateManager because template may be ambiguous