KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > netbeans > modules > web > core > syntax > formatting > JspFormatter


1 /*
2  * The contents of this file are subject to the terms of the Common Development
3  * and Distribution License (the License). You may not use this file except in
4  * compliance with the License.
5  *
6  * You can obtain a copy of the License at http://www.netbeans.org/cddl.html
7  * or http://www.netbeans.org/cddl.txt.
8  *
9  * When distributing Covered Code, include this CDDL Header Notice in each file
10  * and include the License file at http://www.netbeans.org/cddl.txt.
11  * If applicable, add the following below the CDDL Header, with the fields
12  * enclosed by brackets [] replaced by your own identifying information:
13  * "Portions Copyrighted [year] [name of copyright owner]"
14  *
15  * The Original Software is NetBeans. The Initial Developer of the Original
16  * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
17  * Microsystems, Inc. All Rights Reserved.
18  */

19
20 package org.netbeans.modules.web.core.syntax.formatting;
21
22 import org.netbeans.modules.web.core.syntax.deprecated.JspMultiSyntax;
23 import org.netbeans.modules.web.core.syntax.deprecated.JspTagTokenContext;
24 import org.netbeans.modules.web.core.syntax.*;
25 import java.io.IOException JavaDoc;
26 import java.io.Writer JavaDoc;
27 import java.util.LinkedList JavaDoc;
28 import java.util.List JavaDoc;
29 import javax.swing.text.BadLocationException JavaDoc;
30 import javax.swing.text.JTextComponent JavaDoc;
31 import javax.swing.text.Position JavaDoc;
32 import org.netbeans.editor.BaseDocument;
33 import org.netbeans.editor.Syntax;
34 import org.netbeans.editor.TokenContextPath;
35 import org.netbeans.editor.TokenItem;
36 import org.netbeans.editor.Utilities;
37 import org.netbeans.editor.ext.AbstractFormatLayer;
38 import org.netbeans.editor.ext.ExtSyntaxSupport;
39 import org.netbeans.editor.ext.FormatWriter;
40 import org.netbeans.editor.ext.html.HTMLFormatter;
41 import org.netbeans.editor.ext.java.JavaFormatter;
42 import org.netbeans.editor.ext.java.JavaTokenContext;
43 import org.netbeans.modules.editor.java.JavaKit;
44
45 /**
46  * Formatter for JSP files.
47  * @author Tomasz.Slota@Sun.COM
48  */

