001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * If you wish your version of this file to be governed by only the CDDL
025: * or only the GPL Version 2, indicate your decision by adding
026: * "[Contributor] elects to include this software in this distribution
027: * under the [CDDL or GPL Version 2] license." If you do not indicate a
028: * single choice of license, a recipient has the option to distribute
029: * your version of this file under either the CDDL, the GPL Version 2 or
030: * to extend the choice of license to its licensees as provided above.
031: * However, if you add GPL Version 2 code and therefore, elected the GPL
032: * Version 2 license, then the option applies only if the new code is
033: * made subject to such option by the copyright holder.
034: *
035: * Contributor(s):
036: *
037: * Portions Copyrighted 2008 Sun Microsystems, Inc.
038: */
039:
040: package org.netbeans.modules.spring.beans.completion;
041:
042: import java.awt.Color;
043: import java.awt.Font;
044: import java.awt.Graphics;
045: import java.awt.event.KeyEvent;
046: import java.io.IOException;
047: import javax.lang.model.element.Modifier;
048: import javax.lang.model.element.NestingKind;
049: import javax.lang.model.element.TypeElement;
050: import javax.swing.text.JTextComponent;
051: import org.netbeans.api.java.source.CompilationController;
052: import org.netbeans.api.java.source.ElementHandle;
053: import org.netbeans.api.java.source.JavaSource;
054: import org.netbeans.api.java.source.JavaSource.Phase;
055: import org.netbeans.api.java.source.Task;
056: import org.netbeans.spi.editor.completion.CompletionTask;
057: import org.netbeans.spi.editor.completion.LazyCompletionItem;
058: import org.netbeans.spi.editor.completion.support.CompletionUtilities;
059: import org.openide.util.Exceptions;
060:
061: /**
062: * Based on LazyTypeCompletionItem from Java Editor module
063: *
064: * @author Rohan Ranade (Rohan.Ranade@Sun.COM)
065: */
066: public class LazyTypeCompletionItem extends
067: SpringXMLConfigCompletionItem implements LazyCompletionItem {
068:
069: public static LazyTypeCompletionItem create(int substitutionOffset,
070: ElementHandle<TypeElement> eh, JavaSource javaSource) {
071: return new LazyTypeCompletionItem(substitutionOffset, eh,
072: javaSource);
073: }
074:
075: private ElementHandle<TypeElement> eh;
076: private JavaSource javaSource;
077: private String name;
078: private SpringXMLConfigCompletionItem delegate;
079: private String simpleName;
080: private String pkgName;
081: private int prefWidth = -1;
082: private String sortText;
083:
084: private LazyTypeCompletionItem(int substitutionOffset,
085: ElementHandle<TypeElement> eh, JavaSource javaSource) {
086: super (substitutionOffset);
087: this .eh = eh;
088: this .javaSource = javaSource;
089: this .name = eh.getQualifiedName();
090: int idx = name.lastIndexOf('.'); //NOI18N
091: this .simpleName = idx > -1 ? name.substring(idx + 1) : name;
092: this .pkgName = idx > -1 ? name.substring(0, idx) : ""; //NOI18N
093: this .sortText = this .simpleName
094: + SpringXMLConfigCompletionItem
095: .getImportanceLevel(this .pkgName) + "#"
096: + this .pkgName; // NOI18N
097: }
098:
099: public boolean accept() {
100: if (eh != null) {
101: try {
102: javaSource.runUserActionTask(
103: new Task<CompilationController>() {
104: public void run(CompilationController cc)
105: throws Exception {
106: cc.toPhase(Phase.ELEMENTS_RESOLVED);
107: TypeElement e = eh.resolve(cc);
108: if (e != null && isAccessibleClass(e)) {
109: delegate = SpringXMLConfigCompletionItem
110: .createTypeItem(
111: substitutionOffset,
112: e,
113: eh,
114: cc
115: .getElements()
116: .isDeprecated(
117: e),
118: true);
119: }
120: eh = null;
121: }
122: }, true);
123: } catch (IOException ioe) {
124: Exceptions.printStackTrace(ioe);
125: }
126: }
127:
128: return delegate != null;
129: }
130:
131: private static boolean isAccessibleClass(TypeElement te) {
132: NestingKind nestingKind = te.getNestingKind();
133: return (nestingKind == NestingKind.TOP_LEVEL)
134: || (nestingKind == NestingKind.MEMBER && te
135: .getModifiers().contains(Modifier.STATIC));
136: }
137:
138: public int getSortPriority() {
139: return 200;
140: }
141:
142: public CharSequence getSortText() {
143: return sortText;
144: }
145:
146: public CharSequence getInsertPrefix() {
147: return simpleName;
148: }
149:
150: @Override
151: public CompletionTask createDocumentationTask() {
152: if (delegate != null) {
153: return delegate.createDocumentationTask();
154: }
155:
156: return null;
157: }
158:
159: @Override
160: public CompletionTask createToolTipTask() {
161: if (delegate != null) {
162: return delegate.createToolTipTask();
163: }
164:
165: return null;
166: }
167:
168: @Override
169: public void defaultAction(JTextComponent component) {
170: if (delegate != null)
171: delegate.defaultAction(component);
172: }
173:
174: @Override
175: public void processKeyEvent(KeyEvent evt) {
176: if (delegate != null)
177: delegate.processKeyEvent(evt);
178: }
179:
180: @Override
181: public int getPreferredWidth(Graphics g, Font defaultFont) {
182: if (prefWidth < 0)
183: prefWidth = CompletionUtilities.getPreferredWidth(
184: simpleName + " (" + pkgName + ")", null, g,
185: defaultFont); //NOI18N
186: return prefWidth;
187: }
188:
189: @Override
190: public void render(Graphics g, Font defaultFont,
191: Color defaultColor, Color backgroundColor, int width,
192: int height, boolean selected) {
193: if (delegate != null)
194: delegate.render(g, defaultFont, defaultColor,
195: backgroundColor, width, height, selected);
196: }
197: }
|