KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > netbeans > modules > web > core > syntax > completion > JavaJSPCompletionProvider


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.completion;
21 import java.io.IOException JavaDoc;
22 import java.util.List JavaDoc;
23 import java.util.logging.Level JavaDoc;
24 import java.util.logging.Logger JavaDoc;
25 import javax.swing.text.BadLocationException JavaDoc;
26 import javax.swing.text.Document JavaDoc;
27 import javax.swing.text.JTextComponent JavaDoc;
28 import org.netbeans.api.java.source.JavaSource;
29 import org.netbeans.api.jsp.lexer.JspTokenId;
30 import org.netbeans.api.lexer.TokenHierarchy;
31 import org.netbeans.api.lexer.TokenSequence;
32 import org.netbeans.editor.Utilities;
33 import org.netbeans.modules.editor.java.JavaCompletionProvider;
34 import org.netbeans.modules.web.core.syntax.SimplifiedJSPServlet;
35 import org.netbeans.spi.editor.completion.CompletionItem;
36 import org.netbeans.spi.editor.completion.CompletionProvider;
37 import org.netbeans.spi.editor.completion.CompletionResultSet;
38 import org.netbeans.spi.editor.completion.CompletionTask;
39 import org.netbeans.spi.editor.completion.support.AsyncCompletionQuery;
40 import org.netbeans.spi.editor.completion.support.AsyncCompletionTask;
41 import org.openide.filesystems.FileObject;
42
43 /**
44  * Code completion functionality for Java code embedded in JSP files:
45  * - scriptlets (<% ... %>)
46  * - JSP declarations (<%! ... %> )
47  * - expressions (<%= ... %>)
48  *
49  * @author Tomasz.Slota@Sun.COM
50  */

51 public class JavaJSPCompletionProvider implements CompletionProvider {
52     private final JavaCompletionProvider javaCompletionProvider = new JavaCompletionProvider();
53     private static final Logger JavaDoc logger = Logger.getLogger(JavaJSPCompletionProvider.class.getName());
54     
55     public CompletionTask createTask(int queryType, final JTextComponent JavaDoc component) {
56         if ((queryType & COMPLETION_QUERY_TYPE) != 0){
57             Document JavaDoc doc = Utilities.getDocument(component);
58             int caretOffset = component.getCaret().getDot();
59             
60             if (isWithinScriptlet(doc, caretOffset)){
61                 //delegate to java cc provider if the context is really java code
62
return new AsyncCompletionTask(new EmbeddedJavaCompletionQuery(component, queryType), component);
63             }
64         }
65         
66         return null;
67     }
68     
69     private boolean isWithinScriptlet(Document JavaDoc doc, int offset){
70         TokenHierarchy tokenHierarchy = TokenHierarchy.get(doc);
71         TokenSequence tokenSequence = tokenHierarchy.tokenSequence();
72         
73         tokenSequence.move(offset);
74         if (tokenSequence.moveNext() || tokenSequence.movePrevious()) {
75             Object JavaDoc tokenID = tokenSequence.token().id();
76             if (tokenID == JspTokenId.SCRIPTLET){
77                 return true;
78             } else if (tokenID == JspTokenId.SYMBOL2) {
79                 // maybe the caret is placed just before the ending script delimiter?
80
tokenSequence.movePrevious();
81                 
82                 if (tokenSequence.token().id() == JspTokenId.SCRIPTLET){
83                     return true;
84                 }
85             }
86         }
87         
88         return false;
89     }
90     
91     public int getAutoQueryTypes(JTextComponent JavaDoc component, String JavaDoc typedText) {
92         return javaCompletionProvider.getAutoQueryTypes(component, typedText);
93     }
94     
95     
96     static class EmbeddedJavaCompletionQuery extends AsyncCompletionQuery {
97         protected int queryType;
98         protected JTextComponent JavaDoc component;
99         
100         public EmbeddedJavaCompletionQuery(JTextComponent JavaDoc component, int queryType){
101             this.queryType = queryType;
102             this.component = component;
103         }
104         
105         protected void query(CompletionResultSet resultSet, Document JavaDoc doc,
106                 int caretOffset) {
107             
108             SimplifiedJSPServlet simplifiedJSPServlet = new SimplifiedJSPServlet(doc);
109             try{
110                 simplifiedJSPServlet.process();
111                 String JavaDoc fakedClassBody = simplifiedJSPServlet.getVirtualClassBody();
112                 int shiftedOffset = simplifiedJSPServlet.getShiftedOffset(caretOffset);
113                 
114                 if (shiftedOffset >= 0){
115                     logger.fine("JSP CC: delegating CC query to java file:\n" //NOI18N
116
+ fakedClassBody.substring(0, shiftedOffset)
117                             + "|" + fakedClassBody.substring(shiftedOffset) + "\n"); //NOI18N
118

119                     CompletionQueryDelegatedToJava delegate = new CompletionQueryDelegatedToJava(
120                             caretOffset, shiftedOffset, queryType);
121                     
122                     delegate.create(doc, fakedClassBody);
123                     List JavaDoc<? extends CompletionItem> items = delegate.getCompletionItems();
124                     resultSet.addAllItems(items);
125                 } else{
126                     logger.severe("caretOffset outside of embedded java code"); //NOI18N
127
}
128             } catch (BadLocationException JavaDoc e){
129                 logger.log(Level.SEVERE, e.getMessage(), e);
130             } finally{
131                 resultSet.finish();
132             }
133         }
134     }
135     
136     static class CompletionQueryDelegatedToJava extends SimplifiedJSPServlet.VirtualJavaClass{
137         private int caretOffset;
138         private int queryType;
139         private int shiftedOffset;
140         private List JavaDoc<? extends CompletionItem> completionItems;
141         
142         CompletionQueryDelegatedToJava(int caretOffset, int shiftedOffset, int queryType){
143             this.caretOffset = caretOffset;
144             this.shiftedOffset = shiftedOffset;
145             this.queryType = queryType;
146         }
147         
148         protected void process(FileObject fileObject, JavaSource javaSource){
149             try{
150                 completionItems = JavaCompletionProvider.query(
151                         javaSource, queryType, shiftedOffset, caretOffset);
152             } catch (IOException JavaDoc e){
153                 logger.log(Level.SEVERE, e.getMessage(), e);
154             }
155         }
156         
157         List JavaDoc<? extends CompletionItem> getCompletionItems(){
158             return completionItems;
159         }
160     }
161     
162 }
163
164
Popular Tags