From: Robert M. <rob...@us...> - 2005-11-20 22:12:13
|
Update of /cvsroot/jedit/plugins/RubyPlugin/src/org/jedit/ruby/utils In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24659/src/org/jedit/ruby/utils Modified Files: EditorView.java ViewWrapper.java Added Files: CharCaretListener.java Removed Files: BufferWrapper.java Log Message: v0.7.4 with keyword completion, brace and quote completion, structure highlighting, and goto previous edit action --- BufferWrapper.java DELETED --- --- NEW FILE: CharCaretListener.java --- /* * CharCaretListener.java - * * Copyright 2005 Robert McKinnon * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package org.jedit.ruby.utils; import org.gjt.sp.jedit.textarea.JEditTextArea; import org.jedit.ruby.structure.RubyTokenHandler; import org.jedit.ruby.structure.RubyToken; import javax.swing.event.CaretListener; import javax.swing.event.CaretEvent; /** * @author robmckinnon at users.sourceforge.net */ public final class CharCaretListener implements CaretListener { private static final RubyTokenHandler tokenHandler = new RubyTokenHandler(); private static final char NONE = (char)-1; private static RubyToken lastToken = null; private static RubyToken currentToken = null; private static char charLastBehind = NONE; private static char charBehind = NONE; private static char charAhead = NONE; public static boolean hasCharLastBehind() { return charLastBehind != NONE; } public static char getCharBehind() { return charBehind; } public static char getCharLastBehind() { return charLastBehind; } public static char getCharAhead() { return charAhead; } public static RubyToken getLastToken() { return lastToken; } public static RubyToken getCurrentToken() { return currentToken; } public final void caretUpdate(CaretEvent e) { int mark = e.getMark(); int dot = e.getDot(); charLastBehind = charBehind; lastToken = currentToken; if (dot == mark && dot > 0) { JEditTextArea textArea = (JEditTextArea)e.getSource(); String text = textArea.getText(); charBehind = text.charAt(dot - 1); currentToken = tokenHandler.getTokenAtCaret(textArea.getBuffer(), dot); if (text.length() > dot) { charAhead = text.charAt(dot); } else { charAhead = NONE; } } else { currentToken = null; lastToken = null; charBehind = NONE; charLastBehind = NONE; charAhead = NONE; } } } Index: EditorView.java =================================================================== RCS file: /cvsroot/jedit/plugins/RubyPlugin/src/org/jedit/ruby/utils/EditorView.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- EditorView.java 14 Nov 2005 08:17:52 -0000 1.2 +++ EditorView.java 20 Nov 2005 22:12:04 -0000 1.3 @@ -4,11 +4,15 @@ import org.jedit.ruby.ast.RubyMembers; import org.jedit.ruby.ast.Member; +import java.util.List; + /** * @author robmckinnon at users.sourceforge.net */ public interface EditorView { + public final static EditorView NULL = new NullEditorView(); + String getLineUpToCaret(); String getLineUpToCaretLeftTrimmed(); @@ -27,4 +31,90 @@ Member getMemberAtCaretPosition(); + int getNonSpaceStartOffset(int line); + + int getEndOffset(int line); + + int getEndOfFileOffset(); + + int getStartOffset(int line); + + int getLineAtOffset(int offset); + + int getLineAtCaret(); + + int getTextLength(); + + List<String> getKeywords(); + + public static class NullEditorView implements EditorView { + + public String getLineUpToCaret() { + return null; + } + + public final String getLineUpToCaretLeftTrimmed() { + return null; + } + + public String getText(int start, int length) { + return null; + } + + public int getLength() { + return 0; + } + + public final String getTextWithoutLine() { + return null; + } + + public final View getView() { + return null; + } + + public int getCaretPosition() { + return 0; + } + + public final RubyMembers getMembers() { + return null; + } + + public final Member getMemberAtCaretPosition() { + return null; + } + + public final int getNonSpaceStartOffset(int line) { + return 0; + } + + public final int getEndOffset(int line) { + return 0; + } + + public final int getEndOfFileOffset() { + return 0; + } + + public final int getStartOffset(int line) { + return 0; + } + + public final int getLineAtOffset(int offset) { + return 0; + } + + public final int getLineAtCaret() { + return 0; + } + + public final int getTextLength() { + return 0; + } + + public List<String> getKeywords() { + return null; + } + } } Index: ViewWrapper.java =================================================================== RCS file: /cvsroot/jedit/plugins/RubyPlugin/src/org/jedit/ruby/utils/ViewWrapper.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- ViewWrapper.java 14 Nov 2005 08:17:53 -0000 1.2 +++ ViewWrapper.java 20 Nov 2005 22:12:04 -0000 1.3 @@ -1,38 +1,68 @@ +/* + * ViewWrapper.java + * + * Copyright 2005 Robert McKinnon + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ package org.jedit.ruby.utils; import org.gjt.sp.jedit.textarea.JEditTextArea; import org.gjt.sp.jedit.textarea.Selection; import org.gjt.sp.jedit.Buffer; import org.gjt.sp.jedit.View; +import org.gjt.sp.jedit.syntax.KeywordMap; import org.jedit.ruby.ast.RubyMembers; import org.jedit.ruby.ast.Member; import org.jedit.ruby.parser.RubyParser; +import java.util.List; +import java.util.Arrays; +import java.util.ArrayList; + /** * @author robmckinnon at users.sourceforge.net */ -public class ViewWrapper implements EditorView { +public final class ViewWrapper implements EditorView { - private JEditTextArea textArea; - private Buffer buffer; + private final View view; public ViewWrapper(View view) { - this.textArea = view.getTextArea(); - this.buffer = view.getBuffer(); + this.view = view; } - public int getCaretPosition() { - return textArea.getCaretPosition(); + private Buffer buffer() { + return view.getBuffer(); } - public String getLineUpToCaret() { - int lineIndex = textArea.getCaretLine(); - int start = textArea.getLineStartOffset(lineIndex); - int end = textArea.getCaretPosition(); - return textArea.getText(start, end - start); + private JEditTextArea textArea() { + return view.getTextArea(); } - public String getLineUpToCaretLeftTrimmed() { + public final int getCaretPosition() { + return textArea().getCaretPosition(); + } + + public final String getLineUpToCaret() { + int lineIndex = textArea().getCaretLine(); + int start = textArea().getLineStartOffset(lineIndex); + int end = textArea().getCaretPosition(); + return textArea().getText(start, end - start); + } + + public final String getLineUpToCaretLeftTrimmed() { String line = getLineUpToCaret(); while (line.length() > 0 && Character.isWhitespace(line.charAt(0))) { line = line.substring(1); @@ -40,31 +70,31 @@ return line; } - public void replaceLineUpToCaret(String newText) { + public final void replaceLineUpToCaret(String newText) { int caretPosition = getCaretPosition(); String oldText = getLineUpToCaret(); Selection.Range range = new Selection.Range(caretPosition - oldText.length(), caretPosition); - textArea.setSelection(range); - textArea.setSelectedText(newText); + textArea().setSelection(range); + textArea().setSelectedText(newText); } - public String getText(int start, int length) { - return buffer.getText(start, length); + public final String getText(int start, int length) { + return buffer().getText(start, length); } - public int getLength() { - return buffer.getLength(); + public final int getLength() { + return buffer().getLength(); } - public String getTextWithoutLine() { - int caretPosition = textArea.getCaretPosition(); - int line = textArea.getLineOfOffset(caretPosition); - int start = textArea.getLineStartOffset(line); - int end = textArea.getLineEndOffset(line); + public final String getTextWithoutLine() { + int caretPosition = textArea().getCaretPosition(); + int line = textArea().getLineOfOffset(caretPosition); + int start = textArea().getLineStartOffset(line); + int end = textArea().getLineEndOffset(line); StringBuffer text = new StringBuffer(); - text.append(buffer.getText(0, start)); - if(buffer.getLength() > end) { - text.append(buffer.getText(end, buffer.getLength() - end)); + text.append(buffer().getText(0, start)); + if(buffer().getLength() > end) { + text.append(buffer().getText(end, buffer().getLength() - end)); } return text.toString(); } @@ -78,11 +108,11 @@ * * @return RubyMembers */ - public RubyMembers getMembers() { - RubyMembers members = RubyParser.getMembers(textArea.getView()); - boolean useLastGoodParse = members.containsErrors() && RubyParser.hasLastGoodMembers(buffer); + public final RubyMembers getMembers() { + RubyMembers members = RubyParser.getMembers(textArea().getView()); + boolean useLastGoodParse = members.containsErrors() && RubyParser.hasLastGoodMembers(buffer()); - return useLastGoodParse ? RubyParser.getLastGoodMembers(buffer) : members; + return useLastGoodParse ? RubyParser.getLastGoodMembers(buffer()) : members; } /** @@ -92,15 +122,66 @@ * * @return {@link Member} at caret or null */ - public Member getMemberAtCaretPosition() { + public final Member getMemberAtCaretPosition() { RubyMembers members = getMembers(); boolean errorsPresent = members.containsErrors(); return errorsPresent ? null : members.getMemberAt(getCaretPosition()); } - public View getView() { - return textArea.getView(); + public final View getView() { + return view; + } + + public final int getNonSpaceStartOffset(int line) { + int offset = buffer().getLineStartOffset(line); + int end = buffer().getLineEndOffset(line); + String text = buffer().getLineText(line); + int length = text.length(); + + if (length > 0) { + int index = 0; + while (index < length + && (text.charAt(index) == ' ' || text.charAt(index) == '\t') + && (offset - index) < end) { + index++; + } + offset += index; + } + + return offset; + } + + public final int getEndOffset(int line) { + return buffer().getLineEndOffset(line) - 1; + } + + public final int getEndOfFileOffset() { + return buffer().getLineEndOffset(buffer().getLineCount() - 1); + } + + public final int getStartOffset(int line) { + return buffer().getLineStartOffset(line); + } + + public final int getLineAtOffset(int offset) { + return buffer().getLineOfOffset(offset); + } + + public final int getLineAtCaret() { + return textArea().getCaretLine(); + } + + public final int getTextLength() { + return textArea().getText().length(); + } + + public List<String> getKeywords() { + KeywordMap keywordMap = buffer().getKeywordMapAtOffset(getCaretPosition()); + String[] keywords = keywordMap.getKeywords(); + List<String> list = new ArrayList<String>(Arrays.asList(keywords)); + list.add("defined?"); + return list; } } |