KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > it > businesslogic > ireport > gui > syntax > JRTokenMarker


1 /*
2  * Copyright (C) 2005 - 2006 JasperSoft Corporation. All rights reserved.
3  * http://www.jaspersoft.com.
4  *
5  * Unless you have purchased a commercial license agreement from JasperSoft,
6  * the following license terms apply:
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as published by
10  * the Free Software Foundation.
11  *
12  * This program is distributed WITHOUT ANY WARRANTY; and without the
13  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  * See the GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, see http://www.gnu.org/licenses/gpl.txt
18  * or write to:
19  *
20  * Free Software Foundation, Inc.,
21  * 59 Temple Place - Suite 330,
22  * Boston, MA USA 02111-1307
23  *
24  *
25  *
26  *
27  * JRTokenMarker.java
28  *
29  */

30
31 package it.businesslogic.ireport.gui.syntax;
32
33 import org.syntax.jedit.*;
34 import org.syntax.jedit.tokenmarker.*;
35 import javax.swing.text.Segment JavaDoc;
36
37 /**
38  * Java token marker.
39  *
40  * @author Slava Pestov
41  * @version $Id: JRTokenMarker.java 932 2006-10-20 09:32:45Z gtoffoli $
42  */

43 public class JRTokenMarker extends TokenMarker
44 {
45         public byte FIELD_KEYWORD = 0;
46         public byte VARIABLE_KEYWORD = 0;
47         public byte PARAMETER_KEYWORD = 0;
48                 
49     public JRTokenMarker()
50     {
51         this(getKeywords());
52     }
53
54     public JRTokenMarker(KeywordMap keywords)
55     {
56         this.keywords = keywords;
57                 FIELD_KEYWORD = Token.KEYWORD1;
58                 VARIABLE_KEYWORD = Token.KEYWORD2;
59                 PARAMETER_KEYWORD = Token.KEYWORD3;
60                 
61     }
62
63     public byte markTokensImpl(byte token, Segment JavaDoc line, int lineIndex)
64     {
65         char[] array = line.array;
66         int offset = line.offset;
67         lastOffset = offset;
68         lastKeyword = offset;
69         int length = line.count + offset;
70         boolean backslash = false;
71
72 loop: for(int i = offset; i < length; i++)
73         {
74             int i1 = (i+1);
75
76             char c = array[i];
77             if(c == '\\')
78             {
79                 backslash = !backslash;
80                 continue;
81             }
82
83             switch(token)
84             {
85             case Token.NULL:
86                 switch(c)
87                 {
88                 case '#':
89                     if(backslash)
90                         backslash = false;
91                     else if(cpp)
92                     {
93                         if(doKeyword(line,i,c))
94                             break;
95                         addToken(i - lastOffset,token);
96                         addToken(length - i,Token.KEYWORD2);
97                         lastOffset = lastKeyword = length;
98                         break loop;
99                     }
100                     break;
101                 case '"':
102                     doKeyword(line,i,c);
103                     if(backslash)
104                         backslash = false;
105                     else
106                     {
107                         addToken(i - lastOffset,token);
108                         token = Token.LITERAL1;
109                         lastOffset = lastKeyword = i;
110                     }
111                     break;
112                 case '\'':
113                     doKeyword(line,i,c);
114                     if(backslash)
115                         backslash = false;
116                     else
117                     {
118                         addToken(i - lastOffset,token);
119                         token = Token.LITERAL2;
120                         lastOffset = lastKeyword = i;
121                     }
122                     break;
123                 case ':':
124                     if(lastKeyword == offset)
125                     {
126                         if(doKeyword(line,i,c))
127                             break;
128                         backslash = false;
129                         addToken(i1 - lastOffset,Token.LABEL);
130                         lastOffset = lastKeyword = i1;
131                     }
132                     else if(doKeyword(line,i,c))
133                         break;
134                     break;
135                 case '/':
136                     backslash = false;
137                     doKeyword(line,i,c);
138                     if(length - i > 1)
139                     {
140                         switch(array[i1])
141                         {
142                         case '*':
143                             addToken(i - lastOffset,token);
144                             lastOffset = lastKeyword = i;
145                             if(length - i > 2 && array[i+2] == '*')
146                                 token = Token.COMMENT2;
147                             else
148                                 token = Token.COMMENT1;
149                             break;
150                         case '/':
151                             addToken(i - lastOffset,token);
152                             addToken(length - i,Token.COMMENT1);
153                             lastOffset = lastKeyword = length;
154                             break loop;
155                         }
156                     }
157                     break;
158                 default:
159                     backslash = false;
160                     if(!Character.isLetterOrDigit(c)
161                         && c != '_')
162                         doKeyword(line,i,c);
163                     break;
164                 }
165                 break;
166             case Token.COMMENT1:
167             case Token.COMMENT2:
168                 backslash = false;
169                 if(c == '*' && length - i > 1)
170                 {
171                     if(array[i1] == '/')
172                     {
173                         i++;
174                         addToken((i+1) - lastOffset,token);
175                         token = Token.NULL;
176                         lastOffset = lastKeyword = i+1;
177                     }
178                 }
179                 break;
180             case Token.LITERAL1:
181                 if(backslash)
182                     backslash = false;
183                 else if(c == '"')
184                 {
185                     addToken(i1 - lastOffset,token);
186                     token = Token.NULL;
187                     lastOffset = lastKeyword = i1;
188                 }
189                 break;
190             case Token.LITERAL2:
191                 if(backslash)
192                     backslash = false;
193                 else if(c == '\'')
194                 {
195                     addToken(i1 - lastOffset,Token.LITERAL1);
196                     token = Token.NULL;
197                     lastOffset = lastKeyword = i1;
198                 }
199                 break;
200             default:
201                 throw new InternalError JavaDoc("Invalid state: "
202                     + token);
203             }
204         }
205
206         if(token == Token.NULL)
207             doKeyword(line,length,'\0');
208
209         switch(token)
210         {
211         case Token.LITERAL1:
212         case Token.LITERAL2:
213             addToken(length - lastOffset,Token.INVALID);
214             token = Token.NULL;
215             break;
216         case Token.KEYWORD2:
217             addToken(length - lastOffset,token);
218             if(!backslash)
219                 token = Token.NULL;
220         default:
221             addToken(length - lastOffset,token);
222             break;
223         }
224
225         return token;
226     }
227
228     public static KeywordMap getKeywords()
229     {
230         if(cKeywords == null)
231         {
232             cKeywords = new KeywordMap(false);
233             cKeywords.add("package",Token.KEYWORD2);
234             cKeywords.add("import",Token.KEYWORD2);
235             cKeywords.add("byte",Token.KEYWORD3);
236             cKeywords.add("char",Token.KEYWORD3);
237             cKeywords.add("short",Token.KEYWORD3);
238             cKeywords.add("int",Token.KEYWORD3);
239             cKeywords.add("long",Token.KEYWORD3);
240             cKeywords.add("float",Token.KEYWORD3);
241             cKeywords.add("double",Token.KEYWORD3);
242             cKeywords.add("boolean",Token.KEYWORD3);
243             cKeywords.add("void",Token.KEYWORD3);
244             cKeywords.add("class",Token.KEYWORD3);
245             cKeywords.add("interface",Token.KEYWORD3);
246             cKeywords.add("abstract",Token.KEYWORD1);
247             cKeywords.add("final",Token.KEYWORD1);
248             cKeywords.add("private",Token.KEYWORD1);
249             cKeywords.add("protected",Token.KEYWORD1);
250             cKeywords.add("public",Token.KEYWORD1);
251             cKeywords.add("static",Token.KEYWORD1);
252             cKeywords.add("synchronized",Token.KEYWORD1);
253             cKeywords.add("native",Token.KEYWORD1);
254             cKeywords.add("volatile",Token.KEYWORD1);
255             cKeywords.add("transient",Token.KEYWORD1);
256             cKeywords.add("break",Token.KEYWORD1);
257             cKeywords.add("case",Token.KEYWORD1);
258             cKeywords.add("continue",Token.KEYWORD1);
259             cKeywords.add("default",Token.KEYWORD1);
260             cKeywords.add("do",Token.KEYWORD1);
261             cKeywords.add("else",Token.KEYWORD1);
262             cKeywords.add("for",Token.KEYWORD1);
263             cKeywords.add("if",Token.KEYWORD1);
264             cKeywords.add("instanceof",Token.KEYWORD1);
265             cKeywords.add("new",Token.KEYWORD1);
266             cKeywords.add("return",Token.KEYWORD1);
267             cKeywords.add("switch",Token.KEYWORD1);
268             cKeywords.add("while",Token.KEYWORD1);
269             cKeywords.add("throw",Token.KEYWORD1);
270             cKeywords.add("try",Token.KEYWORD1);
271             cKeywords.add("catch",Token.KEYWORD1);
272             cKeywords.add("extends",Token.KEYWORD1);
273             cKeywords.add("finally",Token.KEYWORD1);
274             cKeywords.add("implements",Token.KEYWORD1);
275             cKeywords.add("throws",Token.KEYWORD1);
276             cKeywords.add("this",Token.LITERAL2);
277             cKeywords.add("null",Token.LITERAL2);
278             cKeywords.add("super",Token.LITERAL2);
279             cKeywords.add("true",Token.LITERAL2);
280             cKeywords.add("false",Token.LITERAL2);
281                         cKeywords.add("$PPPQ",Token.LITERAL2);
282                         cKeywords.add("giulio",Token.LITERAL2);
283         }
284         return cKeywords;
285     }
286
287     // private members
288
private static KeywordMap cKeywords;
289
290     private boolean cpp;
291     protected KeywordMap keywords;
292     private int lastOffset;
293     private int lastKeyword;
294
295     private boolean doKeyword(Segment JavaDoc line, int i, char c)
296     {
297         int i1 = i+1;
298
299         int len = i - lastKeyword;
300         byte id = keywords.lookup(line,lastKeyword,len);
301         if(id != Token.NULL)
302         {
303             if(lastKeyword != lastOffset)
304                 addToken(lastKeyword - lastOffset,Token.NULL);
305             addToken(len,id);
306             lastOffset = i;
307         }
308         lastKeyword = i1;
309         return false;
310     }
311         
312         public void addKeyword(String JavaDoc key, byte id)
313         {
314             keywords.add( key, id);
315             
316         }
317         
318 }
319
Popular Tags