49
50 public class JspFormatter extends HTMLFormatter {
51     private JavaFormatter jFormatter;
52     
53     /** Creates a new instance of HTMLFormater */
54     public JspFormatter(Class JavaDoc kitClass) {
55         super(kitClass);
56         jFormatter = new JspJavaFormatter(JavaKit.class);
57     }
58     
59     @Override JavaDoc public Writer JavaDoc reformat(final BaseDocument doc, final int startOffset, final int endOffset,
60             final boolean indentOnly) throws BadLocationException JavaDoc, IOException JavaDoc{
61         super.reformat(doc, startOffset, endOffset, indentOnly);
62         
63         List JavaDoc<ScriptletBlock> scripletBlocks = new LinkedList JavaDoc<ScriptletBlock>();
64         ExtSyntaxSupport sup = getSyntaxSupport(doc);
65         TokenItem token = sup.getTokenChain(startOffset, startOffset + 1);
66         
67         if (token == null){
68             return null;
69         }
70         
71         TokenItem lastNonWhiteScriptletToken = null;
72         int scripletBlockStart = -1;
73         int scripletBlockEnd = -1;
74         
75         do{
76             if (token.getOffset() >= endOffset){
77                 break;
78             }
79             
80             if (token.getTokenContextPath().contains(JavaTokenContext.contextPath)){
81                 
82                 if (token.getTokenID() != JavaTokenContext.WHITESPACE){
83                     if (scripletBlockStart == -1){
84                         scripletBlockStart = token.getOffset();
85                     }
86                     
87                     lastNonWhiteScriptletToken = token;
88                 }
89             } else{
90                 if (scripletBlockStart != -1){
91                     
92                     scripletBlockEnd = lastNonWhiteScriptletToken.getOffset()
93                     + lastNonWhiteScriptletToken.getImage().length();
94                     
95                     scripletBlocks.add(new ScriptletBlock(doc, scripletBlockStart, scripletBlockEnd));
96                     scripletBlockStart = -1;
97                 }
98             }
99             
100             token = token.getNext();
101         }
102         while (token != null);
103         
104         for (ScriptletBlock sb : scripletBlocks){
105             extFormatterReformat(doc, sb.getStart(), Math.min(sb.getEnd(), endOffset), indentOnly);
106         }
107         
108         return null;
109     }
110     
111     @Override JavaDoc protected void enterPressed(JTextComponent JavaDoc txtComponent, int dotPos) throws BadLocationException JavaDoc{
112         BaseDocument doc = Utilities.getDocument(txtComponent);
113         JspSyntaxSupport sup = new JspSyntaxSupport(doc);
114         TokenItem token = sup.getItemAtOrBefore(dotPos);
115         
116         if (token.getTokenContextPath().contains(JavaTokenContext.contextPath)){
117             try {
118                 extFormatterReformat(doc, dotPos, dotPos + 1, true);
119                 
120             } catch (IOException JavaDoc ex) {
121                 ex.printStackTrace();
122             }
123         } else{
124             super.enterPressed(txtComponent, dotPos);
125         }
126     }
127     
128     @Override JavaDoc protected boolean isClosingTag(TokenItem token){
129         return token != null && isJSPTag(token)
130         && token.getPrevious().getImage().equals("</")
131         || super.isClosingTag(token);
132     }
133     
134     @Override JavaDoc protected boolean isOpeningTag(TokenItem token){
135         return token != null && isJSPTag(token)
136         && token.getPrevious().getImage().equals("<")
137         || super.isOpeningTag(token);
138     }
139     
140     @Override JavaDoc protected TokenItem getTagTokenEndingAtPosition(BaseDocument doc, int position) throws BadLocationException JavaDoc{
141         TokenItem htmlEndingToken = super.getTagTokenEndingAtPosition(doc, position);
142         
143         if (htmlEndingToken != null){
144             return htmlEndingToken;
145         }
146         
147         if (position >= 0) {
148             JspSyntaxSupport sup = (JspSyntaxSupport)doc.getSyntaxSupport().get(JspSyntaxSupport.class);
149             TokenItem token = sup.getTokenChain(position, position + 1);
150             
151             if (token.getTokenID() == JspTagTokenContext.SYMBOL &&
152                     token.getImage().equals(">")){ //NOI18N
153
do {
154                     token = token.getPrevious();
155                 }
156                 while (token != null && token.getTokenID() != JspTagTokenContext.TAG);
157                 
158                 return token;
159             }
160         }
161         return null;
162     }
163     
164     @Override JavaDoc protected int getTagEndOffset(TokenItem token){
165         
166         if (!isJSPTag(token)){
167             return super.getTagEndOffset(token);
168         }
169         
170         TokenItem t = token.getNext();
171         
172         while (t != null && !(t.getTokenID() == JspTagTokenContext.SYMBOL
173                 && (">".equals(t.getImage()) || "/>".equals(t.getImage())))){ //NOI18N
174
t = t.getNext();
175         }
176         
177         return t == null ? -1 : t.getOffset();
178     }
179     
180     @Override JavaDoc protected int getOpeningSymbolOffset(TokenItem tknTag){
181         if (!isJSPTag(tknTag)){
182             return super.getOpeningSymbolOffset(tknTag);
183         }
184         
185         TokenItem tkn = tknTag;
186         
187         do{
188             tkn = tkn.getPrevious();
189         }
190         while(tkn != null && tkn.getTokenID() != JspTagTokenContext.SYMBOL);
191         
192         if (tkn != null){
193             return tkn.getOffset();
194         }
195         
196         return -1;
197     }
198     
199     private boolean isJSPTag(TokenItem tagToken){
200         return tagToken.getTokenID() == JspTagTokenContext.TAG;
201     }
202     
203     @Override JavaDoc protected boolean acceptSyntax(Syntax syntax) {
204         return (syntax instanceof JspMultiSyntax);
205     }
206     
207     @Override JavaDoc protected void initFormatLayers() {
208         addFormatLayer(new SwitchLayer());
209     }
210     
211     @Override JavaDoc protected boolean isUnformattableToken(TokenItem token) {
212         if (token.getTokenID() == JspTagTokenContext.COMMENT
213                 || token.getTokenID() == JspTagTokenContext.EOL){
214             return true;
215         }
216         
217         return super.isUnformattableToken(token);
218     }
219     
220     private class SwitchLayer extends AbstractFormatLayer {
221         
222         public SwitchLayer() {
223             super("Switch-line"); //NOI18N
224
}
225         
226         public void format(FormatWriter fw) {
227             int offset = fw.getOffset();
228             
229             JspSyntaxSupport sup = new JspSyntaxSupport( (BaseDocument)fw.getDocument() );
230             try{
231                 TokenItem item = sup.getItemAtOrBefore(offset);
232                 
233                 if (item == null){
234                     return;
235                 }
236                 
237                 TokenContextPath tcp = item.getTokenContextPath();
238                 if(tcp.contains(JavaTokenContext.contextPath)) {
239                     if (JspUtils.getScriptingLanguage().equals("text/x-java")) { // NOI18N
240
jFormatter.format(fw);
241                     }
242                 }
243                 
244             }catch(BadLocationException JavaDoc e) {
245                 e.printStackTrace(System.err);
246             }
247         }
248     }
249     
250     private class ScriptletBlock{
251         private Position JavaDoc posStart;
252         private Position JavaDoc posEnd;
253         
254         public ScriptletBlock(BaseDocument doc, int start, int end) throws BadLocationException JavaDoc{
255             posStart = doc.createPosition(start);
256             posEnd = doc.createPosition(end);
257         }
258         
259         public int getStart() {
260             return posStart.getOffset();
261         }
262         
263         public int getEnd() {
264             return posEnd.getOffset();
265         }
266     }
267 }
268
Popular Tags