private static void expand( ZenCodingNode node, ZenCodingGenerator generator, List<ZenCodingFilter> filters, String surroundedText, CustomTemplateCallback callback) { if (surroundedText != null) { surroundedText = surroundedText.trim(); } List<GenerationNode> genNodes = node.expand(-1, surroundedText, callback, true); LiveTemplateBuilder builder = new LiveTemplateBuilder(); int end = -1; for (int i = 0, genNodesSize = genNodes.size(); i < genNodesSize; i++) { GenerationNode genNode = genNodes.get(i); TemplateImpl template = genNode.generate(callback, generator, filters, true); int e = builder.insertTemplate(builder.length(), template, null); if (end == -1 && end < builder.length()) { end = e; } } callback.startTemplate( builder.buildTemplate(), null, new TemplateEditingAdapter() { private TextRange myEndVarRange; private Editor myEditor; @Override public void beforeTemplateFinished(TemplateState state, Template template) { int variableNumber = state.getCurrentVariableNumber(); if (variableNumber >= 0 && template instanceof TemplateImpl) { TemplateImpl t = (TemplateImpl) template; while (variableNumber < t.getVariableCount()) { String varName = t.getVariableNameAt(variableNumber); if (LiveTemplateBuilder.isEndVariable(varName)) { myEndVarRange = state.getVariableRange(varName); myEditor = state.getEditor(); break; } variableNumber++; } } } @Override public void templateFinished(Template template, boolean brokenOff) { if (brokenOff && myEndVarRange != null && myEditor != null) { int offset = myEndVarRange.getStartOffset(); if (offset >= 0 && offset != myEditor.getCaretModel().getOffset()) { myEditor.getCaretModel().moveToOffset(offset); myEditor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE); } } } }); }
@NotNull @Override public List<GenerationNode> expand( int numberInIteration, int totalIterations, String surroundedText, CustomTemplateCallback callback, boolean insertSurroundedTextAtTheEnd, GenerationNode parent) { List<GenerationNode> result = new ArrayList<>(); for (int i = 0; i < myRightOperand; i++) { result.addAll( myLeftOperand.expand( i, myRightOperand, surroundedText, callback, insertSurroundedTextAtTheEnd, parent)); } return result; }
@Override public int getApproximateOutputLength(@Nullable CustomTemplateCallback callback) { return myLeftOperand.getApproximateOutputLength(callback) * myRightOperand; }