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: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041:
042: package org.netbeans.modules.cnd.editor.parser;
043:
044: import org.openide.cookies.EditorCookie;
045: import org.openide.nodes.AbstractNode;
046: import org.openide.nodes.Children;
047: import org.openide.text.Line;
048: import org.openide.cookies.LineCookie;
049: import org.openide.loaders.DataObject;
050: import org.openide.ErrorManager;
051:
052: import javax.swing.JEditorPane;
053:
054: import org.openide.text.NbDocument;
055:
056: public abstract class ViewNode extends AbstractNode {
057: private Line line = null;
058: private DataObject dao = null;
059: private int lineno = 0;
060: private char kind;
061: private String scope;
062: private int scopeCluster;
063: private int cluster;
064: private String sortName;
065: private int scopeLevels = 0;
066:
067: public ViewNode(String name, DataObject dao, int lineno, char kind,
068: String scope, int scopeCluster, int cluster) {
069: super (Children.LEAF);
070: this .dao = dao;
071: this .lineno = lineno;
072: this .kind = kind;
073: this .scope = scope;
074: this .scopeCluster = scopeCluster;
075: this .cluster = cluster;
076: setName(name);
077: if (scope != null) {
078: sortName = createSortScope(scope) + "::" + cluster + name; // NOI18N
079: setDisplayName(name);
080: } else {
081: sortName = cluster + name;
082: setDisplayName(name);
083: }
084: }
085:
086: /**
087: * Creates a scope thet can be sorted alphabetically using the following form:
088: * C++ Class scope:
089: * "ccc1::ccc11::ccc111" returns "7ccc1::7ccc11::7ccc111" where 7 is the 'class' cluster id
090: * and
091: * C++ Namespace scope:
092: * "nnn1::nnn12" returns "8nnn1::8nnn12" where 8 is the 'namespace' cluster id.
093: * The scop will later be combined with the name and the name's cluster id in the following
094: * fashion:
095: * 7ccc1::7ccc11::7ccc111:5yyy
096: * 7ccc1::7ccc11::7ccc111:6xxx
097: * 8nnn1::8nnn12
098: * 8nnn1::8nnn12::3zzz
099: * When sorting the strings, 7 comes before 8 so classes come before namespaces, and 5 comes before 6 so
100: * variables come before methods
101: */
102: private String createSortScope(String scope) {
103: String sortScope = ""; // NOI18N
104: if (scope == null) {
105: scopeLevels = 0;
106: sortScope = ""; // NOI18N
107: } else {
108: scopeLevels = 1;
109: int startIndex = 0;
110: int index;
111: while ((index = scope.indexOf("::", startIndex)) >= 0) { // NOI18N
112: sortScope = sortScope + scopeCluster
113: + scope.substring(startIndex, index) + "::"; // NOI18N
114: scopeLevels++;
115: startIndex = index + 2;
116: }
117: sortScope = sortScope + scopeCluster
118: + scope.substring(startIndex);
119: }
120: return sortScope;
121: }
122:
123: public String getSortName() {
124: return sortName;
125: }
126:
127: public int getScopeLevel() {
128: return scopeLevels;
129: }
130:
131: public String getScope() {
132: return scope;
133: }
134:
135: public int getScopeCluster() {
136: return scopeCluster;
137: }
138:
139: public int getCluster() {
140: return cluster;
141: }
142:
143: public Line getLine() {
144: if (line == null)
145: line = lineNumberToLine();
146: if (line == null) {
147: ErrorManager.getDefault().notify(
148: new Exception("No Line info for line " + lineno
149: + " in "
150: + dao.getPrimaryFile().getNameExt())); // NOI18N
151: }
152: return line;
153: }
154:
155: public int getLineNo() {
156: return lineno;
157: }
158:
159: public void goToLine() {
160: getLine().show(Line.SHOW_GOTO);
161: }
162:
163: private Line lineNumberToLine() {
164: LineCookie lc = (LineCookie) dao.getCookie(LineCookie.class);
165: Line l = null;
166: if (lc != null) {
167: Line.Set ls = lc.getLineSet();
168: if (ls != null) {
169: l = ls.getCurrent(lineno - 1);
170: }
171: }
172: return l;
173: }
174:
175: public int getLineOffset() {
176: EditorCookie editor = (EditorCookie) dao
177: .getCookie(EditorCookie.class);
178: assert editor != null;
179: return NbDocument.findLineOffset(editor.getDocument(),
180: lineno - 1);
181: }
182:
183: public void goToOffset(JEditorPane jEditorPane) {
184: jEditorPane.getCaret().setDot(getLineOffset());
185: jEditorPane.requestFocus();
186: }
187:
188: public char getKind() {
189: return kind;
190: }
191:
192: public DataObject getDataObject() {
193: return dao;
194: }
195: }
|