001: /* ====================================================================
002: * The JRefactory License, Version 1.0
003: *
004: * Copyright (c) 2001 JRefactory. All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions
008: * are met:
009: *
010: * 1. Redistributions of source code must retain the above copyright
011: * notice, this list of conditions and the following disclaimer.
012: *
013: * 2. Redistributions in binary form must reproduce the above copyright
014: * notice, this list of conditions and the following disclaimer in
015: * the documentation and/or other materials provided with the
016: * distribution.
017: *
018: * 3. The end-user documentation included with the redistribution,
019: * if any, must include the following acknowledgment:
020: * "This product includes software developed by the
021: * JRefactory (http://www.sourceforge.org/projects/jrefactory)."
022: * Alternately, this acknowledgment may appear in the software itself,
023: * if and wherever such third-party acknowledgments normally appear.
024: *
025: * 4. The names "JRefactory" must not be used to endorse or promote
026: * products derived from this software without prior written
027: * permission. For written permission, please contact seguin@acm.org.
028: *
029: * 5. Products derived from this software may not be called "JRefactory",
030: * nor may "JRefactory" appear in their name, without prior written
031: * permission of Chris Seguin.
032: *
033: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
034: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
035: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
036: * DISCLAIMED. IN NO EVENT SHALL THE CHRIS SEGUIN OR
037: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
038: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
039: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
040: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
041: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
042: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
043: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
044: * SUCH DAMAGE.
045: * ====================================================================
046: *
047: * This software consists of voluntary contributions made by many
048: * individuals on behalf of JRefactory. For more information on
049: * JRefactory, please see
050: * <http://www.sourceforge.org/projects/jrefactory>.
051: */
052: package org.acm.seguin.ide.netbeans;
053:
054: import java.io.*;
055: import javax.swing.*;
056: import org.acm.seguin.pretty.PrettyPrintFromIDE;
057: import org.openide.*;
058: import org.openide.cookies.*;
059: import org.openide.nodes.*;
060: import org.openide.windows.*;
061: import org.acm.seguin.util.FileSettings;
062: import net.sourceforge.jrefactory.parser.JavaParser;
063:
064: /**
065: * Description of the Class
066: *
067: *@author Chris Seguin
068: *@created October 18, 2001
069: */
070: public class NetBeansPrettyPrinter extends PrettyPrintFromIDE {
071: // NOTE: A new line is actually 2 characters long but 1 reflects how the
072: // caret positioning works
073: private final int NEW_LINE_LENGTH = 1;
074:
075: private JEditorPane _editorPane;
076:
077: /**
078: * Constructor for the NetBeansPrettyPrinter object
079: *
080: *@param editorCookie Description of Parameter
081: */
082: public NetBeansPrettyPrinter(EditorCookie editorCookie) {
083: super ();
084: JRefactory.log("NetBeansPrettyPrinter(" + editorCookie + ")");
085: _editorPane = getCurrentEditorPane(editorCookie);
086: }
087:
088: /**
089: * Sets the LineNumber attribute of the NetBeansPrettyPrinter object
090: *
091: *@param lineNumber The new LineNumber value
092: */
093: protected void setLineNumber(int lineNumber) {
094: if (lineNumber < 1) {
095: throw new IllegalArgumentException(
096: "lineNumber must be 1 or greater: " + lineNumber);
097: }
098:
099: int targetOffset = 0;
100: int lineCount = 1;
101:
102: BufferedReader reader = getDocumentTextReader();
103:
104: String currLine = null;
105: try {
106: currLine = reader.readLine();
107: while (currLine != null && lineCount < lineNumber) {
108: targetOffset += currLine.length() + NEW_LINE_LENGTH;
109: lineCount++;
110: currLine = reader.readLine();
111: }
112: } catch (IOException ioe) {
113: ioe.printStackTrace();
114: return;
115: }
116:
117: if (currLine == null) {
118: if (lineCount < lineNumber) {
119: throw new IllegalArgumentException(
120: "lineNumber is past end of document!: "
121: + lineNumber);
122: }
123:
124: if (lineCount > 0) {
125: // no new line after last line
126: targetOffset--;
127: }
128: }
129: _editorPane.setCaretPosition(targetOffset);
130: }
131:
132: /**
133: * Sets the string in the IDE
134: *
135: *@param text The new StringInIDE value
136: */
137: protected void setStringInIDE(String text) {
138: _editorPane.setText(text);
139: }
140:
141: /**
142: * Gets the CurrentEditorPane attribute of the NetBeansPrettyPrinter object
143: *
144: *@param cookie Description of Parameter
145: *@return The CurrentEditorPane value
146: */
147: private JEditorPane getCurrentEditorPane(EditorCookie cookie) {
148: if (cookie == null) {
149: return null;
150: }
151: JEditorPane[] panes = cookie.getOpenedPanes();
152: JRefactory.log("Panes: " + panes);
153: if (panes.length == 1) {
154: return panes[0];
155: }
156:
157: return null;
158: }
159:
160: /**
161: * Gets the DocumentTextReader attribute of the NetBeansPrettyPrinter
162: * object
163: *
164: *@return The DocumentTextReader value
165: */
166: private BufferedReader getDocumentTextReader() {
167: try {
168: FileSettings bundle = FileSettings
169: .getRefactoryPrettySettings();
170: JavaParser.setTargetJDK(bundle.getString("jdk"));
171: } catch (Exception e) {
172: JavaParser.setTargetJDK("1.4.2");
173: }
174: BufferedReader reader = new BufferedReader(new StringReader(
175: _editorPane.getText()));
176: return reader;
177: }
178:
179: /**
180: *@return the initial line number, -1 if failed
181: */
182: protected int getLineNumber() {
183: BufferedReader reader = getDocumentTextReader();
184:
185: int offset = _editorPane.getCaretPosition();
186:
187: int lineNumber = 0;
188: int currOffset = 0;
189:
190: while (currOffset <= offset) {
191: String currLine = null;
192: try {
193: currLine = reader.readLine();
194: } catch (IOException ioe) {
195: ioe.printStackTrace();
196: return -1;
197: }
198: currOffset += currLine.length() + NEW_LINE_LENGTH;
199: lineNumber++;
200: }
201:
202: return lineNumber;
203: }
204:
205: /**
206: * Gets the initial string from the IDE
207: *
208: *@return The file in string format
209: */
210: protected String getStringFromIDE() {
211: return _editorPane.getText();
212: }
213:
214: }
|