1 package com
.intellij
.codeInsight
.template
.impl
;
3 import com
.intellij
.codeInsight
.template
.Expression
;
4 import com
.intellij
.codeInsight
.template
.Template
;
5 import com
.intellij
.openapi
.util
.text
.StringUtil
;
6 import com
.intellij
.psi
.tree
.IElementType
;
7 import org
.jetbrains
.annotations
.NonNls
;
9 import java
.util
.ArrayList
;
10 import java
.util
.Arrays
;
11 import java
.util
.HashSet
;
17 public class TemplateImpl
implements Template
{
19 private String myString
= null;
20 private String myDescription
;
21 private String myGroupName
;
22 private char myShortcutChar
= TemplateSettings
.DEFAULT_CHAR
;
23 private ArrayList
<Variable
> myVariables
= new ArrayList
<Variable
>();
24 private ArrayList
<Segment
> mySegments
= null;
25 private String myTemplateText
= null;
28 public boolean equals(Object o
) {
29 if (this == o
) return true;
30 if (!(o
instanceof TemplateImpl
)) return false;
32 final TemplateImpl template
= (TemplateImpl
) o
;
33 if (myId
!= null && template
.myId
!= null && myId
.equals(template
.myId
)) return true;
35 if (isToReformat
!= template
.isToReformat
) return false;
36 if (isToShortenLongNames
!= template
.isToShortenLongNames
) return false;
37 if (myShortcutChar
!= template
.myShortcutChar
) return false;
38 if (myDescription
!= null ?
!myDescription
.equals(template
.myDescription
) : template
.myDescription
!= null) return false;
39 if (myGroupName
!= null ?
!myGroupName
.equals(template
.myGroupName
) : template
.myGroupName
!= null) return false;
40 if (myKey
!= null ?
!myKey
.equals(template
.myKey
) : template
.myKey
!= null) return false;
41 if (myString
!= null ?
!myString
.equals(template
.myString
) : template
.myString
!= null) return false;
42 if (myTemplateText
!= null ?
!myTemplateText
.equals(template
.myTemplateText
) : template
.myTemplateText
!= null) return false;
44 if (myVariables
== null && template
.myVariables
== null) return true;
45 if (myVariables
== null || template
.myVariables
== null) return false;
46 if (myVariables
.size() != template
.myVariables
.size()) return false;
47 for (Variable variable
: myVariables
) {
48 if (template
.myVariables
.indexOf(variable
) < 0) return false;
54 public int hashCode() {
56 return myId
.hashCode();
59 result
= myKey
.hashCode();
60 result
= 29 * result
+ (myString
== null ?
0 : myString
.hashCode());
61 result
= 29 * result
+ myGroupName
.hashCode();
65 private boolean isToReformat
= false;
66 private boolean isToShortenLongNames
= true;
67 private boolean toParseSegments
= true;
68 private TemplateContext myTemplateContext
= new TemplateContext();
70 public static final @NonNls String END
= "END";
71 public static final @NonNls String SELECTION
= "SELECTION";
72 public static final @NonNls String SELECTION_START
= "SELECTION_START";
73 public static final @NonNls String SELECTION_END
= "SELECTION_END";
75 public static final Set
<String
> INTERNAL_VARS_SET
= new HashSet
<String
>(Arrays
.asList(
76 END
, SELECTION
, SELECTION_START
, SELECTION_END
));
78 private boolean isDeactivated
= false;
80 public boolean isInline() {
84 private boolean isToIndent
= true;
87 public void setInline(boolean isInline
) {
88 myIsInline
= isInline
;
91 private boolean myIsInline
= false;
95 public TemplateImpl(String key
, String group
) {
96 this(key
, null, group
);
97 toParseSegments
= false;
99 mySegments
= new ArrayList
<Segment
>();
102 public TemplateImpl(String key
, String string
, String group
) {
109 public void addTextSegment(String text
) {
110 text
= StringUtil
.convertLineSeparators(text
, "\n");
111 myTemplateText
+= text
;
114 public void addVariableSegment (String name
) {
115 mySegments
.add(new Segment(name
, myTemplateText
.length()));
118 public void addVariable(String name
, Expression expression
, Expression defaultValueExpression
, boolean isAlwaysStopAt
) {
119 if (mySegments
!= null) {
120 Segment segment
= new Segment(name
, myTemplateText
.length());
121 mySegments
.add(segment
);
123 Variable variable
= new Variable(name
, expression
, defaultValueExpression
, isAlwaysStopAt
);
124 myVariables
.add(variable
);
127 public void addEndVariable() {
128 Segment segment
= new Segment(END
, myTemplateText
.length());
129 mySegments
.add(segment
);
132 public void addSelectionStartVariable() {
133 Segment segment
= new Segment(SELECTION_START
, myTemplateText
.length());
134 mySegments
.add(segment
);
137 public void addSelectionEndVariable() {
138 Segment segment
= new Segment(SELECTION_END
, myTemplateText
.length());
139 mySegments
.add(segment
);
142 public String
getId() {
146 public TemplateImpl
copy() {
147 TemplateImpl template
= new TemplateImpl(myKey
, myString
, myGroupName
);
148 template
.myId
= myId
;
149 template
.myDescription
= myDescription
;
150 template
.myShortcutChar
= myShortcutChar
;
151 template
.isToReformat
= isToReformat
;
152 template
.isToShortenLongNames
= isToShortenLongNames
;
153 template
.myIsInline
= myIsInline
;
154 template
.myTemplateContext
= (TemplateContext
)myTemplateContext
.clone();
155 template
.isDeactivated
= isDeactivated
;
156 for (Variable variable
: myVariables
) {
157 template
.addVariable(variable
.getName(), variable
.getExpressionString(), variable
.getDefaultValueString(), variable
.isAlwaysStopAt());
162 public boolean isToReformat() {
166 public void setToReformat(boolean toReformat
) {
167 isToReformat
= toReformat
;
170 public void setToIndent(boolean toIndent
) {
171 isToIndent
= toIndent
;
174 public boolean isToIndent() {
178 public boolean isToShortenLongNames() {
179 return isToShortenLongNames
;
182 public void setToShortenLongNames(boolean toShortenLongNames
) {
183 isToShortenLongNames
= toShortenLongNames
;
186 public void setDeactivated(boolean isDeactivated
) {
187 this.isDeactivated
= isDeactivated
;
190 public boolean isDeactivated() {
191 return isDeactivated
;
194 public TemplateContext
getTemplateContext() {
195 return myTemplateContext
;
198 public int getEndSegmentNumber() {
199 return getVariableSegmentNumber(END
);
202 public int getSelectionStartSegmentNumber() {
203 return getVariableSegmentNumber(SELECTION_START
);
206 public int getSelectionEndSegmentNumber() {
207 return getVariableSegmentNumber(SELECTION_END
);
210 public int getVariableSegmentNumber(String variableName
) {
212 for (int i
= 0; i
< mySegments
.size(); i
++) {
213 Segment segment
= mySegments
.get(i
);
214 if (segment
.name
.equals(variableName
)) {
221 public String
getTemplateText() {
223 return myTemplateText
;
226 public String
getSegmentName(int i
) {
228 return mySegments
.get(i
).name
;
231 public int getSegmentOffset(int i
) {
233 return mySegments
.get(i
).offset
;
236 public int getSegmentsCount() {
238 return mySegments
.size();
241 public void parseSegments() {
242 if(!toParseSegments
) {
245 if(mySegments
!= null) {
249 if (myString
== null) myString
= "";
250 myString
= StringUtil
.convertLineSeparators(myString
, "\n");
251 mySegments
= new ArrayList
<Segment
>();
252 StringBuffer buffer
= new StringBuffer("");
253 TemplateTextLexer lexer
= new TemplateTextLexer();
254 lexer
.start(myString
,0,myString
.length(),0);
257 IElementType tokenType
= lexer
.getTokenType();
258 if (tokenType
== null) break;
259 int start
= lexer
.getTokenStart();
260 int end
= lexer
.getTokenEnd();
261 String token
= myString
.substring(start
, end
);
262 if (tokenType
== TemplateTokenType
.VARIABLE
){
263 String name
= token
.substring(1, token
.length() - 1);
264 Segment segment
= new Segment(name
, buffer
.length());
265 mySegments
.add(segment
);
267 else if (tokenType
== TemplateTokenType
.ESCAPE_DOLLAR
){
271 buffer
.append(token
);
275 myTemplateText
= buffer
.toString();
278 public void removeAllParsed() {
283 public void addVariable(String name
, String expression
, String defaultValue
, boolean isAlwaysStopAt
) {
284 Variable variable
= new Variable(name
, expression
, defaultValue
, isAlwaysStopAt
);
285 myVariables
.add(variable
);
288 public int getVariableCount() {
289 return myVariables
.size();
292 public String
getVariableNameAt(int i
) {
293 return myVariables
.get(i
).getName();
296 public String
getExpressionStringAt(int i
) {
297 return myVariables
.get(i
).getExpressionString();
300 public Expression
getExpressionAt(int i
) {
301 return myVariables
.get(i
).getExpression();
304 public String
getDefaultValueStringAt(int i
) {
305 return myVariables
.get(i
).getDefaultValueString();
308 public Expression
getDefaultValueAt(int i
) {
309 return myVariables
.get(i
).getDefaultValueExpression();
312 public boolean isAlwaysStopAt(int i
) {
313 return myVariables
.get(i
).isAlwaysStopAt();
316 public String
getKey() {
320 public void setKey(String key
) {
324 public String
getString() {
329 public void setString(String string
) {
333 public String
getDescription() {
334 return myDescription
;
337 public void setDescription(String description
) {
338 myDescription
= description
;
341 public char getShortcutChar() {
342 return myShortcutChar
;
345 public void setShortcutChar(char shortcutChar
) {
346 myShortcutChar
= shortcutChar
;
349 public String
getGroupName() {
353 public void setGroupName(String groupName
) {
354 myGroupName
= groupName
;
357 public boolean isSelectionTemplate() {
358 for (Variable v
: myVariables
) {
359 if (v
.getName().equals(SELECTION
)) return true;
365 public void setId(final String id
) {
369 private static class Segment
{
373 public Segment(String name
, int offset
) {
375 this.offset
= offset
;