Fixes and updates

This commit is contained in:
Nico committed 2021-03-07 15:22:55 +01:00
1 parent d1710ea6a5
commit fb4da77359
204 files changed
+41378 -41586

No files matched your search

@@ -18,6 +18,7 @@ import javax.swing.KeyStroke;
import javax.swing.border.EmptyBorder; import javax.swing.border.EmptyBorder;
import org.objectweb.asm.tree.AbstractInsnNode; import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.AnnotationNode;
import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.FieldInsnNode; import org.objectweb.asm.tree.FieldInsnNode;
import org.objectweb.asm.tree.LdcInsnNode; import org.objectweb.asm.tree.LdcInsnNode;
@@ -141,6 +142,7 @@ public class GlobalSearchBox extends JFrame {
if (ignoreCase) { if (ignoreCase) {
str = str.toLowerCase(); str = str.toLowerCase();
} }
String fstr = str;
for (ClassNode cn : Main.classNodes.values()) { for (ClassNode cn : Main.classNodes.values()) {
for (MethodNode mn : cn.methods) { for (MethodNode mn : cn.methods) {
for (AbstractInsnNode insn : mn.instructions.toArray()) { for (AbstractInsnNode insn : mn.instructions.toArray()) {
@@ -154,6 +156,15 @@ public class GlobalSearchBox extends JFrame {
} }
} }
} }
if (mn.visibleAnnotations != null) {
for (AnnotationNode anno : mn.visibleAnnotations) {
if (anno.values == null)
continue;
anno.values.stream().filter(o -> o instanceof String).map(o -> (String) o)
.map(s -> ignoreCase ? s.toLowerCase() : s).filter(s -> s.contains(fstr))
.forEach(s -> set.add(new Info(cn.name, mn.name, mn.desc, mn)));
}
}
} }
} }
} else { } else {
+8 -123
View File
@@ -106,7 +106,7 @@ public class Disassembler {
AtomicInteger lineFound = new AtomicInteger(-1); AtomicInteger lineFound = new AtomicInteger(-1);
StringContext ctx = new StringContext(18); StringContext ctx = new StringContext(18);
ctx.next("// #Annotations:\n"); ctx.next("// #Annotations:\n");
ctx.next(doAnnotations(classNode.visibleAnnotations, hs)); ctx.next(doAnnotations(classNode.visibleAnnotations, hs, ""));
ctx.next("// #Class v:" + classNode.version + "\n"); ctx.next("// #Class v:" + classNode.version + "\n");
if (classNode.signature != null) if (classNode.signature != null)
ctx.next("// #Signature: " + UnicodeUtils.escapeWithSpaces(hs, classNode.signature) + "\n"); ctx.next("// #Signature: " + UnicodeUtils.escapeWithSpaces(hs, classNode.signature) + "\n");
@@ -165,12 +165,12 @@ public class Disassembler {
} }
} }
private static String doAnnotations(List<AnnotationNode> annotations, HugeStrings hs) { private static String doAnnotations(List<AnnotationNode> annotations, HugeStrings hs, String linePrefix) {
if (annotations == null) if (annotations == null)
return ""; return "";
StringContext ctx = new StringContext(annotations.size()); StringContext ctx = new StringContext(annotations.size());
for (AnnotationNode annotationNode : annotations) { for (AnnotationNode annotationNode : annotations) {
String s = "@" + UnicodeUtils.escapeWithSpaces(hs, annotationNode.desc); String s = linePrefix + "@" + UnicodeUtils.escapeWithSpaces(hs, annotationNode.desc);
if (annotationNode.values != null && !annotationNode.values.isEmpty()) { if (annotationNode.values != null && !annotationNode.values.isEmpty()) {
s += " ("; s += " (";
boolean valBefore = true; boolean valBefore = true;
@@ -213,7 +213,7 @@ public class Disassembler {
s += ", "; s += ", ";
} }
s = s.substring(0, s.length() - 2); s = s.substring(0, s.length() - 2);
s += " }]"; s += " }], ";
} else if (o instanceof String) { } else if (o instanceof String) {
s += "\"" + UnicodeUtils.escapeWithSpaces(hs, (String) o) + "\"], "; s += "\"" + UnicodeUtils.escapeWithSpaces(hs, (String) o) + "\"], ";
} else { } else {
@@ -249,66 +249,8 @@ public class Disassembler {
String[] dis = disassembleMethod(className, mn, hs); String[] dis = disassembleMethod(className, mn, hs);
ms += dis[2]; ms += dis[2];
ms += dis[1]; ms += dis[1];
if (mn.visibleAnnotations != null && !mn.visibleAnnotations.isEmpty()) { if (mn.visibleAnnotations != null && !mn.visibleAnnotations.isEmpty())
for (AnnotationNode annotationNode : mn.visibleAnnotations) { ms += doAnnotations(mn.visibleAnnotations, hs, "\t");
ms += "\t@" + annotationNode.desc;
if (annotationNode.values != null && !annotationNode.values.isEmpty()) {
ms += " (";
boolean valBefore = true;
for (Object o : annotationNode.values) {
if (valBefore) {
ms += o + " = [";
valBefore = false;
continue;
} else {
if (o instanceof String[]) {
String[] arr = (String[]) o;
boolean w8ing = false;
for (String rofl : arr) {
if (!w8ing) {
ms += UnicodeUtils.escapeWithSpaces(hs, rofl) + "/";
w8ing = true;
} else {
ms += UnicodeUtils.escapeWithSpaces(hs, rofl) + "]";
}
}
ms += ", ";
} else if (o instanceof List) {
List list = (List) o;
ms += "{ ";
for (Object obj : list) {
if (obj instanceof String[]) {
String[] arr = (String[]) obj;
boolean w8ing = false;
for (String rofl : arr) {
if (!w8ing) {
ms += UnicodeUtils.escapeWithSpaces(hs, rofl) + "/";
w8ing = true;
} else {
ms += UnicodeUtils.escapeWithSpaces(hs, rofl);
}
}
} else {
ms += "\"" + UnicodeUtils.escape(hs, String.valueOf(obj))
+ "\"";
}
ms += ", ";
}
ms = ms.substring(0, ms.length() - 2);
ms += " }]";
} else {
ms += "(" + o.getClass().getName().replace(".", "/") + ") " + o + "], ";
}
valBefore = true;
}
}
if (ms.endsWith(", "))
ms = ms.substring(0, ms.length() - 2);
ms += ")";
}
ms += "\n";
}
}
if (mn.equals(nodeToFind)) { if (mn.equals(nodeToFind)) {
lineFound.set(ms.split("\\n").length); lineFound.set(ms.split("\\n").length);
} }
@@ -359,65 +301,8 @@ public class Disassembler {
String s = ""; String s = "";
if (fn.signature != null) if (fn.signature != null)
s += "\t// #Signature: " + UnicodeUtils.escapeWithSpaces(hs, fn.signature) + "\n"; s += "\t// #Signature: " + UnicodeUtils.escapeWithSpaces(hs, fn.signature) + "\n";
if (fn.visibleAnnotations != null && !fn.visibleAnnotations.isEmpty()) { if (fn.visibleAnnotations != null && !fn.visibleAnnotations.isEmpty())
for (AnnotationNode annotationNode : fn.visibleAnnotations) { s += doAnnotations(fn.visibleAnnotations, hs, "\t");
s += "\t@" + UnicodeUtils.escapeWithSpaces(hs, annotationNode.desc);
if (annotationNode.values != null && !annotationNode.values.isEmpty()) {
s += " (";
boolean valBefore = true;
for (Object o : annotationNode.values) {
if (valBefore) {
s += o + " = [";
valBefore = false;
continue;
} else {
if (o instanceof String[]) {
String[] arr = (String[]) o;
boolean w8ing = false;
for (String rofl : arr) {
if (!w8ing) {
s += UnicodeUtils.escapeWithSpaces(hs, rofl) + "/";
w8ing = true;
} else {
s += UnicodeUtils.escapeWithSpaces(hs, rofl) + "]";
}
}
s += ", ";
} else if (o instanceof List) {
List list = (List) o;
s += "{ ";
for (Object obj : list) {
if (obj instanceof String[]) {
String[] arr = (String[]) obj;
boolean w8ing = false;
for (String rofl : arr) {
if (!w8ing) {
s += UnicodeUtils.escapeWithSpaces(hs, rofl) + "/";
w8ing = true;
} else {
s += UnicodeUtils.escapeWithSpaces(hs, rofl);
}
}
} else {
s += "\"" + UnicodeUtils.escape(hs, String.valueOf(obj)) + "\"";
}
s += ", ";
}
s = s.substring(0, s.length() - 2);
s += " }]";
} else {
s += "(" + o.getClass().getName().replace(".", "/") + ") " + o + "], ";
}
valBefore = true;
}
}
if (s.endsWith(", "))
s = s.substring(0, s.length() - 2);
s += ")";
}
s += "\n";
}
}
if (fn.equals(nodeToFind)) { if (fn.equals(nodeToFind)) {
lineFound.set(s.split("\\n").length); lineFound.set(s.split("\\n").length);
} }
+14 -12
View File
@@ -33,12 +33,12 @@ import java.util.Enumeration;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.JarOutputStream;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
import javax.swing.ButtonGroup; import javax.swing.ButtonGroup;
import javax.swing.JCheckBoxMenuItem; import javax.swing.JCheckBoxMenuItem;
@@ -311,7 +311,7 @@ public class Main extends JFrame {
new Thread(new Runnable() { new Thread(new Runnable() {
public void run() { public void run() {
try { try {
ArchiveTreeModel model = new ArchiveTreeModel(new JarFile(jarFile)); ArchiveTreeModel model = new ArchiveTreeModel(new ZipFile(jarFile));
EventQueue.invokeLater(new Runnable() { EventQueue.invokeLater(new Runnable() {
public void run() { public void run() {
synchronized (treeLock) { synchronized (treeLock) {
@@ -466,7 +466,7 @@ public class Main extends JFrame {
new Thread(new Runnable() { new Thread(new Runnable() {
public void run() { public void run() {
try { try {
ArchiveTreeModel model = new ArchiveTreeModel(new JarFile(jarFile)); ArchiveTreeModel model = new ArchiveTreeModel(new ZipFile(jarFile));
EventQueue.invokeLater(new Runnable() { EventQueue.invokeLater(new Runnable() {
public void run() { public void run() {
synchronized (treeLock) { synchronized (treeLock) {
@@ -560,7 +560,7 @@ public class Main extends JFrame {
new Thread(new Runnable() { new Thread(new Runnable() {
public void run() { public void run() {
try { try {
ArchiveTreeModel model = new ArchiveTreeModel(new JarFile(jarFile)); ArchiveTreeModel model = new ArchiveTreeModel(new ZipFile(jarFile));
EventQueue.invokeLater(new Runnable() { EventQueue.invokeLater(new Runnable() {
public void run() { public void run() {
synchronized (treeLock) { synchronized (treeLock) {
@@ -786,6 +786,8 @@ public class Main extends JFrame {
public void goToSelected() throws BadLocationException { public void goToSelected() throws BadLocationException {
int lineStart = txtByteEditView.getLineStartOffsetOfCurrentLine(); int lineStart = txtByteEditView.getLineStartOffsetOfCurrentLine();
int lineEnd = txtByteEditView.getLineEndOffsetOfCurrentLine() - 1; int lineEnd = txtByteEditView.getLineEndOffsetOfCurrentLine() - 1;
if (lineEnd < lineStart)
return;
String line = txtByteEditView.getText(lineStart, lineEnd - lineStart); String line = txtByteEditView.getText(lineStart, lineEnd - lineStart);
if (!jumpableInstructionPattern.matcher(line).matches()) { if (!jumpableInstructionPattern.matcher(line).matches()) {
return; return;
@@ -1042,7 +1044,7 @@ public class Main extends JFrame {
public void save(File jar, Collection<ClassNode> classes) { public void save(File jar, Collection<ClassNode> classes) {
try { try {
final JarOutputStream output = new JarOutputStream(new FileOutputStream(jar)); final ZipOutputStream output = new ZipOutputStream(new FileOutputStream(jar));
if (tree.getModel().getClass().equals(DefaultTreeModel.class) if (tree.getModel().getClass().equals(DefaultTreeModel.class)
|| ((ArchiveTreeModel) tree.getModel()).newCreated) { || ((ArchiveTreeModel) tree.getModel()).newCreated) {
int acc = ClassUtil.ACC_PUBLIC | ClassUtil.ACC_STATIC; int acc = ClassUtil.ACC_PUBLIC | ClassUtil.ACC_STATIC;
@@ -1067,7 +1069,7 @@ public class Main extends JFrame {
((ArchiveTreeModel) tree.getModel()).newCreated = false; ((ArchiveTreeModel) tree.getModel()).newCreated = false;
} }
for (Entry<String, byte[]> entry : OTHER_FILES.entrySet()) { for (Entry<String, byte[]> entry : OTHER_FILES.entrySet()) {
JarEntry ent = new JarEntry(entry.getKey()); ZipEntry ent = new ZipEntry(entry.getKey());
output.putNextEntry(ent); output.putNextEntry(ent);
output.write(entry.getValue()); output.write(entry.getValue());
output.closeEntry(); output.closeEntry();
@@ -1082,7 +1084,7 @@ public class Main extends JFrame {
for (ClassNode node : classes) { for (ClassNode node : classes) {
ClassWriter writer = new ClassWriter(computeFlags); ClassWriter writer = new ClassWriter(computeFlags);
node.accept(writer); node.accept(writer);
output.putNextEntry(new JarEntry(getFullName(node.name))); output.putNextEntry(new ZipEntry(getFullName(node.name)));
output.write(writer.toByteArray()); output.write(writer.toByteArray());
output.closeEntry(); output.closeEntry();
} }
@@ -1123,16 +1125,16 @@ public class Main extends JFrame {
newCreated = true; newCreated = true;
} }
public ArchiveTreeModel(JarFile jar) { public ArchiveTreeModel(ZipFile jar) {
super(new ByteEditTreeNode(jar.getName().split(File.separator.equals("\\") ? "\\\\" super(new ByteEditTreeNode(jar.getName().split(File.separator.equals("\\") ? "\\\\"
: File.separator)[jar.getName().split(File.separator.equals("\\") ? "\\\\" : File.separator).length : File.separator)[jar.getName().split(File.separator.equals("\\") ? "\\\\" : File.separator).length
- 1])); - 1]));
try { try {
classNodes.clear(); classNodes.clear();
OTHER_FILES.clear(); OTHER_FILES.clear();
Enumeration<JarEntry> enumeration = jar.entries(); Enumeration<? extends ZipEntry> enumeration = jar.entries();
while (enumeration.hasMoreElements()) { while (enumeration.hasMoreElements()) {
JarEntry next = enumeration.nextElement(); ZipEntry next = enumeration.nextElement();
byte[] data = toByteArray(jar.getInputStream(next)); byte[] data = toByteArray(jar.getInputStream(next));
if (next.getSize() != 0 && !next.getName().startsWith("META-INF") if (next.getSize() != 0 && !next.getName().startsWith("META-INF")
&& (next.getName().endsWith(".class") || next.getName().endsWith(".class/"))) { && (next.getName().endsWith(".class") || next.getName().endsWith(".class/"))) {
+1 -1
View File
@@ -12,7 +12,7 @@
<baseFont size="12"/> <baseFont size="12"/>
<!-- General editor colors. --> <!-- General editor colors. -->
<background color="ffffff"/> <background color="c0c0c0"/>
<caret color="000000"/> <caret color="000000"/>
<selection bg="dddddd" fg="000000"/> <selection bg="dddddd" fg="000000"/>
<currentLineHighlight color="dddddd" fade="false"/> <currentLineHighlight color="dddddd" fade="false"/>
+3 -3
View File
@@ -12,10 +12,10 @@
<baseFont size="12"/> <baseFont size="12"/>
<!-- General editor colors. --> <!-- General editor colors. -->
<background color="000000"/> <background color="2f2f2f"/>
<caret color="eeeeee"/> <caret color="eeeeee"/>
<selection bg="222222" fg="eeeeee"/> <selection bg="111111" fg="eeeeee"/>
<currentLineHighlight color="222222" fade="false"/> <currentLineHighlight color="111111" fade="false"/>
<marginLine fg="4f4b46"/> <marginLine fg="4f4b46"/>
<markAllHighlight color="947e76"/> <!-- TODO: Fix me --> <markAllHighlight color="947e76"/> <!-- TODO: Fix me -->
<markOccurrencesHighlight color="2b2b2b" border="false"/> <markOccurrencesHighlight color="2b2b2b" border="false"/>
+26 -34
View File
@@ -41,8 +41,7 @@ public class DocumentReader extends Reader {
/** /**
* Constructor. * Constructor.
* *
* @param document * @param document The document we're 'reading'.
* The document we're 'reading'.
*/ */
public DocumentReader(Document document) { public DocumentReader(Document document) {
position = 0; position = 0;
@@ -55,14 +54,14 @@ public class DocumentReader extends Reader {
* This currently does nothing... * This currently does nothing...
*/ */
@Override @Override
public void close() {} public void close() {
}
/** /**
* Marks the present position in the stream. Subsequent calls to * Marks the present position in the stream. Subsequent calls to
* <code>reset()</code> will reposition the stream to this point. * <code>reset()</code> will reposition the stream to this point.
* *
* @param readAheadLimit * @param readAheadLimit Ignored.
* Ignored.
*/ */
@Override @Override
public void mark(int readAheadLimit) { public void mark(int readAheadLimit) {
@@ -70,8 +69,8 @@ public class DocumentReader extends Reader {
} }
/** /**
* Tells whether this reader supports the <code>mark</code> operation. * Tells whether this reader supports the <code>mark</code> operation. This
* This always returns <code>true</code> for <code>DocumentReader</code>. * always returns <code>true</code> for <code>DocumentReader</code>.
*/ */
@Override @Override
public boolean markSupported() { public boolean markSupported() {
@@ -98,11 +97,10 @@ public class DocumentReader extends Reader {
} }
/** /**
* Read <code>array.length</code> characters from the beginning * Read <code>array.length</code> characters from the beginning of the document
* of the document into <code>array</code>. * into <code>array</code>.
* *
* @param array * @param array The array to read characters into.
* The array to read characters into.
* @return The number of characters read. * @return The number of characters read.
*/ */
@Override @Override
@@ -113,14 +111,11 @@ public class DocumentReader extends Reader {
/** /**
* Reads characters into a portion of an array. * Reads characters into a portion of an array.
* *
* @param cbuf * @param cbuf The destination buffer.
* The destination buffer. * @param off Offset at which to start storing characters.
* @param off * @param len Maximum number of characters to read.
* Offset at which to start storing characters. * @return The number of characters read, or <code>-1</code> if the end of the
* @param len * stream (document) has been reached.
* Maximum number of characters to read.
* @return The number of characters read, or <code>-1</code> if the
* end of the stream (document) has been reached.
*/ */
@Override @Override
public int read(char[] cbuf, int off, int len) { public int read(char[] cbuf, int off, int len) {
@@ -147,12 +142,11 @@ public class DocumentReader extends Reader {
} }
/** /**
* Tells whether this reader is ready to be read without * Tells whether this reader is ready to be read without blocking for input.
* blocking for input. <code>DocumentReader</code> will * <code>DocumentReader</code> will always return true.
* always return true.
* *
* @return <code>true</code> if the next read operation will * @return <code>true</code> if the next read operation will return without
* return without blocking. * blocking.
*/ */
@Override @Override
public boolean ready() { public boolean ready() {
@@ -160,9 +154,9 @@ public class DocumentReader extends Reader {
} }
/** /**
* Resets the stream. If the stream has been marked, then attempt to * Resets the stream. If the stream has been marked, then attempt to reposition
* reposition it at the mark. If the stream has not been marked, then * it at the mark. If the stream has not been marked, then move it to the
* move it to the beginning of the document. * beginning of the document.
*/ */
@Override @Override
public void reset() { public void reset() {
@@ -177,8 +171,7 @@ public class DocumentReader extends Reader {
/** /**
* Skips characters. This will not 'skip' past the end of the document. * Skips characters. This will not 'skip' past the end of the document.
* *
* @param n * @param n The number of characters to skip.
* The number of characters to skip.
* @return The number of characters actually skipped. * @return The number of characters actually skipped.
*/ */
@Override @Override
@@ -193,12 +186,11 @@ public class DocumentReader extends Reader {
} }
/** /**
* Move to the specified position in the document. If <code>pos</code> * Move to the specified position in the document. If <code>pos</code> is
* is greater than the document's length, the stream's position is moved * greater than the document's length, the stream's position is moved to the end
* to the end of the document. * of the document.
* *
* @param pos * @param pos The position in the document to move to.
* The position in the document to move to.
*/ */
public void seek(long pos) { public void seek(long pos) {
position = Math.min(pos, document.getLength()); position = Math.min(pos, document.getLength());
+34 -60
View File
@@ -30,10 +30,9 @@ import java.io.Writer;
public class UnicodeWriter extends Writer { public class UnicodeWriter extends Writer {
/** /**
* If this system property evaluates to "<code>false</code>", ignoring * If this system property evaluates to "<code>false</code>", ignoring case,
* case, files written out as UTF-8 will not have a BOM written for them. * files written out as UTF-8 will not have a BOM written for them. Otherwise
* Otherwise (even if the property is not set), UTF-8 files will have a * (even if the property is not set), UTF-8 files will have a BOM written.
* BOM written.
*/ */
public static final String PROPERTY_WRITE_UTF8_BOM = "UnicodeWriter.writeUtf8BOM"; public static final String PROPERTY_WRITE_UTF8_BOM = "UnicodeWriter.writeUtf8BOM";
/** /**
@@ -47,30 +46,24 @@ public class UnicodeWriter extends Writer {
private static final byte[] UTF32BE_BOM = new byte[] { (byte) 0x00, (byte) 0x00, (byte) 0xFE, (byte) 0xFF }; private static final byte[] UTF32BE_BOM = new byte[] { (byte) 0x00, (byte) 0x00, (byte) 0xFE, (byte) 0xFF };
/** /**
* This is a utility constructor since the vast majority of the time, this * This is a utility constructor since the vast majority of the time, this class
* class will be used to write Unicode files. * will be used to write Unicode files.
* *
* @param fileName * @param fileName The file to which to write the Unicode output.
* The file to which to write the Unicode output. * @param encoding The encoding to use.
* @param encoding * @throws IOException If an IO exception occurs.
* The encoding to use.
* @throws IOException
* If an IO exception occurs.
*/ */
public UnicodeWriter(String fileName, String encoding) throws IOException { public UnicodeWriter(String fileName, String encoding) throws IOException {
this(new FileOutputStream(fileName), encoding); this(new FileOutputStream(fileName), encoding);
} }
/** /**
* This is a utility constructor since the vast majority of the time, this * This is a utility constructor since the vast majority of the time, this class
* class will be used to write Unicode files. * will be used to write Unicode files.
* *
* @param file * @param file The file to which to write the Unicode output.
* The file to which to write the Unicode output. * @param encoding The encoding to use.
* @param encoding * @throws IOException If an IO exception occurs.
* The encoding to use.
* @throws IOException
* If an IO exception occurs.
*/ */
public UnicodeWriter(File file, String encoding) throws IOException { public UnicodeWriter(File file, String encoding) throws IOException {
this(new FileOutputStream(file), encoding); this(new FileOutputStream(file), encoding);
@@ -79,12 +72,9 @@ public class UnicodeWriter extends Writer {
/** /**
* Creates a new writer. * Creates a new writer.
* *
* @param out * @param out The output stream to write.
* The output stream to write. * @param encoding The encoding to use.
* @param encoding * @throws IOException If an IO exception occurs.
* The encoding to use.
* @throws IOException
* If an IO exception occurs.
*/ */
public UnicodeWriter(OutputStream out, String encoding) throws IOException { public UnicodeWriter(OutputStream out, String encoding) throws IOException {
init(out, encoding); init(out, encoding);
@@ -93,8 +83,7 @@ public class UnicodeWriter extends Writer {
/** /**
* Closes this writer. * Closes this writer.
* *
* @throws IOException * @throws IOException If an IO exception occurs.
* If an IO exception occurs.
*/ */
@Override @Override
public void close() throws IOException { public void close() throws IOException {
@@ -104,8 +93,7 @@ public class UnicodeWriter extends Writer {
/** /**
* Flushes the stream. * Flushes the stream.
* *
* @throws IOException * @throws IOException If an IO exception occurs.
* If an IO exception occurs.
*/ */
@Override @Override
public void flush() throws IOException { public void flush() throws IOException {
@@ -139,15 +127,12 @@ public class UnicodeWriter extends Writer {
} }
/** /**
* Initializes the internal output stream and writes the BOM if the * Initializes the internal output stream and writes the BOM if the specified
* specified encoding is a Unicode encoding. * encoding is a Unicode encoding.
* *
* @param out * @param out The output stream we are writing.
* The output stream we are writing. * @param encoding The encoding in which to write.
* @param encoding * @throws IOException If an I/O error occurs while writing a BOM.
* The encoding in which to write.
* @throws IOException
* If an I/O error occurs while writing a BOM.
*/ */
private void init(OutputStream out, String encoding) throws IOException { private void init(OutputStream out, String encoding) throws IOException {
internalOut = new OutputStreamWriter(out, encoding); internalOut = new OutputStreamWriter(out, encoding);
@@ -173,8 +158,7 @@ public class UnicodeWriter extends Writer {
/** /**
* Sets whether UTF-8 files should have a BOM written in them. * Sets whether UTF-8 files should have a BOM written in them.
* *
* @param write * @param write Whether to write a BOM.
* Whether to write a BOM.
* @see #getWriteUtf8BOM() * @see #getWriteUtf8BOM()
* @see UnicodeWriter * @see UnicodeWriter
*/ */
@@ -185,14 +169,10 @@ public class UnicodeWriter extends Writer {
/** /**
* Writes a portion of an array of characters. * Writes a portion of an array of characters.
* *
* @param cbuf * @param cbuf The buffer of characters.
* The buffer of characters. * @param off The offset from which to start writing characters.
* @param off * @param len The number of characters to write.
* The offset from which to start writing characters. * @throws IOException If an I/O error occurs.
* @param len
* The number of characters to write.
* @throws IOException
* If an I/O error occurs.
*/ */
@Override @Override
public void write(char[] cbuf, int off, int len) throws IOException { public void write(char[] cbuf, int off, int len) throws IOException {
@@ -202,10 +182,8 @@ public class UnicodeWriter extends Writer {
/** /**
* Writes a single character. * Writes a single character.
* *
* @param c * @param c An integer specifying the character to write.
* An integer specifying the character to write. * @throws IOException If an IO error occurs.
* @throws IOException
* If an IO error occurs.
*/ */
@Override @Override
public void write(int c) throws IOException { public void write(int c) throws IOException {
@@ -215,14 +193,10 @@ public class UnicodeWriter extends Writer {
/** /**
* Writes a portion of a string. * Writes a portion of a string.
* *
* @param str * @param str The string from which to write.
* The string from which to write. * @param off The offset from which to start writing characters.
* @param off * @param len The number of characters to write.
* The offset from which to start writing characters. * @throws IOException If an IO error occurs.
* @param len
* The number of characters to write.
* @throws IOException
* If an IO error occurs.
*/ */
@Override @Override
public void write(String str, int off, int len) throws IOException { public void write(String str, int off, int len) throws IOException {
+56 -79
View File
@@ -55,24 +55,18 @@ public abstract class RPrintUtilities {
/** /**
* Returns the position closest to, but before, position * Returns the position closest to, but before, position
* <code>maxCharsPerLine</code> in * <code>maxCharsPerLine</code> in <code>line</code> of one of the chars in
* <code>line</code> of one of the chars in <code>breakChars</code>, or * <code>breakChars</code>, or simply returns <code>maxCharsPerLine-1</code> if
* simply returns * none of the <code>breakChars</code> comes before that position. This position
* <code>maxCharsPerLine-1</code> if none of the <code>breakChars</code> * represents the logical line break for this <code>java.lang.String</code> if
* comes before * it is being printed in a monospaced font when lines can only be
* that position. This position represents the logical line break for this * <code>maxCharsPerLine</code> characters long.
* <code>java.lang.String</code>
* if it is being printed in a monospaced font when lines can only be
* <code>maxCharsPerLine</code>
* characters long.
* *
* @param line * @param line The text being printed.
* The text being printed. * @param maxCharsPerLine Only up-to this many characters from <code>line</code>
* @param maxCharsPerLine * can be printed on one line.
* Only up-to this many characters from * @return The logical position at which to stop printing <code>line</code> to
* <code>line</code> can be printed on one line. * simulate word wrap.
* @return The logical position at which to stop printing <code>line</code>
* to simulate word wrap.
*/ */
private static int getLineBreakPoint(String line, final int maxCharsPerLine) { private static int getLineBreakPoint(String line, final int maxCharsPerLine) {
int breakPoint = -1; int breakPoint = -1;
@@ -87,27 +81,20 @@ public abstract class RPrintUtilities {
/** /**
* Prints a <code>Document</code> using a monospaced font, and does no word * Prints a <code>Document</code> using a monospaced font, and does no word
* wrapping (ie, * wrapping (ie, words will wrap mid-word to the next line). This method is
* words will wrap mid-word to the next line). This method is expected to be * expected to be called from Printable 'print(Graphics g)' functions.
* called from
* Printable 'print(Graphics g)' functions.
* *
* @param g * @param g The graphics context to write to.
* The graphics context to write to. * @param doc The <code>javax.swing.text.Document</code> to print.
* @param doc * @param fontSize the point size to use for the monospaced font.
* The <code>javax.swing.text.Document</code> to print. * @param pageIndex The page number to print.
* @param fontSize * @param pageFormat The format to print the page with.
* the point size to use for the monospaced font. * @param tabSize The number of spaces to expand tabs to.
* @param pageIndex
* The page number to print.
* @param pageFormat
* The format to print the page with.
* @param tabSize
* The number of spaces to expand tabs to.
* *
* @see #printDocumentMonospacedWordWrap * @see #printDocumentMonospacedWordWrap
*/ */
public static int printDocumentMonospaced(Graphics g, Document doc, int fontSize, int pageIndex, PageFormat pageFormat, int tabSize) { public static int printDocumentMonospaced(Graphics g, Document doc, int fontSize, int pageIndex,
PageFormat pageFormat, int tabSize) {
g.setColor(Color.BLACK); g.setColor(Color.BLACK);
g.setFont(new Font("Monospaced", Font.PLAIN, fontSize)); g.setFont(new Font("Monospaced", Font.PLAIN, fontSize));
// Initialize our static variables (these are used by our tab expander // Initialize our static variables (these are used by our tab expander
@@ -204,27 +191,21 @@ public abstract class RPrintUtilities {
} }
/** /**
* Prints a <code>Document</code> using a monospaced font, word wrapping on * Prints a <code>Document</code> using a monospaced font, word wrapping on the
* the characters ' ', '\t', '\n', ',', '.', and ';'. This method is * characters ' ', '\t', '\n', ',', '.', and ';'. This method is expected to be
* expected to be called from Printable 'print(Graphics g)' functions. * called from Printable 'print(Graphics g)' functions.
* *
* @param g * @param g The graphics context to write to.
* The graphics context to write to. * @param doc The <code>javax.swing.text.Document</code> to print.
* @param doc * @param fontSize the point size to use for the monospaced font.
* The <code>javax.swing.text.Document</code> to print. * @param pageIndex The page number to print.
* @param fontSize * @param pageFormat The format to print the page with.
* the point size to use for the monospaced font. * @param tabSize The number of spaces to expand tabs to.
* @param pageIndex
* The page number to print.
* @param pageFormat
* The format to print the page with.
* @param tabSize
* The number of spaces to expand tabs to.
* *
* @see #printDocumentMonospaced * @see #printDocumentMonospaced
*/ */
public static int printDocumentMonospacedWordWrap(Graphics g, Document doc, int fontSize, int pageIndex, PageFormat pageFormat, public static int printDocumentMonospacedWordWrap(Graphics g, Document doc, int fontSize, int pageIndex,
int tabSize) { PageFormat pageFormat, int tabSize) {
g.setColor(Color.BLACK); g.setColor(Color.BLACK);
g.setFont(new Font("Monospaced", Font.PLAIN, fontSize)); g.setFont(new Font("Monospaced", Font.PLAIN, fontSize));
// Initialize our static variables (these are used by our tab expander // Initialize our static variables (these are used by our tab expander
@@ -322,28 +303,22 @@ public abstract class RPrintUtilities {
} }
/** /**
* Prints a <code>Document</code> using the specified font, word wrapping * Prints a <code>Document</code> using the specified font, word wrapping on the
* on the characters ' ', '\t', '\n', ',', '.', and ';'. This method is * characters ' ', '\t', '\n', ',', '.', and ';'. This method is expected to be
* expected to be called from Printable 'print(Graphics g)' functions. * called from Printable 'print(Graphics g)' functions.
* *
* @param g * @param g The graphics context to write to.
* The graphics context to write to. * @param textComponent The <code>javax.swing.text.JTextComponent</code> whose
* @param textComponent * text you're printing.
* The <code>javax.swing.text.JTextComponent</code> * @param font The font to use for printing. If <code>null</code>, then
* whose text you're printing. * <code>textComponent</code>'s font is used.
* @param font * @param pageIndex The page number to print.
* The font to use for printing. If <code>null</code>, then * @param pageFormat The format to print the page with.
* <code>textComponent</code>'s font is used. * @param tabSize The number of spaces to convert tabs to.
* @param pageIndex
* The page number to print.
* @param pageFormat
* The format to print the page with.
* @param tabSize
* The number of spaces to convert tabs to.
* *
*/ */
public static int printDocumentWordWrap(Graphics g, JTextComponent textComponent, Font font, int pageIndex, PageFormat pageFormat, public static int printDocumentWordWrap(Graphics g, JTextComponent textComponent, Font font, int pageIndex,
int tabSize) { PageFormat pageFormat, int tabSize) {
// Initialize our graphics object. // Initialize our graphics object.
g.setColor(Color.BLACK); g.setColor(Color.BLACK);
g.setFont(font != null ? font : textComponent.getFont()); g.setFont(font != null ? font : textComponent.getFont());
@@ -389,7 +364,8 @@ public abstract class RPrintUtilities {
// we'd start after the part // we'd start after the part
// that has already been printed). // that has already been printed).
try { try {
doc.getText(currentLineStart + startingOffset, currentLineEnd - (currentLineStart + startingOffset), currentLineSeg); doc.getText(currentLineStart + startingOffset, currentLineEnd - (currentLineStart + startingOffset),
currentLineSeg);
} catch (BadLocationException ble) { } catch (BadLocationException ble) {
System.err.println("BadLocationException in print (where there shouldn't be one!): " + ble); System.err.println("BadLocationException in print (where there shouldn't be one!): " + ble);
return Printable.NO_SUCH_PAGE; return Printable.NO_SUCH_PAGE;
@@ -452,7 +428,8 @@ public abstract class RPrintUtilities {
System.err.println(ble); System.err.println(ble);
return Printable.NO_SUCH_PAGE; return Printable.NO_SUCH_PAGE;
} }
currentLineLengthInPixels = Utilities.getTabbedTextWidth(currentLineSeg, fm, 0, tabExpander, 0); currentLineLengthInPixels = Utilities.getTabbedTextWidth(currentLineSeg, fm, 0, tabExpander,
0);
} while (currentLineLengthInPixels <= lineLengthInPixels); } while (currentLineLengthInPixels <= lineLengthInPixels);
currentPos--; currentPos--;
} }
@@ -460,8 +437,8 @@ public abstract class RPrintUtilities {
doc.getText((currentLineStart + startingOffset), currentPos, currentLineSeg); doc.getText((currentLineStart + startingOffset), currentPos, currentLineSeg);
} catch (BadLocationException ble) { } catch (BadLocationException ble) {
System.err.println("BadLocationException in print (a):"); System.err.println("BadLocationException in print (a):");
System.err.println("==> currentLineStart: " + currentLineStart + "; startingOffset: " + startingOffset System.err.println("==> currentLineStart: " + currentLineStart + "; startingOffset: "
+ "; currentPos: " + currentPos); + startingOffset + "; currentPos: " + currentPos);
System.err.println("==> Range: " + (currentLineStart + startingOffset) + " - " System.err.println("==> Range: " + (currentLineStart + startingOffset) + " - "
+ (currentLineStart + startingOffset + currentPos)); + (currentLineStart + startingOffset + currentPos));
ble.printStackTrace(); ble.printStackTrace();
@@ -495,8 +472,7 @@ public abstract class RPrintUtilities {
/** /**
* Removes any spaces or tabs from the end of the segment. * Removes any spaces or tabs from the end of the segment.
* *
* @param segment * @param segment The segment from which to remove tailing whitespace.
* The segment from which to remove tailing whitespace.
* @return <code>segment</code> with trailing whitespace removed. * @return <code>segment</code> with trailing whitespace removed.
*/ */
private static Segment removeEndingWhitespace(Segment segment) { private static Segment removeEndingWhitespace(Segment segment) {
@@ -512,12 +488,13 @@ public abstract class RPrintUtilities {
} }
/** /**
* A tab expander for the document currently being printed with the * A tab expander for the document currently being printed with the font being
* font being used for the printing. * used for the printing.
*/ */
private static class RPrintTabExpander implements TabExpander { private static class RPrintTabExpander implements TabExpander {
RPrintTabExpander() {} RPrintTabExpander() {
}
@Override @Override
public float nextTabStop(float x, int tabOffset) { public float nextTabStop(float x, int tabOffset) {
@@ -17,11 +17,11 @@ import javax.swing.text.JTextComponent;
* lexicographically (ignoring case). * lexicographically (ignoring case).
* <p> * <p>
* *
* This implementation assumes the input text and replacement text are the * This implementation assumes the input text and replacement text are the same
* same value. It also returns the input text from its {@link #toString()} * value. It also returns the input text from its {@link #toString()} method
* method (which is what <code>DefaultListCellRenderer</code> uses to render * (which is what <code>DefaultListCellRenderer</code> uses to render objects).
* objects). Subclasses that wish to override any of this behavior can simply * Subclasses that wish to override any of this behavior can simply override the
* override the corresponding method(s) needed to do so. * corresponding method(s) needed to do so.
* *
* @author Robert Futrell * @author Robert Futrell
* @version 1.0 * @version 1.0
@@ -38,17 +38,16 @@ public abstract class AbstractCompletion implements Completion {
private Icon icon; private Icon icon;
/** /**
* The relevance of this completion. Completion instances with higher * The relevance of this completion. Completion instances with higher
* "relevance" values are inserted higher into the list of possible * "relevance" values are inserted higher into the list of possible completions
* completions than those with lower values. Completion instances with * than those with lower values. Completion instances with equal relevance
* equal relevance values are sorted alphabetically. * values are sorted alphabetically.
*/ */
private int relevance; private int relevance;
/** /**
* Constructor. * Constructor.
* *
* @param provider * @param provider The provider that created this completion.
* The provider that created this completion.
*/ */
protected AbstractCompletion(CompletionProvider provider) { protected AbstractCompletion(CompletionProvider provider) {
this.provider = provider; this.provider = provider;
@@ -57,10 +56,8 @@ public abstract class AbstractCompletion implements Completion {
/** /**
* Constructor. * Constructor.
* *
* @param provider * @param provider The provider that created this completion.
* The provider that created this completion. * @param icon The icon for this completion.
* @param icon
* The icon for this completion.
*/ */
protected AbstractCompletion(CompletionProvider provider, Icon icon) { protected AbstractCompletion(CompletionProvider provider, Icon icon) {
this(provider); this(provider);
@@ -97,8 +94,8 @@ public abstract class AbstractCompletion implements Completion {
} }
/** /**
* Returns the text the user has to (start) typing for this completion * Returns the text the user has to (start) typing for this completion to be
* to be offered. The default implementation simply returns * offered. The default implementation simply returns
* {@link #getReplacementText()}. * {@link #getReplacementText()}.
* *
* @return The text the user has to (start) typing for this completion. * @return The text the user has to (start) typing for this completion.
@@ -126,8 +123,8 @@ public abstract class AbstractCompletion implements Completion {
} }
/** /**
* The default implementation returns <code>null</code>. Subclasses * The default implementation returns <code>null</code>. Subclasses can override
* can override this method. * this method.
* *
* @return The tool tip text. * @return The tool tip text.
*/ */
@@ -139,8 +136,7 @@ public abstract class AbstractCompletion implements Completion {
/** /**
* Sets the icon to use for this completion. * Sets the icon to use for this completion.
* *
* @param icon * @param icon The icon to use.
* The icon to use.
* @see #getIcon() * @see #getIcon()
*/ */
public void setIcon(Icon icon) { public void setIcon(Icon icon) {
@@ -150,8 +146,7 @@ public abstract class AbstractCompletion implements Completion {
/** /**
* Sets the relevance of this completion. * Sets the relevance of this completion.
* *
* @param relevance * @param relevance The new relevance of this completion.
* The new relevance of this completion.
* @see #getRelevance() * @see #getRelevance()
*/ */
public void setRelevance(int relevance) { public void setRelevance(int relevance) {
@@ -43,8 +43,8 @@ import javax.swing.event.HyperlinkListener;
import org.fife.ui.rsyntaxtextarea.PopupWindowDecorator; import org.fife.ui.rsyntaxtextarea.PopupWindowDecorator;
/** /**
* The optional "description" window that describes the currently selected * The optional "description" window that describes the currently selected item
* item in the auto-completion window. * in the auto-completion window.
* *
* @author Robert Futrell * @author Robert Futrell
* @version 1.0 * @version 1.0
@@ -89,9 +89,8 @@ class AutoCompleteDescWindow extends JWindow implements HyperlinkListener, DescW
private int historyPos; private int historyPos;
/** /**
* Provides a slight delay between asking to set a description and actually * Provides a slight delay between asking to set a description and actually
* displaying it, so that if the user is scrolling quickly through * displaying it, so that if the user is scrolling quickly through completions,
* completions, those with slow-to-calculate summaries won't bog down the * those with slow-to-calculate summaries won't bog down the scrolling.
* scrolling.
*/ */
private Timer timer; private Timer timer;
/** /**
@@ -103,10 +102,9 @@ class AutoCompleteDescWindow extends JWindow implements HyperlinkListener, DescW
*/ */
private ResourceBundle bundle; private ResourceBundle bundle;
/** /**
* The amount of time to wait after the user changes the selected * The amount of time to wait after the user changes the selected completion to
* completion to refresh the description. This delay is in place to help * refresh the description. This delay is in place to help performance for
* performance for {@link Completion}s that may be slow to compute their * {@link Completion}s that may be slow to compute their summary text.
* summary text.
*/ */
private static final int INITIAL_TIMER_DELAY = 120; private static final int INITIAL_TIMER_DELAY = 120;
/** /**
@@ -117,10 +115,8 @@ class AutoCompleteDescWindow extends JWindow implements HyperlinkListener, DescW
/** /**
* Constructor. * Constructor.
* *
* @param owner * @param owner The parent window.
* The parent window. * @param ac The parent auto-completion.
* @param ac
* The parent auto-completion.
*/ */
public AutoCompleteDescWindow(Window owner, AutoCompletion ac) { public AutoCompleteDescWindow(Window owner, AutoCompletion ac) {
super(owner); super(owner);
@@ -183,8 +179,7 @@ class AutoCompleteDescWindow extends JWindow implements HyperlinkListener, DescW
/** /**
* Sets the currently displayed description and updates the history. * Sets the currently displayed description and updates the history.
* *
* @param historyItem * @param historyItem The item to add to the history.
* The item to add to the history.
*/ */
private void addToHistory(HistoryEntry historyItem) { private void addToHistory(HistoryEntry historyItem) {
history.add(++historyPos, historyItem); history.add(++historyPos, historyItem);
@@ -214,8 +209,8 @@ class AutoCompleteDescWindow extends JWindow implements HyperlinkListener, DescW
} }
/** /**
* Copies from the description text area, if it is visible and there is * Copies from the description text area, if it is visible and there is a
* a selection. * selection.
* *
* @return Whether a copy occurred. * @return Whether a copy occurred.
*/ */
@@ -230,8 +225,7 @@ class AutoCompleteDescWindow extends JWindow implements HyperlinkListener, DescW
/** /**
* Returns the localized message for the specified key. * Returns the localized message for the specified key.
* *
* @param key * @param key The key.
* The key.
* @return The localized message. * @return The localized message.
*/ */
private String getString(String key) { private String getString(String key) {
@@ -244,8 +238,7 @@ class AutoCompleteDescWindow extends JWindow implements HyperlinkListener, DescW
/** /**
* Called when a hyperlink is clicked. * Called when a hyperlink is clicked.
* *
* @param e * @param e The event.
* The event.
*/ */
@Override @Override
public void hyperlinkUpdate(HyperlinkEvent e) { public void hyperlinkUpdate(HyperlinkEvent e) {
@@ -261,7 +254,8 @@ class AutoCompleteDescWindow extends JWindow implements HyperlinkListener, DescW
URL newUrl = redirector.possiblyRedirect(url); URL newUrl = redirector.possiblyRedirect(url);
if (newUrl != null && newUrl != url) { if (newUrl != null && newUrl != url) {
url = newUrl; url = newUrl;
e = new HyperlinkEvent(e.getSource(), e.getEventType(), newUrl, e.getDescription(), e.getSourceElement()); e = new HyperlinkEvent(e.getSource(), e.getEventType(), newUrl, e.getDescription(),
e.getSourceElement());
} }
} }
} }
@@ -325,11 +319,9 @@ class AutoCompleteDescWindow extends JWindow implements HyperlinkListener, DescW
} }
/** /**
* Sets the description displayed in this window. This clears the * Sets the description displayed in this window. This clears the history.
* history.
* *
* @param item * @param item The item whose description you want to display.
* The item whose description you want to display.
*/ */
public void setDescriptionFor(Completion item) { public void setDescriptionFor(Completion item) {
setDescriptionFor(item, false); setDescriptionFor(item, false);
@@ -338,11 +330,9 @@ class AutoCompleteDescWindow extends JWindow implements HyperlinkListener, DescW
/** /**
* Sets the description displayed in this window. * Sets the description displayed in this window.
* *
* @param item * @param item The item whose description you want to display.
* The item whose description you want to display. * @param addToHistory Whether to add this page to the page history (as opposed
* @param addToHistory * to clearing it and starting anew).
* Whether to add this page to the page history
* (as opposed to clearing it and starting anew).
*/ */
protected void setDescriptionFor(Completion item, boolean addToHistory) { protected void setDescriptionFor(Completion item, boolean addToHistory) {
setDescriptionFor(item, null, addToHistory); setDescriptionFor(item, null, addToHistory);
@@ -351,12 +341,10 @@ class AutoCompleteDescWindow extends JWindow implements HyperlinkListener, DescW
/** /**
* Sets the description displayed in this window. * Sets the description displayed in this window.
* *
* @param item * @param item The item whose description you want to display.
* The item whose description you want to display.
* @parma anchor The anchor to jump to, or <code>null</code> if none. * @parma anchor The anchor to jump to, or <code>null</code> if none.
* @param addToHistory * @param addToHistory Whether to add this page to the page history (as opposed
* Whether to add this page to the page history * to clearing it and starting anew).
* (as opposed to clearing it and starting anew).
*/ */
protected void setDescriptionFor(Completion item, String anchor, boolean addToHistory) { protected void setDescriptionFor(Completion item, String anchor, boolean addToHistory) {
timer.stop(); timer.stop();
@@ -403,11 +391,9 @@ class AutoCompleteDescWindow extends JWindow implements HyperlinkListener, DescW
/** /**
* Callback for custom <code>ExternalURLHandler</code>s. * Callback for custom <code>ExternalURLHandler</code>s.
* *
* @param completion * @param completion The completion to display.
* The completion to display. * @param anchor The anchor in the HTML to jump to, or <code>null</code> if
* @param anchor * none.
* The anchor in the HTML to jump to, or <code>null</code>
* if none.
*/ */
@Override @Override
public void showSummaryFor(Completion completion, String anchor) { public void showSummaryFor(Completion completion, String anchor) {
@@ -442,8 +428,8 @@ class AutoCompleteDescWindow extends JWindow implements HyperlinkListener, DescW
} }
/** /**
* Overridden to display a short name for the completion, since it's * Overridden to display a short name for the completion, since it's used in the
* used in the tool tips for the "back" and "forward" buttons. * tool tips for the "back" and "forward" buttons.
* *
* @return A string representation of this history entry. * @return A string representation of this history entry.
*/ */
@@ -43,10 +43,9 @@ import org.fife.ui.rsyntaxtextarea.PopupWindowDecorator;
/** /**
* The actual popup window of choices. When visible, this window intercepts * The actual popup window of choices. When visible, this window intercepts
* certain keystrokes in the parent text component and uses them to navigate * certain keystrokes in the parent text component and uses them to navigate the
* the completion choices instead. If Enter or Escape is pressed, the window * completion choices instead. If Enter or Escape is pressed, the window hides
* hides itself and notifies the {@link AutoCompletion} to insert the selected * itself and notifies the {@link AutoCompletion} to insert the selected text.
* text.
* *
* @author Robert Futrell * @author Robert Futrell
* @version 1.0 * @version 1.0
@@ -66,27 +65,26 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener, ListSele
*/ */
private CompletionListModel model; private CompletionListModel model;
/** /**
* A hack to work around the fact that we clear our completion model (and * A hack to work around the fact that we clear our completion model (and our
* our selection) when hiding the completion window. This allows us to * selection) when hiding the completion window. This allows us to still know
* still know what the user selected after the popup is hidden. * what the user selected after the popup is hidden.
*/ */
private Completion lastSelection; private Completion lastSelection;
/** /**
* Optional popup window containing a description of the currently * Optional popup window containing a description of the currently selected
* selected completion. * completion.
*/ */
private AutoCompleteDescWindow descWindow; private AutoCompleteDescWindow descWindow;
/** /**
* The preferred size of the optional description window. This field * The preferred size of the optional description window. This field only exists
* only exists because the user may (and usually will) set the size of * because the user may (and usually will) set the size of the description
* the description window before it exists (it must be parented to a * window before it exists (it must be parented to a Window).
* Window).
*/ */
private Dimension preferredDescWindowSize; private Dimension preferredDescWindowSize;
/** /**
* Whether the completion window and the optional description window * Whether the completion window and the optional description window should be
* should be displayed above the current caret position (as opposed to * displayed above the current caret position (as opposed to underneath it,
* underneath it, which is preferred unless there is not enough space). * which is preferred unless there is not enough space).
*/ */
private boolean aboveCaret; private boolean aboveCaret;
private int lastLine; private int lastLine;
@@ -103,7 +101,8 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener, ListSele
private KeyActionPair pageUpKap; private KeyActionPair pageUpKap;
private KeyActionPair pageDownKap; private KeyActionPair pageDownKap;
private KeyActionPair ctrlCKap; private KeyActionPair ctrlCKap;
private KeyActionPair oldEscape, oldUp, oldDown, oldLeft, oldRight, oldEnter, oldTab, oldHome, oldEnd, oldPageUp, oldPageDown, oldCtrlC; private KeyActionPair oldEscape, oldUp, oldDown, oldLeft, oldRight, oldEnter, oldTab, oldHome, oldEnd, oldPageUp,
oldPageDown, oldCtrlC;
/** /**
* The space between the caret and the completion popup. * The space between the caret and the completion popup.
*/ */
@@ -116,10 +115,8 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener, ListSele
/** /**
* Constructor. * Constructor.
* *
* @param parent * @param parent The parent window (hosting the text component).
* The parent window (hosting the text component). * @param ac The auto-completion instance.
* @param ac
* The auto-completion instance.
*/ */
public AutoCompletePopupWindow(Window parent, final AutoCompletion ac) { public AutoCompletePopupWindow(Window parent, final AutoCompletion ac) {
super(parent); super(parent);
@@ -131,7 +128,8 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener, ListSele
list.addListSelectionListener(this); list.addListSelectionListener(this);
list.addMouseListener(this); list.addMouseListener(this);
JPanel contentPane = new JPanel(new BorderLayout()); JPanel contentPane = new JPanel(new BorderLayout());
JScrollPane sp = new JScrollPane(list, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); JScrollPane sp = new JScrollPane(list, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
// In 1.4, JScrollPane.setCorner() has a bug where it won't accept // In 1.4, JScrollPane.setCorner() has a bug where it won't accept
// JScrollPane.LOWER_TRAILING_CORNER, even though that constant is // JScrollPane.LOWER_TRAILING_CORNER, even though that constant is
// defined. So we have to put the logic added in 1.5 to handle it // defined. So we have to put the logic added in 1.5 to handle it
@@ -188,8 +186,8 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener, ListSele
} }
/** /**
* Creates the mappings from keys to Actions we'll be putting into the * Creates the mappings from keys to Actions we'll be putting into the text
* text component's ActionMap and InputMap. * component's ActionMap and InputMap.
*/ */
private void createKeyActionPairs() { private void createKeyActionPairs() {
// Actions we'll install. // Actions we'll install.
@@ -237,8 +235,8 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener, ListSele
} }
/** /**
* Returns the default list cell renderer used when a completion provider * Returns the default list cell renderer used when a completion provider does
* does not supply its own. * not supply its own.
* *
* @return The default list cell renderer. * @return The default list cell renderer.
* @see #setListCellRenderer(ListCellRenderer) * @see #setListCellRenderer(ListCellRenderer)
@@ -268,8 +266,7 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener, ListSele
} }
/** /**
* Registers keyboard actions to listen for in the text component and * Registers keyboard actions to listen for in the text component and intercept.
* intercept.
* *
* @see #uninstallKeyBindings() * @see #uninstallKeyBindings()
*/ */
@@ -322,21 +319,25 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener, ListSele
} }
@Override @Override
public void mouseEntered(MouseEvent e) {} public void mouseEntered(MouseEvent e) {
}
@Override @Override
public void mouseExited(MouseEvent e) {} public void mouseExited(MouseEvent e) {
}
@Override @Override
public void mousePressed(MouseEvent e) {} public void mousePressed(MouseEvent e) {
}
@Override @Override
public void mouseReleased(MouseEvent e) {} public void mouseReleased(MouseEvent e) {
}
/** /**
* Positions the description window relative to the completion choices * Positions the description window relative to the completion choices window.
* window. We assume there is room on one side of the other for this * We assume there is room on one side of the other for this entire window to
* entire window to fit. * fit.
*/ */
private void positionDescWindow() { private void positionDescWindow() {
boolean showDescWindow = descWindow != null && ac.getShowDescWindow(); boolean showDescWindow = descWindow != null && ac.getShowDescWindow();
@@ -374,19 +375,14 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener, ListSele
} }
/** /**
* "Puts back" the original key/Action pair for a keystroke. This is used * "Puts back" the original key/Action pair for a keystroke. This is used when
* when this popup is hidden. * this popup is hidden.
* *
* @param im * @param im The input map.
* The input map. * @param am The action map.
* @param am * @param key The keystroke whose key/Action pair to change.
* The action map. * @param kap The (original) key/Action pair.
* @param key * @see #replaceAction(InputMap, ActionMap, int, KeyActionPair, KeyActionPair)
* The keystroke whose key/Action pair to change.
* @param kap
* The (original) key/Action pair.
* @see #replaceAction(InputMap, ActionMap, int, KeyActionPair,
* KeyActionPair)
*/ */
private void putBackAction(InputMap im, ActionMap am, int key, KeyActionPair kap) { private void putBackAction(InputMap im, ActionMap am, int key, KeyActionPair kap) {
KeyStroke ks = KeyStroke.getKeyStroke(key, 0); KeyStroke ks = KeyStroke.getKeyStroke(key, 0);
@@ -395,19 +391,13 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener, ListSele
} }
/** /**
* Replaces a key/Action pair in an InputMap and ActionMap with a new * Replaces a key/Action pair in an InputMap and ActionMap with a new pair.
* pair.
* *
* @param im * @param im The input map.
* The input map. * @param am The action map.
* @param am * @param key The keystroke whose information to replace.
* The action map. * @param kap The new key/Action pair for <code>key</code>.
* @param key * @param old A buffer in which to place the old key/Action pair.
* The keystroke whose information to replace.
* @param kap
* The new key/Action pair for <code>key</code>.
* @param old
* A buffer in which to place the old key/Action pair.
* @see #putBackAction(InputMap, ActionMap, int, KeyActionPair) * @see #putBackAction(InputMap, ActionMap, int, KeyActionPair)
*/ */
private void replaceAction(InputMap im, ActionMap am, int key, KeyActionPair kap, KeyActionPair old) { private void replaceAction(InputMap im, ActionMap am, int key, KeyActionPair kap, KeyActionPair old) {
@@ -458,8 +448,7 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener, ListSele
} }
/** /**
* Selects the completion item one "page down" from the currently selected * Selects the completion item one "page down" from the currently selected one.
* one.
* *
* @see #selectPageUpItem() * @see #selectPageUpItem()
*/ */
@@ -471,8 +460,7 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener, ListSele
} }
/** /**
* Selects the completion item one "page up" from the currently selected * Selects the completion item one "page up" from the currently selected one.
* one.
* *
* @see #selectPageDownItem() * @see #selectPageDownItem()
*/ */
@@ -491,29 +479,28 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener, ListSele
private void selectPreviousItem() { private void selectPreviousItem() {
int index = list.getSelectedIndex(); int index = list.getSelectedIndex();
switch (index) { switch (index) {
case 0: case 0:
index = list.getModel().getSize() - 1; index = list.getModel().getSize() - 1;
break; break;
case -1: // Check for an empty list (would be an error) case -1: // Check for an empty list (would be an error)
index = list.getModel().getSize() - 1; index = list.getModel().getSize() - 1;
if (index == -1) { if (index == -1) {
return; return;
} }
break; break;
default: default:
index = index - 1; index = index - 1;
break; break;
} }
list.setSelectedIndex(index); list.setSelectedIndex(index);
list.ensureIndexIsVisible(index); list.ensureIndexIsVisible(index);
} }
/** /**
* Sets the completions to display in the choices list. The first * Sets the completions to display in the choices list. The first completion is
* completion is selected. * selected.
* *
* @param completions * @param completions The completions to display.
* The completions to display.
*/ */
public void setCompletions(List<Completion> completions) { public void setCompletions(List<Completion> completions) {
model.setContents(completions); model.setContents(completions);
@@ -523,8 +510,7 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener, ListSele
/** /**
* Sets the size of the description window. * Sets the size of the description window.
* *
* @param size * @param size The new size. This cannot be <code>null</code>.
* The new size. This cannot be <code>null</code>.
*/ */
public void setDescriptionWindowSize(Dimension size) { public void setDescriptionWindowSize(Dimension size) {
if (descWindow != null) { if (descWindow != null) {
@@ -535,12 +521,11 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener, ListSele
} }
/** /**
* Sets the default list cell renderer to use when a completion provider * Sets the default list cell renderer to use when a completion provider does
* does not supply its own. * not supply its own.
* *
* @param renderer * @param renderer The renderer to use. If this is <code>null</code>, a default
* The renderer to use. If this is <code>null</code>, * renderer is used.
* a default renderer is used.
* @see #getListCellRenderer() * @see #getListCellRenderer()
*/ */
public void setListCellRenderer(ListCellRenderer renderer) { public void setListCellRenderer(ListCellRenderer renderer) {
@@ -550,11 +535,10 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener, ListSele
/** /**
* Sets the location of this window to be "good" relative to the specified * Sets the location of this window to be "good" relative to the specified
* rectangle. That rectangle should be the location of the text * rectangle. That rectangle should be the location of the text component's
* component's caret, in screen coordinates. * caret, in screen coordinates.
* *
* @param r * @param r The text component's caret position, in screen coordinates.
* The text component's caret position, in screen coordinates.
*/ */
public void setLocationRelativeTo(Rectangle r) { public void setLocationRelativeTo(Rectangle r) {
// Multi-monitor support - make sure the completion window (and // Multi-monitor support - make sure the completion window (and
@@ -600,8 +584,7 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener, ListSele
/** /**
* Toggles the visibility of this popup window. * Toggles the visibility of this popup window.
* *
* @param visible * @param visible Whether this window should be visible.
* Whether this window should be visible.
*/ */
@Override @Override
public void setVisible(boolean visible) { public void setVisible(boolean visible) {
@@ -685,8 +668,7 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener, ListSele
} }
/** /**
* Updates the <tt>LookAndFeel</tt> of this window and the description * Updates the <tt>LookAndFeel</tt> of this window and the description window.
* window.
*/ */
public void updateUI() { public void updateUI() {
SwingUtilities.updateComponentTreeUI(this); SwingUtilities.updateComponentTreeUI(this);
@@ -698,8 +680,7 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener, ListSele
/** /**
* Called when a new item is selected in the popup list. * Called when a new item is selected in the popup list.
* *
* @param e * @param e The event.
* The event.
*/ */
@Override @Override
public void valueChanged(ListSelectionEvent e) { public void valueChanged(ListSelectionEvent e) {
@@ -784,7 +765,8 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener, ListSele
public Object key; public Object key;
public Action action; public Action action;
public KeyActionPair() {} public KeyActionPair() {
}
public KeyActionPair(Object key, Action a) { public KeyActionPair(Object key, Action a) {
this.key = key; this.key = key;
+161 -201
View File
@@ -49,8 +49,8 @@ import javax.swing.text.Element;
import javax.swing.text.JTextComponent; import javax.swing.text.JTextComponent;
/** /**
* Adds auto-completion to a text component. Provides a popup window with a * Adds auto-completion to a text component. Provides a popup window with a list
* list of auto-complete choices on a given keystroke, such as Crtrl+Space. * of auto-complete choices on a given keystroke, such as Crtrl+Space.
* <p> * <p>
* *
* Depending on the {@link CompletionProvider} installed, the following * Depending on the {@link CompletionProvider} installed, the following
@@ -58,14 +58,14 @@ import javax.swing.text.JTextComponent;
* *
* <ul> * <ul>
* <li>An auto-complete choices list made visible via e.g. Ctrl+Space</li> * <li>An auto-complete choices list made visible via e.g. Ctrl+Space</li>
* <li>A "description" window displayed alongside the choices list that * <li>A "description" window displayed alongside the choices list that provides
* provides documentation on the currently selected completion choice * documentation on the currently selected completion choice (as seen in Eclipse
* (as seen in Eclipse and NetBeans).</li> * and NetBeans).</li>
* <li>Parameter assistance. If this is enabled, if the user enters a * <li>Parameter assistance. If this is enabled, if the user enters a
* "parameterized" completion, such as a method or a function, then they * "parameterized" completion, such as a method or a function, then they will
* will receive a tool tip describing the arguments they have to enter to * receive a tool tip describing the arguments they have to enter to the
* the completion. Also, the arguments can be navigated via tab and * completion. Also, the arguments can be navigated via tab and shift+tab (a la
* shift+tab (a la Eclipse and NetBeans).</li> * Eclipse and NetBeans).</li>
* </ul> * </ul>
* *
* @author Robert Futrell * @author Robert Futrell
@@ -93,14 +93,14 @@ public class AutoCompletion {
private AutoCompletePopupWindow popupWindow; private AutoCompletePopupWindow popupWindow;
/** /**
* The preferred size of the completion choices window. This field exists * The preferred size of the completion choices window. This field exists
* because the user will likely set the preferred size of the window before * because the user will likely set the preferred size of the window before it
* it is actually created. * is actually created.
*/ */
private Dimension preferredChoicesWindowSize; private Dimension preferredChoicesWindowSize;
/** /**
* The preferred size of the optional description window. This field only * The preferred size of the optional description window. This field only exists
* exists because the user may (and usually will) set the size of the * because the user may (and usually will) set the size of the description
* description window before it exists (it must be parented to a Window). * window before it exists (it must be parented to a Window).
*/ */
private Dimension preferredDescWindowSize; private Dimension preferredDescWindowSize;
/** /**
@@ -112,13 +112,12 @@ public class AutoCompletion {
*/ */
private CompletionProvider provider; private CompletionProvider provider;
/** /**
* The renderer to use for the completion choices. If this is * The renderer to use for the completion choices. If this is <code>null</code>,
* <code>null</code>, then a default renderer is used. * then a default renderer is used.
*/ */
private ListCellRenderer renderer; private ListCellRenderer renderer;
/** /**
* The handler to use when an external URL is clicked in the help * The handler to use when an external URL is clicked in the help documentation.
* documentation.
*/ */
private ExternalURLHandler externalURLHandler; private ExternalURLHandler externalURLHandler;
/** /**
@@ -127,8 +126,8 @@ public class AutoCompletion {
*/ */
private static LinkRedirector linkRedirector; private static LinkRedirector linkRedirector;
/** /**
* Whether the description window should be displayed along with the * Whether the description window should be displayed along with the completion
* completion choice window. * choice window.
*/ */
private boolean showDescWindow; private boolean showDescWindow;
/** /**
@@ -136,14 +135,14 @@ public class AutoCompletion {
*/ */
private boolean autoCompleteEnabled; private boolean autoCompleteEnabled;
/** /**
* Whether the auto-activation of auto-complete (after a delay, after the * Whether the auto-activation of auto-complete (after a delay, after the user
* user types an appropriate character) is enabled. * types an appropriate character) is enabled.
*/ */
private boolean autoActivationEnabled; private boolean autoActivationEnabled;
/** /**
* Whether or not, when there is only a single auto-complete option that * Whether or not, when there is only a single auto-complete option that matches
* matches the text at the current text position, that text should be * the text at the current text position, that text should be auto-inserted,
* auto-inserted, instead of the completion window displaying. * instead of the completion window displaying.
*/ */
private boolean autoCompleteSingleChoices; private boolean autoCompleteSingleChoices;
/** /**
@@ -166,8 +165,8 @@ public class AutoCompletion {
*/ */
private Object oldTriggerKey; private Object oldTriggerKey;
/** /**
* The action previously assigned to {@link #trigger}, so we can reset it if * The action previously assigned to {@link #trigger}, so we can reset it if the
* the user disables auto-completion. * user disables auto-completion.
*/ */
private Action oldTriggerAction; private Action oldTriggerAction;
/** /**
@@ -186,8 +185,8 @@ public class AutoCompletion {
*/ */
private ParentWindowListener parentWindowListener; private ParentWindowListener parentWindowListener;
/** /**
* Listens for events from the text component that affect the visibility of * Listens for events from the text component that affect the visibility of the
* the popup windows. * popup windows.
*/ */
private TextComponentListener textComponentListener; private TextComponentListener textComponentListener;
/** /**
@@ -210,14 +209,14 @@ public class AutoCompletion {
private EventListenerList listeners; private EventListenerList listeners;
/** /**
* Whether or not the popup should be hidden when user types a space (or any * Whether or not the popup should be hidden when user types a space (or any
* character that resets the completion list to "all completions"). Defaults * character that resets the completion list to "all completions"). Defaults to
* to true. * true.
*/ */
private boolean hideOnNoText; private boolean hideOnNoText;
/** /**
* Whether or not the popup should be hidden when the CompletionProvider * Whether or not the popup should be hidden when the CompletionProvider
* changes. If set to false, caller has to ensure refresh of the popup * changes. If set to false, caller has to ensure refresh of the popup content.
* content. Defaults to true. * Defaults to true.
*/ */
private boolean hideOnCompletionProviderChange; private boolean hideOnCompletionProviderChange;
/** /**
@@ -229,21 +228,18 @@ public class AutoCompletion {
*/ */
private static final String PARAM_COMPLETE_KEY = "AutoCompletion.FunctionStart"; private static final String PARAM_COMPLETE_KEY = "AutoCompletion.FunctionStart";
/** /**
* Stores how to render auto-completion-specific highlights in text * Stores how to render auto-completion-specific highlights in text components.
* components.
*/ */
private static final AutoCompletionStyleContext styleContext = new AutoCompletionStyleContext(); private static final AutoCompletionStyleContext styleContext = new AutoCompletionStyleContext();
/** /**
* Whether debug messages should be printed to stdout as AutoCompletion * Whether debug messages should be printed to stdout as AutoCompletion runs.
* runs.
*/ */
private static final boolean DEBUG = initDebug(); private static final boolean DEBUG = initDebug();
/** /**
* Constructor. * Constructor.
* *
* @param provider * @param provider The completion provider. This cannot be <code>null</code>
* The completion provider. This cannot be <code>null</code>
*/ */
public AutoCompletion(CompletionProvider provider) { public AutoCompletion(CompletionProvider provider) {
setChoicesWindowSize(350, 200); setChoicesWindowSize(350, 200);
@@ -267,8 +263,7 @@ public class AutoCompletion {
/** /**
* Adds a listener interested in popup window events from this instance. * Adds a listener interested in popup window events from this instance.
* *
* @param l * @param l The listener to add.
* The listener to add.
* @see #removeAutoCompletionListener(AutoCompletionListener) * @see #removeAutoCompletionListener(AutoCompletionListener)
*/ */
public void addAutoCompletionListener(AutoCompletionListener l) { public void addAutoCompletionListener(AutoCompletionListener l) {
@@ -286,8 +281,7 @@ public class AutoCompletion {
/** /**
* Fires an {@link AutoCompletionEvent} of the specified type. * Fires an {@link AutoCompletionEvent} of the specified type.
* *
* @param type * @param type The type of event to fire.
* The type of event to fire.
*/ */
protected void fireAutoCompletionEvent(AutoCompletionEvent.Type type) { protected void fireAutoCompletionEvent(AutoCompletionEvent.Type type) {
// Guaranteed to return a non-null array // Guaranteed to return a non-null array
@@ -306,8 +300,8 @@ public class AutoCompletion {
} }
/** /**
* Returns the delay between when the user types a character and when the * Returns the delay between when the user types a character and when the code
* code completion popup should automatically appear (if applicable). * completion popup should automatically appear (if applicable).
* *
* @return The delay, in milliseconds. * @return The delay, in milliseconds.
* @see #setAutoActivationDelay(int) * @see #setAutoActivationDelay(int)
@@ -317,8 +311,8 @@ public class AutoCompletion {
} }
/** /**
* Returns whether, if a single auto-complete choice is available, it should * Returns whether, if a single auto-complete choice is available, it should be
* be automatically inserted, without displaying the popup menu. * automatically inserted, without displaying the popup menu.
* *
* @return Whether to auto-complete single choices. * @return Whether to auto-complete single choices.
* @see #setAutoCompleteSingleChoices(boolean) * @see #setAutoCompleteSingleChoices(boolean)
@@ -346,8 +340,8 @@ public class AutoCompletion {
} }
/** /**
* Returns the default auto-complete "trigger key" for this OS. For Windows, * Returns the default auto-complete "trigger key" for this OS. For Windows, for
* for example, it is Ctrl+Space. * example, it is Ctrl+Space.
* *
* @return The default auto-complete trigger key. * @return The default auto-complete trigger key.
*/ */
@@ -358,8 +352,8 @@ public class AutoCompletion {
} }
/** /**
* Returns the handler to use when an external URL is clicked in the * Returns the handler to use when an external URL is clicked in the description
* description window. * window.
* *
* @return The handler. * @return The handler.
* @see #setExternalURLHandler(ExternalURLHandler) * @see #setExternalURLHandler(ExternalURLHandler)
@@ -386,8 +380,8 @@ public class AutoCompletion {
} }
/** /**
* Returns the default list cell renderer used when a completion provider * Returns the default list cell renderer used when a completion provider does
* does not supply its own. * not supply its own.
* *
* @return The default list cell renderer. * @return The default list cell renderer.
* @see #setListCellRenderer(ListCellRenderer) * @see #setListCellRenderer(ListCellRenderer)
@@ -397,10 +391,10 @@ public class AutoCompletion {
} }
/** /**
* Returns the renderer to use for {@link Completion}s in the optional * Returns the renderer to use for {@link Completion}s in the optional parameter
* parameter choices popup window (displayed when a * choices popup window (displayed when a {@link ParameterizedCompletion} is
* {@link ParameterizedCompletion} is code-completed). If this returns * code-completed). If this returns <code>null</code>, a default renderer is
* <code>null</code>, a default renderer is used. * used.
* *
* @return The renderer to use. * @return The renderer to use.
* @see #setParamChoicesRenderer(ListCellRenderer) * @see #setParamChoicesRenderer(ListCellRenderer)
@@ -417,14 +411,10 @@ public class AutoCompletion {
* <tt>c.getReplacementText()</tt>. You usually will not need to modify this * <tt>c.getReplacementText()</tt>. You usually will not need to modify this
* method. * method.
* *
* @param c * @param c The completion being inserted.
* The completion being inserted. * @param doc The document being modified.
* @param doc * @param start The start of the text being replaced.
* The document being modified. * @param len The length of the text being replaced.
* @param start
* The start of the text being replaced.
* @param len
* The length of the text being replaced.
* @return The text to replace with. * @return The text to replace with.
*/ */
protected String getReplacementText(Completion c, Document doc, int start, int len) { protected String getReplacementText(Completion c, Document doc, int start, int len) {
@@ -443,8 +433,8 @@ public class AutoCompletion {
} }
/** /**
* Returns the style context describing how auto-completion related * Returns the style context describing how auto-completion related highlights
* highlights in the editor are rendered. * in the editor are rendered.
* *
* @return The style context. * @return The style context.
*/ */
@@ -466,8 +456,8 @@ public class AutoCompletion {
/** /**
* Returns the orientation of the text component we're installed to. * Returns the orientation of the text component we're installed to.
* *
* @return The orientation of the text component, or <code>null</code> if we * @return The orientation of the text component, or <code>null</code> if we are
* are not installed on one. * not installed on one.
*/ */
ComponentOrientation getTextComponentOrientation() { ComponentOrientation getTextComponentOrientation() {
return textComponent == null ? null : textComponent.getComponentOrientation(); return textComponent == null ? null : textComponent.getComponentOrientation();
@@ -525,8 +515,8 @@ public class AutoCompletion {
} }
/** /**
* Determines whether debug should be enabled for the AutoCompletion * Determines whether debug should be enabled for the AutoCompletion library.
* library. This method checks a system property, but takes care of * This method checks a system property, but takes care of
* {@link SecurityException}s in case we're in an applet or WebStart. * {@link SecurityException}s in case we're in an applet or WebStart.
* *
* @return Whether debug should be enabled. * @return Whether debug should be enabled.
@@ -545,8 +535,7 @@ public class AutoCompletion {
* Inserts a completion. Any time a code completion event occurs, the actual * Inserts a completion. Any time a code completion event occurs, the actual
* text insertion happens through this method. * text insertion happens through this method.
* *
* @param c * @param c A completion to insert. This cannot be <code>null</code>.
* A completion to insert. This cannot be <code>null</code>.
*/ */
protected final void insertCompletion(Completion c) { protected final void insertCompletion(Completion c) {
insertCompletion(c, false); insertCompletion(c, false);
@@ -556,11 +545,11 @@ public class AutoCompletion {
* Inserts a completion. Any time a code completion event occurs, the actual * Inserts a completion. Any time a code completion event occurs, the actual
* text insertion happens through this method. * text insertion happens through this method.
* *
* @param c * @param c A completion to insert. This cannot be
* A completion to insert. This cannot be <code>null</code>. * <code>null</code>.
* @param typedParamListStartChar * @param typedParamListStartChar Whether the parameterized completion start
* Whether the parameterized completion start * character was typed (typically
* character was typed (typically <code>'('</code>). * <code>'('</code>).
*/ */
protected void insertCompletion(Completion c, boolean typedParamListStartChar) { protected void insertCompletion(Completion c, boolean typedParamListStartChar) {
JTextComponent textComp = getTextComponent(); JTextComponent textComp = getTextComponent();
@@ -582,11 +571,10 @@ public class AutoCompletion {
/** /**
* Installs this auto-completion on a text component. If this * Installs this auto-completion on a text component. If this
* {@link AutoCompletion} is already installed on another text component, * {@link AutoCompletion} is already installed on another text component, it is
* it is uninstalled first. * uninstalled first.
* *
* @param c * @param c The text component.
* The text component.
* @see #uninstall() * @see #uninstall()
*/ */
public void install(JTextComponent c) { public void install(JTextComponent c) {
@@ -624,8 +612,7 @@ public class AutoCompletion {
/** /**
* Installs a "trigger key" action onto the current text component. * Installs a "trigger key" action onto the current text component.
* *
* @param ks * @param ks The keystroke that should trigger the action.
* The keystroke that should trigger the action.
* @see #uninstallTriggerKey() * @see #uninstallTriggerKey()
*/ */
private void installTriggerKey(KeyStroke ks) { private void installTriggerKey(KeyStroke ks) {
@@ -639,9 +626,9 @@ public class AutoCompletion {
/** /**
* Creates and returns the action to call when the user presses the * Creates and returns the action to call when the user presses the
* auto-completion trigger key (e.g. ctrl+space). This is a hook for * auto-completion trigger key (e.g. ctrl+space). This is a hook for subclasses
* subclasses that want to provide their own behavior in this scenario. * that want to provide their own behavior in this scenario. The default
* The default implementation returns an {@link AutoCompleteAction}. * implementation returns an {@link AutoCompleteAction}.
* *
* @return The action to use. * @return The action to use.
* @see AutoCompleteAction * @see AutoCompleteAction
@@ -651,10 +638,10 @@ public class AutoCompletion {
} }
/** /**
* Returns whether auto-activation is enabled (that is, whether the * Returns whether auto-activation is enabled (that is, whether the completion
* completion popup will automatically appear after a delay when the user * popup will automatically appear after a delay when the user types an
* types an appropriate character). Note that this parameter will be ignored * appropriate character). Note that this parameter will be ignored if
* if auto-completion is disabled. * auto-completion is disabled.
* *
* @return Whether auto-activation is enabled. * @return Whether auto-activation is enabled.
* @see #setAutoActivationEnabled(boolean) * @see #setAutoActivationEnabled(boolean)
@@ -677,8 +664,7 @@ public class AutoCompletion {
/** /**
* Whether or not the popup should be hidden when the CompletionProvider * Whether or not the popup should be hidden when the CompletionProvider
* changes. If set to false, caller has to ensure refresh of the popup * changes. If set to false, caller has to ensure refresh of the popup content.
* content.
* *
* @return Whether the popup should be hidden when the completion provider * @return Whether the popup should be hidden when the completion provider
* changes. * changes.
@@ -689,11 +675,11 @@ public class AutoCompletion {
} }
/** /**
* Whether or not the popup should be hidden when user types a space (or * Whether or not the popup should be hidden when user types a space (or any
* any character that resets the completion list to "all completions"). * character that resets the completion list to "all completions").
* *
* @return Whether the popup should be hidden when the completion list is * @return Whether the popup should be hidden when the completion list is reset
* reset to show all completions. * to show all completions.
* @see #setHideOnNoText(boolean) * @see #setHideOnNoText(boolean)
*/ */
protected boolean isHideOnNoText() { protected boolean isHideOnNoText() {
@@ -720,12 +706,12 @@ public class AutoCompletion {
} }
/** /**
* Refreshes the popup window. First, this method gets the possible * Refreshes the popup window. First, this method gets the possible completions
* completions for the current caret position. If there are none, and the * for the current caret position. If there are none, and the popup is visible,
* popup is visible, it is hidden. If there are some completions and the * it is hidden. If there are some completions and the popup is hidden, it is
* popup is hidden, it is made visible and made to display the completions. * made visible and made to display the completions. If there are some
* If there are some completions and the popup is visible, its list is * completions and the popup is visible, its list is updated to the current set
* updated to the current set of completions. * of completions.
* *
* @return The current line number of the caret. * @return The current line number of the caret.
*/ */
@@ -749,7 +735,8 @@ public class AutoCompletion {
final List<Completion> completions = provider.getCompletions(textComponent); final List<Completion> completions = provider.getCompletions(textComponent);
int count = completions == null ? 0 : completions.size(); int count = completions == null ? 0 : completions.size();
if (count > 1 || (count == 1 && (isPopupVisible() || text.equals(completions.get(0).getInputText()))) if (count > 1 || (count == 1 && (isPopupVisible() || text.equals(completions.get(0).getInputText())))
|| (count == 1 && (isPopupVisible() || textLen == 0)) || (count == 1 && !getAutoCompleteSingleChoices())) { || (count == 1 && (isPopupVisible() || textLen == 0))
|| (count == 1 && !getAutoCompleteSingleChoices())) {
if (popupWindow == null) { if (popupWindow == null) {
popupWindow = new AutoCompletePopupWindow(parentWindow, this); popupWindow = new AutoCompletePopupWindow(parentWindow, this);
popupWindowListener.install(popupWindow); popupWindowListener.install(popupWindow);
@@ -800,8 +787,7 @@ public class AutoCompletion {
/** /**
* Removes a listener interested in popup window events from this instance. * Removes a listener interested in popup window events from this instance.
* *
* @param l * @param l The listener to remove.
* The listener to remove.
* @see #addAutoCompletionListener(AutoCompletionListener) * @see #addAutoCompletionListener(AutoCompletionListener)
*/ */
public void removeAutoCompletionListener(AutoCompletionListener l) { public void removeAutoCompletionListener(AutoCompletionListener l) {
@@ -812,8 +798,7 @@ public class AutoCompletion {
* Sets the delay between when the user types a character and when the code * Sets the delay between when the user types a character and when the code
* completion popup should automatically appear (if applicable). * completion popup should automatically appear (if applicable).
* *
* @param ms * @param ms The delay, in milliseconds. This should be greater than zero.
* The delay, in milliseconds. This should be greater than zero.
* @see #getAutoActivationDelay() * @see #getAutoActivationDelay()
*/ */
public void setAutoActivationDelay(int ms) { public void setAutoActivationDelay(int ms) {
@@ -823,11 +808,10 @@ public class AutoCompletion {
} }
/** /**
* Toggles whether auto-activation is enabled. Note that auto-activation * Toggles whether auto-activation is enabled. Note that auto-activation also
* also depends on auto-completion itself being enabled. * depends on auto-completion itself being enabled.
* *
* @param enabled * @param enabled Whether auto-activation is enabled.
* Whether auto-activation is enabled.
* @see #isAutoActivationEnabled() * @see #isAutoActivationEnabled()
* @see #setAutoActivationDelay(int) * @see #setAutoActivationDelay(int)
*/ */
@@ -847,8 +831,7 @@ public class AutoCompletion {
/** /**
* Sets whether auto-completion is enabled. * Sets whether auto-completion is enabled.
* *
* @param enabled * @param enabled Whether auto-completion is enabled.
* Whether auto-completion is enabled.
* @see #isAutoCompleteEnabled() * @see #isAutoCompleteEnabled()
*/ */
public void setAutoCompleteEnabled(boolean enabled) { public void setAutoCompleteEnabled(boolean enabled) {
@@ -862,8 +845,7 @@ public class AutoCompletion {
* Sets whether, if a single auto-complete choice is available, it should be * Sets whether, if a single auto-complete choice is available, it should be
* automatically inserted, without displaying the popup menu. * automatically inserted, without displaying the popup menu.
* *
* @param autoComplete * @param autoComplete Whether to auto-complete single choices.
* Whether to auto-complete single choices.
* @see #getAutoCompleteSingleChoices() * @see #getAutoCompleteSingleChoices()
*/ */
public void setAutoCompleteSingleChoices(boolean autoComplete) { public void setAutoCompleteSingleChoices(boolean autoComplete) {
@@ -873,12 +855,10 @@ public class AutoCompletion {
/** /**
* Sets the completion provider being used. * Sets the completion provider being used.
* *
* @param provider * @param provider The new completion provider. This cannot be
* The new completion provider. This cannot be * <code>null</code>.
* <code>null</code>. * @throws IllegalArgumentException If <code>provider</code> is
* @throws IllegalArgumentException * <code>null</code>.
* If <code>provider</code> is
* <code>null</code>.
*/ */
public void setCompletionProvider(CompletionProvider provider) { public void setCompletionProvider(CompletionProvider provider) {
if (provider == null) { if (provider == null) {
@@ -893,10 +873,8 @@ public class AutoCompletion {
/** /**
* Sets the size of the completion choices window. * Sets the size of the completion choices window.
* *
* @param w * @param w The new width.
* The new width. * @param h The new height.
* @param h
* The new height.
* @see #setDescriptionWindowSize(int, int) * @see #setDescriptionWindowSize(int, int)
*/ */
public void setChoicesWindowSize(int w, int h) { public void setChoicesWindowSize(int w, int h) {
@@ -909,10 +887,8 @@ public class AutoCompletion {
/** /**
* Sets the size of the description window. * Sets the size of the description window.
* *
* @param w * @param w The new width.
* The new width. * @param h The new height.
* @param h
* The new height.
* @see #setChoicesWindowSize(int, int) * @see #setChoicesWindowSize(int, int)
*/ */
public void setDescriptionWindowSize(int w, int h) { public void setDescriptionWindowSize(int w, int h) {
@@ -923,15 +899,14 @@ public class AutoCompletion {
} }
/** /**
* Sets the handler to use when an external URL is clicked in the * Sets the handler to use when an external URL is clicked in the description
* description window. This handler can perform some action, such as open * window. This handler can perform some action, such as open the URL in a web
* the URL in a web browser. The default implementation will open the URL in * browser. The default implementation will open the URL in a browser, but only
* a browser, but only if running in Java 6. If you want browser support for * if running in Java 6. If you want browser support for Java 5 and below, or
* Java 5 and below, or otherwise want to respond to hyperlink clicks, you * otherwise want to respond to hyperlink clicks, you will have to install your
* will have to install your own handler to do so. * own handler to do so.
* *
* @param handler * @param handler The new handler.
* The new handler.
* @see #getExternalURLHandler() * @see #getExternalURLHandler()
*/ */
public void setExternalURLHandler(ExternalURLHandler handler) { public void setExternalURLHandler(ExternalURLHandler handler) {
@@ -939,13 +914,11 @@ public class AutoCompletion {
} }
/** /**
* Sets whether or not the popup should be hidden when the * Sets whether or not the popup should be hidden when the CompletionProvider
* CompletionProvider changes. If set to false, caller has to ensure refresh * changes. If set to false, caller has to ensure refresh of the popup content.
* of the popup content.
* *
* @param hideOnCompletionProviderChange * @param hideOnCompletionProviderChange Whether the popup should be hidden when
* Whether the popup should be hidden * the completion provider changes.
* when the completion provider changes.
* @see #isHideOnCompletionProviderChange() * @see #isHideOnCompletionProviderChange()
*/ */
protected void setHideOnCompletionProviderChange(boolean hideOnCompletionProviderChange) { protected void setHideOnCompletionProviderChange(boolean hideOnCompletionProviderChange) {
@@ -953,12 +926,11 @@ public class AutoCompletion {
} }
/** /**
* Sets whether or not the popup should be hidden when user types a space * Sets whether or not the popup should be hidden when user types a space (or
* (or any character that resets the completion list to "all completions"). * any character that resets the completion list to "all completions").
* *
* @param hideOnNoText * @param hideOnNoText Whether the popup sh ould be hidden when the completion
* Whether the popup sh ould be hidden when the * list is reset to show all completions.
* completion list is reset to show all completions.
* @see #isHideOnNoText() * @see #isHideOnNoText()
*/ */
protected void setHideOnNoText(boolean hideOnNoText) { protected void setHideOnNoText(boolean hideOnNoText) {
@@ -967,12 +939,10 @@ public class AutoCompletion {
/** /**
* Sets the redirector for external URL's found in code completion * Sets the redirector for external URL's found in code completion
* documentation. When a non-local link in completion popups is clicked, * documentation. When a non-local link in completion popups is clicked, this
* this redirector is given the chance to modify the URL fetched and * redirector is given the chance to modify the URL fetched and displayed.
* displayed.
* *
* @param linkRedirector * @param linkRedirector The link redirector, or <code>null</code> for none.
* The link redirector, or <code>null</code> for none.
* @see #getLinkRedirector() * @see #getLinkRedirector()
*/ */
public static void setLinkRedirector(LinkRedirector linkRedirector) { public static void setLinkRedirector(LinkRedirector linkRedirector) {
@@ -980,12 +950,11 @@ public class AutoCompletion {
} }
/** /**
* Sets the default list cell renderer to use when a completion provider * Sets the default list cell renderer to use when a completion provider does
* does not supply its own. * not supply its own.
* *
* @param renderer * @param renderer The renderer to use. If this is <code>null</code>, a default
* The renderer to use. If this is <code>null</code>, a * renderer is used.
* default renderer is used.
* @see #getListCellRenderer() * @see #getListCellRenderer()
*/ */
public void setListCellRenderer(ListCellRenderer renderer) { public void setListCellRenderer(ListCellRenderer renderer) {
@@ -997,13 +966,11 @@ public class AutoCompletion {
} }
/** /**
* Sets the renderer to use for {@link Completion}s in the optional * Sets the renderer to use for {@link Completion}s in the optional parameter
* parameter choices popup window (displayed when a * choices popup window (displayed when a {@link ParameterizedCompletion} is
* {@link ParameterizedCompletion} is code-completed). If this isn't set, a * code-completed). If this isn't set, a default renderer is used.
* default renderer is used.
* *
* @param r * @param r The renderer to use.
* The renderer to use.
* @see #getParamChoicesRenderer() * @see #getParamChoicesRenderer()
* @see #setParameterAssistanceEnabled(boolean) * @see #setParameterAssistanceEnabled(boolean)
*/ */
@@ -1013,13 +980,12 @@ public class AutoCompletion {
/** /**
* Sets whether parameter assistance is enabled. If parameter assistance is * Sets whether parameter assistance is enabled. If parameter assistance is
* enabled, and a "parameterized" completion (such as a function or method) * enabled, and a "parameterized" completion (such as a function or method) is
* is inserted, the user will get "assistance" in inserting the parameters * inserted, the user will get "assistance" in inserting the parameters in the
* in the form of a popup window with documentation and easy tabbing through * form of a popup window with documentation and easy tabbing through the
* the arguments (as seen in Eclipse and NetBeans). * arguments (as seen in Eclipse and NetBeans).
* *
* @param enabled * @param enabled Whether parameter assistance should be enabled.
* Whether parameter assistance should be enabled.
* @see #isParameterAssistanceEnabled() * @see #isParameterAssistanceEnabled()
*/ */
public void setParameterAssistanceEnabled(boolean enabled) { public void setParameterAssistanceEnabled(boolean enabled) {
@@ -1027,11 +993,10 @@ public class AutoCompletion {
} }
/** /**
* Toggles the visibility of the auto-completion popup window. This fires * Toggles the visibility of the auto-completion popup window. This fires an
* an {@link AutoCompletionEvent} of the appropriate type. * {@link AutoCompletionEvent} of the appropriate type.
* *
* @param visible * @param visible Whether the window should be made visible or hidden.
* Whether the window should be made visible or hidden.
* @see #isPopupVisible() * @see #isPopupVisible()
*/ */
protected void setPopupVisible(boolean visible) { protected void setPopupVisible(boolean visible) {
@@ -1041,11 +1006,10 @@ public class AutoCompletion {
} }
/** /**
* Sets whether the "description window" should be shown beside the * Sets whether the "description window" should be shown beside the completion
* completion window. * window.
* *
* @param show * @param show Whether to show the description window.
* Whether to show the description window.
* @see #getShowDescWindow() * @see #getShowDescWindow()
*/ */
public void setShowDescWindow(boolean show) { public void setShowDescWindow(boolean show) {
@@ -1057,10 +1021,8 @@ public class AutoCompletion {
* Sets the keystroke that should be used to trigger the auto-complete popup * Sets the keystroke that should be used to trigger the auto-complete popup
* window. * window.
* *
* @param ks * @param ks The keystroke.
* The keystroke. * @throws IllegalArgumentException If <code>ks</code> is <code>null</code>.
* @throws IllegalArgumentException
* If <code>ks</code> is <code>null</code>.
* @see #getTriggerKey() * @see #getTriggerKey()
*/ */
public void setTriggerKey(KeyStroke ks) { public void setTriggerKey(KeyStroke ks) {
@@ -1081,11 +1043,9 @@ public class AutoCompletion {
/** /**
* Displays a "tool tip" detailing the inputs to the function just entered. * Displays a "tool tip" detailing the inputs to the function just entered.
* *
* @param pc * @param pc The completion.
* The completion. * @param typedParamListStartChar Whether the parameterized completion list
* @param typedParamListStartChar * starting character was typed.
* Whether the parameterized completion list
* starting character was typed.
*/ */
private void startParameterizedCompletionAssistance(ParameterizedCompletion pc, boolean typedParamListStartChar) { private void startParameterizedCompletionAssistance(ParameterizedCompletion pc, boolean typedParamListStartChar) {
// Get rid of the previous tool tip window, if there is one. // Get rid of the previous tool tip window, if there is one.
@@ -1159,8 +1119,7 @@ public class AutoCompletion {
/** /**
* Updates the LookAndFeel of the popup window. Applications can call this * Updates the LookAndFeel of the popup window. Applications can call this
* method as appropriate if they support changing the LookAndFeel at * method as appropriate if they support changing the LookAndFeel at runtime.
* runtime.
*/ */
private void updateUI() { private void updateUI() {
if (popupWindow != null) { if (popupWindow != null) {
@@ -1176,10 +1135,11 @@ public class AutoCompletion {
} }
/** /**
* Listens for events in the text component to auto-activate the code * Listens for events in the text component to auto-activate the code completion
* completion popup. * popup.
*/ */
private class AutoActivationListener extends FocusAdapter implements DocumentListener, CaretListener, ActionListener { private class AutoActivationListener extends FocusAdapter
implements DocumentListener, CaretListener, ActionListener {
private Timer timer; private Timer timer;
private boolean justInserted; private boolean justInserted;
@@ -1250,8 +1210,8 @@ public class AutoCompletion {
} }
/** /**
* The <code>Action</code> that displays the popup window if auto-completion * The <code>Action</code> that displays the popup window if auto-completion is
* is enabled. * enabled.
*/ */
protected class AutoCompleteAction extends AbstractAction { protected class AutoCompleteAction extends AbstractAction {
@@ -1340,7 +1300,8 @@ public class AutoCompletion {
} }
@Override @Override
public void windowGainedFocus(WindowEvent e) {} public void windowGainedFocus(WindowEvent e) {
}
@Override @Override
public void windowLostFocus(WindowEvent e) { public void windowLostFocus(WindowEvent e) {
@@ -1393,12 +1354,11 @@ public class AutoCompletion {
} }
/** /**
* Called when the component hierarchy for our text component changes. * Called when the component hierarchy for our text component changes. When the
* When the text component is added to a new {@link Window}, this method * text component is added to a new {@link Window}, this method registers
* registers listeners on that <code>Window</code>. * listeners on that <code>Window</code>.
* *
* @param e * @param e The event.
* The event.
*/ */
@Override @Override
public void hierarchyChanged(HierarchyEvent e) { public void hierarchyChanged(HierarchyEvent e) {
@@ -8,9 +8,9 @@ package org.fife.ui.autocomplete;
import java.util.EventObject; import java.util.EventObject;
/** /**
* An event fired by an instance of {@link AutoCompletion}. This can be * An event fired by an instance of {@link AutoCompletion}. This can be used by
* used by applications that wish to be notified of the auto-complete popup * applications that wish to be notified of the auto-complete popup window
* window showing and hiding. * showing and hiding.
* *
* @author Robert Futrell * @author Robert Futrell
* @version 1.0 * @version 1.0
@@ -25,11 +25,8 @@ public class AutoCompletionEvent extends EventObject {
/** /**
* Constructor. * Constructor.
* *
* @param source * @param source The <code>AutoCompletion</code> instance that fired this event.
* The <code>AutoCompletion</code> instance that fired * @param type The event type.
* this event.
* @param type
* The event type.
*/ */
public AutoCompletionEvent(AutoCompletion source, Type type) { public AutoCompletionEvent(AutoCompletion source, Type type) {
super(source); super(source);
@@ -17,11 +17,10 @@ import java.util.EventListener;
public interface AutoCompletionListener extends EventListener { public interface AutoCompletionListener extends EventListener {
/** /**
* Callback notified when a change to the <code>AutoCompletion</code>'s * Callback notified when a change to the <code>AutoCompletion</code>'s status
* status occurs. * occurs.
* *
* @param e * @param e The event.
* The event.
*/ */
void autoCompleteUpdate(AutoCompletionEvent e); void autoCompleteUpdate(AutoCompletionEvent e);
} }
@@ -22,13 +22,13 @@ public class AutoCompletionStyleContext {
*/ */
private Color parameterizedCompletionCursorPositionColor; private Color parameterizedCompletionCursorPositionColor;
/** /**
* The color used to highlight copies of editable parameters in * The color used to highlight copies of editable parameters in parameterized
* parameterized completions. * completions.
*/ */
private Color parameterCopyColor; private Color parameterCopyColor;
/** /**
* The color of the outline highlight used to denote editable parameters * The color of the outline highlight used to denote editable parameters in
* in parameterized completions. * parameterized completions.
*/ */
private Color parameterOutlineColor; private Color parameterOutlineColor;
@@ -39,8 +39,8 @@ public class AutoCompletionStyleContext {
} }
/** /**
* Returns the color of the highlight painted on copies of editable * Returns the color of the highlight painted on copies of editable parameters
* parameters in parameterized completions. * in parameterized completions.
* *
* @return The color used. * @return The color used.
* @see #setParameterCopyColor(Color) * @see #setParameterCopyColor(Color)
@@ -50,8 +50,8 @@ public class AutoCompletionStyleContext {
} }
/** /**
* Returns the color used to denote the ending caret position for * Returns the color used to denote the ending caret position for parameterized
* parameterized completions. * completions.
* *
* @return The color used. * @return The color used.
* @see #setParameterizedCompletionCursorPositionColor(Color) * @see #setParameterizedCompletionCursorPositionColor(Color)
@@ -61,8 +61,8 @@ public class AutoCompletionStyleContext {
} }
/** /**
* Returns the color of the outline highlight used to denote editable * Returns the color of the outline highlight used to denote editable parameters
* parameters in parameterized completions. * in parameterized completions.
* *
* @return The color used. * @return The color used.
* @see #setParameterOutlineColor(Color) * @see #setParameterOutlineColor(Color)
@@ -72,11 +72,10 @@ public class AutoCompletionStyleContext {
} }
/** /**
* Sets the color of the highlight painted on copies of editable * Sets the color of the highlight painted on copies of editable parameters in
* parameters in parameterized completions. * parameterized completions.
* *
* @param color * @param color The color to use.
* The color to use.
* @see #setParameterCopyColor(Color) * @see #setParameterCopyColor(Color)
*/ */
public void setParameterCopyColor(Color color) { public void setParameterCopyColor(Color color) {
@@ -84,11 +83,10 @@ public class AutoCompletionStyleContext {
} }
/** /**
* Sets the color used to denote the ending caret position for * Sets the color used to denote the ending caret position for parameterized
* parameterized completions. * completions.
* *
* @param color * @param color The color to use.
* The color to use.
* @see #getParameterizedCompletionCursorPositionColor() * @see #getParameterizedCompletionCursorPositionColor()
*/ */
public void setParameterizedCompletionCursorPositionColor(Color color) { public void setParameterizedCompletionCursorPositionColor(Color color) {
@@ -96,11 +94,10 @@ public class AutoCompletionStyleContext {
} }
/** /**
* Sets the color of the outline highlight used to denote editable * Sets the color of the outline highlight used to denote editable parameters in
* parameters in parameterized completions. * parameterized completions.
* *
* @param color * @param color The color to use.
* The color to use.
* @see #getParameterOutlineColor() * @see #getParameterOutlineColor()
*/ */
public void setParameterOutlineColor(Color color) { public void setParameterOutlineColor(Color color) {
@@ -7,9 +7,9 @@
package org.fife.ui.autocomplete; package org.fife.ui.autocomplete;
/** /**
* A straightforward {@link Completion} implementation. This implementation * A straightforward {@link Completion} implementation. This implementation can
* can be used if you have a relatively short number of static completions * be used if you have a relatively short number of static completions with no
* with no (or short) summaries. * (or short) summaries.
* <p> * <p>
* *
* This implementation uses the replacement text as the input text. It also * This implementation uses the replacement text as the input text. It also
@@ -28,10 +28,8 @@ public class BasicCompletion extends AbstractCompletion {
/** /**
* Constructor. * Constructor.
* *
* @param provider * @param provider The parent completion provider.
* The parent completion provider. * @param replacementText The text to replace.
* @param replacementText
* The text to replace.
*/ */
public BasicCompletion(CompletionProvider provider, String replacementText) { public BasicCompletion(CompletionProvider provider, String replacementText) {
this(provider, replacementText, null); this(provider, replacementText, null);
@@ -40,14 +38,11 @@ public class BasicCompletion extends AbstractCompletion {
/** /**
* Constructor. * Constructor.
* *
* @param provider * @param provider The parent completion provider.
* The parent completion provider. * @param replacementText The text to replace.
* @param replacementText * @param shortDesc A short description of the completion. This will be
* The text to replace. * displayed in the completion list. This may be
* @param shortDesc * <code>null</code>.
* A short description of the completion. This will be
* displayed in the completion list. This may be
* <code>null</code>.
*/ */
public BasicCompletion(CompletionProvider provider, String replacementText, String shortDesc) { public BasicCompletion(CompletionProvider provider, String replacementText, String shortDesc) {
this(provider, replacementText, shortDesc, null); this(provider, replacementText, shortDesc, null);
@@ -56,17 +51,13 @@ public class BasicCompletion extends AbstractCompletion {
/** /**
* Constructor. * Constructor.
* *
* @param provider * @param provider The parent completion provider.
* The parent completion provider. * @param replacementText The text to replace.
* @param replacementText * @param shortDesc A short description of the completion. This will be
* The text to replace. * displayed in the completion list. This may be
* @param shortDesc * <code>null</code>.
* A short description of the completion. This will be * @param summary The summary of this completion. This should be HTML.
* displayed in the completion list. This may be * This may be <code>null</code>.
* <code>null</code>.
* @param summary
* The summary of this completion. This should be HTML.
* This may be <code>null</code>.
*/ */
public BasicCompletion(CompletionProvider provider, String replacementText, String shortDesc, String summary) { public BasicCompletion(CompletionProvider provider, String replacementText, String shortDesc, String summary) {
super(provider); super(provider);
@@ -84,8 +75,8 @@ public class BasicCompletion extends AbstractCompletion {
} }
/** /**
* Returns the short description of this completion, usually used in * Returns the short description of this completion, usually used in the
* the completion choices list. * completion choices list.
* *
* @return The short description, or <code>null</code> if there is none. * @return The short description, or <code>null</code> if there is none.
* @see #setShortDescription(String) * @see #setShortDescription(String)
@@ -105,8 +96,7 @@ public class BasicCompletion extends AbstractCompletion {
/** /**
* Sets the short description of this completion. * Sets the short description of this completion.
* *
* @param shortDesc * @param shortDesc The short description of this completion.
* The short description of this completion.
* @see #getShortDescription() * @see #getShortDescription()
*/ */
public void setShortDescription(String shortDesc) { public void setShortDescription(String shortDesc) {
@@ -116,8 +106,7 @@ public class BasicCompletion extends AbstractCompletion {
/** /**
* Sets the summary for this completion. * Sets the summary for this completion.
* *
* @param summary * @param summary The summary for this completion.
* The summary for this completion.
* @see #getSummary() * @see #getSummary()
*/ */
public void setSummary(String summary) { public void setSummary(String summary) {
@@ -125,8 +114,8 @@ public class BasicCompletion extends AbstractCompletion {
} }
/** /**
* Returns a string representation of this completion. If the short * Returns a string representation of this completion. If the short description
* description is not <code>null</code>, this method will return: * is not <code>null</code>, this method will return:
* *
* <code>getInputText() + " - " + shortDesc</code> * <code>getInputText() + " - " + shortDesc</code>
* *
+42 -50
View File
@@ -10,20 +10,20 @@ import javax.swing.Icon;
import javax.swing.text.JTextComponent; import javax.swing.text.JTextComponent;
/** /**
* Represents a completion choice. A {@link CompletionProvider} returns lists * Represents a completion choice. A {@link CompletionProvider} returns lists of
* of objects implementing this interface. A <tt>Completion</tt> contains the * objects implementing this interface. A <tt>Completion</tt> contains the
* following information: * following information:
* *
* <ul> * <ul>
* <li>The text the user must (begin to) input for this to be a completion * <li>The text the user must (begin to) input for this to be a completion
* choice. * choice.
* <li>The text that will be filled in if the user chooses this completion. * <li>The text that will be filled in if the user chooses this completion. Note
* Note that often, this is the same as the text the user must (begin to) * that often, this is the same as the text the user must (begin to) enter, but
* enter, but this doesn't have to be the case. * this doesn't have to be the case.
* <li>Summary HTML that describes this completion. This is information that * <li>Summary HTML that describes this completion. This is information that can
* can be displayed in a helper "tooltip"-style window beside the * be displayed in a helper "tooltip"-style window beside the completion list.
* completion list. This may be <code>null</code>. It may also be * This may be <code>null</code>. It may also be lazily generated to cut down on
* lazily generated to cut down on memory usage. * memory usage.
* <li>The <tt>CompletionProvider</tt> that returned this completion. * <li>The <tt>CompletionProvider</tt> that returned this completion.
* <li>Tool tip text that can be displayed when a mouse hovers over this * <li>Tool tip text that can be displayed when a mouse hovers over this
* completion in a text component. * completion in a text component.
@@ -36,26 +36,23 @@ import javax.swing.text.JTextComponent;
public interface Completion extends Comparable<Completion> { public interface Completion extends Comparable<Completion> {
/** /**
* Compares this completion to another one lexicographically, ignoring * Compares this completion to another one lexicographically, ignoring case.
* case.
* *
* @param other * @param other Another completion instance.
* Another completion instance.
* @return How this completion compares to the other one. * @return How this completion compares to the other one.
*/ */
@Override @Override
public int compareTo(Completion other); public int compareTo(Completion other);
/** /**
* Returns the portion of this completion that has already been entered * Returns the portion of this completion that has already been entered into the
* into the text component. The match is case-insensitive. * text component. The match is case-insensitive.
* <p> * <p>
* *
* This is a convenience method for: * This is a convenience method for:
* <code>getProvider().getAlreadyEnteredText(comp)</code>. * <code>getProvider().getAlreadyEnteredText(comp)</code>.
* *
* @param comp * @param comp The text component.
* The text component.
* @return The already-entered portion of this completion. * @return The already-entered portion of this completion.
*/ */
public String getAlreadyEntered(JTextComponent comp); public String getAlreadyEntered(JTextComponent comp);
@@ -68,14 +65,14 @@ public interface Completion extends Comparable<Completion> {
public Icon getIcon(); public Icon getIcon();
/** /**
* Returns the text that the user has to (start) typing for this completion * Returns the text that the user has to (start) typing for this completion to
* to be offered. Note that this will usually be the same value as * be offered. Note that this will usually be the same value as
* {@link #getReplacementText()}, but not always (a completion could be * {@link #getReplacementText()}, but not always (a completion could be a way to
* a way to implement shorthand, for example, "<code>sysout</code>" mapping * implement shorthand, for example, "<code>sysout</code>" mapping to
* to "<code>System.out.println(</code>"). * "<code>System.out.println(</code>").
* *
* @return The text the user has to (start) typing for this completion to * @return The text the user has to (start) typing for this completion to be
* be offered. * offered.
* @see #getReplacementText() * @see #getReplacementText()
*/ */
public String getInputText(); public String getInputText();
@@ -89,25 +86,25 @@ public interface Completion extends Comparable<Completion> {
/** /**
* Returns the "relevance" of this completion. This is used when sorting * Returns the "relevance" of this completion. This is used when sorting
* completions by their relevance. It is an abstract concept that may * completions by their relevance. It is an abstract concept that may mean
* mean different things to different languages, and may depend on the * different things to different languages, and may depend on the context of the
* context of the completion. * completion.
* <p> * <p>
* *
* By default, all completions have a relevance of <code>0</code>. The * By default, all completions have a relevance of <code>0</code>. The higher
* higher the value returned by this method, the higher up in the list * the value returned by this method, the higher up in the list this completion
* this completion will be; the lower the value returned, the lower it will * will be; the lower the value returned, the lower it will be.
* be. <code>Completion</code>s with equal relevance values will be * <code>Completion</code>s with equal relevance values will be sorted
* sorted alphabetically. * alphabetically.
* *
* @return The relevance of this completion. * @return The relevance of this completion.
*/ */
public int getRelevance(); public int getRelevance();
/** /**
* Returns the text to insert as the result of this auto-completion. This * Returns the text to insert as the result of this auto-completion. This is the
* is the "complete" text, including any text that replaces what the user * "complete" text, including any text that replaces what the user has already
* has already typed. * typed.
* *
* @return The replacement text. * @return The replacement text.
* @see #getInputText() * @see #getInputText()
@@ -115,31 +112,26 @@ public interface Completion extends Comparable<Completion> {
public String getReplacementText(); public String getReplacementText();
/** /**
* Returns the description of this auto-complete choice. This can be * Returns the description of this auto-complete choice. This can be used in a
* used in a popup "description window." * popup "description window."
* *
* @return This item's description. This should be HTML. It may be * @return This item's description. This should be HTML. It may be
* <code>null</code> if there is no description for this * <code>null</code> if there is no description for this completion.
* completion.
*/ */
public String getSummary(); public String getSummary();
/** /**
* Returns the tool tip text to display for mouse hovers over this * Returns the tool tip text to display for mouse hovers over this completion.
* completion.
* <p> * <p>
* *
* Note that for this functionality to be enabled, a * Note that for this functionality to be enabled, a <tt>JTextComponent</tt>
* <tt>JTextComponent</tt> must be registered with the * must be registered with the <tt>ToolTipManager</tt>, and the text component
* <tt>ToolTipManager</tt>, and the text component must know to search * must know to search for this value. In the case of an
* for this value. In the case of an * <a href="http://fifesoft.com/rsyntaxtextarea">RSyntaxTextArea</a>, this can
* <a href="http://fifesoft.com/rsyntaxtextarea">RSyntaxTextArea</a>, this * be done with a <tt>org.fife.ui.rtextarea.ToolTipSupplier</tt> that calls into
* can be done with a <tt>org.fife.ui.rtextarea.ToolTipSupplier</tt> that
* calls into
* {@link CompletionProvider#getCompletionsAt(JTextComponent, java.awt.Point)}. * {@link CompletionProvider#getCompletionsAt(JTextComponent, java.awt.Point)}.
* *
* @return The tool tip text for this completion, or <code>null</code> if * @return The tool tip text for this completion, or <code>null</code> if none.
* none.
*/ */
public String getToolTipText(); public String getToolTipText();
} }
@@ -26,8 +26,8 @@ import javax.swing.text.View;
/** /**
* A cell renderer that adds some pizazz when rendering the standard * A cell renderer that adds some pizazz when rendering the standard
* {@link Completion} types, like Eclipse and NetBeans do. Specifically, * {@link Completion} types, like Eclipse and NetBeans do. Specifically, this
* this renderer handles: * renderer handles:
* *
* <ul> * <ul>
* <li>{@link FunctionCompletion}s</li> * <li>{@link FunctionCompletion}s</li>
@@ -43,18 +43,18 @@ import javax.swing.text.View;
public class CompletionCellRenderer extends DefaultListCellRenderer { public class CompletionCellRenderer extends DefaultListCellRenderer {
/** /**
* The alternating background color, or <code>null</code> if alternating * The alternating background color, or <code>null</code> if alternating row
* row colors should not be used. * colors should not be used.
*/ */
private static Color altBG; private static Color altBG;
/** /**
* The font to use when rendering items, or <code>null</code> if the * The font to use when rendering items, or <code>null</code> if the list's
* list's default font should be used. * default font should be used.
*/ */
private Font font; private Font font;
/** /**
* Whether to display the types of fields and return types of functions * Whether to display the types of fields and return types of functions in the
* in the completion text. * completion text.
*/ */
private boolean showTypes; private boolean showTypes;
/** /**
@@ -101,14 +101,13 @@ public class CompletionCellRenderer extends DefaultListCellRenderer {
} }
/** /**
* Constructor. This is primarily a hook for Substance, or any other * Constructor. This is primarily a hook for Substance, or any other Look and
* Look and Feel whose renderers look drastically different than standard * Feel whose renderers look drastically different than standard
* <code>DefaultListCellRenderer</code>s. Everything except for the text * <code>DefaultListCellRenderer</code>s. Everything except for the text
* rendering will be done by the delegate. In almost all scenarios, you * rendering will be done by the delegate. In almost all scenarios, you will
* will want to use the no-argument constructor instead of this one. * want to use the no-argument constructor instead of this one.
* *
* @param delegate * @param delegate The delegate renderer.
* The delegate renderer.
* @see #delegateToSubstanceRenderer() * @see #delegateToSubstanceRenderer()
*/ */
public CompletionCellRenderer(DefaultListCellRenderer delegate) { public CompletionCellRenderer(DefaultListCellRenderer delegate) {
@@ -117,8 +116,8 @@ public class CompletionCellRenderer extends DefaultListCellRenderer {
} }
/** /**
* Creates the icon to use if no icon is found for a specific completion. * Creates the icon to use if no icon is found for a specific completion. The
* The default implementation returns a 16x16 empty icon. * default implementation returns a 16x16 empty icon.
* *
* @return The icon. * @return The icon.
* @see #getEmptyIcon() * @see #getEmptyIcon()
@@ -128,8 +127,8 @@ public class CompletionCellRenderer extends DefaultListCellRenderer {
} }
/** /**
* Returns a decent "parameter" color based on the current default * Returns a decent "parameter" color based on the current default foreground
* foreground color. * color.
* *
* @return The parameter color to use. * @return The parameter color to use.
*/ */
@@ -138,8 +137,7 @@ public class CompletionCellRenderer extends DefaultListCellRenderer {
} }
/** /**
* Returns a decent "type" color based on the current default foreground * Returns a decent "type" color based on the current default foreground color.
* color.
* *
* @return The type color to use. * @return The type color to use.
*/ */
@@ -148,12 +146,11 @@ public class CompletionCellRenderer extends DefaultListCellRenderer {
} }
/** /**
* Attempts to delegate rendering to a Substance cell renderer. This * Attempts to delegate rendering to a Substance cell renderer. This should only
* should only be called if Substance is known to be on the classpath. * be called if Substance is known to be on the classpath.
* *
* @throws Exception * @throws Exception If Substance is not on the classpath, or some other error
* If Substance is not on the classpath, or some other * occurs creating the Substance cell renderer.
* error occurs creating the Substance cell renderer.
* @see Util#getUseSubstanceRenderers() * @see Util#getUseSubstanceRenderers()
* @see #setDelegateRenderer(DefaultListCellRenderer) * @see #setDelegateRenderer(DefaultListCellRenderer)
*/ */
@@ -187,8 +184,8 @@ public class CompletionCellRenderer extends DefaultListCellRenderer {
/** /**
* Returns the font used when rendering completions. * Returns the font used when rendering completions.
* *
* @return The font. If this is <code>null</code>, then the default list * @return The font. If this is <code>null</code>, then the default list font is
* font is used. * used.
* @see #setDisplayFont(Font) * @see #setDisplayFont(Font)
*/ */
public Font getDisplayFont() { public Font getDisplayFont() {
@@ -196,8 +193,8 @@ public class CompletionCellRenderer extends DefaultListCellRenderer {
} }
/** /**
* Returns the icon to use if no icon is found for a specific completion. * Returns the icon to use if no icon is found for a specific completion. This
* This icon is lazily created if necessary. * icon is lazily created if necessary.
* *
* @return The icon. * @return The icon.
* @see #createEmptyIcon() * @see #createEmptyIcon()
@@ -212,9 +209,8 @@ public class CompletionCellRenderer extends DefaultListCellRenderer {
/** /**
* Returns an icon. * Returns an icon.
* *
* @param resource * @param resource The icon to retrieve. This should either be a file, or a
* The icon to retrieve. This should either be a file, * resource loadable by the current ClassLoader.
* or a resource loadable by the current ClassLoader.
* @return The icon. * @return The icon.
*/ */
protected Icon getIcon(String resource) { protected Icon getIcon(String resource) {
@@ -233,19 +229,15 @@ public class CompletionCellRenderer extends DefaultListCellRenderer {
/** /**
* Returns the renderer. * Returns the renderer.
* *
* @param list * @param list The list of choices being rendered.
* The list of choices being rendered. * @param value The {@link Completion} being rendered.
* @param value * @param index The index into <code>list</code> being rendered.
* The {@link Completion} being rendered. * @param selected Whether the item is selected.
* @param index * @param hasFocus Whether the item has focus.
* The index into <code>list</code> being rendered.
* @param selected
* Whether the item is selected.
* @param hasFocus
* Whether the item has focus.
*/ */
@Override @Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean selected, boolean hasFocus) { public Component getListCellRendererComponent(JList list, Object value, int index, boolean selected,
boolean hasFocus) {
super.getListCellRendererComponent(list, value, index, selected, hasFocus); super.getListCellRendererComponent(list, value, index, selected, hasFocus);
if (font != null) { if (font != null) {
setFont(font); // Overrides super's setFont(list.getFont()). setFont(font); // Overrides super's setFont(list.getFont()).
@@ -284,8 +276,8 @@ public class CompletionCellRenderer extends DefaultListCellRenderer {
} }
/** /**
* Returns whether the types of fields and return types of methods are * Returns whether the types of fields and return types of methods are shown in
* shown in the completion text. * the completion text.
* *
* @return Whether to show the types. * @return Whether to show the types.
* @see #setShowTypes(boolean) * @see #setShowTypes(boolean)
@@ -346,18 +338,14 @@ public class CompletionCellRenderer extends DefaultListCellRenderer {
/** /**
* Prepares this renderer to display a function completion. * Prepares this renderer to display a function completion.
* *
* @param list * @param list The list of choices being rendered.
* The list of choices being rendered. * @param fc The completion to render.
* @param fc * @param index The index into <code>list</code> being rendered.
* The completion to render. * @param selected Whether the item is selected.
* @param index * @param hasFocus Whether the item has focus.
* The index into <code>list</code> being rendered.
* @param selected
* Whether the item is selected.
* @param hasFocus
* Whether the item has focus.
*/ */
protected void prepareForFunctionCompletion(JList list, FunctionCompletion fc, int index, boolean selected, boolean hasFocus) { protected void prepareForFunctionCompletion(JList list, FunctionCompletion fc, int index, boolean selected,
boolean hasFocus) {
StringBuilder sb = new StringBuilder(PREFIX); StringBuilder sb = new StringBuilder(PREFIX);
sb.append(fc.getName()); sb.append(fc.getName());
char paramListStart = fc.getProvider().getParameterListStart(); char paramListStart = fc.getProvider().getParameterListStart();
@@ -408,18 +396,14 @@ public class CompletionCellRenderer extends DefaultListCellRenderer {
/** /**
* Prepares this renderer to display a markup tag completion. * Prepares this renderer to display a markup tag completion.
* *
* @param list * @param list The list of choices being rendered.
* The list of choices being rendered. * @param mc The completion to render.
* @param mc * @param index The index into <code>list</code> being rendered.
* The completion to render. * @param selected Whether the item is selected.
* @param index * @param hasFocus Whether the item has focus.
* The index into <code>list</code> being rendered.
* @param selected
* Whether the item is selected.
* @param hasFocus
* Whether the item has focus.
*/ */
protected void prepareForMarkupTagCompletion(JList list, MarkupTagCompletion mc, int index, boolean selected, boolean hasFocus) { protected void prepareForMarkupTagCompletion(JList list, MarkupTagCompletion mc, int index, boolean selected,
boolean hasFocus) {
StringBuilder sb = new StringBuilder(PREFIX); StringBuilder sb = new StringBuilder(PREFIX);
sb.append(mc.getName()); sb.append(mc.getName());
setText(sb.toString()); setText(sb.toString());
@@ -429,16 +413,11 @@ public class CompletionCellRenderer extends DefaultListCellRenderer {
* Prepares this renderer to display a completion not specifically handled * Prepares this renderer to display a completion not specifically handled
* elsewhere. * elsewhere.
* *
* @param list * @param list The list of choices being rendered.
* The list of choices being rendered. * @param c The completion to render.
* @param c * @param index The index into <code>list</code> being rendered.
* The completion to render. * @param selected Whether the item is selected.
* @param index * @param hasFocus Whether the item has focus.
* The index into <code>list</code> being rendered.
* @param selected
* Whether the item is selected.
* @param hasFocus
* Whether the item has focus.
*/ */
protected void prepareForOtherCompletion(JList list, Completion c, int index, boolean selected, boolean hasFocus) { protected void prepareForOtherCompletion(JList list, Completion c, int index, boolean selected, boolean hasFocus) {
StringBuilder sb = new StringBuilder(PREFIX); StringBuilder sb = new StringBuilder(PREFIX);
@@ -462,18 +441,14 @@ public class CompletionCellRenderer extends DefaultListCellRenderer {
/** /**
* Prepares this renderer to display a template completion. * Prepares this renderer to display a template completion.
* *
* @param list * @param list The list of choices being rendered.
* The list of choices being rendered. * @param tc The completion to render.
* @param tc * @param index The index into <code>list</code> being rendered.
* The completion to render. * @param selected Whether the item is selected.
* @param index * @param hasFocus Whether the item has focus.
* The index into <code>list</code> being rendered.
* @param selected
* Whether the item is selected.
* @param hasFocus
* Whether the item has focus.
*/ */
protected void prepareForTemplateCompletion(JList list, TemplateCompletion tc, int index, boolean selected, boolean hasFocus) { protected void prepareForTemplateCompletion(JList list, TemplateCompletion tc, int index, boolean selected,
boolean hasFocus) {
StringBuilder sb = new StringBuilder(PREFIX); StringBuilder sb = new StringBuilder(PREFIX);
sb.append(tc.getInputText()); sb.append(tc.getInputText());
String definition = tc.getShortDescription(); String definition = tc.getShortDescription();
@@ -493,18 +468,14 @@ public class CompletionCellRenderer extends DefaultListCellRenderer {
/** /**
* Prepares this renderer to display a variable completion. * Prepares this renderer to display a variable completion.
* *
* @param list * @param list The list of choices being rendered.
* The list of choices being rendered. * @param vc The completion to render.
* @param vc * @param index The index into <code>list</code> being rendered.
* The completion to render. * @param selected Whether the item is selected.
* @param index * @param hasFocus Whether the item has focus.
* The index into <code>list</code> being rendered.
* @param selected
* Whether the item is selected.
* @param hasFocus
* Whether the item has focus.
*/ */
protected void prepareForVariableCompletion(JList list, VariableCompletion vc, int index, boolean selected, boolean hasFocus) { protected void prepareForVariableCompletion(JList list, VariableCompletion vc, int index, boolean selected,
boolean hasFocus) {
StringBuilder sb = new StringBuilder(PREFIX); StringBuilder sb = new StringBuilder(PREFIX);
sb.append(vc.getName()); sb.append(vc.getName());
if (getShowTypes() && vc.getType() != null) { if (getShowTypes() && vc.getType() != null) {
@@ -523,10 +494,9 @@ public class CompletionCellRenderer extends DefaultListCellRenderer {
/** /**
* Sets the background color to use on alternating lines. * Sets the background color to use on alternating lines.
* *
* @param altBG * @param altBG The new alternate background color. If this is
* The new alternate background color. If this is * <code>null</code>, alternating lines will not use different
* <code>null</code>, alternating lines will not use different * background colors.
* background colors.
* @see #getAlternateBackground() * @see #getAlternateBackground()
*/ */
public static void setAlternateBackground(Color altBG) { public static void setAlternateBackground(Color altBG) {
@@ -534,14 +504,12 @@ public class CompletionCellRenderer extends DefaultListCellRenderer {
} }
/** /**
* Sets the delegate renderer. Most users will never use this method; it * Sets the delegate renderer. Most users will never use this method; it is
* is primarily a hook for Substance and other Look and Feels whose * primarily a hook for Substance and other Look and Feels whose renderers look
* renderers look drastically different from the standard * drastically different from the standard <code>DefaultListCellRenderer</code>.
* <code>DefaultListCellRenderer</code>.
* *
* @param delegate * @param delegate The new delegate renderer. If this is <code>null</code>, the
* The new delegate renderer. If this is <code>null</code>, * default rendering of this component is used.
* the default rendering of this component is used.
* @see #getDelegateRenderer() * @see #getDelegateRenderer()
* @see #delegateToSubstanceRenderer() * @see #delegateToSubstanceRenderer()
*/ */
@@ -552,9 +520,8 @@ public class CompletionCellRenderer extends DefaultListCellRenderer {
/** /**
* Sets the font to use when rendering completion items. * Sets the font to use when rendering completion items.
* *
* @param font * @param font The font to use. If this is <code>null</code>, then the default
* The font to use. If this is <code>null</code>, then * list font is used.
* the default list font is used.
* @see #getDisplayFont() * @see #getDisplayFont()
*/ */
public void setDisplayFont(Font font) { public void setDisplayFont(Font font) {
@@ -562,11 +529,10 @@ public class CompletionCellRenderer extends DefaultListCellRenderer {
} }
/** /**
* Sets the icon to display based off of a completion, falling back to the * Sets the icon to display based off of a completion, falling back to the empty
* empty icon if the completion has no icon. * icon if the completion has no icon.
* *
* @param completion * @param completion The completion to check.
* The completion to check.
* @see #setIconWithDefault(Completion, Icon) * @see #setIconWithDefault(Completion, Icon)
*/ */
protected void setIconWithDefault(Completion completion) { protected void setIconWithDefault(Completion completion) {
@@ -574,14 +540,12 @@ public class CompletionCellRenderer extends DefaultListCellRenderer {
} }
/** /**
* Sets the icon to display based off of a completion, falling back to a * Sets the icon to display based off of a completion, falling back to a default
* default icon if the completion has no icon. * icon if the completion has no icon.
* *
* @param completion * @param completion The completion to check.
* The completion to check. * @param defaultIcon The icon to use if <code>completion</code> does not
* @param defaultIcon * specify an icon.
* The icon to use if <code>completion</code> does not
* specify an icon.
* @see #setIconWithDefault(Completion) * @see #setIconWithDefault(Completion)
*/ */
protected void setIconWithDefault(Completion completion, Icon defaultIcon) { protected void setIconWithDefault(Completion completion, Icon defaultIcon) {
@@ -592,8 +556,7 @@ public class CompletionCellRenderer extends DefaultListCellRenderer {
/** /**
* Sets the color to use for function arguments. * Sets the color to use for function arguments.
* *
* @param color * @param color The color to use. This is ignored if <code>null</code>.
* The color to use. This is ignored if <code>null</code>.
* @see #setTypeColor(Color) * @see #setTypeColor(Color)
*/ */
public void setParamColor(Color color) { public void setParamColor(Color color) {
@@ -603,11 +566,10 @@ public class CompletionCellRenderer extends DefaultListCellRenderer {
} }
/** /**
* Sets whether the types of fields and return types of methods are * Sets whether the types of fields and return types of methods are shown in the
* shown in the completion text. * completion text.
* *
* @param show * @param show Whether to show the types.
* Whether to show the types.
* @see #getShowTypes() * @see #getShowTypes()
*/ */
public void setShowTypes(boolean show) { public void setShowTypes(boolean show) {
@@ -616,12 +578,11 @@ public class CompletionCellRenderer extends DefaultListCellRenderer {
/** /**
* Sets the color to use for function/field types. Note that if * Sets the color to use for function/field types. Note that if
* {@link #getShowTypes()} returns <code>false</code>, this property * {@link #getShowTypes()} returns <code>false</code>, this property effectively
* effectively does nothing. * does nothing.
* *
* @param color * @param color The color to use for types. This is ignored if
* The color to use for types. This is ignored if * <code>null</code>.
* <code>null</code>.
* @see #setShowTypes(boolean) * @see #setShowTypes(boolean)
* @see #setParamColor(Color) * @see #setParamColor(Color)
*/ */
@@ -13,9 +13,8 @@ import java.util.List;
import javax.swing.AbstractListModel; import javax.swing.AbstractListModel;
/** /**
* A list model implementation that allows the bulk addition of elements. * A list model implementation that allows the bulk addition of elements. This
* This is the only feature missing from <code>DefaultListModel</code> that * is the only feature missing from <code>DefaultListModel</code> that we need.
* we need.
* *
* @author Robert Futrell * @author Robert Futrell
* @version 1.0 * @version 1.0
@@ -35,8 +34,8 @@ class CompletionListModel extends AbstractListModel {
} }
/** /**
* Removes all of the elements from this list. The list will * Removes all of the elements from this list. The list will be empty after this
* be empty after this call returns (unless it throws an exception). * call returns (unless it throws an exception).
* *
* @see #setContents(Collection) * @see #setContents(Collection)
*/ */
@@ -67,8 +66,7 @@ class CompletionListModel extends AbstractListModel {
/** /**
* Sets the contents of this model. All previous contents are removed. * Sets the contents of this model. All previous contents are removed.
* *
* @param contents * @param contents The new contents of this model.
* The new contents of this model.
*/ */
public void setContents(Collection<Completion> contents) { public void setContents(Collection<Completion> contents) {
clear(); clear();
@@ -36,38 +36,34 @@ public interface CompletionProvider {
public void clearParameterizedCompletionParams(); public void clearParameterizedCompletionParams();
/** /**
* Returns the text just before the current caret position that could be * Returns the text just before the current caret position that could be the
* the start of something auto-completable. * start of something auto-completable.
* *
* @param comp * @param comp The text component.
* The text component. * @return The text. A return value of <code>null</code> means nothing should be
* @return The text. A return value of <code>null</code> means nothing * auto-completed; a value of an empty string (<code>""</code>) means
* should be auto-completed; a value of an empty string * auto-completion should still be considered (i.e., all possible
* (<code>""</code>) means auto-completion should still be * choices are valid).
* considered (i.e., all possible choices are valid).
*/ */
public String getAlreadyEnteredText(JTextComponent comp); public String getAlreadyEnteredText(JTextComponent comp);
/** /**
* Gets the possible completions for the text component at the current * Gets the possible completions for the text component at the current caret
* caret position. * position.
* *
* @param comp * @param comp The text component.
* The text component. * @return The list of {@link Completion}s. If no completions are available,
* @return The list of {@link Completion}s. If no completions are * this method should return an empty list.
* available, this method should return an empty list.
*/ */
public List<Completion> getCompletions(JTextComponent comp); public List<Completion> getCompletions(JTextComponent comp);
/** /**
* Returns the completions that have been entered at the specified visual * Returns the completions that have been entered at the specified visual
* location. This can be used for tool tips when the user hovers the * location. This can be used for tool tips when the user hovers the mouse over
* mouse over completed text. * completed text.
* *
* @param comp * @param comp The text component.
* The text component. * @param p The position, usually from a <tt>MouseEvent</tt>.
* @param p
* The position, usually from a <tt>MouseEvent</tt>.
* @return The completions, or an empty list if there are none. * @return The completions, or an empty list if there are none.
*/ */
public List<Completion> getCompletionsAt(JTextComponent comp, Point p); public List<Completion> getCompletionsAt(JTextComponent comp, Point p);
@@ -75,8 +71,8 @@ public interface CompletionProvider {
/** /**
* Returns the cell renderer for completions returned from this provider. * Returns the cell renderer for completions returned from this provider.
* *
* @return The cell renderer, or <code>null</code> if the default should * @return The cell renderer, or <code>null</code> if the default should be
* be used. * used.
* @see #setListCellRenderer(ListCellRenderer) * @see #setListCellRenderer(ListCellRenderer)
*/ */
public ListCellRenderer getListCellRenderer(); public ListCellRenderer getListCellRenderer();
@@ -87,29 +83,27 @@ public interface CompletionProvider {
* completion, such as a function or method. For any parameter to the * completion, such as a function or method. For any parameter to the
* function/method, this object can return possible completions. * function/method, this object can return possible completions.
* *
* @return The parameter choices provider, or <code>null</code> if * @return The parameter choices provider, or <code>null</code> if none is
* none is installed. * installed.
*/ */
public ParameterChoicesProvider getParameterChoicesProvider(); public ParameterChoicesProvider getParameterChoicesProvider();
/** /**
* Returns a list of parameterized completions that have been entered * Returns a list of parameterized completions that have been entered at the
* at the current caret position of a text component (and thus can have * current caret position of a text component (and thus can have their
* their completion choices displayed). * completion choices displayed).
* *
* @param tc * @param tc The text component.
* The text component. * @return The list of {@link ParameterizedCompletion}s. If no completions are
* @return The list of {@link ParameterizedCompletion}s. If no completions * available, this may be <code>null</code>.
* are available, this may be <code>null</code>.
*/ */
public List<ParameterizedCompletion> getParameterizedCompletions(JTextComponent tc); public List<ParameterizedCompletion> getParameterizedCompletions(JTextComponent tc);
/** /**
* Returns the text that marks the end of a list of parameters to a * Returns the text that marks the end of a list of parameters to a function or
* function or method. * method.
* *
* @return The text for a parameter list end, for example, * @return The text for a parameter list end, for example, '<code>)</code>'.
* '<code>)</code>'.
* @see #getParameterListStart() * @see #getParameterListStart()
* @see #getParameterListSeparator() * @see #getParameterListSeparator()
* @see #setParameterizedCompletionParams(char, String, char) * @see #setParameterizedCompletionParams(char, String, char)
@@ -119,8 +113,7 @@ public interface CompletionProvider {
/** /**
* Returns the text that separates parameters to a function or method. * Returns the text that separates parameters to a function or method.
* *
* @return The text that separates parameters, for example, * @return The text that separates parameters, for example, "<code>, </code>".
* "<code>, </code>".
* @see #getParameterListStart() * @see #getParameterListStart()
* @see #getParameterListEnd() * @see #getParameterListEnd()
* @see #setParameterizedCompletionParams(char, String, char) * @see #setParameterizedCompletionParams(char, String, char)
@@ -128,11 +121,10 @@ public interface CompletionProvider {
public String getParameterListSeparator(); public String getParameterListSeparator();
/** /**
* Returns the text that marks the start of a list of parameters to a * Returns the text that marks the start of a list of parameters to a function
* function or method. * or method.
* *
* @return The text for a parameter list start, for example, * @return The text for a parameter list start, for example, "<code>(</code>".
* "<code>(</code>".
* @see #getParameterListEnd() * @see #getParameterListEnd()
* @see #getParameterListSeparator() * @see #getParameterListSeparator()
* @see #setParameterizedCompletionParams(char, String, char) * @see #setParameterizedCompletionParams(char, String, char)
@@ -149,15 +141,14 @@ public interface CompletionProvider {
/** /**
* This method is called if auto-activation is enabled in the parent * This method is called if auto-activation is enabled in the parent
* {@link AutoCompletion} after the user types a single character. This * {@link AutoCompletion} after the user types a single character. This provider
* provider should check the text at the current caret position of the * should check the text at the current caret position of the text component,
* text component, and decide whether auto-activation would be appropriate * and decide whether auto-activation would be appropriate here. For example, a
* here. For example, a <code>CompletionProvider</code> for Java might * <code>CompletionProvider</code> for Java might want to return
* want to return <code>true</code> for this method only if the last * <code>true</code> for this method only if the last character typed was a
* character typed was a '<code>.</code>'. * '<code>.</code>'.
* *
* @param tc * @param tc The text component.
* The text component.
* @return Whether auto-activation would be appropriate. * @return Whether auto-activation would be appropriate.
*/ */
public boolean isAutoActivateOkay(JTextComponent tc); public boolean isAutoActivateOkay(JTextComponent tc);
@@ -165,30 +156,26 @@ public interface CompletionProvider {
/** /**
* Sets the renderer to use when displaying completion choices. * Sets the renderer to use when displaying completion choices.
* *
* @param r * @param r The renderer to use.
* The renderer to use.
* @see #getListCellRenderer() * @see #getListCellRenderer()
*/ */
public void setListCellRenderer(ListCellRenderer r); public void setListCellRenderer(ListCellRenderer r);
/** /**
* Sets the values used to identify and insert "parameterized completions" * Sets the values used to identify and insert "parameterized completions" (e.g.
* (e.g. functions or methods). If this method isn't called, functions * functions or methods). If this method isn't called, functions and methods
* and methods will not have their parameters auto-completed. * will not have their parameters auto-completed.
* *
* @param listStart * @param listStart The character that marks the beginning of a list of
* The character that marks the beginning of a list of * parameters, such as '<tt>(</tt>' in C or Java.
* parameters, such as '<tt>(</tt>' in C or Java. * @param separator Text that should separate parameters in a parameter list
* @param separator * when one is inserted. For example, "<tt>, </tt>".
* Text that should separate parameters in a parameter * @param listEnd The character that marks the end of a list of parameters,
* list when one is inserted. For example, "<tt>, </tt>". * such as '<tt>)</tt>' in C or Java.
* @param listEnd * @throws IllegalArgumentException If either <tt>listStart</tt> or
* The character that marks the end of a list of parameters, * <tt>listEnd</tt> is not printable ASCII, or
* such as '<tt>)</tt>' in C or Java. * if <tt>separator</tt> is <code>null</code>
* @throws IllegalArgumentException * or an empty string.
* If either <tt>listStart</tt> or
* <tt>listEnd</tt> is not printable ASCII, or if
* <tt>separator</tt> is <code>null</code> or an empty string.
* @see #clearParameterizedCompletionParams() * @see #clearParameterizedCompletionParams()
*/ */
public void setParameterizedCompletionParams(char listStart, String separator, char listEnd); public void setParameterizedCompletionParams(char listStart, String separator, char listEnd);
@@ -196,9 +183,8 @@ public interface CompletionProvider {
/** /**
* Sets the parent completion provider. * Sets the parent completion provider.
* *
* @param parent * @param parent The parent provider. <code>null</code> means there will be no
* The parent provider. <code>null</code> means there will * parent provider.
* be no parent provider.
* @see #getParent() * @see #getParent()
*/ */
public void setParent(CompletionProvider parent); public void setParent(CompletionProvider parent);
@@ -182,7 +182,8 @@ public abstract class CompletionProviderBase implements CompletionProvider {
} catch (BadLocationException ble) { // Never happens } catch (BadLocationException ble) { // Never happens
ble.printStackTrace(); ble.printStackTrace();
} }
return (autoActivateAfterLetters && Character.isLetter(ch)) || (autoActivateChars != null && autoActivateChars.indexOf(ch) > -1); return (autoActivateAfterLetters && Character.isLetter(ch))
|| (autoActivateChars != null && autoActivateChars.indexOf(ch) > -1);
} }
/** /**
@@ -18,9 +18,9 @@ import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler; import org.xml.sax.helpers.DefaultHandler;
/** /**
* Parser for an XML file describing a procedural language such as C. XML * Parser for an XML file describing a procedural language such as C. XML files
* files will be validated against the <code>CompletionXml.dtd</code> DTD * will be validated against the <code>CompletionXml.dtd</code> DTD found in
* found in this package. * this package.
* *
* @author Robert Futrell * @author Robert Futrell
* @version 1.0 * @version 1.0
@@ -68,18 +68,16 @@ public class CompletionXMLParser extends DefaultHandler {
*/ */
private String funcCompletionType; private String funcCompletionType;
/** /**
* The class loader to use to load custom completion classes, such as * The class loader to use to load custom completion classes, such as the one
* the one defined by {@link #funcCompletionType}. If this is * defined by {@link #funcCompletionType}. If this is <code>null</code>, then a
* <code>null</code>, then a default class loader is used. This field * default class loader is used. This field will usually be <code>null</code>.
* will usually be <code>null</code>.
*/ */
private static ClassLoader DEFAULT_COMPLETION_CLASS_LOADER; private static ClassLoader DEFAULT_COMPLETION_CLASS_LOADER;
/** /**
* Constructor. * Constructor.
* *
* @param provider * @param provider The provider to get completions for.
* The provider to get completions for.
* @see #reset(CompletionProvider) * @see #reset(CompletionProvider)
*/ */
public CompletionXMLParser(CompletionProvider provider) { public CompletionXMLParser(CompletionProvider provider) {
@@ -89,15 +87,12 @@ public class CompletionXMLParser extends DefaultHandler {
/** /**
* Constructor. * Constructor.
* *
* @param provider * @param provider The provider to get completions for.
* The provider to get completions for. * @param cl The class loader to use, if necessary, when loading classes
* @param cl * from the XML (custom {@link FunctionCompletion}s, for
* The class loader to use, if necessary, when loading classes * example). This may be <code>null</code> if the default is to
* from the XML (custom {@link FunctionCompletion}s, for * be used, or if the XML does not define specific classes for
* example). * completion types.
* This may be <code>null</code> if the default is to be used, or
* if the XML does not define specific classes for completion
* types.
* @see #reset(CompletionProvider) * @see #reset(CompletionProvider)
*/ */
public CompletionXMLParser(CompletionProvider provider, ClassLoader cl) { public CompletionXMLParser(CompletionProvider provider, ClassLoader cl) {
@@ -295,8 +290,7 @@ public class CompletionXMLParser extends DefaultHandler {
/** /**
* Resets this parser to grab more completions. * Resets this parser to grab more completions.
* *
* @param provider * @param provider The new provider to get completions for.
* The new provider to get completions for.
*/ */
public void reset(CompletionProvider provider) { public void reset(CompletionProvider provider) {
this.provider = provider; this.provider = provider;
@@ -312,16 +306,14 @@ public class CompletionXMLParser extends DefaultHandler {
} }
/** /**
* Sets the class loader to use when loading custom classes to use for * Sets the class loader to use when loading custom classes to use for various
* various {@link Completion} types, such as {@link FunctionCompletion}s, * {@link Completion} types, such as {@link FunctionCompletion}s, from XML.
* from XML.
* <p> * <p>
* *
* Users should very rarely have a need to use this method. * Users should very rarely have a need to use this method.
* *
* @param cl * @param cl The class loader to use. If this is <code>null</code>, then a
* The class loader to use. If this is <code>null</code>, then * default is used.
* a default is used.
*/ */
public static void setDefaultCompletionClassLoader(ClassLoader cl) { public static void setDefaultCompletionClassLoader(ClassLoader cl) {
DEFAULT_COMPLETION_CLASS_LOADER = cl; DEFAULT_COMPLETION_CLASS_LOADER = cl;
@@ -28,9 +28,9 @@ import org.xml.sax.SAXException;
/** /**
* A basic completion provider implementation. This provider has no * A basic completion provider implementation. This provider has no
* understanding of language semantics. It simply checks the text entered up * understanding of language semantics. It simply checks the text entered up to
* to the caret position for a match against known completions. This is all * the caret position for a match against known completions. This is all that is
* that is needed in the majority of cases. * needed in the majority of cases.
* *
* @author Robert Futrell * @author Robert Futrell
* @version 1.0 * @version 1.0
@@ -43,11 +43,11 @@ public class DefaultCompletionProvider extends AbstractCompletionProvider {
*/ */
private String lastCompletionsAtText; private String lastCompletionsAtText;
/** /**
* Used to speed up {@link #getCompletionsAt(JTextComponent, Point)}, * Used to speed up {@link #getCompletionsAt(JTextComponent, Point)}, since this
* since this may be called multiple times in succession (this is usually * may be called multiple times in succession (this is usually called by
* called by <tt>JTextComponent.getToolTipText()</tt>, and if the user * <tt>JTextComponent.getToolTipText()</tt>, and if the user wiggles the mouse
* wiggles the mouse while a tool tip is displayed, this method gets * while a tool tip is displayed, this method gets repeatedly called. It can be
* repeatedly called. It can be costly so we try to speed it up a tad). * costly so we try to speed it up a tad).
*/ */
private List<Completion> lastParameterizedCompletionsAt; private List<Completion> lastParameterizedCompletionsAt;
@@ -61,12 +61,11 @@ public class DefaultCompletionProvider extends AbstractCompletionProvider {
} }
/** /**
* Creates a completion provider that provides completion for a simple * Creates a completion provider that provides completion for a simple list of
* list of words. * words.
* *
* @param words * @param words The words to offer as completion suggestions. If this is
* The words to offer as completion suggestions. If this is * <code>null</code>, no completions will be known.
* <code>null</code>, no completions will be known.
* @see BasicCompletion * @see BasicCompletion
*/ */
public DefaultCompletionProvider(String[] words) { public DefaultCompletionProvider(String[] words) {
@@ -75,12 +74,12 @@ public class DefaultCompletionProvider extends AbstractCompletionProvider {
} }
/** /**
* Returns the text just before the current caret position that could be * Returns the text just before the current caret position that could be the
* the start of something auto-completable. * start of something auto-completable.
* <p> * <p>
* *
* This method returns all characters before the caret that are matched * This method returns all characters before the caret that are matched by
* by {@link #isValidChar(char)}. * {@link #isValidChar(char)}.
* *
* {@inheritDoc} * {@inheritDoc}
*/ */
@@ -221,13 +220,12 @@ public class DefaultCompletionProvider extends AbstractCompletionProvider {
} }
/** /**
* Returns whether the specified character is valid in an auto-completion. * Returns whether the specified character is valid in an auto-completion. The
* The default implementation is equivalent to * default implementation is equivalent to
* "<code>Character.isLetterOrDigit(ch) || ch=='_'</code>". Subclasses * "<code>Character.isLetterOrDigit(ch) || ch=='_'</code>". Subclasses can
* can override this method to change what characters are matched. * override this method to change what characters are matched.
* *
* @param ch * @param ch The character.
* The character.
* @return Whether the character is valid. * @return Whether the character is valid.
*/ */
protected boolean isValidChar(char ch) { protected boolean isValidChar(char ch) {
@@ -238,10 +236,8 @@ public class DefaultCompletionProvider extends AbstractCompletionProvider {
* Loads completions from an XML file. The XML should validate against * Loads completions from an XML file. The XML should validate against
* <code>CompletionXml.dtd</code>. * <code>CompletionXml.dtd</code>.
* *
* @param file * @param file An XML file to load from.
* An XML file to load from. * @throws IOException If an IO error occurs.
* @throws IOException
* If an IO error occurs.
*/ */
public void loadFromXML(File file) throws IOException { public void loadFromXML(File file) throws IOException {
BufferedInputStream bin = new BufferedInputStream(new FileInputStream(file)); BufferedInputStream bin = new BufferedInputStream(new FileInputStream(file));
@@ -253,32 +249,26 @@ public class DefaultCompletionProvider extends AbstractCompletionProvider {
} }
/** /**
* Loads completions from an XML input stream. The XML should validate * Loads completions from an XML input stream. The XML should validate against
* against <code>CompletionXml.dtd</code>. * <code>CompletionXml.dtd</code>.
* *
* @param in * @param in The input stream to read from.
* The input stream to read from. * @throws IOException If an IO error occurs.
* @throws IOException
* If an IO error occurs.
*/ */
public void loadFromXML(InputStream in) throws IOException { public void loadFromXML(InputStream in) throws IOException {
loadFromXML(in, null); loadFromXML(in, null);
} }
/** /**
* Loads completions from an XML input stream. The XML should validate * Loads completions from an XML input stream. The XML should validate against
* against <code>CompletionXml.dtd</code>. * <code>CompletionXml.dtd</code>.
* *
* @param in * @param in The input stream to read from.
* The input stream to read from. * @param cl The class loader to use when loading any extra classes defined in
* @param cl * the XML, such as custom {@link FunctionCompletion}s. This may be
* The class loader to use when loading any extra classes defined * <code>null</code> if the default is to be used, or if no custom
* in the XML, such as custom {@link FunctionCompletion}s. This * completions are defined in the XML.
* may be <code>null</code> if the default is to be used, or if * @throws IOException If an IO error occurs.
* no
* custom completions are defined in the XML.
* @throws IOException
* If an IO error occurs.
*/ */
public void loadFromXML(InputStream in, ClassLoader cl) throws IOException { public void loadFromXML(InputStream in, ClassLoader cl) throws IOException {
// long start = System.currentTimeMillis(); // long start = System.currentTimeMillis();
@@ -314,10 +304,8 @@ public class DefaultCompletionProvider extends AbstractCompletionProvider {
* Loads completions from an XML file. The XML should validate against * Loads completions from an XML file. The XML should validate against
* <code>CompletionXml.dtd</code>. * <code>CompletionXml.dtd</code>.
* *
* @param resource * @param resource A resource the current ClassLoader can get to.
* A resource the current ClassLoader can get to. * @throws IOException If an IO error occurs.
* @throws IOException
* If an IO error occurs.
*/ */
public void loadFromXML(String resource) throws IOException { public void loadFromXML(String resource) throws IOException {
ClassLoader cl = getClass().getClassLoader(); ClassLoader cl = getClass().getClassLoader();
@@ -15,9 +15,9 @@ import javax.swing.JList;
import javax.swing.ListCellRenderer; import javax.swing.ListCellRenderer;
/** /**
* List cell renderer that delegates to a {@link CompletionProvider}'s * List cell renderer that delegates to a {@link CompletionProvider}'s renderer,
* renderer, if it has one. If it doesn't, it calls into a fallback renderer. * if it has one. If it doesn't, it calls into a fallback renderer. If a
* If a fallback renderer isn't specified, it simply renders * fallback renderer isn't specified, it simply renders
* <code>(({@link Completion})value).toString()</code>. * <code>(({@link Completion})value).toString()</code>.
* *
* @author Robert Futrell * @author Robert Futrell
@@ -26,8 +26,8 @@ import javax.swing.ListCellRenderer;
class DelegatingCellRenderer extends DefaultListCellRenderer { class DelegatingCellRenderer extends DefaultListCellRenderer {
/** /**
* The renderer to fall back on if one isn't specified by a provider. * The renderer to fall back on if one isn't specified by a provider. This is
* This is usually <tt>this</tt>. * usually <tt>this</tt>.
*/ */
private ListCellRenderer fallback; private ListCellRenderer fallback;
@@ -45,7 +45,8 @@ class DelegatingCellRenderer extends DefaultListCellRenderer {
* {@inheritDoc} * {@inheritDoc}
*/ */
@Override @Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean selected, boolean hasFocus) { public Component getListCellRendererComponent(JList list, Object value, int index, boolean selected,
boolean hasFocus) {
Completion c = (Completion) value; Completion c = (Completion) value;
CompletionProvider p = c.getProvider(); CompletionProvider p = c.getProvider();
ListCellRenderer r = p.getListCellRenderer(); ListCellRenderer r = p.getListCellRenderer();
@@ -61,9 +62,8 @@ class DelegatingCellRenderer extends DefaultListCellRenderer {
/** /**
* Sets the fallback cell renderer. * Sets the fallback cell renderer.
* *
* @param fallback * @param fallback The fallback cell renderer. If this is <code>null</code>,
* The fallback cell renderer. If this is * <tt>this</tt> will be used.
* <code>null</code>, <tt>this</tt> will be used.
* @see #getFallbackCellRenderer() * @see #getFallbackCellRenderer()
*/ */
public void setFallbackCellRenderer(ListCellRenderer fallback) { public void setFallbackCellRenderer(ListCellRenderer fallback) {
@@ -16,13 +16,11 @@ package org.fife.ui.autocomplete;
public interface DescWindowCallback { public interface DescWindowCallback {
/** /**
* Callback allowing a new code completion's description to be displayed * Callback allowing a new code completion's description to be displayed in the
* in the description window. * description window.
* *
* @param completion * @param completion The new completion.
* The new completion. * @param anchor The anchor to scroll to, or <code>null</code> if none.
* @param anchor
* The anchor to scroll to, or <code>null</code> if none.
*/ */
public void showSummaryFor(Completion completion, String anchor); public void showSummaryFor(Completion completion, String anchor);
} }
+2 -1
View File
@@ -39,5 +39,6 @@ public class EmptyIcon implements Icon, Serializable {
} }
@Override @Override
public void paintIcon(Component c, Graphics g, int x, int y) {} public void paintIcon(Component c, Graphics g, int x, int y) {
}
} }
@@ -10,12 +10,12 @@ package org.fife.ui.autocomplete;
import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkEvent;
/** /**
* A callback for when an external URL is clicked in the description window. * A callback for when an external URL is clicked in the description window. If
* If no handler is installed, and if running in Java 6, the system default * no handler is installed, and if running in Java 6, the system default web
* web browser is used to open the URL. If not running Java 6, nothing will * browser is used to open the URL. If not running Java 6, nothing will happen.
* happen. If you want browser support for pre-Java 6 JRE's, you will need * If you want browser support for pre-Java 6 JRE's, you will need to register
* to register one of these callbacks on your {@link AutoCompletion}, and * one of these callbacks on your {@link AutoCompletion}, and open the URL in a
* open the URL in a web browser yourself. * web browser yourself.
* <p> * <p>
* *
* Alternatively, folks implementing robust code completion support for a * Alternatively, folks implementing robust code completion support for a
@@ -31,13 +31,9 @@ public interface ExternalURLHandler {
/** /**
* Called when an external URL is clicked in the description window. * Called when an external URL is clicked in the description window.
* *
* @param e * @param e The event containing the hyperlink clicked.
* The event containing the hyperlink clicked. * @param c The completion currently being displayed.
* @param c * @param callback Allows you to display new content in the description window.
* The completion currently being displayed.
* @param callback
* Allows you to display new content in the description
* window.
*/ */
public void urlClicked(HyperlinkEvent e, Completion c, DescWindowCallback callback); public void urlClicked(HyperlinkEvent e, Completion c, DescWindowCallback callback);
} }
+21 -23
View File
@@ -20,14 +20,14 @@ import javax.swing.plaf.basic.BasicListUI;
/** /**
* A custom list UI, used by the completion choices list. If the number of * A custom list UI, used by the completion choices list. If the number of
* completion choices is "large," it does a fast estimate of the preferred * completion choices is "large," it does a fast estimate of the preferred width
* width and height of list items. This allows HTML renderers to be used (such * and height of list items. This allows HTML renderers to be used (such as
* as {@link CompletionCellRenderer}), with thousands of completion choices, * {@link CompletionCellRenderer}), with thousands of completion choices, with
* with no performance penalty. With standard BasicListUI subclasses, this can * no performance penalty. With standard BasicListUI subclasses, this can cause
* cause very poor performance <b>each time</b> the list is displayed, which * very poor performance <b>each time</b> the list is displayed, which is bad
* is bad for lists that are repeatedly hidden and re-displayed, such as * for lists that are repeatedly hidden and re-displayed, such as completion
* completion choices. This is all because the calculation to get the * choices. This is all because the calculation to get the preferred size of
* preferred size of each list item, when it is displayed with HTML, is slow. * each list item, when it is displayed with HTML, is slow.
* *
* @author Robert Futrell * @author Robert Futrell
* @version 1.0 * @version 1.0
@@ -35,19 +35,19 @@ import javax.swing.plaf.basic.BasicListUI;
class FastListUI extends BasicListUI { class FastListUI extends BasicListUI {
/** /**
* Whether the selection background was overridden (usually because of * Whether the selection background was overridden (usually because of Nimbus)
* Nimbus) so we know to manually uninstall the color we installed. * so we know to manually uninstall the color we installed.
*/ */
private boolean overriddenBackground; private boolean overriddenBackground;
/** /**
* Whether the selection foreground was overridden (usually because of * Whether the selection foreground was overridden (usually because of Nimbus)
* Nimbus) so we know to manually uninstall the color we installed. * so we know to manually uninstall the color we installed.
*/ */
private boolean overriddenForeground; private boolean overriddenForeground;
/** /**
* If there are more than this many completions in a single list, this * If there are more than this many completions in a single list, this UI will
* UI will estimate the cell width and height needed for each item instead * estimate the cell width and height needed for each item instead of computing
* of computing it, for performance reasons. * it, for performance reasons.
*/ */
private static final int ESTIMATION_THRESHOLD = 200; private static final int ESTIMATION_THRESHOLD = 200;
@@ -86,10 +86,9 @@ class FastListUI extends BasicListUI {
} }
/** /**
* Overridden to ensure we have selection background/foreground colors * Overridden to ensure we have selection background/foreground colors defined,
* defined, even if we're in some weirdo LAF such as Nimbus which doesn't * even if we're in some weirdo LAF such as Nimbus which doesn't define them.
* define them. Since FastListUI extends BasicListUI, we need these values * Since FastListUI extends BasicListUI, we need these values to be defined.
* to be defined.
*/ */
@Override @Override
protected void installDefaults() { protected void installDefaults() {
@@ -119,10 +118,9 @@ class FastListUI extends BasicListUI {
} }
/** /**
* Recalculates the cell width and height of each cell in the list. This * Recalculates the cell width and height of each cell in the list. This method
* method is overridden to do a fast estimation if the completion list is * is overridden to do a fast estimation if the completion list is too long, to
* too long, to improve performance for lists with huge amounts of * improve performance for lists with huge amounts of completions.
* completions.
*/ */
@Override @Override
protected void updateLayoutState() { protected void updateLayoutState() {
@@ -37,12 +37,9 @@ public class FunctionCompletion extends VariableCompletion implements Parameteri
/** /**
* Constructor. * Constructor.
* *
* @param provider * @param provider The parent provider.
* The parent provider. * @param name The name of this function.
* @param name * @param returnType The return type of this function.
* The name of this function.
* @param returnType
* The return type of this function.
*/ */
public FunctionCompletion(CompletionProvider provider, String name, String returnType) { public FunctionCompletion(CompletionProvider provider, String name, String returnType) {
super(provider, name, returnType); super(provider, name, returnType);
@@ -58,8 +55,7 @@ public class FunctionCompletion extends VariableCompletion implements Parameteri
/** /**
* Adds HTML describing the parameters to this function to a buffer. * Adds HTML describing the parameters to this function to a buffer.
* *
* @param sb * @param sb The buffer to append to.
* The buffer to append to.
*/ */
protected void addParameters(StringBuilder sb) { protected void addParameters(StringBuilder sb) {
// TODO: Localize me // TODO: Localize me
@@ -90,8 +86,7 @@ public class FunctionCompletion extends VariableCompletion implements Parameteri
/** /**
* Overridden to compare methods by their comparison strings. * Overridden to compare methods by their comparison strings.
* *
* @param c2 * @param c2 A <code>Completion</code> to compare to.
* A <code>Completion</code> to compare to.
* @return The sort order. * @return The sort order.
*/ */
@Override @Override
@@ -114,11 +109,9 @@ public class FunctionCompletion extends VariableCompletion implements Parameteri
*/ */
private String getCompareString() { private String getCompareString() {
/* /*
* This string compares the following parts of methods in this order, * This string compares the following parts of methods in this order, to
* to optimize sort order in completion lists. * optimize sort order in completion lists. 1. First, by name 2. Next, by number
* 1. First, by name * of parameters. 3. Finally, by parameter type.
* 2. Next, by number of parameters.
* 3. Finally, by parameter type.
*/ */
if (compareString == null) { if (compareString == null) {
StringBuilder sb = new StringBuilder(getName()); StringBuilder sb = new StringBuilder(getName());
@@ -141,8 +134,8 @@ public class FunctionCompletion extends VariableCompletion implements Parameteri
} }
/** /**
* Returns the "definition string" for this function completion. For * Returns the "definition string" for this function completion. For example,
* example, for the C "<code>printf</code>" function, this would return * for the C "<code>printf</code>" function, this would return
* "<code>int printf(const char *, ...)</code>". * "<code>int printf(const char *, ...)</code>".
* *
* @return The definition string. * @return The definition string.
@@ -269,8 +262,7 @@ public class FunctionCompletion extends VariableCompletion implements Parameteri
/** /**
* Returns the text to insert for a parameter. * Returns the text to insert for a parameter.
* *
* @param param * @param param The parameter.
* The parameter.
* @return The text. * @return The text.
*/ */
private String getParamText(ParameterizedCompletion.Parameter param) { private String getParamText(ParameterizedCompletion.Parameter param) {
@@ -324,9 +316,8 @@ public class FunctionCompletion extends VariableCompletion implements Parameteri
/** /**
* Sets the parameters to this function. * Sets the parameters to this function.
* *
* @param params * @param params The parameters. This should be a list of
* The parameters. This should be a list of * {@link ParameterizedCompletion.Parameter}s.
* {@link ParameterizedCompletion.Parameter}s.
* @see #getParam(int) * @see #getParam(int)
* @see #getParamCount() * @see #getParamCount()
*/ */
@@ -340,8 +331,7 @@ public class FunctionCompletion extends VariableCompletion implements Parameteri
/** /**
* Sets the description of the return value of this function. * Sets the description of the return value of this function.
* *
* @param desc * @param desc The description.
* The description.
* @see #getReturnValueDescription() * @see #getReturnValueDescription()
*/ */
public void setReturnValueDescription(String desc) { public void setReturnValueDescription(String desc) {
@@ -33,13 +33,13 @@ import org.fife.ui.rtextarea.ToolTipSupplier;
* <li>A documentation comment</li> * <li>A documentation comment</li>
* </ul> * </ul>
* *
* This allows for different completion choices in comments than in code, * This allows for different completion choices in comments than in code, for
* for example. * example.
* <p> * <p>
* *
* This provider also implements the * This provider also implements the
* <tt>org.fife.ui.rtextarea.ToolTipSupplier</tt> interface, which allows it * <tt>org.fife.ui.rtextarea.ToolTipSupplier</tt> interface, which allows it to
* to display tooltips for completion choices. Thus the standard * display tooltips for completion choices. Thus the standard
* {@link VariableCompletion} and {@link FunctionCompletion} completions should * {@link VariableCompletion} and {@link FunctionCompletion} completions should
* be able to display tooltips with the variable declaration or function * be able to display tooltips with the variable declaration or function
* definition (provided the <tt>RSyntaxTextArea</tt> was registered with the * definition (provided the <tt>RSyntaxTextArea</tt> was registered with the
@@ -51,8 +51,7 @@ import org.fife.ui.rtextarea.ToolTipSupplier;
public class LanguageAwareCompletionProvider extends CompletionProviderBase implements ToolTipSupplier { public class LanguageAwareCompletionProvider extends CompletionProviderBase implements ToolTipSupplier {
/** /**
* The provider to use when no provider is assigned to a particular token * The provider to use when no provider is assigned to a particular token type.
* type.
*/ */
private CompletionProvider defaultProvider; private CompletionProvider defaultProvider;
/** /**
@@ -69,32 +68,31 @@ public class LanguageAwareCompletionProvider extends CompletionProviderBase impl
private CompletionProvider docCommentCompletionProvider; private CompletionProvider docCommentCompletionProvider;
/** /**
* Constructor subclasses can use when they don't have their default * Constructor subclasses can use when they don't have their default provider
* provider created at construction time. They should call * created at construction time. They should call
* {@link #setDefaultCompletionProvider(CompletionProvider)} in this * {@link #setDefaultCompletionProvider(CompletionProvider)} in this
* constructor. * constructor.
*/ */
protected LanguageAwareCompletionProvider() {} protected LanguageAwareCompletionProvider() {
}
/** /**
* Constructor. * Constructor.
* *
* @param defaultProvider * @param defaultProvider The provider to use when no provider is assigned to a
* The provider to use when no provider is assigned * particular token type. This cannot be
* to a particular token type. This cannot be <code>null</code>. * <code>null</code>.
*/ */
public LanguageAwareCompletionProvider(CompletionProvider defaultProvider) { public LanguageAwareCompletionProvider(CompletionProvider defaultProvider) {
setDefaultCompletionProvider(defaultProvider); setDefaultCompletionProvider(defaultProvider);
} }
/** /**
* Calling this method will result in an * Calling this method will result in an {@link UnsupportedOperationException}
* {@link UnsupportedOperationException} being thrown. To set the * being thrown. To set the parameter completion parameters, do so on the
* parameter completion parameters, do so on the provider returned by * provider returned by {@link #getDefaultCompletionProvider()}.
* {@link #getDefaultCompletionProvider()}.
* *
* @throws UnsupportedOperationException * @throws UnsupportedOperationException Always.
* Always.
* @see #setParameterizedCompletionParams(char, String, char) * @see #setParameterizedCompletionParams(char, String, char)
*/ */
@Override @Override
@@ -135,10 +133,8 @@ public class LanguageAwareCompletionProvider extends CompletionProviderBase impl
/** /**
* Does the dirty work of creating a list of completions. * Does the dirty work of creating a list of completions.
* *
* @param comp * @param comp The text component to look in.
* The text component to look in. * @return The list of possible completions, or an empty list if there are none.
* @return The list of possible completions, or an empty list if there
* are none.
*/ */
@Override @Override
protected List<Completion> getCompletionsImpl(JTextComponent comp) { protected List<Completion> getCompletionsImpl(JTextComponent comp) {
@@ -152,8 +148,8 @@ public class LanguageAwareCompletionProvider extends CompletionProviderBase impl
} }
/** /**
* Returns the completion provider used when one isn't defined for a * Returns the completion provider used when one isn't defined for a particular
* particular token type. * token type.
* *
* @return The completion provider to use. * @return The completion provider to use.
* @see #setDefaultCompletionProvider(CompletionProvider) * @see #setDefaultCompletionProvider(CompletionProvider)
@@ -209,11 +205,10 @@ public class LanguageAwareCompletionProvider extends CompletionProviderBase impl
} }
/** /**
* Returns the completion provider to use at the current caret position in * Returns the completion provider to use at the current caret position in a
* a text component. * text component.
* *
* @param comp * @param comp The text component to check.
* The text component to check.
* @return The completion provider to use. * @return The completion provider to use.
*/ */
private CompletionProvider getProviderFor(JTextComponent comp) { private CompletionProvider getProviderFor(JTextComponent comp) {
@@ -242,15 +237,15 @@ public class LanguageAwareCompletionProvider extends CompletionProviderBase impl
type = doc.getClosestStandardTokenTypeForInternalType(type); type = doc.getClosestStandardTokenTypeForInternalType(type);
} }
switch (type) { switch (type) {
case Token.ERROR_STRING_DOUBLE: case Token.ERROR_STRING_DOUBLE:
return getStringCompletionProvider(); return getStringCompletionProvider();
case Token.COMMENT_EOL: case Token.COMMENT_EOL:
case Token.COMMENT_MULTILINE: case Token.COMMENT_MULTILINE:
return getCommentCompletionProvider(); return getCommentCompletionProvider();
case Token.COMMENT_DOCUMENTATION: case Token.COMMENT_DOCUMENTATION:
return getDocCommentCompletionProvider(); return getDocCommentCompletionProvider();
default: default:
return getDefaultCompletionProvider(); return getDefaultCompletionProvider();
} }
} }
// FIXME: This isn't always a safe assumption. // FIXME: This isn't always a safe assumption.
@@ -261,23 +256,23 @@ public class LanguageAwareCompletionProvider extends CompletionProviderBase impl
return getDefaultCompletionProvider(); return getDefaultCompletionProvider();
} }
switch (curToken.getType()) { switch (curToken.getType()) {
case Token.LITERAL_STRING_DOUBLE_QUOTE: case Token.LITERAL_STRING_DOUBLE_QUOTE:
case Token.ERROR_STRING_DOUBLE: case Token.ERROR_STRING_DOUBLE:
return getStringCompletionProvider(); return getStringCompletionProvider();
case Token.COMMENT_EOL: case Token.COMMENT_EOL:
case Token.COMMENT_MULTILINE: case Token.COMMENT_MULTILINE:
return getCommentCompletionProvider(); return getCommentCompletionProvider();
case Token.COMMENT_DOCUMENTATION: case Token.COMMENT_DOCUMENTATION:
return getDocCommentCompletionProvider(); return getDocCommentCompletionProvider();
case Token.NULL: case Token.NULL:
case Token.WHITESPACE: case Token.WHITESPACE:
case Token.IDENTIFIER: case Token.IDENTIFIER:
case Token.VARIABLE: case Token.VARIABLE:
case Token.PREPROCESSOR: case Token.PREPROCESSOR:
case Token.DATA_TYPE: case Token.DATA_TYPE:
case Token.FUNCTION: case Token.FUNCTION:
case Token.OPERATOR: case Token.OPERATOR:
return getDefaultCompletionProvider(); return getDefaultCompletionProvider();
} }
return null; // In a token type we can't auto-complete from. return null; // In a token type we can't auto-complete from.
} }
@@ -304,8 +299,7 @@ public class LanguageAwareCompletionProvider extends CompletionProviderBase impl
/** /**
* Sets the comment completion provider. * Sets the comment completion provider.
* *
* @param provider * @param provider The provider to use in comments.
* The provider to use in comments.
* @see #getCommentCompletionProvider() * @see #getCommentCompletionProvider()
*/ */
public void setCommentCompletionProvider(CompletionProvider provider) { public void setCommentCompletionProvider(CompletionProvider provider) {
@@ -315,9 +309,8 @@ public class LanguageAwareCompletionProvider extends CompletionProviderBase impl
/** /**
* Sets the default completion provider. * Sets the default completion provider.
* *
* @param provider * @param provider The provider to use when no provider is assigned to a
* The provider to use when no provider is assigned to a * particular token type. This cannot be <code>null</code>.
* particular token type. This cannot be <code>null</code>.
* @see #getDefaultCompletionProvider() * @see #getDefaultCompletionProvider()
*/ */
public void setDefaultCompletionProvider(CompletionProvider provider) { public void setDefaultCompletionProvider(CompletionProvider provider) {
@@ -330,8 +323,7 @@ public class LanguageAwareCompletionProvider extends CompletionProviderBase impl
/** /**
* Sets the documentation comment completion provider. * Sets the documentation comment completion provider.
* *
* @param provider * @param provider The provider to use in comments.
* The provider to use in comments.
* @see #getDocCommentCompletionProvider() * @see #getDocCommentCompletionProvider()
*/ */
public void setDocCommentCompletionProvider(CompletionProvider provider) { public void setDocCommentCompletionProvider(CompletionProvider provider) {
@@ -339,13 +331,11 @@ public class LanguageAwareCompletionProvider extends CompletionProviderBase impl
} }
/** /**
* Calling this method will result in an * Calling this method will result in an {@link UnsupportedOperationException}
* {@link UnsupportedOperationException} being thrown. To set the * being thrown. To set the parameter completion parameters, do so on the
* parameter completion parameters, do so on the provider returned by * provider returned by {@link #getDefaultCompletionProvider()}.
* {@link #getDefaultCompletionProvider()}.
* *
* @throws UnsupportedOperationException * @throws UnsupportedOperationException Always.
* Always.
* @see #clearParameterizedCompletionParams() * @see #clearParameterizedCompletionParams()
*/ */
@Override @Override
@@ -356,8 +346,7 @@ public class LanguageAwareCompletionProvider extends CompletionProviderBase impl
/** /**
* Sets the completion provider to use while in a string. * Sets the completion provider to use while in a string.
* *
* @param provider * @param provider The provider to use.
* The provider to use.
* @see #getStringCompletionProvider() * @see #getStringCompletionProvider()
*/ */
public void setStringCompletionProvider(CompletionProvider provider) { public void setStringCompletionProvider(CompletionProvider provider) {
@@ -368,17 +357,15 @@ public class LanguageAwareCompletionProvider extends CompletionProviderBase impl
* Returns the tool tip to display for a mouse event. * Returns the tool tip to display for a mouse event.
* <p> * <p>
* *
* For this method to be called, the <tt>RSyntaxTextArea</tt> must be * For this method to be called, the <tt>RSyntaxTextArea</tt> must be registered
* registered with the <tt>javax.swing.ToolTipManager</tt> like so: * with the <tt>javax.swing.ToolTipManager</tt> like so:
* *
* <pre> * <pre>
* ToolTipManager.sharedInstance().registerComponent(textArea); * ToolTipManager.sharedInstance().registerComponent(textArea);
* </pre> * </pre>
* *
* @param textArea * @param textArea The text area.
* The text area. * @param e The mouse event.
* @param e
* The mouse event.
* @return The tool tip text, or <code>null</code> if none. * @return The tool tip text, or <code>null</code> if none.
*/ */
@Override @Override
@@ -8,9 +8,8 @@ package org.fife.ui.autocomplete;
import java.net.URL; import java.net.URL;
/** /**
* Possibly redirects one URL to another. Useful if you want "external" URL's * Possibly redirects one URL to another. Useful if you want "external" URL's in
* in code completion documentation to point to a local copy instead, for * code completion documentation to point to a local copy instead, for example.
* example.
* *
* @author Robert Futrell * @author Robert Futrell
* @version 1.0 * @version 1.0
@@ -31,10 +31,8 @@ public class MarkupTagCompletion extends AbstractCompletion {
/** /**
* Constructor. * Constructor.
* *
* @param provider * @param provider The parent provider instance.
* The parent provider instance. * @param name The name of the tag.
* @param name
* The name of the tag.
*/ */
public MarkupTagCompletion(CompletionProvider provider, String name) { public MarkupTagCompletion(CompletionProvider provider, String name) {
super(provider); super(provider);
@@ -44,8 +42,7 @@ public class MarkupTagCompletion extends AbstractCompletion {
/** /**
* Adds HTML describing the attributes of this tag to a buffer. * Adds HTML describing the attributes of this tag to a buffer.
* *
* @param sb * @param sb The buffer to append to.
* The buffer to append to.
*/ */
protected void addAttributes(StringBuilder sb) { protected void addAttributes(StringBuilder sb) {
// TODO: Localize me. // TODO: Localize me.
@@ -86,8 +83,7 @@ public class MarkupTagCompletion extends AbstractCompletion {
/** /**
* Returns the specified {@link ParameterizedCompletion.Parameter}. * Returns the specified {@link ParameterizedCompletion.Parameter}.
* *
* @param index * @param index The index of the attribute to retrieve.
* The index of the attribute to retrieve.
* @return The attribute. * @return The attribute.
* @see #getAttributeCount() * @see #getAttributeCount()
*/ */
@@ -116,11 +112,9 @@ public class MarkupTagCompletion extends AbstractCompletion {
} }
/** /**
* Returns a short description of this variable. This should be an * Returns a short description of this variable. This should be an HTML snippet.
* HTML snippet.
* *
* @return A short description of this variable. This may be * @return A short description of this variable. This may be <code>null</code>.
* <code>null</code>.
* @see #setDescription(String) * @see #setDescription(String)
*/ */
public String getDescription() { public String getDescription() {
@@ -158,11 +152,10 @@ public class MarkupTagCompletion extends AbstractCompletion {
} }
/** /**
* Adds some HTML describing where this variable is defined, if this * Adds some HTML describing where this variable is defined, if this information
* information is known. * is known.
* *
* @param sb * @param sb The buffer to append to.
* The buffer to append to.
*/ */
protected void possiblyAddDefinedIn(StringBuilder sb) { protected void possiblyAddDefinedIn(StringBuilder sb) {
if (definedIn != null) { if (definedIn != null) {
@@ -172,11 +165,9 @@ public class MarkupTagCompletion extends AbstractCompletion {
} }
/** /**
* Adds the description text as HTML to a buffer, if a description is * Adds the description text as HTML to a buffer, if a description is defined.
* defined.
* *
* @param sb * @param sb The buffer to append to.
* The buffer to append to.
*/ */
protected void possiblyAddDescription(StringBuilder sb) { protected void possiblyAddDescription(StringBuilder sb) {
if (desc != null) { if (desc != null) {
@@ -189,8 +180,7 @@ public class MarkupTagCompletion extends AbstractCompletion {
/** /**
* Sets where this variable is defined. * Sets where this variable is defined.
* *
* @param definedIn * @param definedIn Where this variable is defined.
* Where this variable is defined.
* @see #getDefinedIn() * @see #getDefinedIn()
*/ */
public void setDefinedIn(String definedIn) { public void setDefinedIn(String definedIn) {
@@ -198,12 +188,9 @@ public class MarkupTagCompletion extends AbstractCompletion {
} }
/** /**
* Sets the short description of this tag. This should be an * Sets the short description of this tag. This should be an HTML snippet.
* HTML snippet.
* *
* @param desc * @param desc A short description of this tag. This may be <code>null</code>.
* A short description of this tag. This may be
* <code>null</code>.
* @see #getDescription() * @see #getDescription()
*/ */
public void setDescription(String desc) { public void setDescription(String desc) {
@@ -213,8 +200,7 @@ public class MarkupTagCompletion extends AbstractCompletion {
/** /**
* Sets the attributes of this tag. * Sets the attributes of this tag.
* *
* @param attrs * @param attrs The attributes.
* The attributes.
* @see #getAttribute(int) * @see #getAttribute(int)
* @see #getAttributeCount() * @see #getAttributeCount()
*/ */
@@ -19,16 +19,16 @@ import javax.swing.text.Position;
import javax.swing.text.View; import javax.swing.text.View;
/** /**
* Highlight painter that draws an outline around the text. This is used to * Highlight painter that draws an outline around the text. This is used to draw
* draw bounds around function/method parameters. * bounds around function/method parameters.
* *
* @author Robert Futrell * @author Robert Futrell
* @version 1.0 * @version 1.0
*/ */
/* /*
* NOTE: Whenever you see text like "Workaround for Java Highlight issues", * NOTE: Whenever you see text like "Workaround for Java Highlight issues", this
* this is because highlighted text in a JTextComponent gets "pushed" forward * is because highlighted text in a JTextComponent gets "pushed" forward when
* when the caret is at the Highlight's start, when we need it to instead get * the caret is at the Highlight's start, when we need it to instead get
* prepended to. For this reason, the auto-complete package adds its Highlights * prepended to. For this reason, the auto-complete package adds its Highlights
* 1 char too long (1 char earlier than where it should really start), but only * 1 char too long (1 char earlier than where it should really start), but only
* paint the Highlight from the 2nd char on. * paint the Highlight from the 2nd char on.
@@ -36,17 +36,16 @@ import javax.swing.text.View;
class OutlineHighlightPainter extends DefaultHighlighter.DefaultHighlightPainter { class OutlineHighlightPainter extends DefaultHighlighter.DefaultHighlightPainter {
/** /**
* DefaultHighlightPainter doesn't allow changing color, so we must cache * DefaultHighlightPainter doesn't allow changing color, so we must cache ours
* ours here. * here.
*/ */
private Color color; private Color color;
/** /**
* Constructor. * Constructor.
* *
* @param color * @param color The color to draw the bounding boxes with. This cannot be
* The color to draw the bounding boxes with. This cannot * <code>null</code>.
* be <code>null</code>.
*/ */
public OutlineHighlightPainter(Color color) { public OutlineHighlightPainter(Color color) {
super(color); super(color);
@@ -114,8 +113,7 @@ class OutlineHighlightPainter extends DefaultHighlighter.DefaultHighlightPainter
/** /**
* Sets the color to paint the bounding boxes with. * Sets the color to paint the bounding boxes with.
* *
* @param color * @param color The new color. This cannot be <code>null</code>.
* The new color. This cannot be <code>null</code>.
* @see #getColor() * @see #getColor()
*/ */
public void setColor(Color color) { public void setColor(Color color) {
@@ -12,9 +12,9 @@ import java.util.List;
import javax.swing.text.JTextComponent; import javax.swing.text.JTextComponent;
/** /**
* Provides completions for a {@link ParameterizedCompletion}'s parameters. * Provides completions for a {@link ParameterizedCompletion}'s parameters. So,
* So, for example, if the user code-completes a function or method, if * for example, if the user code-completes a function or method, if a
* a <code>ParameterChoicesProvider</code> is installed, it can return possible * <code>ParameterChoicesProvider</code> is installed, it can return possible
* completions for the parameters to that function or method. * completions for the parameters to that function or method.
* *
* @author Robert Futrell * @author Robert Futrell
@@ -25,12 +25,10 @@ public interface ParameterChoicesProvider {
/** /**
* Returns a list of choices for a specific parameter. * Returns a list of choices for a specific parameter.
* *
* @param tc * @param tc The text component.
* The text component. * @param param The currently focused parameter.
* @param param * @return The list of parameters. This may be <code>null</code> for "no
* The currently focused parameter. * parameters," but might also be an empty list.
* @return The list of parameters. This may be <code>null</code> for
* "no parameters," but might also be an empty list.
*/ */
public List<Completion> getParameterChoices(JTextComponent tc, ParameterizedCompletion.Parameter param); public List<Completion> getParameterChoices(JTextComponent tc, ParameterizedCompletion.Parameter param);
} }
@@ -17,8 +17,8 @@ import javax.swing.text.JTextComponent;
public interface ParameterizedCompletion extends Completion { public interface ParameterizedCompletion extends Completion {
/** /**
* Returns the "definition string" for this completion. For example, * Returns the "definition string" for this completion. For example, for the C
* for the C "<code>printf</code>" function, this would return * "<code>printf</code>" function, this would return
* "<code>int printf(const char *, ...)</code>". * "<code>int printf(const char *, ...)</code>".
* *
* @return The definition string. * @return The definition string.
@@ -28,8 +28,7 @@ public interface ParameterizedCompletion extends Completion {
/** /**
* Returns the specified {@link Parameter}. * Returns the specified {@link Parameter}.
* *
* @param index * @param index The index of the parameter to retrieve.
* The index of the parameter to retrieve.
* @return The parameter. * @return The parameter.
* @see #getParamCount() * @see #getParamCount()
*/ */
@@ -46,8 +45,8 @@ public interface ParameterizedCompletion extends Completion {
public ParameterizedCompletionInsertionInfo getInsertionInfo(JTextComponent tc, boolean replaceTabsWithSpaces); public ParameterizedCompletionInsertionInfo getInsertionInfo(JTextComponent tc, boolean replaceTabsWithSpaces);
/** /**
* Returns whether a tool tip displaying assistance for each parameter * Returns whether a tool tip displaying assistance for each parameter while it
* while it is being edited is appropriate for this completion. * is being edited is appropriate for this completion.
* *
* @return Whether the tool tip is appropriate to display. * @return Whether the tool tip is appropriate to display.
*/ */
@@ -66,16 +65,13 @@ public interface ParameterizedCompletion extends Completion {
/** /**
* Constructor. * Constructor.
* *
* @param type * @param type The type of this parameter. This may be <code>null</code> for
* The type of this parameter. This may be * languages without specific types, dynamic typing, etc. Usually
* <code>null</code> for languages without specific types, * you'll pass a String for this value, but you may pass any object
* dynamic typing, etc. Usually you'll pass a String for this * representing a type in your language, as long as its
* value, but you may pass any object representing a type in * <code>toString()</code> method returns a string representation of
* your language, as long as its <code>toString()</code> * the type.
* method * @param name The name of the parameter.
* returns a string representation of the type.
* @param name
* The name of the parameter.
*/ */
public Parameter(Object type, String name) { public Parameter(Object type, String name) {
this(type, name, false); this(type, name, false);
@@ -84,25 +80,19 @@ public interface ParameterizedCompletion extends Completion {
/** /**
* Constructor. * Constructor.
* *
* @param type * @param type The type of this parameter. This may be <code>null</code> for
* The type of this parameter. This may be * languages without specific types, dynamic typing, etc.
* <code>null</code> for languages without specific types, * Usually you'll pass a String for this value, but you may pass
* dynamic typing, etc. Usually you'll pass a String for this * any object representing a type in your language, as long as
* value, but you may pass any object representing a type in * its <code>toString()</code> method returns a string
* your language, as long as its <code>toString()</code> * representation of the type.
* method * @param name The name of the parameter.
* returns a string representation of the type. * @param endParam Whether this parameter is an "ending parameter;" that is,
* @param name * whether this parameter is at a logical "ending point" in the
* The name of the parameter. * completion text. If the user types in a parameter that is an
* @param endParam * ending point, parameter completion mode terminates. Set this
* Whether this parameter is an "ending parameter;" * to <code>true</code> for a trailing parameter after a
* that is, whether this parameter is at a logical "ending * function call's closing ')', for example.
* point" in the completion text. If the user types in a
* parameter that is an ending point, parameter completion
* mode
* terminates. Set this to <code>true</code> for a trailing
* parameter after a function call's closing ')', for
* example.
*/ */
public Parameter(Object type, String name, boolean endParam) { public Parameter(Object type, String name, boolean endParam) {
this.name = name; this.name = name;
@@ -137,11 +127,10 @@ public interface ParameterizedCompletion extends Completion {
} }
/** /**
* @return Whether this parameter is an "ending parameter;" * @return Whether this parameter is an "ending parameter;" that is, whether
* that is, whether this parameter is at a logical "ending * this parameter is at a logical "ending point" in the completion text.
* point" in the completion text. If the user types in a * If the user types in a parameter that is an ending point, parameter
* parameter that is an ending point, parameter completion mode * completion mode terminates.
* terminates.
*/ */
public boolean isEndParam() { public boolean isEndParam() {
return isEndParam; return isEndParam;
@@ -28,11 +28,11 @@ import javax.swing.text.JTextComponent;
import org.fife.ui.rsyntaxtextarea.PopupWindowDecorator; import org.fife.ui.rsyntaxtextarea.PopupWindowDecorator;
/** /**
* A small popup window offering a list of likely choices for a parameter * A small popup window offering a list of likely choices for a parameter when
* when the user has code-completed a parameterized completion. For example, * the user has code-completed a parameterized completion. For example, if they
* if they have just code-completed the C function "<code>fprintf</code>", * have just code-completed the C function "<code>fprintf</code>", when entering
* when entering the file name, this popup might display all local variables * the file name, this popup might display all local variables of type
* of type "<code>char *</code>". * "<code>char *</code>".
* *
* @author Robert Futrell * @author Robert Futrell
* @version 1.0 * @version 1.0
@@ -60,22 +60,20 @@ public class ParameterizedCompletionChoicesWindow extends JWindow {
*/ */
private JScrollPane sp; private JScrollPane sp;
/** /**
* Comparator used to sort completions by their relevance before sorting * Comparator used to sort completions by their relevance before sorting them
* them lexicographically. * lexicographically.
*/ */
private static final Comparator<Completion> sortByRelevanceComparator = new SortByRelevanceComparator(); private static final Comparator<Completion> sortByRelevanceComparator = new SortByRelevanceComparator();
/** /**
* Constructor. * Constructor.
* *
* @param parent * @param parent The parent window (hosting the text component).
* The parent window (hosting the text component). * @param ac The auto-completion instance.
* @param ac * @param context The completion context.
* The auto-completion instance.
* @param context
* The completion context.
*/ */
public ParameterizedCompletionChoicesWindow(Window parent, AutoCompletion ac, final ParameterizedCompletionContext context) { public ParameterizedCompletionChoicesWindow(Window parent, AutoCompletion ac,
final ParameterizedCompletionContext context) {
super(parent); super(parent);
this.ac = ac; this.ac = ac;
ComponentOrientation o = ac.getTextComponentOrientation(); ComponentOrientation o = ac.getTextComponentOrientation();
@@ -107,8 +105,7 @@ public class ParameterizedCompletionChoicesWindow extends JWindow {
/** /**
* Returns the selected value. * Returns the selected value.
* *
* @return The selected value, or <code>null</code> if nothing is * @return The selected value, or <code>null</code> if nothing is selected.
* selected.
*/ */
public String getSelectedChoice() { public String getSelectedChoice() {
Completion c = (Completion) list.getSelectedValue(); Completion c = (Completion) list.getSelectedValue();
@@ -118,8 +115,7 @@ public class ParameterizedCompletionChoicesWindow extends JWindow {
/** /**
* Changes the selected index. * Changes the selected index.
* *
* @param amount * @param amount The amount by which to change the selected index.
* The amount by which to change the selected index.
*/ */
public void incSelection(int amount) { public void incSelection(int amount) {
int selection = list.getSelectedIndex(); int selection = list.getSelectedIndex();
@@ -135,12 +131,10 @@ public class ParameterizedCompletionChoicesWindow extends JWindow {
} }
/** /**
* Initializes this window to offer suggestions for the parameters of * Initializes this window to offer suggestions for the parameters of a specific
* a specific completion. * completion.
* *
* @param pc * @param pc The completion whose parameters we should offer suggestions for.
* The completion whose parameters we should offer suggestions
* for.
*/ */
public void initialize(ParameterizedCompletion pc) { public void initialize(ParameterizedCompletion pc) {
CompletionProvider provider = pc.getProvider(); CompletionProvider provider = pc.getProvider();
@@ -162,8 +156,7 @@ public class ParameterizedCompletionChoicesWindow extends JWindow {
/** /**
* Sets the location of this window relative to the given rectangle. * Sets the location of this window relative to the given rectangle.
* *
* @param r * @param r The visual position of the caret (in screen coordinates).
* The visual position of the caret (in screen coordinates).
*/ */
public void setLocationRelativeTo(Rectangle r) { public void setLocationRelativeTo(Rectangle r) {
// Multi-monitor support - make sure the completion window (and // Multi-monitor support - make sure the completion window (and
@@ -189,16 +182,14 @@ public class ParameterizedCompletionChoicesWindow extends JWindow {
} }
/** /**
* Displays the choices for the specified parameter matching the given * Displays the choices for the specified parameter matching the given text.
* text. This will display or hide this popup window as necessary. * This will display or hide this popup window as necessary.
* *
* @param param * @param param The index of the parameter the caret is currently in. This may
* The index of the parameter the caret is currently in. * be <code>-1</code> if not in a parameter (i.e., on the comma
* This may be <code>-1</code> if not in a parameter (i.e., on * between parameters).
* the comma between parameters). * @param prefix Text in the parameter before the dot. This may be
* @param prefix * <code>null</code> to represent the empty string.
* Text in the parameter before the dot. This may
* be <code>null</code> to represent the empty string.
*/ */
public void setParameter(int param, String prefix) { public void setParameter(int param, String prefix) {
model.clear(); model.clear();
@@ -254,8 +245,7 @@ public class ParameterizedCompletionChoicesWindow extends JWindow {
/** /**
* Toggles the visibility of this popup window. * Toggles the visibility of this popup window.
* *
* @param visible * @param visible Whether this window should be visible.
* Whether this window should be visible.
*/ */
@Override @Override
public void setVisible(boolean visible) { public void setVisible(boolean visible) {
@@ -48,8 +48,8 @@ import org.fife.ui.rtextarea.ChangeableHighlightPainter;
/** /**
* Manages UI and state specific to parameterized completions - the parameter * Manages UI and state specific to parameterized completions - the parameter
* description tool tip, the parameter completion choices list, the actual * description tool tip, the parameter completion choices list, the actual
* highlights in the editor, etc. This component installs new key bindings * highlights in the editor, etc. This component installs new key bindings when
* when appropriate to allow the user to cycle through the parameters of the * appropriate to allow the user to cycle through the parameters of the
* completion, and optionally cycle through completion choices for those * completion, and optionally cycle through completion choices for those
* parameters. * parameters.
* *
@@ -95,13 +95,13 @@ class ParameterizedCompletionContext {
*/ */
private Listener listener; private Listener listener;
/** /**
* The minimum offset into the document that the caret can move to * The minimum offset into the document that the caret can move to before this
* before this tool tip disappears. * tool tip disappears.
*/ */
private int minPos; private int minPos;
/** /**
* The maximum offset into the document that the caret can move to * The maximum offset into the document that the caret can move to before this
* before this tool tip disappears. * tool tip disappears.
*/ */
private Position maxPos; // Moves with text inserted. private Position maxPos; // Moves with text inserted.
private Position defaultEndOffs; private Position defaultEndOffs;
@@ -208,8 +208,7 @@ class ParameterizedCompletionContext {
} }
/** /**
* Hides any popup windows and terminates parameterized completion * Hides any popup windows and terminates parameterized completion assistance.
* assistance.
* *
* @see #activate() * @see #activate()
*/ */
@@ -228,13 +227,11 @@ class ParameterizedCompletionContext {
} }
/** /**
* Returns the text inserted for the parameter containing the specified * Returns the text inserted for the parameter containing the specified offset.
* offset.
* *
* @param offs * @param offs The offset into the document.
* The offset into the document. * @return The text of the parameter containing the offset, or <code>null</code>
* @return The text of the parameter containing the offset, or * if the offset is not in a parameter.
* <code>null</code> if the offset is not in a parameter.
*/ */
public String getArgumentText(int offs) { public String getArgumentText(int offs) {
List<Highlight> paramHighlights = getParameterHighlights(); List<Highlight> paramHighlights = getParameterHighlights();
@@ -262,8 +259,8 @@ class ParameterizedCompletionContext {
/** /**
* Returns the highlight of the current parameter. * Returns the highlight of the current parameter.
* *
* @return The current parameter's highlight, or <code>null</code> if * @return The current parameter's highlight, or <code>null</code> if the caret
* the caret is not in a parameter's bounds. * is not in a parameter's bounds.
* @see #getCurrentParameterStartOffset() * @see #getCurrentParameterStartOffset()
*/ */
private Highlight getCurrentParameterHighlight() { private Highlight getCurrentParameterHighlight() {
@@ -300,8 +297,8 @@ class ParameterizedCompletionContext {
/** /**
* Returns the starting offset of the current parameter. * Returns the starting offset of the current parameter.
* *
* @return The current parameter's starting offset, or <code>-1</code> if * @return The current parameter's starting offset, or <code>-1</code> if the
* the caret is not in a parameter's bounds. * caret is not in a parameter's bounds.
* @see #getCurrentParameterHighlight() * @see #getCurrentParameterHighlight()
*/ */
private int getCurrentParameterStartOffset() { private int getCurrentParameterStartOffset() {
@@ -310,13 +307,12 @@ class ParameterizedCompletionContext {
} }
/** /**
* Returns the highlight from a list that comes "first" in a list. Even * Returns the highlight from a list that comes "first" in a list. Even though
* though most parameter highlights are ordered, sometimes they aren't * most parameter highlights are ordered, sometimes they aren't (e.g. the
* (e.g. the "cursor" parameter in a template completion is always last, * "cursor" parameter in a template completion is always last, even though it
* even though it can be anywhere in the template). * can be anywhere in the template).
* *
* @param highlights * @param highlights The list of highlights. Assumed to be non-empty.
* The list of highlights. Assumed to be non-empty.
* @return The highlight that comes first in the document. * @return The highlight that comes first in the document.
* @see #getLastHighlight(List) * @see #getLastHighlight(List)
*/ */
@@ -334,13 +330,12 @@ class ParameterizedCompletionContext {
} }
/** /**
* Returns the highlight from a list that comes "last" in that list. Even * Returns the highlight from a list that comes "last" in that list. Even though
* though most parameter highlights are ordered, sometimes they aren't * most parameter highlights are ordered, sometimes they aren't (e.g. the
* (e.g. the "cursor" parameter in a template completion is always last, * "cursor" parameter in a template completion is always last, even though it
* even though it can be anywhere in the template. * can be anywhere in the template.
* *
* @param highlights * @param highlights The list of highlights. Assumed to be non-empty.
* The list of highlights. Assumed to be non-empty.
* @return The highlight that comes last in the document. * @return The highlight that comes last in the document.
* @see #getFirstHighlight(List) * @see #getFirstHighlight(List)
*/ */
@@ -373,8 +368,8 @@ class ParameterizedCompletionContext {
/** /**
* Inserts the choice selected in the parameter choices window. * Inserts the choice selected in the parameter choices window.
* *
* @return Whether the choice was inserted. This will be <code>false</code> * @return Whether the choice was inserted. This will be <code>false</code> if
* if the window is not visible, or no choice is selected. * the window is not visible, or no choice is selected.
*/ */
boolean insertSelectedChoice() { boolean insertSelectedChoice() {
if (paramChoicesWindow != null && paramChoicesWindow.isVisible()) { if (paramChoicesWindow != null && paramChoicesWindow.isVisible()) {
@@ -398,8 +393,8 @@ class ParameterizedCompletionContext {
} }
/** /**
* Installs key bindings on the text component that facilitate the user * Installs key bindings on the text component that facilitate the user editing
* editing this completion's parameters. * this completion's parameters.
* *
* @see #uninstallKeyBindings() * @see #uninstallKeyBindings()
*/ */
@@ -507,8 +502,8 @@ class ParameterizedCompletionContext {
List<Highlight> highlights = getParameterHighlights(); List<Highlight> highlights = getParameterHighlights();
for (int i = 0; i < highlights.size(); i++) { for (int i = 0; i < highlights.size(); i++) {
Highlight h = highlights.get(i); Highlight h = highlights.get(i);
if (currentPrev == null || currentPrev.getStartOffset() >= dot if (currentPrev == null || currentPrev.getStartOffset() >= dot || (h.getStartOffset() < selStart
|| (h.getStartOffset() < selStart && (h.getStartOffset() > currentPrev.getStartOffset() || pos == lastSelectedParam))) { && (h.getStartOffset() > currentPrev.getStartOffset() || pos == lastSelectedParam))) {
currentPrev = h; currentPrev = h;
pos = i; pos = i;
} }
@@ -613,17 +608,14 @@ class ParameterizedCompletionContext {
} }
/** /**
* Replaces highlighted text with new text. Takes special care so that * Replaces highlighted text with new text. Takes special care so that the
* the highlight stays just around the newly-highlighted text, since * highlight stays just around the newly-highlighted text, since Swing's
* Swing's <code>Highlight</code> classes are funny about insertions at * <code>Highlight</code> classes are funny about insertions at their start
* their start offsets. * offsets.
* *
* @param doc * @param doc The document.
* The document. * @param h The highlight whose text to change.
* @param h * @param replacement The new text to be in the highlight.
* The highlight whose text to change.
* @param replacement
* The new text to be in the highlight.
* @return The replacement highlight for <code>h</code>. * @return The replacement highlight for <code>h</code>.
*/ */
private Highlight replaceHighlightedText(Document doc, Highlight h, String replacement) { private Highlight replaceHighlightedText(Document doc, Highlight h, String replacement) {
@@ -684,9 +676,8 @@ class ParameterizedCompletionContext {
} }
/** /**
* Updates the text in the tool tip to have the current parameter * Updates the text in the tool tip to have the current parameter displayed in
* displayed in bold. The "current parameter" is determined from the * bold. The "current parameter" is determined from the current caret position.
* current caret position.
* *
* @return The "prefix" of text in the caret's parameter before the caret. * @return The "prefix" of text in the caret's parameter before the caret.
*/ */
@@ -779,8 +770,8 @@ class ParameterizedCompletionContext {
} }
/** /**
* Called when the user types the character marking the closing of the * Called when the user types the character marking the closing of the parameter
* parameter list, such as '<code>)</code>'. * list, such as '<code>)</code>'.
*/ */
private class ClosingAction extends AbstractAction { private class ClosingAction extends AbstractAction {
@@ -846,8 +837,8 @@ class ParameterizedCompletionContext {
} }
/** /**
* Listens for various events in the text component while this tool tip * Listens for various events in the text component while this tool tip is
* is visible. * visible.
*/ */
private class Listener implements FocusListener, CaretListener, DocumentListener { private class Listener implements FocusListener, CaretListener, DocumentListener {
@@ -856,8 +847,7 @@ class ParameterizedCompletionContext {
/** /**
* Called when the text component's caret moves. * Called when the text component's caret moves.
* *
* @param e * @param e The event.
* The event.
*/ */
@Override @Override
public void caretUpdate(CaretEvent e) { public void caretUpdate(CaretEvent e) {
@@ -877,13 +867,13 @@ class ParameterizedCompletionContext {
} }
@Override @Override
public void changedUpdate(DocumentEvent e) {} public void changedUpdate(DocumentEvent e) {
}
/** /**
* Called when the text component gains focus. * Called when the text component gains focus.
* *
* @param e * @param e The event.
* The event.
*/ */
@Override @Override
public void focusGained(FocusEvent e) { public void focusGained(FocusEvent e) {
@@ -893,8 +883,7 @@ class ParameterizedCompletionContext {
/** /**
* Called when the text component loses focus. * Called when the text component loses focus.
* *
* @param e * @param e The event.
* The event.
*/ */
@Override @Override
public void focusLost(FocusEvent e) { public void focusLost(FocusEvent e) {
@@ -923,8 +912,7 @@ class ParameterizedCompletionContext {
/** /**
* Installs this listener onto a text component. * Installs this listener onto a text component.
* *
* @param tc * @param tc The text component to install onto.
* The text component to install onto.
* @see #uninstall() * @see #uninstall()
*/ */
public void install(JTextComponent tc) { public void install(JTextComponent tc) {
@@ -950,7 +938,8 @@ class ParameterizedCompletionContext {
} }
for (int i = 0; i < info.getReplacementCopyCount(); i++) { for (int i = 0; i < info.getReplacementCopyCount(); i++) {
ReplacementCopy rc = info.getReplacementCopy(i); ReplacementCopy rc = info.getReplacementCopy(i);
paramCopyInfos.add(new ParamCopyInfo(rc.getId(), (Highlight) h.addHighlight(rc.getStart(), rc.getEnd(), paramCopyP))); paramCopyInfos.add(new ParamCopyInfo(rc.getId(),
(Highlight) h.addHighlight(rc.getStart(), rc.getEnd(), paramCopyP)));
} }
// Go back and start at the first parameter. // Go back and start at the first parameter.
tc.setCaretPosition(info.getSelectionStart()); tc.setCaretPosition(info.getSelectionStart());
@@ -1007,8 +996,8 @@ class ParameterizedCompletionContext {
} }
/** /**
* Action performed when the user presses the up or down arrow keys and * Action performed when the user presses the up or down arrow keys and the
* the parameter completion choices popup is visible. * parameter completion choices popup is visible.
*/ */
private class NextChoiceAction extends AbstractAction { private class NextChoiceAction extends AbstractAction {
@@ -45,19 +45,17 @@ class ParameterizedCompletionDescriptionToolTip {
/** /**
* Constructor. * Constructor.
* *
* @param owner * @param owner The parent window.
* The parent window. * @param ac The parent auto-completion.
* @param ac * @param pc The completion being described.
* The parent auto-completion.
* @param pc
* The completion being described.
*/ */
public ParameterizedCompletionDescriptionToolTip(Window owner, ParameterizedCompletionContext context, AutoCompletion ac, public ParameterizedCompletionDescriptionToolTip(Window owner, ParameterizedCompletionContext context,
ParameterizedCompletion pc) { AutoCompletion ac, ParameterizedCompletion pc) {
tooltip = new JWindow(owner); tooltip = new JWindow(owner);
this.pc = pc; this.pc = pc;
descLabel = new JLabel(); descLabel = new JLabel();
descLabel.setBorder(BorderFactory.createCompoundBorder(TipUtil.getToolTipBorder(), BorderFactory.createEmptyBorder(2, 5, 2, 5))); descLabel.setBorder(BorderFactory.createCompoundBorder(TipUtil.getToolTipBorder(),
BorderFactory.createEmptyBorder(2, 5, 2, 5)));
descLabel.setOpaque(true); descLabel.setOpaque(true);
descLabel.setBackground(TipUtil.getToolTipBackground()); descLabel.setBackground(TipUtil.getToolTipBackground());
// It appears that if a JLabel is set as a content pane directly, when // It appears that if a JLabel is set as a content pane directly, when
@@ -91,8 +89,7 @@ class ParameterizedCompletionDescriptionToolTip {
/** /**
* Sets the location of this tool tip relative to the given rectangle. * Sets the location of this tool tip relative to the given rectangle.
* *
* @param r * @param r The visual position of the caret (in screen coordinates).
* The visual position of the caret (in screen coordinates).
*/ */
public void setLocationRelativeTo(Rectangle r) { public void setLocationRelativeTo(Rectangle r) {
// Multi-monitor support - make sure the completion window (and // Multi-monitor support - make sure the completion window (and
@@ -123,8 +120,7 @@ class ParameterizedCompletionDescriptionToolTip {
/** /**
* Toggles the visibility of this tool tip. * Toggles the visibility of this tool tip.
* *
* @param visible * @param visible Whether this tool tip should be visible.
* Whether this tool tip should be visible.
* @see #isVisible() * @see #isVisible()
*/ */
public void setVisible(boolean visible) { public void setVisible(boolean visible) {
@@ -132,11 +128,10 @@ class ParameterizedCompletionDescriptionToolTip {
} }
/** /**
* Updates the text in the tool tip to have the current parameter * Updates the text in the tool tip to have the current parameter displayed in
* displayed in bold. * bold.
* *
* @param selectedParam * @param selectedParam The index of the selected parameter.
* The index of the selected parameter.
* @return Whether the text needed to be updated. * @return Whether the text needed to be updated.
*/ */
public boolean updateText(int selectedParam) { public boolean updateText(int selectedParam) {
@@ -172,8 +167,7 @@ class ParameterizedCompletionDescriptionToolTip {
} }
/** /**
* Updates the <tt>LookAndFeel</tt> of this window and the description * Updates the <tt>LookAndFeel</tt> of this window and the description window.
* window.
*/ */
public void updateUI() { public void updateUI() {
SwingUtilities.updateComponentTreeUI(tooltip); SwingUtilities.updateComponentTreeUI(tooltip);
@@ -44,13 +44,11 @@ class ParameterizedCompletionInsertionInfo {
} }
/** /**
* Marks a region of the replacement text as representing a variable name * Marks a region of the replacement text as representing a variable name or
* or some other construct that the user should replace. * some other construct that the user should replace.
* *
* @param start * @param start The start offset.
* The start offset. * @param end The end offset.
* @param end
* The end offset.
* @see #getReplacementCount() * @see #getReplacementCount()
* @see #getReplacementLocation(int) * @see #getReplacementLocation(int)
*/ */
@@ -66,8 +64,8 @@ class ParameterizedCompletionInsertionInfo {
} }
/** /**
* Returns the maximum offset the caret can move to before being outside * Returns the maximum offset the caret can move to before being outside of the
* of the text inserted for this completion. * text inserted for this completion.
* *
* @return The maximum offset. * @return The maximum offset.
* @see #getMinOffset() * @see #getMinOffset()
@@ -77,8 +75,8 @@ class ParameterizedCompletionInsertionInfo {
} }
/** /**
* Returns the minimum offset the caret can move to before being outside * Returns the minimum offset the caret can move to before being outside of the
* of the text inserted for this completion. * text inserted for this completion.
* *
* @return The minimum offset. * @return The minimum offset.
* @see #getMaxOffset() * @see #getMaxOffset()
@@ -105,11 +103,10 @@ class ParameterizedCompletionInsertionInfo {
} }
/** /**
* Returns the starting- and ending-offsets of the replacement regions * Returns the starting- and ending-offsets of the replacement regions in the
* in the completion. * completion.
* *
* @param index * @param index The replacement region.
* The replacement region.
* @return The range in the document of that replacement region. * @return The range in the document of that replacement region.
* @see #getReplacementCount() * @see #getReplacementCount()
*/ */
@@ -118,9 +115,9 @@ class ParameterizedCompletionInsertionInfo {
} }
/** /**
* Returns the offset that should be the end of the initially selected * Returns the offset that should be the end of the initially selected text when
* text when the completion is inserted (i.e., the end offset of the first * the completion is inserted (i.e., the end offset of the first replacement
* replacement region). * region).
* *
* @return The end offset for the initial selection. * @return The end offset for the initial selection.
* @see #getSelectionStart() * @see #getSelectionStart()
@@ -130,9 +127,9 @@ class ParameterizedCompletionInsertionInfo {
} }
/** /**
* Returns the offset that should be the start of the initially selected * Returns the offset that should be the start of the initially selected text
* text when the completion is inserted (i.e., the start offset of the * when the completion is inserted (i.e., the start offset of the first
* first replacement region). * replacement region).
* *
* @return The start offset for the initial selection. * @return The start offset for the initial selection.
* @see #getSelectionEnd() * @see #getSelectionEnd()
@@ -152,8 +149,8 @@ class ParameterizedCompletionInsertionInfo {
} }
/** /**
* Returns whether or not there is an initial selected region for the * Returns whether or not there is an initial selected region for the completion
* completion (i.e., whether the completion actually has any parameters). * (i.e., whether the completion actually has any parameters).
* *
* @return Whether there is a region to initially select for the completion. * @return Whether there is a region to initially select for the completion.
*/ */
@@ -164,10 +161,8 @@ class ParameterizedCompletionInsertionInfo {
/** /**
* Sets the initially selected region for the completion. * Sets the initially selected region for the completion.
* *
* @param selStart * @param selStart The selection start.
* The selection start. * @param selEnd The selection end.
* @param selEnd
* The selection end.
* @see #getSelectionEnd() * @see #getSelectionEnd()
* @see #getSelectionStart() * @see #getSelectionStart()
*/ */
@@ -177,14 +172,12 @@ class ParameterizedCompletionInsertionInfo {
} }
/** /**
* Sets the document range the caret can move around in before being * Sets the document range the caret can move around in before being outside of
* outside of the text inserted for the completion. * the text inserted for the completion.
* *
* @param minOffs * @param minOffs The minimum offset.
* The minimum offset. * @param maxOffs The maximum offset, that will track its location as the
* @param maxOffs * document is modified.
* The maximum offset, that will track its location as the
* document is modified.
* @see #getMinOffset() * @see #getMinOffset()
* @see #getMaxOffset() * @see #getMaxOffset()
*/ */
@@ -200,8 +193,7 @@ class ParameterizedCompletionInsertionInfo {
/** /**
* Sets the text to insert for the completion. * Sets the text to insert for the completion.
* *
* @param text * @param text The text to insert.
* The text to insert.
* @see #getTextToInsert() * @see #getTextToInsert()
*/ */
public void setTextToInsert(String text) { public void setTextToInsert(String text) {
@@ -14,8 +14,8 @@ import javax.swing.Action;
/** /**
* An <code>AutoCompletion</code> that adds the ability to cycle through a set * An <code>AutoCompletion</code> that adds the ability to cycle through a set
* of <code>CompletionProvider</code>s via the trigger key. This allows the * of <code>CompletionProvider</code>s via the trigger key. This allows the
* application to logically "group together" completions of similar kinds; * application to logically "group together" completions of similar kinds; for
* for example, Java code completions vs. template completions. * example, Java code completions vs. template completions.
* <p> * <p>
* *
* Usage: * Usage:
@@ -40,8 +40,7 @@ public class RoundRobinAutoCompletion extends AutoCompletion {
/** /**
* Constructor. * Constructor.
* *
* @param provider * @param provider A single completion provider.
* A single completion provider.
* @see #addCompletionProvider(CompletionProvider) * @see #addCompletionProvider(CompletionProvider)
*/ */
public RoundRobinAutoCompletion(CompletionProvider provider) { public RoundRobinAutoCompletion(CompletionProvider provider) {
@@ -60,23 +59,22 @@ public class RoundRobinAutoCompletion extends AutoCompletion {
} }
/** /**
* Adds an additional <code>CompletionProvider</code> to the list to * Adds an additional <code>CompletionProvider</code> to the list to cycle
* cycle through. * through.
* *
* @param provider * @param provider The new completion provider.
* The new completion provider.
*/ */
public void addCompletionProvider(CompletionProvider provider) { public void addCompletionProvider(CompletionProvider provider) {
cycle.add(provider); cycle.add(provider);
} }
/** /**
* Moves to the next Provider internally. Needs refresh of the popup window * Moves to the next Provider internally. Needs refresh of the popup window to
* to display the changes. * display the changes.
* *
* @return true if the next provider was the default one (thus returned to * @return true if the next provider was the default one (thus returned to the
* the default view). May be used in case you like to hide the * default view). May be used in case you like to hide the popup in this
* popup in this case. * case.
*/ */
public boolean advanceProvider() { public boolean advanceProvider() {
CompletionProvider currentProvider = getCompletionProvider(); CompletionProvider currentProvider = getCompletionProvider();
@@ -106,8 +104,8 @@ public class RoundRobinAutoCompletion extends AutoCompletion {
/** /**
* An implementation of the auto-complete action that ensures the proper * An implementation of the auto-complete action that ensures the proper
* <code>CompletionProvider</code> is displayed based on the context in * <code>CompletionProvider</code> is displayed based on the context in which
* which the user presses the trigger key. * the user presses the trigger key.
*/ */
private class CycleAutoCompleteAction extends AutoCompleteAction { private class CycleAutoCompleteAction extends AutoCompleteAction {
@@ -26,12 +26,9 @@ public class ShorthandCompletion extends BasicCompletion {
/** /**
* Constructor. * Constructor.
* *
* @param provider * @param provider The provider that returns this completion.
* The provider that returns this completion. * @param inputText The text the user inputs to get this completion.
* @param inputText * @param replacementText The replacement text of the completion.
* The text the user inputs to get this completion.
* @param replacementText
* The replacement text of the completion.
*/ */
public ShorthandCompletion(CompletionProvider provider, String inputText, String replacementText) { public ShorthandCompletion(CompletionProvider provider, String inputText, String replacementText) {
super(provider, replacementText); super(provider, replacementText);
@@ -41,18 +38,15 @@ public class ShorthandCompletion extends BasicCompletion {
/** /**
* Constructor. * Constructor.
* *
* @param provider * @param provider The provider that returns this completion.
* The provider that returns this completion. * @param inputText The text the user inputs to get this completion.
* @param inputText * @param replacementText The replacement text of the completion.
* The text the user inputs to get this completion. * @param shortDesc A short description of the completion. This will be
* @param replacementText * displayed in the completion list. This may be
* The replacement text of the completion. * <code>null</code>.
* @param shortDesc
* A short description of the completion. This will be
* displayed in the completion list. This may be
* <code>null</code>.
*/ */
public ShorthandCompletion(CompletionProvider provider, String inputText, String replacementText, String shortDesc) { public ShorthandCompletion(CompletionProvider provider, String inputText, String replacementText,
String shortDesc) {
super(provider, replacementText, shortDesc); super(provider, replacementText, shortDesc);
this.inputText = inputText; this.inputText = inputText;
} }
@@ -60,21 +54,17 @@ public class ShorthandCompletion extends BasicCompletion {
/** /**
* Constructor. * Constructor.
* *
* @param provider * @param provider The provider that returns this completion.
* The provider that returns this completion. * @param inputText The text the user inputs to get this completion.
* @param inputText * @param replacementText The replacement text of the completion.
* The text the user inputs to get this completion. * @param shortDesc A short description of the completion. This will be
* @param replacementText * displayed in the completion list. This may be
* The replacement text of the completion. * <code>null</code>.
* @param shortDesc * @param summary The summary of this completion. This should be HTML.
* A short description of the completion. This will be * This may be <code>null</code>.
* displayed in the completion list. This may be
* <code>null</code>.
* @param summary
* The summary of this completion. This should be HTML.
* This may be <code>null</code>.
*/ */
public ShorthandCompletion(CompletionProvider provider, String inputText, String replacementText, String shortDesc, String summary) { public ShorthandCompletion(CompletionProvider provider, String inputText, String replacementText, String shortDesc,
String summary) {
super(provider, replacementText, shortDesc, summary); super(provider, replacementText, shortDesc, summary);
this.inputText = inputText; this.inputText = inputText;
} }
@@ -93,8 +83,7 @@ public class ShorthandCompletion extends BasicCompletion {
* If a summary has been set, that summary is returned. Otherwise, the * If a summary has been set, that summary is returned. Otherwise, the
* replacement text is returned. * replacement text is returned.
* *
* @return A description of this completion (the text that will be * @return A description of this completion (the text that will be inserted).
* inserted).
* @see #getReplacementText() * @see #getReplacementText()
*/ */
@Override @Override
@@ -104,9 +93,9 @@ public class ShorthandCompletion extends BasicCompletion {
} }
/** /**
* Returns the "body" of the HTML returned by {@link #getSummary()} when * Returns the "body" of the HTML returned by {@link #getSummary()} when no
* no summary text has been set. This is defined to return the replacement * summary text has been set. This is defined to return the replacement text in
* text in a monospaced font. * a monospaced font.
* *
* @return The summary text's body, if no other summary has been defined. * @return The summary text's body, if no other summary has been defined.
* @see #getReplacementText() * @see #getReplacementText()
+9 -12
View File
@@ -51,11 +51,10 @@ class SizeGrip extends JPanel {
} }
/** /**
* Overridden to ensure that the cursor for this component is appropriate * Overridden to ensure that the cursor for this component is appropriate for
* for the orientation. * the orientation.
* *
* @param o * @param o The new orientation.
* The new orientation.
*/ */
@Override @Override
public void applyComponentOrientation(ComponentOrientation o) { public void applyComponentOrientation(ComponentOrientation o) {
@@ -98,8 +97,7 @@ class SizeGrip extends JPanel {
/** /**
* Paints this panel. * Paints this panel.
* *
* @param g * @param g The graphics context.
* The graphics context.
*/ */
@Override @Override
protected void paintComponent(Graphics g) { protected void paintComponent(Graphics g) {
@@ -152,8 +150,7 @@ class SizeGrip extends JPanel {
* Ensures that the cursor for this component is appropriate for the * Ensures that the cursor for this component is appropriate for the
* orientation. * orientation.
* *
* @param ltr * @param ltr Whether the current component orientation is LTR.
* Whether the current component orientation is LTR.
*/ */
protected void possiblyFixCursor(boolean ltr) { protected void possiblyFixCursor(boolean ltr) {
int cursor = Cursor.NE_RESIZE_CURSOR; int cursor = Cursor.NE_RESIZE_CURSOR;
@@ -184,10 +181,10 @@ class SizeGrip extends JPanel {
* appropriately. * appropriately.
*/ */
/* /*
* NOTE: We use SwingUtilities.convertPointToScreen() instead of just using * NOTE: We use SwingUtilities.convertPointToScreen() instead of just using the
* the locations relative to the corner component because the latter proved * locations relative to the corner component because the latter proved buggy -
* buggy - stretch the window too wide and some kind of arithmetic error * stretch the window too wide and some kind of arithmetic error started
* started happening somewhere - our window would grow way too large. * happening somewhere - our window would grow way too large.
*/ */
private class MouseHandler extends MouseInputAdapter { private class MouseHandler extends MouseInputAdapter {
@@ -10,8 +10,8 @@ package org.fife.ui.autocomplete;
import java.util.Comparator; import java.util.Comparator;
/** /**
* Compares two <code>Completion</code>s by their relevance before * Compares two <code>Completion</code>s by their relevance before sorting them
* sorting them lexicographically. * lexicographically.
* *
* @author Robert Futrell * @author Robert Futrell
* @version 1.0 * @version 1.0
@@ -37,12 +37,12 @@ import org.fife.ui.rsyntaxtextarea.RSyntaxUtilities;
* } * }
* </pre> * </pre>
* *
* In the above example, the first <code>${i}</code> is a parameter for the * In the above example, the first <code>${i}</code> is a parameter for the user
* user to type into; all the other <code>${i}</code> instances are * to type into; all the other <code>${i}</code> instances are automatically
* automatically changed to what the user types in the first one. The parameter * changed to what the user types in the first one. The parameter named
* named <code>${cursor}</code> is the "ending position" of the template. It's * <code>${cursor}</code> is the "ending position" of the template. It's where
* where the caret moves after it cycles through all other parameters. If the * the caret moves after it cycles through all other parameters. If the user
* user types into it, template mode terminates. If more than one * types into it, template mode terminates. If more than one
* <code>${cursor}</code> parameter is specified, behavior is undefined. * <code>${cursor}</code> parameter is specified, behavior is undefined.
* <p> * <p>
* *
@@ -51,8 +51,8 @@ import org.fife.ui.rsyntaxtextarea.RSyntaxUtilities;
* fault-tolerant. * fault-tolerant.
* <p> * <p>
* *
* Leading whitespace is automatically added to lines if the template spans * Leading whitespace is automatically added to lines if the template spans more
* more than one line, and if used with a text component using a * than one line, and if used with a text component using a
* <code>PlainDocument</code>, tabs will be converted to spaces if requested. * <code>PlainDocument</code>, tabs will be converted to spaces if requested.
* *
* @author Robert Futrell * @author Robert Futrell
@@ -110,8 +110,8 @@ public class TemplateCompletion extends AbstractCompletion implements Parameteri
} }
/** /**
* Returns <code>null</code>; template completions insert all of their * Returns <code>null</code>; template completions insert all of their text via
* text via <code>getInsertionInfo()</code>. * <code>getInsertionInfo()</code>.
* *
* @return <code>null</code> always. * @return <code>null</code> always.
*/ */
@@ -234,8 +234,7 @@ public class TemplateCompletion extends AbstractCompletion implements Parameteri
/** /**
* Returns whether a parameter is already defined with a specific name. * Returns whether a parameter is already defined with a specific name.
* *
* @param name * @param name The name.
* The name.
* @return Whether a parameter is defined with that name. * @return Whether a parameter is defined with that name.
*/ */
private boolean isParamDefined(String name) { private boolean isParamDefined(String name) {
@@ -251,8 +250,7 @@ public class TemplateCompletion extends AbstractCompletion implements Parameteri
/** /**
* Parses a template string into logical pieces used by this class. * Parses a template string into logical pieces used by this class.
* *
* @param template * @param template The template to parse.
* The template to parse.
*/ */
private void parse(String template) { private void parse(String template) {
int offs = 0; int offs = 0;
@@ -260,23 +258,23 @@ public class TemplateCompletion extends AbstractCompletion implements Parameteri
while ((offs = template.indexOf('$', lastOffs)) > -1 && offs < template.length() - 1) { while ((offs = template.indexOf('$', lastOffs)) > -1 && offs < template.length() - 1) {
char next = template.charAt(offs + 1); char next = template.charAt(offs + 1);
switch (next) { switch (next) {
case '$': // "$$" => escaped single dollar sign case '$': // "$$" => escaped single dollar sign
addTemplatePiece(new TemplatePiece.Text(template.substring(lastOffs, offs + 1))); addTemplatePiece(new TemplatePiece.Text(template.substring(lastOffs, offs + 1)));
lastOffs = offs + 2; lastOffs = offs + 2;
break; break;
case '{': // "${...}" => variable case '{': // "${...}" => variable
int closingCurly = template.indexOf('}', offs + 2); int closingCurly = template.indexOf('}', offs + 2);
if (closingCurly > -1) { if (closingCurly > -1) {
addTemplatePiece(new TemplatePiece.Text(template.substring(lastOffs, offs))); addTemplatePiece(new TemplatePiece.Text(template.substring(lastOffs, offs)));
String varName = template.substring(offs + 2, closingCurly); String varName = template.substring(offs + 2, closingCurly);
if (!"cursor".equals(varName) && isParamDefined(varName)) { if (!"cursor".equals(varName) && isParamDefined(varName)) {
addTemplatePiece(new TemplatePiece.ParamCopy(varName)); addTemplatePiece(new TemplatePiece.ParamCopy(varName));
} else { } else {
addTemplatePiece(new TemplatePiece.Param(varName)); addTemplatePiece(new TemplatePiece.Param(varName));
}
lastOffs = closingCurly + 1;
} }
break; lastOffs = closingCurly + 1;
}
break;
} }
} }
if (lastOffs < template.length()) { if (lastOffs < template.length()) {
@@ -319,8 +317,7 @@ public class TemplateCompletion extends AbstractCompletion implements Parameteri
/** /**
* Sets the short description of this template completion. * Sets the short description of this template completion.
* *
* @param shortDesc * @param shortDesc The new short description.
* The new short description.
* @see #getShortDescription() * @see #getShortDescription()
*/ */
public void setShortDescription(String shortDesc) { public void setShortDescription(String shortDesc) {
@@ -7,8 +7,8 @@
package org.fife.ui.autocomplete; package org.fife.ui.autocomplete;
/** /**
* A piece of a <code>TemplateCompletion</code>. You add instances of this * A piece of a <code>TemplateCompletion</code>. You add instances of this class
* class to template completions to define them. * to template completions to define them.
* *
* @author Robert Futrell * @author Robert Futrell
* @version 1.0 * @version 1.0
+17 -18
View File
@@ -22,16 +22,17 @@ import javax.swing.text.html.HTMLDocument;
* Static utility methods for homemade tool tips. * Static utility methods for homemade tool tips.
* <p> * <p>
* *
* This is blatantly ripped off from RSyntaxTextArea's "FocusableTips" class * This is blatantly ripped off from RSyntaxTextArea's "FocusableTips" class of
* of the same name, but isn't re-used to prevent a hard dependency on the * the same name, but isn't re-used to prevent a hard dependency on the RSTA
* RSTA library. * library.
* *
* @author Robert Futrell * @author Robert Futrell
* @version 1.0 * @version 1.0
*/ */
class TipUtil { class TipUtil {
private TipUtil() {} private TipUtil() {
}
/** /**
* Returns the default background color to use for tool tip windows. * Returns the default background color to use for tool tip windows.
@@ -73,17 +74,16 @@ class TipUtil {
} }
/** /**
* Returns whether a color is a Nimbus DerivedColor, which is troublesome * Returns whether a color is a Nimbus DerivedColor, which is troublesome in
* in that it doesn't use its RGB values (uses HSB instead?) and so * that it doesn't use its RGB values (uses HSB instead?) and so querying them
* querying them is useless. * is useless.
* *
* @param c * @param c The color to check.
* The color to check.
* @return Whether it is a DerivedColor * @return Whether it is a DerivedColor
*/ */
private static final boolean isDerivedColor(Color c) { private static final boolean isDerivedColor(Color c) {
return c != null return c != null && (c.getClass().getName().endsWith(".DerivedColor")
&& (c.getClass().getName().endsWith(".DerivedColor") || c.getClass().getName().endsWith(".DerivedColor$UIResource")); || c.getClass().getName().endsWith(".DerivedColor$UIResource"));
} }
/** /**
@@ -96,12 +96,11 @@ class TipUtil {
} }
/** /**
* Tweaks a <code>JEditorPane</code> so it can be used to render the * Tweaks a <code>JEditorPane</code> so it can be used to render the content in
* content in a focusable pseudo-tool tip. It is assumed that the editor * a focusable pseudo-tool tip. It is assumed that the editor pane is using an
* pane is using an <code>HTMLDocument</code>. * <code>HTMLDocument</code>.
* *
* @param textArea * @param textArea The editor pane to tweak.
* The editor pane to tweak.
*/ */
public static void tweakTipEditorPane(JEditorPane textArea) { public static void tweakTipEditorPane(JEditorPane textArea) {
// Jump through a few hoops to get things looking nice in Nimbus // Jump through a few hoops to get things looking nice in Nimbus
@@ -134,8 +133,8 @@ class TipUtil {
font = new Font("SansSerif", Font.PLAIN, 12); font = new Font("SansSerif", Font.PLAIN, 12);
} }
HTMLDocument doc = (HTMLDocument) textArea.getDocument(); HTMLDocument doc = (HTMLDocument) textArea.getDocument();
doc.getStyleSheet().addRule("body { font-family: " + font.getFamily() + "; font-size: " + font.getSize() + "pt" + "; color: " doc.getStyleSheet().addRule("body { font-family: " + font.getFamily() + "; font-size: " + font.getSize() + "pt"
+ Util.getHexString(fg) + "; }"); + "; color: " + Util.getHexString(fg) + "; }");
// Always add link foreground rule. Unfortunately these CSS rules // Always add link foreground rule. Unfortunately these CSS rules
// stack each time the LaF is changed (how can we overwrite them // stack each time the LaF is changed (how can we overwrite them
// without clearing out the important "standard" ones?). // without clearing out the important "standard" ones?).
+47 -55
View File
@@ -30,29 +30,29 @@ import org.fife.ui.rsyntaxtextarea.PopupWindowDecorator;
public class Util { public class Util {
/** /**
* If a system property is defined with this name and set, ignoring case, * If a system property is defined with this name and set, ignoring case, to
* to <code>true</code>, this library will not attempt to use Substance * <code>true</code>, this library will not attempt to use Substance renderers.
* renderers. Otherwise, if a Substance Look and Feel is installed, we * Otherwise, if a Substance Look and Feel is installed, we will attempt to use
* will attempt to use Substance cell renderers in all of our dropdowns. * Substance cell renderers in all of our dropdowns.
* <p> * <p>
* *
* Note that we do not have a build dependency on Substance, so all access * Note that we do not have a build dependency on Substance, so all access to
* to Substance stuff is done via reflection. We will fall back onto * Substance stuff is done via reflection. We will fall back onto default
* default renderers if something goes horribly wrong. * renderers if something goes horribly wrong.
*/ */
public static final String PROPERTY_DONT_USE_SUBSTANCE_RENDERERS = "org.fife.ui.autocomplete.DontUseSubstanceRenderers"; public static final String PROPERTY_DONT_USE_SUBSTANCE_RENDERERS = "org.fife.ui.autocomplete.DontUseSubstanceRenderers";
/** /**
* If this system property is <code>true</code>, then even the "main" two * If this system property is <code>true</code>, then even the "main" two
* auto-complete windows will allow window decorations via * auto-complete windows will allow window decorations via
* {@link PopupWindowDecorator}. If this property is undefined or * {@link PopupWindowDecorator}. If this property is undefined or
* <code>false</code>, they won't honor such decorations. This is due to * <code>false</code>, they won't honor such decorations. This is due to certain
* certain performance issues with translucent windows (used for drop * performance issues with translucent windows (used for drop shadows), even as
* shadows), even as of Java 7u2. * of Java 7u2.
*/ */
public static final String PROPERTY_ALLOW_DECORATED_AUTOCOMPLETE_WINDOWS = "org.fife.ui.autocomplete.allowDecoratedAutoCompleteWindows"; public static final String PROPERTY_ALLOW_DECORATED_AUTOCOMPLETE_WINDOWS = "org.fife.ui.autocomplete.allowDecoratedAutoCompleteWindows";
/** /**
* Used for the color of hyperlinks when a LookAndFeel uses light text * Used for the color of hyperlinks when a LookAndFeel uses light text against a
* against a dark background. * dark background.
*/ */
private static final Color LIGHT_HYPERLINK_FG = new Color(0xd8ffff); private static final Color LIGHT_HYPERLINK_FG = new Color(0xd8ffff);
private static final Pattern TAG_PATTERN = Pattern.compile("<[^>]*>"); private static final Pattern TAG_PATTERN = Pattern.compile("<[^>]*>");
@@ -64,11 +64,10 @@ public class Util {
/** /**
* Attempts to open a web browser to the specified URI. * Attempts to open a web browser to the specified URI.
* *
* @param uri * @param uri The URI to open. If this is <code>null</code>, nothing happens and
* The URI to open. If this is <code>null</code>, nothing * this method returns <code>false</code>.
* happens and this method returns <code>false</code>. * @return Whether the operation was successful. This will be <code>false</code>
* @return Whether the operation was successful. This will be * on JRE's older than 1.6.
* <code>false</code> on JRE's older than 1.6.
*/ */
public static boolean browse(URI uri) { public static boolean browse(URI uri) {
boolean success = false; boolean success = false;
@@ -91,8 +90,8 @@ public class Util {
/** /**
* Returns the singleton <code>java.awt.Desktop</code> instance, or * Returns the singleton <code>java.awt.Desktop</code> instance, or
* <code>null</code> if it is unsupported on this platform (or the JRE * <code>null</code> if it is unsupported on this platform (or the JRE is older
* is older than 1.6). * than 1.6).
* *
* @return The desktop, as an {@link Object}. * @return The desktop, as an {@link Object}.
*/ */
@@ -121,10 +120,9 @@ public class Util {
/** /**
* Returns a hex string for the specified color, suitable for HTML. * Returns a hex string for the specified color, suitable for HTML.
* *
* @param c * @param c The color.
* The color. * @return The string representation, in the form "<code>#rrggbb</code>", or
* @return The string representation, in the form "<code>#rrggbb</code>", * <code>null</code> if <code>c</code> is <code>null</code>.
* or <code>null</code> if <code>c</code> is <code>null</code>.
*/ */
public static String getHexString(Color c) { public static String getHexString(Color c) {
if (c == null) { if (c == null) {
@@ -152,10 +150,10 @@ public class Util {
} }
/** /**
* Returns the color to use for hyperlink-style components. This method * Returns the color to use for hyperlink-style components. This method will
* will return <code>Color.blue</code> unless it appears that the current * return <code>Color.blue</code> unless it appears that the current LookAndFeel
* LookAndFeel uses light text on a dark background, in which case a * uses light text on a dark background, in which case a brighter alternative is
* brighter alternative is returned. * returned.
* *
* @return The color to use for hyperlinks. * @return The color to use for hyperlinks.
*/ */
@@ -170,14 +168,12 @@ public class Util {
} }
/** /**
* Returns the screen coordinates for the monitor that contains the * Returns the screen coordinates for the monitor that contains the specified
* specified point. This is useful for setups with multiple monitors, * point. This is useful for setups with multiple monitors, to ensure that popup
* to ensure that popup windows are positioned properly. * windows are positioned properly.
* *
* @param x * @param x The x-coordinate, in screen coordinates.
* The x-coordinate, in screen coordinates. * @param y The y-coordinate, in screen coordinates.
* @param y
* The y-coordinate, in screen coordinates.
* @return The bounds of the monitor that contains the specified point. * @return The bounds of the monitor that contains the specified point.
*/ */
public static Rectangle getScreenBoundsForPoint(int x, int y) { public static Rectangle getScreenBoundsForPoint(int x, int y) {
@@ -195,10 +191,10 @@ public class Util {
} }
/** /**
* Give apps a chance to decorate us with drop shadows, etc. Since very * Give apps a chance to decorate us with drop shadows, etc. Since very scrolly
* scrolly things such as lists (of e.g. completions) are *very* slow when * things such as lists (of e.g. completions) are *very* slow when in per-pixel
* in per-pixel translucent windows, even as of Java 7u2, we force the user * translucent windows, even as of Java 7u2, we force the user to specify an
* to specify an extra option for the two "main" auto-complete windows. * extra option for the two "main" auto-complete windows.
* *
* @return Whether to allow decorating the main auto-complete windows. * @return Whether to allow decorating the main auto-complete windows.
* @see #PROPERTY_ALLOW_DECORATED_AUTOCOMPLETE_WINDOWS * @see #PROPERTY_ALLOW_DECORATED_AUTOCOMPLETE_WINDOWS
@@ -212,10 +208,10 @@ public class Util {
} }
/** /**
* Returns whether we should attempt to use Substance cell renderers and * Returns whether we should attempt to use Substance cell renderers and styles
* styles for things such as completion choices, if a Substance Look and * for things such as completion choices, if a Substance Look and Feel is
* Feel is installed. If this is <code>false</code>, we'll use our * installed. If this is <code>false</code>, we'll use our standard rendering
* standard rendering for completions, even when Substance is being used. * for completions, even when Substance is being used.
* *
* @return Whether to use Substance renderers if Substance is installed. * @return Whether to use Substance renderers if Substance is installed.
*/ */
@@ -224,12 +220,11 @@ public class Util {
} }
/** /**
* Returns whether the specified color is "light" to use as a foreground. * Returns whether the specified color is "light" to use as a foreground. Colors
* Colors that return <code>true</code> indicate that the current Look and * that return <code>true</code> indicate that the current Look and Feel
* Feel probably uses light text colors on a dark background. * probably uses light text colors on a dark background.
* *
* @param fg * @param fg The foreground color.
* The foreground color.
* @return Whether it is a "light" foreground color. * @return Whether it is a "light" foreground color.
*/ */
public static final boolean isLightForeground(Color fg) { public static final boolean isLightForeground(Color fg) {
@@ -237,13 +232,11 @@ public class Util {
} }
/** /**
* Returns whether a string starts with a specified prefix, ignoring case. * Returns whether a string starts with a specified prefix, ignoring case. This
* This method does not support characters outside of the BMP. * method does not support characters outside of the BMP.
* *
* @param str * @param str The string to check. This cannot be {@code null}.
* The string to check. This cannot be {@code null}. * @param prefix The prefix to check for. This cannot be {@code null}.
* @param prefix
* The prefix to check for. This cannot be {@code null}.
* @return Whether {@code str} starts with {@code prefix}, ignoring case. * @return Whether {@code str} starts with {@code prefix}, ignoring case.
*/ */
public static boolean startsWithIgnoreCase(String str, String prefix) { public static boolean startsWithIgnoreCase(String str, String prefix) {
@@ -258,8 +251,7 @@ public class Util {
* Strips any HTML from a string. The string must start with * Strips any HTML from a string. The string must start with
* "<code>&lt;html&gt;</code>" for markup tags to be stripped. * "<code>&lt;html&gt;</code>" for markup tags to be stripped.
* *
* @param text * @param text The string.
* The string.
* @return The string, with any HTML stripped. * @return The string, with any HTML stripped.
*/ */
public static String stripHtml(String text) { public static String stripHtml(String text) {
@@ -13,10 +13,10 @@ import javax.swing.text.JTextComponent;
* <p> * <p>
* *
* This completion type uses its <tt>shortDescription</tt> property as part of * This completion type uses its <tt>shortDescription</tt> property as part of
* its summary returned by {@link #getSummary()}; for this reason, it may be * its summary returned by {@link #getSummary()}; for this reason, it may be a
* a little longer (even much longer), if desired, than what is recommended * little longer (even much longer), if desired, than what is recommended for
* for <tt>BasicCompletion</tt>s (where the <tt>shortDescription</tt> is used * <tt>BasicCompletion</tt>s (where the <tt>shortDescription</tt> is used in
* in {@link #toString()} for <tt>ListCellRenderers</tt>). * {@link #toString()} for <tt>ListCellRenderers</tt>).
* *
* @author Robert Futrell * @author Robert Futrell
* @version 1.0 * @version 1.0
@@ -35,13 +35,10 @@ public class VariableCompletion extends BasicCompletion {
/** /**
* Constructor. * Constructor.
* *
* @param provider * @param provider The parent provider.
* The parent provider. * @param name The name of this variable.
* @param name * @param type The type of this variable (e.g. "<code>int</code>",
* The name of this variable. * "<code>String</code>", etc.).
* @param type
* The type of this variable (e.g. "<code>int</code>",
* "<code>String</code>", etc.).
*/ */
public VariableCompletion(CompletionProvider provider, String name, String type) { public VariableCompletion(CompletionProvider provider, String name, String type) {
super(provider, name); super(provider, name);
@@ -95,21 +92,17 @@ public class VariableCompletion extends BasicCompletion {
} }
/** /**
* Returns the tool tip text to display for mouse hovers over this * Returns the tool tip text to display for mouse hovers over this completion.
* completion.
* <p> * <p>
* *
* Note that for this functionality to be enabled, a * Note that for this functionality to be enabled, a <tt>JTextComponent</tt>
* <tt>JTextComponent</tt> must be registered with the * must be registered with the <tt>ToolTipManager</tt>, and the text component
* <tt>ToolTipManager</tt>, and the text component must know to search * must know to search for this value. In the case of an
* for this value. In the case of an * <a href="http://fifesoft.com/rsyntaxtextarea">RSyntaxTextArea</a>, this can
* <a href="http://fifesoft.com/rsyntaxtextarea">RSyntaxTextArea</a>, this * be done with a <tt>org.fife.ui.rtextarea.ToolTipSupplier</tt> that calls into
* can be done with a <tt>org.fife.ui.rtextarea.ToolTipSupplier</tt> that
* calls into
* {@link CompletionProvider#getCompletionsAt(JTextComponent, java.awt.Point)}. * {@link CompletionProvider#getCompletionsAt(JTextComponent, java.awt.Point)}.
* *
* @return The tool tip text for this completion, or <code>null</code> if * @return The tool tip text for this completion, or <code>null</code> if none.
* none.
*/ */
@Override @Override
public String getToolTipText() { public String getToolTipText() {
@@ -126,11 +119,10 @@ public class VariableCompletion extends BasicCompletion {
} }
/** /**
* Adds some HTML describing where this variable is defined, if this * Adds some HTML describing where this variable is defined, if this information
* information is known. * is known.
* *
* @param sb * @param sb The buffer to append to.
* The buffer to append to.
*/ */
protected void possiblyAddDefinedIn(StringBuilder sb) { protected void possiblyAddDefinedIn(StringBuilder sb) {
if (definedIn != null) { if (definedIn != null) {
@@ -140,11 +132,9 @@ public class VariableCompletion extends BasicCompletion {
} }
/** /**
* Adds the description text as HTML to a buffer, if a description is * Adds the description text as HTML to a buffer, if a description is defined.
* defined.
* *
* @param sb * @param sb The buffer to append to.
* The buffer to append to.
* @return Whether there was a description to add. * @return Whether there was a description to add.
*/ */
protected boolean possiblyAddDescription(StringBuilder sb) { protected boolean possiblyAddDescription(StringBuilder sb) {
@@ -160,8 +150,7 @@ public class VariableCompletion extends BasicCompletion {
/** /**
* Sets where this variable is defined. * Sets where this variable is defined.
* *
* @param definedIn * @param definedIn Where this variable is defined.
* Where this variable is defined.
* @see #getDefinedIn() * @see #getDefinedIn()
*/ */
public void setDefinedIn(String definedIn) { public void setDefinedIn(String definedIn) {
@@ -39,9 +39,9 @@ public abstract class AbstractJFlexCTokenMaker extends AbstractJFlexTokenMaker {
} }
/** /**
* Creates and returns the action to use when the user inserts a newline. * Creates and returns the action to use when the user inserts a newline. The
* The default implementation intelligently closes multi-line comments. * default implementation intelligently closes multi-line comments. Subclasses
* Subclasses can override. * can override.
* *
* @return The action. * @return The action.
* @see #getInsertBreakAction() * @see #getInsertBreakAction()
@@ -51,8 +51,8 @@ public abstract class AbstractJFlexCTokenMaker extends AbstractJFlexTokenMaker {
} }
/** /**
* Returns <code>true</code> always as C-style languages use curly braces * Returns <code>true</code> always as C-style languages use curly braces to
* to denote code blocks. * denote code blocks.
* *
* @return <code>true</code> always. * @return <code>true</code> always.
*/ */
@@ -62,9 +62,8 @@ public abstract class AbstractJFlexCTokenMaker extends AbstractJFlexTokenMaker {
} }
/** /**
* Returns an action to handle "insert break" key presses (i.e. Enter). * Returns an action to handle "insert break" key presses (i.e. Enter). An
* An action is returned that handles newlines differently in multi-line * action is returned that handles newlines differently in multi-line comments.
* comments.
* *
* @return The action. * @return The action.
*/ */
@@ -94,17 +93,15 @@ public abstract class AbstractJFlexCTokenMaker extends AbstractJFlexTokenMaker {
} }
/** /**
* Returns whether a given token is an internal token type that represents * Returns whether a given token is an internal token type that represents an
* an MLC or documentation comment continuing on to the next line. This is * MLC or documentation comment continuing on to the next line. This is done by
* done by languages such as JavaScript that are a little more verbose * languages such as JavaScript that are a little more verbose than necessary so
* than necessary so that their code can be copy-and-pasted into other * that their code can be copy-and-pasted into other <code>TokenMaker</code>s
* <code>TokenMaker</code>s that use them as nested languages (such as * that use them as nested languages (such as HTML, JSP, etc.).
* HTML, JSP, etc.).
* *
* @param t * @param t The token to check. This cannot be <code>null</code>.
* The token to check. This cannot be <code>null</code>. * @return Whether the token is an internal token representing the end of a line
* @return Whether the token is an internal token representing the end of * for an MLC/doc comment continuing on to the next line.
* a line for an MLC/doc comment continuing on to the next line.
*/ */
private boolean isInternalEolTokenForMLCs(Token t) { private boolean isInternalEolTokenForMLCs(Token t) {
int type = t.getType(); int type = t.getType();
@@ -116,8 +113,8 @@ public abstract class AbstractJFlexCTokenMaker extends AbstractJFlexTokenMaker {
} }
/** /**
* Action that knows how to special-case inserting a newline in a * Action that knows how to special-case inserting a newline in a multi-line
* multi-line comment for languages like C and Java. * comment for languages like C and Java.
*/ */
protected class CStyleInsertBreakAction extends RSyntaxTextAreaEditorKit.InsertBreakAction { protected class CStyleInsertBreakAction extends RSyntaxTextAreaEditorKit.InsertBreakAction {
@@ -143,11 +140,10 @@ public abstract class AbstractJFlexCTokenMaker extends AbstractJFlexTokenMaker {
} }
/** /**
* Returns whether the MLC token containing <code>offs</code> appears * Returns whether the MLC token containing <code>offs</code> appears to have a
* to have a "nested" comment (i.e., contains "<code>/*</code>" * "nested" comment (i.e., contains "<code>/*</code>" somewhere inside of it).
* somewhere inside of it). This implies that it is likely a "new" MLC * This implies that it is likely a "new" MLC and needs to be closed. While not
* and needs to be closed. While not foolproof, this is usually good * foolproof, this is usually good enough of a sign.
* enough of a sign.
* *
* @param textArea * @param textArea
* @param line * @param line
@@ -11,8 +11,8 @@ import javax.swing.text.Segment;
/** /**
* Base class for JFlex-generated token makers. This class attempts to factor * Base class for JFlex-generated token makers. This class attempts to factor
* out all common code from these classes. Many methods <em>almost</em> could * out all common code from these classes. Many methods <em>almost</em> could be
* be factored out into this class, but cannot because they reference JFlex * factored out into this class, but cannot because they reference JFlex
* variables that we cannot access from this class. * variables that we cannot access from this class.
* *
* @author Robert Futrell * @author Robert Futrell
@@ -28,18 +28,15 @@ public abstract class AbstractJFlexTokenMaker extends TokenMakerBase {
/** /**
* Declared here so we can define overloads that refer to this method. * Declared here so we can define overloads that refer to this method.
* *
* @param newState * @param newState The new JFlex state to enter.
* The new JFlex state to enter.
*/ */
public abstract void yybegin(int newState); public abstract void yybegin(int newState);
/** /**
* Starts a new JFlex state and changes the current language index. * Starts a new JFlex state and changes the current language index.
* *
* @param state * @param state The new JFlex state to enter.
* The new JFlex state to enter. * @param languageIndex The new language index.
* @param languageIndex
* The new language index.
*/ */
protected void yybegin(int state, int languageIndex) { protected void yybegin(int state, int languageIndex) {
yybegin(state); yybegin(state);
@@ -8,9 +8,9 @@ package org.fife.ui.rsyntaxtextarea;
/** /**
* An abstract implementation of the * An abstract implementation of the
* {@link org.fife.ui.rsyntaxtextarea.TokenMaker} interface. It should * {@link org.fife.ui.rsyntaxtextarea.TokenMaker} interface. It should be
* be overridden for every language for which you want to provide * overridden for every language for which you want to provide syntax
* syntax highlighting. * highlighting.
* <p> * <p>
* *
* @see Token * @see Token
@@ -21,10 +21,9 @@ package org.fife.ui.rsyntaxtextarea;
public abstract class AbstractTokenMaker extends TokenMakerBase { public abstract class AbstractTokenMaker extends TokenMakerBase {
/** /**
* Hash table of words to highlight and what token type they are. * Hash table of words to highlight and what token type they are. The keys are
* The keys are the words to highlight, and their values are the * the words to highlight, and their values are the token types, for example,
* token types, for example, <code>Token.RESERVED_WORD</code> or * <code>Token.RESERVED_WORD</code> or <code>Token.FUNCTION</code>.
* <code>Token.FUNCTION</code>.
*/ */
protected TokenMap wordsToHighlight; protected TokenMap wordsToHighlight;
@@ -38,15 +37,15 @@ public abstract class AbstractTokenMaker extends TokenMakerBase {
/** /**
* Returns the words to highlight for this programming language. * Returns the words to highlight for this programming language.
* *
* @return A <code>TokenMap</code> containing the words to highlight for * @return A <code>TokenMap</code> containing the words to highlight for this
* this programming language. * programming language.
*/ */
public abstract TokenMap getWordsToHighlight(); public abstract TokenMap getWordsToHighlight();
/** /**
* Removes the token last added from the linked list of tokens. The * Removes the token last added from the linked list of tokens. The programmer
* programmer should never have to call this directly; it can be called * should never have to call this directly; it can be called by subclasses of
* by subclasses of <code>TokenMaker</code> if necessary. * <code>TokenMaker</code> if necessary.
*/ */
public void removeLastToken() { public void removeLastToken() {
if (previousToken == null) { if (previousToken == null) {
@@ -20,10 +20,9 @@ import java.util.Set;
public abstract class AbstractTokenMakerFactory extends TokenMakerFactory { public abstract class AbstractTokenMakerFactory extends TokenMakerFactory {
/** /**
* A mapping from keys to the names of {@link TokenMaker} implementation * A mapping from keys to the names of {@link TokenMaker} implementation class
* class names. When {@link #getTokenMaker(String)} is called with a key * names. When {@link #getTokenMaker(String)} is called with a key defined in
* defined in this map, a <code>TokenMaker</code> of the corresponding type * this map, a <code>TokenMaker</code> of the corresponding type is returned.
* is returned.
*/ */
private Map<String, Object> tokenMakerMap; private Map<String, Object> tokenMakerMap;
@@ -38,10 +37,9 @@ public abstract class AbstractTokenMakerFactory extends TokenMakerFactory {
/** /**
* Returns a {@link TokenMaker} for the specified key. * Returns a {@link TokenMaker} for the specified key.
* *
* @param key * @param key The key.
* The key. * @return The corresponding <code>TokenMaker</code>, or <code>null</code> if
* @return The corresponding <code>TokenMaker</code>, or <code>null</code> * none matches the specified key.
* if none matches the specified key.
*/ */
@Override @Override
protected TokenMaker getTokenMakerImpl(String key) { protected TokenMaker getTokenMakerImpl(String key) {
@@ -60,8 +58,8 @@ public abstract class AbstractTokenMakerFactory extends TokenMakerFactory {
/** /**
* Populates the mapping from keys to instances of * Populates the mapping from keys to instances of
* <code>TokenMakerCreator</code>s. Subclasses should override this method * <code>TokenMakerCreator</code>s. Subclasses should override this method and
* and call one of the <code>putMapping</code> overloads to register * call one of the <code>putMapping</code> overloads to register
* {@link TokenMaker}s for syntax constants. * {@link TokenMaker}s for syntax constants.
* *
* @see #putMapping(String, String) * @see #putMapping(String, String)
@@ -78,13 +76,11 @@ public abstract class AbstractTokenMakerFactory extends TokenMakerFactory {
} }
/** /**
* Adds a mapping from a key to a <code>TokenMaker</code> implementation * Adds a mapping from a key to a <code>TokenMaker</code> implementation class
* class name. * name.
* *
* @param key * @param key The key.
* The key. * @param className The <code>TokenMaker</code> class name.
* @param className
* The <code>TokenMaker</code> class name.
* @see #putMapping(String, String, ClassLoader) * @see #putMapping(String, String, ClassLoader)
*/ */
public void putMapping(String key, String className) { public void putMapping(String key, String className) {
@@ -92,15 +88,12 @@ public abstract class AbstractTokenMakerFactory extends TokenMakerFactory {
} }
/** /**
* Adds a mapping from a key to a <code>TokenMaker</code> implementation * Adds a mapping from a key to a <code>TokenMaker</code> implementation class
* class name. * name.
* *
* @param key * @param key The key.
* The key. * @param className The <code>TokenMaker</code> class name.
* @param className * @param cl The class loader to use when loading the class.
* The <code>TokenMaker</code> class name.
* @param cl
* The class loader to use when loading the class.
* @see #putMapping(String, String) * @see #putMapping(String, String)
*/ */
public void putMapping(String key, String className, ClassLoader cl) { public void putMapping(String key, String className, ClassLoader cl) {
@@ -24,14 +24,11 @@ public class ActiveLineRangeEvent extends EventObject {
/** /**
* Constructor. * Constructor.
* *
* @param source * @param source The text area.
* The text area. * @param min The first line in the active line range, or <code>-1</code> if
* @param min * the line range is being cleared.
* The first line in the active line range, or * @param max The last line in the active line range, or <code>-1</code> if
* <code>-1</code> if the line range is being cleared. * the line range is being cleared.
* @param max
* The last line in the active line range, or
* <code>-1</code> if the line range is being cleared.
*/ */
public ActiveLineRangeEvent(RSyntaxTextArea source, int min, int max) { public ActiveLineRangeEvent(RSyntaxTextArea source, int min, int max) {
super(source); super(source);
@@ -42,8 +39,7 @@ public class ActiveLineRangeEvent extends EventObject {
/** /**
* Returns the last line in the active line range. * Returns the last line in the active line range.
* *
* @return The last line, or <code>-1</code> if the range is being * @return The last line, or <code>-1</code> if the range is being cleared.
* cleared.
* @see #getMin() * @see #getMin()
*/ */
public int getMax() { public int getMax() {
@@ -53,8 +49,7 @@ public class ActiveLineRangeEvent extends EventObject {
/** /**
* Returns the first line in the active line range. * Returns the first line in the active line range.
* *
* @return The first line, or <code>-1</code> if the range is being * @return The first line, or <code>-1</code> if the range is being cleared.
* cleared.
* @see #getMax() * @see #getMax()
*/ */
public int getMin() { public int getMin() {
@@ -13,15 +13,15 @@ import java.util.EventListener;
* Listens for "active line range" events from an <code>RSyntaxTextArea</code>. * Listens for "active line range" events from an <code>RSyntaxTextArea</code>.
* If a text area contains some semantic knowledge of the programming language * If a text area contains some semantic knowledge of the programming language
* being edited, it may broadcast {@link ActiveLineRangeEvent}s whenever the * being edited, it may broadcast {@link ActiveLineRangeEvent}s whenever the
* caret moves into a new "block" of code. Listeners can listen for these * caret moves into a new "block" of code. Listeners can listen for these events
* events and respond accordingly. * and respond accordingly.
* <p> * <p>
* *
* See the <code>RSTALanguageSupport</code> project at * See the <code>RSTALanguageSupport</code> project at
* <a href="http://fifesoft.com">http://fifesoft.com</a> for some * <a href="http://fifesoft.com">http://fifesoft.com</a> for some
* <code>LanguageSupport</code> implementations that may broadcast these * <code>LanguageSupport</code> implementations that may broadcast these events.
* events. Note that if an RSTA/LanguageSupport does not support broadcasting * Note that if an RSTA/LanguageSupport does not support broadcasting these
* these events, the listener will simply never receive any notifications. * events, the listener will simply never receive any notifications.
* *
* @author Robert Futrell * @author Robert Futrell
* @version 1.0 * @version 1.0
@@ -31,11 +31,9 @@ public interface ActiveLineRangeListener extends EventListener {
/** /**
* Called whenever the "active line range" changes. * Called whenever the "active line range" changes.
* *
* @param e * @param e Information about the line range change. If there is no longer an
* Information about the line range change. If there is no longer * "active line range," the "minimum" and "maximum" line values should
* an "active line range," the "minimum" and "maximum" line * both be <code>-1</code>.
* values
* should both be <code>-1</code>.
*/ */
void activeLineRangeChanged(ActiveLineRangeEvent e); void activeLineRangeChanged(ActiveLineRangeEvent e);
} }
@@ -13,8 +13,8 @@ import javax.swing.text.Caret;
import org.fife.ui.rtextarea.SmartHighlightPainter; import org.fife.ui.rtextarea.SmartHighlightPainter;
/** /**
* The default implementation of {@link OccurrenceMarker}. It goes through * The default implementation of {@link OccurrenceMarker}. It goes through the
* the document and marks all instances of the specified token. * document and marks all instances of the specified token.
* *
* @author Robert Futrell * @author Robert Futrell
* @version 1.0 * @version 1.0
@@ -66,16 +66,13 @@ class DefaultOccurrenceMarker implements OccurrenceMarker {
* Highlights all instances of tokens identical to <code>t</code> in the * Highlights all instances of tokens identical to <code>t</code> in the
* specified document. * specified document.
* *
* @param doc * @param doc The document.
* The document. * @param t The document whose relevant occurrences should be marked.
* @param t * @param h The highlighter to add the highlights to.
* The document whose relevant occurrences should be marked. * @param p The painter for the highlights.
* @param h
* The highlighter to add the highlights to.
* @param p
* The painter for the highlights.
*/ */
public static final void markOccurrencesOfToken(RSyntaxDocument doc, Token t, RSyntaxTextAreaHighlighter h, SmartHighlightPainter p) { public static final void markOccurrencesOfToken(RSyntaxDocument doc, Token t, RSyntaxTextAreaHighlighter h,
SmartHighlightPainter p) {
char[] lexeme = t.getLexeme().toCharArray(); char[] lexeme = t.getLexeme().toCharArray();
int type = t.getType(); int type = t.getType();
int lineCount = doc.getDefaultRootElement().getElementCount(); int lineCount = doc.getDefaultRootElement().getElementCount();
@@ -10,18 +10,18 @@ import javax.swing.text.Segment;
/** /**
* This class generates tokens for a {@link TokenMaker}. This class is here * This class generates tokens for a {@link TokenMaker}. This class is here
* because it reuses tokens when they aren't needed anymore to prevent * because it reuses tokens when they aren't needed anymore to prevent This
* This class doesn't actually create new tokens every time * class doesn't actually create new tokens every time <code>createToken</code>
* <code>createToken</code> is called. Instead, it internally keeps a stack of * is called. Instead, it internally keeps a stack of available already-created
* available already-created tokens. When more tokens are needed to properly * tokens. When more tokens are needed to properly display a line, more tokens
* display a line, more tokens are added to the available stack. This saves * are added to the available stack. This saves from needless repetitive memory
* from needless repetitive memory allocation. However, it makes it IMPERATIVE * allocation. However, it makes it IMPERATIVE that users call
* that users call <code>resetTokenList</code> when creating a new token list so * <code>resetTokenList</code> when creating a new token list so that the token
* that the token maker can keep an accurate list of available tokens. * maker can keep an accurate list of available tokens.
* <p> * <p>
* *
* NOTE: This class should only be used by {@link TokenMaker}; nobody else * NOTE: This class should only be used by {@link TokenMaker}; nobody else needs
* needs it! * it!
* *
* @author Robert Futrell * @author Robert Futrell
* @version 0.1 * @version 0.1
@@ -45,11 +45,8 @@ class DefaultTokenFactory implements TokenFactory {
/** /**
* Constructor. * Constructor.
* *
* @param size * @param size The initial number of tokens in this factory.
* The initial number of tokens in this factory. * @param increment How many tokens to increment by when the stack gets empty.
* @param increment
* How many tokens to increment by when the stack gets
* empty.
*/ */
DefaultTokenFactory(int size, int increment) { DefaultTokenFactory(int size, int increment) {
this.size = size; this.size = size;
@@ -63,8 +60,8 @@ class DefaultTokenFactory implements TokenFactory {
} }
/** /**
* Adds tokens to the internal token list. This is called whenever a * Adds tokens to the internal token list. This is called whenever a request is
* request is made and no more tokens are available. * made and no more tokens are available.
*/ */
private void augmentTokenList() { private void augmentTokenList() {
TokenImpl[] temp = new TokenImpl[size + increment]; TokenImpl[] temp = new TokenImpl[size + increment];
@@ -83,12 +80,8 @@ class DefaultTokenFactory implements TokenFactory {
@Override @Override
public TokenImpl createToken() { public TokenImpl createToken() {
TokenImpl token = tokenList[currentFreeToken]; TokenImpl token = tokenList[currentFreeToken];
token.text = null; token.reset();
token.setType(Token.NULL); if (++currentFreeToken == size) {
token.setOffset(-1);
token.setNextToken(null);
currentFreeToken++;
if (currentFreeToken == size) {
augmentTokenList(); augmentTokenList();
} }
return token; return token;
@@ -98,7 +91,8 @@ class DefaultTokenFactory implements TokenFactory {
* {@inheritDoc} * {@inheritDoc}
*/ */
@Override @Override
public TokenImpl createToken(final Segment line, final int beg, final int end, final int startOffset, final int type) { public TokenImpl createToken(final Segment line, final int beg, final int end, final int startOffset,
final int type) {
return createToken(line.array, beg, end, startOffset, type); return createToken(line.array, beg, end, startOffset, type);
} }
@@ -106,7 +100,8 @@ class DefaultTokenFactory implements TokenFactory {
* {@inheritDoc} * {@inheritDoc}
*/ */
@Override @Override
public TokenImpl createToken(final char[] line, final int beg, final int end, final int startOffset, final int type) { public TokenImpl createToken(final char[] line, final int beg, final int end, final int startOffset,
final int type) {
TokenImpl token = tokenList[currentFreeToken]; TokenImpl token = tokenList[currentFreeToken];
token.set(line, beg, end, startOffset, type); token.set(line, beg, end, startOffset, type);
currentFreeToken++; currentFreeToken++;
@@ -117,9 +112,9 @@ class DefaultTokenFactory implements TokenFactory {
} }
/** /**
* Resets the state of this token maker. This method should be called * Resets the state of this token maker. This method should be called by the
* by the <code>TokenMaker</code> every time a token list is generated for * <code>TokenMaker</code> every time a token list is generated for a new line
* a new line so the tokens can be reused. * so the tokens can be reused.
*/ */
@Override @Override
public void resetAllTokens() { public void resetAllTokens() {
@@ -26,9 +26,9 @@ class DefaultTokenPainter implements TokenPainter {
*/ */
private Rectangle2D.Float bgRect; private Rectangle2D.Float bgRect;
/** /**
* Micro-optimization; buffer used to compute tab width. If the width is * Micro-optimization; buffer used to compute tab width. If the width is correct
* correct it's not re-allocated, to prevent lots of very small garbage. * it's not re-allocated, to prevent lots of very small garbage. Only used when
* Only used when painting tab lines. * painting tab lines.
*/ */
private static char[] tabBuf; private static char[] tabBuf;
@@ -48,7 +48,8 @@ class DefaultTokenPainter implements TokenPainter {
* {@inheritDoc} * {@inheritDoc}
*/ */
@Override @Override
public float paint(Token token, Graphics2D g, float x, float y, RSyntaxTextArea host, TabExpander e, float clipStart) { public float paint(Token token, Graphics2D g, float x, float y, RSyntaxTextArea host, TabExpander e,
float clipStart) {
return paintImpl(token, g, x, y, host, e, clipStart, false, false); return paintImpl(token, g, x, y, host, e, clipStart, false, false);
} }
@@ -56,33 +57,26 @@ class DefaultTokenPainter implements TokenPainter {
* {@inheritDoc} * {@inheritDoc}
*/ */
@Override @Override
public float paint(Token token, Graphics2D g, float x, float y, RSyntaxTextArea host, TabExpander e, float clipStart, boolean paintBG) { public float paint(Token token, Graphics2D g, float x, float y, RSyntaxTextArea host, TabExpander e,
float clipStart, boolean paintBG) {
return paintImpl(token, g, x, y, host, e, clipStart, !paintBG, false); return paintImpl(token, g, x, y, host, e, clipStart, !paintBG, false);
} }
/** /**
* Paints the background of a token. * Paints the background of a token.
* *
* @param x * @param x The x-coordinate of the token.
* The x-coordinate of the token. * @param y The y-coordinate of the token.
* @param y * @param width The width of the token (actually, the width of the part of
* The y-coordinate of the token. * the token to paint).
* @param width * @param height The height of the token.
* The width of the token (actually, the width of the part of * @param g The graphics context with which to paint.
* the token to paint). * @param fontAscent The ascent of the token's font.
* @param height * @param host The text area.
* The height of the token. * @param color The color with which to paint.
* @param g
* The graphics context with which to paint.
* @param fontAscent
* The ascent of the token's font.
* @param host
* The text area.
* @param color
* The color with which to paint.
*/ */
protected void paintBackground(float x, float y, float width, float height, Graphics2D g, int fontAscent, RSyntaxTextArea host, protected void paintBackground(float x, float y, float width, float height, Graphics2D g, int fontAscent,
Color color) { RSyntaxTextArea host, Color color) {
g.setColor(color); g.setColor(color);
bgRect.setRect(x, y - fontAscent, width, height); bgRect.setRect(x, y - fontAscent, width, height);
// g.fill(bgRect); // g.fill(bgRect);
@@ -92,8 +86,8 @@ class DefaultTokenPainter implements TokenPainter {
/** /**
* Does the dirty-work of actually painting the token. * Does the dirty-work of actually painting the token.
*/ */
protected float paintImpl(Token token, Graphics2D g, float x, float y, RSyntaxTextArea host, TabExpander e, float clipStart, protected float paintImpl(Token token, Graphics2D g, float x, float y, RSyntaxTextArea host, TabExpander e,
boolean selected, boolean useSTC) { float clipStart, boolean selected, boolean useSTC) {
int origX = (int) x; int origX = (int) x;
int textOffs = token.getTextOffset(); int textOffs = token.getTextOffset();
char[] text = token.getTextArray(); char[] text = token.getTextArray();
@@ -107,22 +101,22 @@ class DefaultTokenPainter implements TokenPainter {
FontMetrics fm = host.getFontMetricsForTokenType(token.getType()); FontMetrics fm = host.getFontMetricsForTokenType(token.getType());
for (int i = textOffs; i < end; i++) { for (int i = textOffs; i < end; i++) {
switch (text[i]) { switch (text[i]) {
case '\t': case '\t':
nextX = e.nextTabStop(x + fm.charsWidth(text, flushIndex, flushLen), 0); nextX = e.nextTabStop(x + fm.charsWidth(text, flushIndex, flushLen), 0);
if (bg != null) { if (bg != null) {
paintBackground(x, y, nextX - x, fm.getHeight(), g, fm.getAscent(), host, bg); paintBackground(x, y, nextX - x, fm.getHeight(), g, fm.getAscent(), host, bg);
} }
if (flushLen > 0) { if (flushLen > 0) {
g.setColor(fg); g.setColor(fg);
g.drawChars(text, flushIndex, flushLen, (int) x, (int) y); g.drawChars(text, flushIndex, flushLen, (int) x, (int) y);
flushLen = 0; flushLen = 0;
} }
flushIndex = i + 1; flushIndex = i + 1;
x = nextX; x = nextX;
break; break;
default: default:
flushLen += 1; flushLen += 1;
break; break;
} }
} }
nextX = x + fm.charsWidth(text, flushIndex, flushLen); nextX = x + fm.charsWidth(text, flushIndex, flushLen);
@@ -157,7 +151,8 @@ class DefaultTokenPainter implements TokenPainter {
* {@inheritDoc} * {@inheritDoc}
*/ */
@Override @Override
public float paintSelected(Token token, Graphics2D g, float x, float y, RSyntaxTextArea host, TabExpander e, boolean useSTC) { public float paintSelected(Token token, Graphics2D g, float x, float y, RSyntaxTextArea host, TabExpander e,
boolean useSTC) {
return paintSelected(token, g, x, y, host, e, 0, useSTC); return paintSelected(token, g, x, y, host, e, 0, useSTC);
} }
@@ -165,35 +160,29 @@ class DefaultTokenPainter implements TokenPainter {
* {@inheritDoc} * {@inheritDoc}
*/ */
@Override @Override
public float paintSelected(Token token, Graphics2D g, float x, float y, RSyntaxTextArea host, TabExpander e, float clipStart, public float paintSelected(Token token, Graphics2D g, float x, float y, RSyntaxTextArea host, TabExpander e,
boolean useSTC) { float clipStart, boolean useSTC) {
return paintImpl(token, g, x, y, host, e, clipStart, true, useSTC); return paintImpl(token, g, x, y, host, e, clipStart, true, useSTC);
} }
/** /**
* Paints dotted "tab" lines; that is, lines that show where your caret * Paints dotted "tab" lines; that is, lines that show where your caret would go
* would go to on the line if you hit "tab". This visual effect is usually * to on the line if you hit "tab". This visual effect is usually done in the
* done in the leading whitespace token(s) of lines. * leading whitespace token(s) of lines.
* *
* @param token * @param token The token to render.
* The token to render. * @param x The starting x-offset of this token. It is assumed that this is
* @param x * the left margin of the text area (may be non-zero due to
* The starting x-offset of this token. It is assumed that this * insets), since tab lines are only painted for leading
* is the left margin of the text area (may be non-zero due to * whitespace.
* insets), since tab lines are only painted for leading * @param y The baseline where this token was painted.
* whitespace. * @param endX The ending x-offset of this token.
* @param y * @param g The graphics context.
* The baseline where this token was painted. * @param e Used to expand tabs.
* @param endX * @param host The text area.
* The ending x-offset of this token.
* @param g
* The graphics context.
* @param e
* Used to expand tabs.
* @param host
* The text area.
*/ */
protected void paintTabLines(Token token, int x, int y, int endX, Graphics2D g, TabExpander e, RSyntaxTextArea host) { protected void paintTabLines(Token token, int x, int y, int endX, Graphics2D g, TabExpander e,
RSyntaxTextArea host) {
// We allow tab lines to be painted in more than just Token.WHITESPACE, // We allow tab lines to be painted in more than just Token.WHITESPACE,
// i.e. for MLC's and Token.IDENTIFIERS (for TokenMakers that return // i.e. for MLC's and Token.IDENTIFIERS (for TokenMakers that return
// whitespace as identifiers for performance). But we only paint tab // whitespace as identifiers for performance). But we only paint tab
@@ -20,13 +20,11 @@ public class DocumentRange implements Comparable<DocumentRange> {
/** /**
* Constructor. * Constructor.
* *
* @param startOffs * @param startOffs The starting offset in the document, inclusive.
* The starting offset in the document, inclusive. * @param endOffs The ending offset in the document, exclusive.
* @param endOffs * @throws IllegalArgumentException If <code>endOffs</code> is less than
* The ending offset in the document, exclusive. * <code>startOffs</code>, or either argument
* @throws IllegalArgumentException * is less than zero.
* If <code>endOffs</code> is less than
* <code>startOffs</code>, or either argument is less than zero.
*/ */
public DocumentRange(int startOffs, int endOffs) { public DocumentRange(int startOffs, int endOffs) {
set(startOffs, endOffs); set(startOffs, endOffs);
@@ -35,8 +33,7 @@ public class DocumentRange implements Comparable<DocumentRange> {
/** /**
* Compares this document range to another. * Compares this document range to another.
* *
* @param other * @param other Another document range.
* Another document range.
* @return How the two should be sorted relative to each other. * @return How the two should be sorted relative to each other.
*/ */
@Override @Override
@@ -54,10 +51,9 @@ public class DocumentRange implements Comparable<DocumentRange> {
/** /**
* Returns whether this document range is equal to another one. * Returns whether this document range is equal to another one.
* *
* @param other * @param other Another object, presumably a document range.
* Another object, presumably a document range. * @return Whether <code>other</code> is also a document range, and equal to
* @return Whether <code>other</code> is also a document range, and equal * this one.
* to this one.
*/ */
@Override @Override
public boolean equals(Object other) { public boolean equals(Object other) {
@@ -102,10 +98,9 @@ public class DocumentRange implements Comparable<DocumentRange> {
} }
/** /**
* Returns whether this document range has zero length. This can happen, * Returns whether this document range has zero length. This can happen, for
* for example, with regex searches of forms like * example, with regex searches of forms like <code>"foo|"</code>, where the
* <code>"foo|"</code>, where the right-hand sub-expression matches empty * right-hand sub-expression matches empty strings.
* strings.
* *
* @return Whether this document range has zero length. * @return Whether this document range has zero length.
*/ */
@@ -116,13 +111,11 @@ public class DocumentRange implements Comparable<DocumentRange> {
/** /**
* Sets the document range. * Sets the document range.
* *
* @param start * @param start The new start value, inclusive.
* The new start value, inclusive. * @param end The new end value, exclusive.
* @param end * @throws IllegalArgumentException If <code>end</code> is less than
* The new end value, exclusive. * <code>start</code>, or either argument is
* @throws IllegalArgumentException * less than zero.
* If <code>end</code> is less than
* <code>start</code>, or either argument is less than zero.
*/ */
public void set(int start, int end) { public void set(int start, int end) {
if (start < 0 || end < 0) { if (start < 0 || end < 0) {
@@ -148,8 +141,7 @@ public class DocumentRange implements Comparable<DocumentRange> {
/** /**
* Translates this document range by a given amount. * Translates this document range by a given amount.
* *
* @param amount * @param amount The amount to translate this range by.
* The amount to translate this range by.
* @return This (modified) range. * @return This (modified) range.
*/ */
public DocumentRange translate(int amount) { public DocumentRange translate(int amount) {
+50 -67
View File
@@ -39,16 +39,15 @@ import org.fife.ui.rsyntaxtextarea.parser.TaskTagParser.TaskNotice;
import org.fife.ui.rtextarea.RTextArea; import org.fife.ui.rtextarea.RTextArea;
/** /**
* A component to sit alongside an {@link RSyntaxTextArea} that displays * A component to sit alongside an {@link RSyntaxTextArea} that displays colored
* colored markers for locations of interest (parser errors, marked * markers for locations of interest (parser errors, marked occurrences, etc.).
* occurrences, etc.).
* <p> * <p>
* *
* <code>ErrorStrip</code>s display <code>ParserNotice</code>s from * <code>ErrorStrip</code>s display <code>ParserNotice</code>s from
* {@link Parser}s. Currently, the only way to get lines flagged in this * {@link Parser}s. Currently, the only way to get lines flagged in this
* component is to register a <code>Parser</code> on an RSyntaxTextArea and * component is to register a <code>Parser</code> on an RSyntaxTextArea and
* return <code>ParserNotice</code>s for each line to display an icon for. * return <code>ParserNotice</code>s for each line to display an icon for. The
* The severity of each notice must be at least the threshold set by * severity of each notice must be at least the threshold set by
* {@link #setLevelThreshold(org.fife.ui.rsyntaxtextarea.parser.ParserNotice.Level)} * {@link #setLevelThreshold(org.fife.ui.rsyntaxtextarea.parser.ParserNotice.Level)}
* to be displayed in this error strip. The default threshold is * to be displayed in this error strip. The default threshold is
* {@link org.fife.ui.rsyntaxtextarea.parser.ParserNotice.Level#WARNING}. * {@link org.fife.ui.rsyntaxtextarea.parser.ParserNotice.Level#WARNING}.
@@ -86,23 +85,23 @@ public class ErrorStrip extends JPanel {
*/ */
private transient Listener listener; private transient Listener listener;
/** /**
* Whether "marked occurrences" in the text area should be shown in this * Whether "marked occurrences" in the text area should be shown in this error
* error strip. * strip.
*/ */
private boolean showMarkedOccurrences; private boolean showMarkedOccurrences;
/** /**
* Whether markers for "mark all" highlights should be shown in this * Whether markers for "mark all" highlights should be shown in this error
* error strip. * strip.
*/ */
private boolean showMarkAll; private boolean showMarkAll;
/** /**
* Mapping of colors to brighter colors. This is kept to prevent * Mapping of colors to brighter colors. This is kept to prevent unnecessary
* unnecessary creation of the same Colors over and over. * creation of the same Colors over and over.
*/ */
private Map<Color, Color> brighterColors; private Map<Color, Color> brighterColors;
/** /**
* Only notices of this severity (or worse) will be displayed in this * Only notices of this severity (or worse) will be displayed in this error
* error strip. * strip.
*/ */
private ParserNotice.Level levelThreshold; private ParserNotice.Level levelThreshold;
/** /**
@@ -134,8 +133,7 @@ public class ErrorStrip extends JPanel {
/** /**
* Constructor. * Constructor.
* *
* @param textArea * @param textArea The text area we are examining.
* The text area we are examining.
*/ */
public ErrorStrip(RSyntaxTextArea textArea) { public ErrorStrip(RSyntaxTextArea textArea) {
this.textArea = textArea; this.textArea = textArea;
@@ -152,8 +150,8 @@ public class ErrorStrip extends JPanel {
} }
/** /**
* Overridden so we only start listening for parser notices when this * Overridden so we only start listening for parser notices when this component
* component (and presumably the text area) are visible. * (and presumably the text area) are visible.
*/ */
@Override @Override
public void addNotify() { public void addNotify() {
@@ -181,8 +179,7 @@ public class ErrorStrip extends JPanel {
/** /**
* Returns a "brighter" color. * Returns a "brighter" color.
* *
* @param c * @param c The color.
* The color.
* @return A brighter color. * @return A brighter color.
*/ */
private Color getBrighterColor(Color c) { private Color getBrighterColor(Color c) {
@@ -232,9 +229,9 @@ public class ErrorStrip extends JPanel {
} }
/** /**
* Returns the minimum severity a parser notice must be for it to be * Returns the minimum severity a parser notice must be for it to be displayed
* displayed in this error strip. This will be one of the constants * in this error strip. This will be one of the constants defined in the
* defined in the <code>ParserNotice</code> class. * <code>ParserNotice</code> class.
* *
* @return The minimum severity. * @return The minimum severity.
* @see #setLevelThreshold(org.fife.ui.rsyntaxtextarea.parser.ParserNotice.Level) * @see #setLevelThreshold(org.fife.ui.rsyntaxtextarea.parser.ParserNotice.Level)
@@ -278,11 +275,10 @@ public class ErrorStrip extends JPanel {
} }
/** /**
* Returns the y-offset in this component corresponding to a line in the * Returns the y-offset in this component corresponding to a line in the text
* text component. * component.
* *
* @param line * @param line The line.
* The line.
* @return The y-offset. * @return The y-offset.
* @see #yToLine(int) * @see #yToLine(int)
*/ */
@@ -295,8 +291,7 @@ public class ErrorStrip extends JPanel {
/** /**
* Overridden to (possibly) draw the caret's position. * Overridden to (possibly) draw the caret's position.
* *
* @param g * @param g The graphics context.
* The graphics context.
*/ */
@Override @Override
protected void paintComponent(Graphics g) { protected void paintComponent(Graphics g) {
@@ -310,8 +305,7 @@ public class ErrorStrip extends JPanel {
/** /**
* Returns a possibly brighter component for a color. * Returns a possibly brighter component for a color.
* *
* @param i * @param i An RGB component for a color (0-255).
* An RGB component for a color (0-255).
* @return A possibly brighter value for the component. * @return A possibly brighter value for the component.
*/ */
private static int possiblyBrighter(int i) { private static int possiblyBrighter(int i) {
@@ -358,12 +352,9 @@ public class ErrorStrip extends JPanel {
/** /**
* Adds markers for a list of ranges in the document. * Adds markers for a list of ranges in the document.
* *
* @param ranges * @param ranges The list of ranges in the document.
* The list of ranges in the document. * @param markerMap A mapping from line number to <code>Marker</code>.
* @param markerMap * @param color The color to use for the markers.
* A mapping from line number to <code>Marker</code>.
* @param color
* The color to use for the markers.
*/ */
private void addMarkersForRanges(List<DocumentRange> ranges, Map<Integer, Marker> markerMap, Color color) { private void addMarkersForRanges(List<DocumentRange> ranges, Map<Integer, Marker> markerMap, Color color) {
for (DocumentRange range : ranges) { for (DocumentRange range : ranges) {
@@ -405,8 +396,7 @@ public class ErrorStrip extends JPanel {
/** /**
* Sets the color to use when painting the caret marker. * Sets the color to use when painting the caret marker.
* *
* @param color * @param color The new caret marker color.
* The new caret marker color.
* @see #getCaretMarkerColor() * @see #getCaretMarkerColor()
*/ */
public void setCaretMarkerColor(Color color) { public void setCaretMarkerColor(Color color) {
@@ -419,8 +409,7 @@ public class ErrorStrip extends JPanel {
/** /**
* Toggles whether the caret's current location should be drawn. * Toggles whether the caret's current location should be drawn.
* *
* @param follow * @param follow Whether the caret's current location should be followed.
* Whether the caret's current location should be followed.
* @see #getFollowCaret() * @see #getFollowCaret()
*/ */
public void setFollowCaret(boolean follow) { public void setFollowCaret(boolean follow) {
@@ -436,13 +425,12 @@ public class ErrorStrip extends JPanel {
} }
/** /**
* Sets the minimum severity a parser notice must be for it to be displayed * Sets the minimum severity a parser notice must be for it to be displayed in
* in this error strip. This should be one of the constants defined in * this error strip. This should be one of the constants defined in the
* the <code>ParserNotice</code> class. The default value is * <code>ParserNotice</code> class. The default value is
* {@link org.fife.ui.rsyntaxtextarea.parser.ParserNotice.Level#WARNING}. * {@link org.fife.ui.rsyntaxtextarea.parser.ParserNotice.Level#WARNING}.
* *
* @param level * @param level The new severity threshold.
* The new severity threshold.
* @see #getLevelThreshold() * @see #getLevelThreshold()
* @see ParserNotice * @see ParserNotice
*/ */
@@ -454,13 +442,12 @@ public class ErrorStrip extends JPanel {
} }
/** /**
* Sets the provider of tool tips for markers in this error strip. * Sets the provider of tool tips for markers in this error strip. Applications
* Applications can use this method to control the content and format of * can use this method to control the content and format of the tool tip
* the tool tip descriptions of line markers. * descriptions of line markers.
* *
* @param provider * @param provider The provider. If this is <code>null</code>, a default
* The provider. If this is <code>null</code>, a default * implementation will be used.
* implementation will be used.
*/ */
public void setMarkerToolTipProvider(ErrorStripMarkerToolTipProvider provider) { public void setMarkerToolTipProvider(ErrorStripMarkerToolTipProvider provider) {
markerToolTipProvider = provider != null ? provider : new DefaultErrorStripMarkerToolTipProvider(); markerToolTipProvider = provider != null ? provider : new DefaultErrorStripMarkerToolTipProvider();
@@ -469,8 +456,7 @@ public class ErrorStrip extends JPanel {
/** /**
* Sets whether "mark all" highlights are shown in this error strip. * Sets whether "mark all" highlights are shown in this error strip.
* *
* @param show * @param show Whether to show markers for "mark all" highlights.
* Whether to show markers for "mark all" highlights.
* @see #getShowMarkAll() * @see #getShowMarkAll()
*/ */
public void setShowMarkAll(boolean show) { public void setShowMarkAll(boolean show) {
@@ -485,8 +471,7 @@ public class ErrorStrip extends JPanel {
/** /**
* Sets whether marked occurrences are shown in this error strip. * Sets whether marked occurrences are shown in this error strip.
* *
* @param show * @param show Whether to show marked occurrences.
* Whether to show marked occurrences.
* @see #getShowMarkedOccurrences() * @see #getShowMarkedOccurrences()
*/ */
public void setShowMarkedOccurrences(boolean show) { public void setShowMarkedOccurrences(boolean show) {
@@ -502,8 +487,7 @@ public class ErrorStrip extends JPanel {
* Returns the line in the text area corresponding to a y-offset in this * Returns the line in the text area corresponding to a y-offset in this
* component. * component.
* *
* @param y * @param y The y-offset.
* The y-offset.
* @return The line. * @return The line.
* @see #lineToY(int) * @see #lineToY(int)
*/ */
@@ -518,8 +502,8 @@ public class ErrorStrip extends JPanel {
} }
/** /**
* The default implementation of the provider of tool tips for markers in * The default implementation of the provider of tool tips for markers in an
* an error strip. * error strip.
* *
* @author predi * @author predi
*/ */
@@ -547,21 +531,20 @@ public class ErrorStrip extends JPanel {
} }
/** /**
* Returns tool tip text for the markers in an {@link ErrorStrip} that * Returns tool tip text for the markers in an {@link ErrorStrip} that denote
* denote one or more parser notices. * one or more parser notices.
* *
* @author predi * @author predi
*/ */
public interface ErrorStripMarkerToolTipProvider { public interface ErrorStripMarkerToolTipProvider {
/** /**
* Returns the tool tip text for a marker in an <code>ErrorStrip</code> * Returns the tool tip text for a marker in an <code>ErrorStrip</code> that
* that denotes a given list of parser notices. * denotes a given list of parser notices.
* *
* @param notices * @param notices The list of parser notices.
* The list of parser notices. * @return The tool tip text. This may be HTML. Returning <code>null</code> will
* @return The tool tip text. This may be HTML. Returning * result in no tool tip being displayed.
* <code>null</code> will result in no tool tip being displayed.
*/ */
String getToolTipText(List<ParserNotice> notices); String getToolTipText(List<ParserNotice> notices);
} }
@@ -29,8 +29,7 @@ class FileFileLocation extends FileLocation {
/** /**
* Constructor. * Constructor.
* *
* @param file * @param file The local file.
* The local file.
*/ */
FileFileLocation(File file) { FileFileLocation(File file) {
try { try {
@@ -96,8 +95,8 @@ class FileFileLocation extends FileLocation {
} }
/** /**
* Since file locations of this type are guaranteed to be local, this * Since file locations of this type are guaranteed to be local, this method
* method returns whether the file exists. * returns whether the file exists.
* *
* @return Whether this local file actually exists. * @return Whether this local file actually exists.
* @see #isLocal() * @see #isLocal()
@@ -14,8 +14,8 @@ import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
/** /**
* Holds the location of a local or remote file. This provides a common way * Holds the location of a local or remote file. This provides a common way to
* to read, write, and check properties of both local and remote files. * read, write, and check properties of both local and remote files.
* *
* @author Robert Futrell * @author Robert Futrell
* @version 1.0 * @version 1.0
@@ -25,12 +25,12 @@ public abstract class FileLocation {
/** /**
* Creates a {@link FileLocation} instance for the specified local file. * Creates a {@link FileLocation} instance for the specified local file.
* *
* @param fileFullPath * @param fileFullPath The full path to a local file.
* The full path to a local file.
* @return The file's location. * @return The file's location.
*/ */
public static FileLocation create(String fileFullPath) { public static FileLocation create(String fileFullPath) {
if (fileFullPath.startsWith("http://") || fileFullPath.startsWith("https://") || fileFullPath.startsWith("ftp://")) { if (fileFullPath.startsWith("http://") || fileFullPath.startsWith("https://")
|| fileFullPath.startsWith("ftp://")) {
try { try {
return new URLFileLocation(new URL(fileFullPath)); return new URLFileLocation(new URL(fileFullPath));
} catch (MalformedURLException mue) { } catch (MalformedURLException mue) {
@@ -43,8 +43,7 @@ public abstract class FileLocation {
/** /**
* Creates a {@link FileLocation} instance for the specified local file. * Creates a {@link FileLocation} instance for the specified local file.
* *
* @param file * @param file A local file.
* A local file.
* @return The file's location. * @return The file's location.
*/ */
public static FileLocation create(File file) { public static FileLocation create(File file) {
@@ -54,8 +53,7 @@ public abstract class FileLocation {
/** /**
* Creates a {@link FileLocation} instance for the specified file. * Creates a {@link FileLocation} instance for the specified file.
* *
* @param url * @param url The URL of a file.
* The URL of a file.
* @return The file's location. * @return The file's location.
*/ */
public static FileLocation create(URL url) { public static FileLocation create(URL url) {
@@ -67,16 +65,16 @@ public abstract class FileLocation {
/** /**
* Returns the last time this file was modified, or * Returns the last time this file was modified, or
* {@link TextEditorPane#LAST_MODIFIED_UNKNOWN} if this value cannot be * {@link TextEditorPane#LAST_MODIFIED_UNKNOWN} if this value cannot be computed
* computed (such as for a remote file). * (such as for a remote file).
* *
* @return The last time this file was modified. * @return The last time this file was modified.
*/ */
protected abstract long getActualLastModified(); protected abstract long getActualLastModified();
/** /**
* Returns the full path to the file. This will be stripped of * Returns the full path to the file. This will be stripped of sensitive
* sensitive information such as passwords for remote files. * information such as passwords for remote files.
* *
* @return The full path to the file. * @return The full path to the file.
* @see #getFileName() * @see #getFileName()
@@ -95,9 +93,8 @@ public abstract class FileLocation {
* Opens an input stream for reading from this file. * Opens an input stream for reading from this file.
* *
* @return The input stream. * @return The input stream.
* @throws IOException * @throws IOException If the file does not exist, or some other IO error
* If the file does not exist, or some other IO error * occurs.
* occurs.
*/ */
protected abstract InputStream getInputStream() throws IOException; protected abstract InputStream getInputStream() throws IOException;
@@ -105,8 +102,7 @@ public abstract class FileLocation {
* Opens an output stream for writing this file. * Opens an output stream for writing this file.
* *
* @return An output stream. * @return An output stream.
* @throws IOException * @throws IOException If an IO error occurs.
* If an IO error occurs.
*/ */
protected abstract OutputStream getOutputStream() throws IOException; protected abstract OutputStream getOutputStream() throws IOException;
@@ -119,8 +115,7 @@ public abstract class FileLocation {
public abstract boolean isLocal(); public abstract boolean isLocal();
/** /**
* Returns whether this file location is a local file that already * Returns whether this file location is a local file that already exists.
* exists.
* *
* @return Whether this file is local and actually exists. * @return Whether this file is local and actually exists.
* @see #isLocal() * @see #isLocal()
@@ -32,8 +32,7 @@ public class FoldingAwareIconRowHeader extends IconRowHeader {
/** /**
* Constructor. * Constructor.
* *
* @param textArea * @param textArea The parent text area.
* The parent text area.
*/ */
public FoldingAwareIconRowHeader(RSyntaxTextArea textArea) { public FoldingAwareIconRowHeader(RSyntaxTextArea textArea) {
super(textArea); super(textArea);
@@ -162,9 +161,9 @@ public class FoldingAwareIconRowHeader extends IconRowHeader {
} }
/** /**
* Paints icons when line wrapping is enabled. Note that this does not * Paints icons when line wrapping is enabled. Note that this does not override
* override the parent class's implementation to avoid this version being * the parent class's implementation to avoid this version being called when
* called when line wrapping is disabled. * line wrapping is disabled.
*/ */
private void paintComponentWrapped(Graphics g) { private void paintComponentWrapped(Graphics g) {
// The variables we use are as follows: // The variables we use are as follows:
@@ -20,8 +20,8 @@ import javax.swing.text.Element;
import org.fife.ui.rtextarea.SmartHighlightPainter; import org.fife.ui.rtextarea.SmartHighlightPainter;
/** /**
* Marks occurrences of the current token for HTML. Tags that require a * Marks occurrences of the current token for HTML. Tags that require a closing
* closing tag have their "opposite" tag closed. * tag have their "opposite" tag closed.
* *
* @author Robert Futrell * @author Robert Futrell
* @version 1.0 * @version 1.0
@@ -33,36 +33,36 @@ public class HtmlOccurrenceMarker implements OccurrenceMarker {
private static final Set<String> TAGS_REQUIRING_CLOSING = getRequiredClosingTags(); private static final Set<String> TAGS_REQUIRING_CLOSING = getRequiredClosingTags();
public static final Set<String> getRequiredClosingTags() { public static final Set<String> getRequiredClosingTags() {
final String[] tags = { "html", "head", "title", "style", "script", "noscript", "body", "section", "nav", "article", "aside", "h1", final String[] tags = { "html", "head", "title", "style", "script", "noscript", "body", "section", "nav",
"h2", "h3", "h4", "h5", "h6", "header", "footer", "address", "pre", "dialog", "blockquote", "ol", "ul", "dl", "a", "q", "article", "aside", "h1", "h2", "h3", "h4", "h5", "h6", "header", "footer", "address", "pre", "dialog",
"cite", "em", "strong", "small", "mark", "dfn", "abbr", "time", "progress", "meter", "code", "var", "samp", "kbd", "sub", "blockquote", "ol", "ul", "dl", "a", "q", "cite", "em", "strong", "small", "mark", "dfn", "abbr",
"sup", "span", "i", "b", "bdo", "ruby", "rt", "rp", "ins", "del", "figure", "iframe", "object", "video", "audio", "canvas", "time", "progress", "meter", "code", "var", "samp", "kbd", "sub", "sup", "span", "i", "b", "bdo",
"map", "table", "caption", "form", "fieldset", "label", "button", "select", "datalist", "textarea", "output", "details", "ruby", "rt", "rp", "ins", "del", "figure", "iframe", "object", "video", "audio", "canvas", "map",
"bb", "menu", "legend", "div", "table", "caption", "form", "fieldset", "label", "button", "select", "datalist", "textarea", "output",
"details", "bb", "menu", "legend", "div",
// Obsolete elements // Obsolete elements
"acronym", "applet", "big", "blink", "center", "dir", "font", "frame", "frameset", "isindex", "listing", "marquee", "nobr", "acronym", "applet", "big", "blink", "center", "dir", "font", "frame", "frameset", "isindex", "listing",
"noembed", "noframes", "plaintext", "s", "spacer", "strike", "tt", "u", "xmp", }; "marquee", "nobr", "noembed", "noframes", "plaintext", "s", "spacer", "strike", "tt", "u", "xmp", };
return new HashSet<String>(Arrays.asList(tags)); return new HashSet<String>(Arrays.asList(tags));
} }
/** /**
* If the caret is inside of a tag, this method returns the token * If the caret is inside of a tag, this method returns the token representing
* representing the tag name; otherwise, <code>null</code> is returned. * the tag name; otherwise, <code>null</code> is returned.
* <p> * <p>
* *
* Currently, this method only checks for tag names on the same line as * Currently, this method only checks for tag names on the same line as the
* the caret, for simplicity. In the future it could check prior lines * caret, for simplicity. In the future it could check prior lines until the tag
* until the tag name is found. * name is found.
* *
* @param textArea * @param textArea The text area.
* The text area. * @param occurrenceMarker The occurrence marker.
* @param occurrenceMarker * @return The token to mark occurrences of. Note that, if the specified
* The occurrence marker. * occurrence marker identifies tokens other than tag names, these other
* @return The token to mark occurrences of. Note that, if the * element types may be returned.
* specified occurrence marker identifies tokens other than
* tag names, these other element types may be returned.
*/ */
public static final Token getTagNameTokenForCaretOffset(RSyntaxTextArea textArea, OccurrenceMarker occurrenceMarker) { public static final Token getTagNameTokenForCaretOffset(RSyntaxTextArea textArea,
OccurrenceMarker occurrenceMarker) {
// Get the tag name token. // Get the tag name token.
// For now, we only check for tags on the current line, for simplicity. // For now, we only check for tags on the current line, for simplicity.
int dot = textArea.getCaretPosition(); int dot = textArea.getCaretPosition();
@@ -31,14 +31,11 @@ public interface LinkGenerator {
/** /**
* If a region of text under the mouse position should be considered a * If a region of text under the mouse position should be considered a
* hyperlink, a result object is returned. This object describes what * hyperlink, a result object is returned. This object describes what region of
* region of text is the link, and what action to perform if the link is * text is the link, and what action to perform if the link is clicked.
* clicked.
* *
* @param textArea * @param textArea The text component.
* The text component. * @param offs The offset in the document under the mouse position.
* @param offs
* The offset in the document under the mouse position.
* @return The link information, or <code>null</code> if no link is at the * @return The link information, or <code>null</code> if no link is at the
* specified offset. * specified offset.
*/ */
@@ -25,10 +25,10 @@ import javax.swing.event.HyperlinkEvent;
public interface LinkGeneratorResult { public interface LinkGeneratorResult {
/** /**
* Executes the action associated with this object. If the result is a * Executes the action associated with this object. If the result is a URL to
* URL to open, a standard hyperlink event can be returned. Alternatively, * open, a standard hyperlink event can be returned. Alternatively,
* <code>null</code> can be returned and the action performed in this * <code>null</code> can be returned and the action performed in this method
* method itself. * itself.
* *
* @return The hyperlink event to broadcast from the text area, or * @return The hyperlink event to broadcast from the text area, or
* <code>null</code> if the action's behavior occurs in this method * <code>null</code> if the action's behavior occurs in this method
@@ -19,8 +19,8 @@ import javax.swing.text.Caret;
import org.fife.ui.rtextarea.SmartHighlightPainter; import org.fife.ui.rtextarea.SmartHighlightPainter;
/** /**
* Marks all occurrences of the token at the current caret position, if it is * Marks all occurrences of the token at the current caret position, if it is an
* an identifier. * identifier.
* *
* @author Robert Futrell * @author Robert Futrell
* @version 1.0 * @version 1.0
@@ -50,10 +50,9 @@ class MarkOccurrencesSupport implements CaretListener, ActionListener {
/** /**
* Constructor. * Constructor.
* *
* @param delay * @param delay The delay between when the caret last moves and when the text
* The delay between when the caret last moves and when the * should be scanned for matching occurrences. This should be in
* text should be scanned for matching occurrences. This should * milliseconds.
* be in milliseconds.
*/ */
MarkOccurrencesSupport(int delay) { MarkOccurrencesSupport(int delay) {
this(delay, DEFAULT_COLOR); this(delay, DEFAULT_COLOR);
@@ -62,13 +61,11 @@ class MarkOccurrencesSupport implements CaretListener, ActionListener {
/** /**
* Constructor. * Constructor.
* *
* @param delay * @param delay The delay between when the caret last moves and when the text
* The delay between when the caret last moves and when the * should be scanned for matching occurrences. This should be in
* text should be scanned for matching occurrences. This should * milliseconds.
* be in milliseconds. * @param color The color to use to mark the occurrences. This cannot be
* @param color * <code>null</code>.
* The color to use to mark the occurrences. This cannot be
* <code>null</code>.
*/ */
MarkOccurrencesSupport(int delay, Color color) { MarkOccurrencesSupport(int delay, Color color) {
timer = new Timer(delay, this); timer = new Timer(delay, this);
@@ -78,16 +75,15 @@ class MarkOccurrencesSupport implements CaretListener, ActionListener {
} }
/** /**
* Called after the caret has been moved and a fixed time delay has * Called after the caret has been moved and a fixed time delay has elapsed.
* elapsed. This locates and highlights all occurrences of the identifier * This locates and highlights all occurrences of the identifier at the caret
* at the caret position, if any. * position, if any.
* <p> * <p>
* *
* Callers should not call this method directly, but should rather prefer * Callers should not call this method directly, but should rather prefer
* {@link #doMarkOccurrences()} to mark occurrences. * {@link #doMarkOccurrences()} to mark occurrences.
* *
* @param e * @param e The event.
* The event.
* @see #doMarkOccurrences() * @see #doMarkOccurrences()
*/ */
@Override @Override
@@ -128,8 +124,7 @@ class MarkOccurrencesSupport implements CaretListener, ActionListener {
/** /**
* Called when the caret moves in the text area. * Called when the caret moves in the text area.
* *
* @param e * @param e The event.
* The event.
*/ */
@Override @Override
public void caretUpdate(CaretEvent e) { public void caretUpdate(CaretEvent e) {
@@ -147,8 +142,7 @@ class MarkOccurrencesSupport implements CaretListener, ActionListener {
} }
/** /**
* Immediately marks all occurrences of the token at the current caret * Immediately marks all occurrences of the token at the current caret position.
* position.
*/ */
public void doMarkOccurrences() { public void doMarkOccurrences() {
timer.stop(); timer.stop();
@@ -187,11 +181,10 @@ class MarkOccurrencesSupport implements CaretListener, ActionListener {
} }
/** /**
* Installs this listener on a text area. If it is already installed on * Installs this listener on a text area. If it is already installed on another
* another text area, it is uninstalled first. * text area, it is uninstalled first.
* *
* @param textArea * @param textArea The text area to install on.
* The text area to install on.
*/ */
public void install(RSyntaxTextArea textArea) { public void install(RSyntaxTextArea textArea) {
if (this.textArea != null) { if (this.textArea != null) {
@@ -207,8 +200,7 @@ class MarkOccurrencesSupport implements CaretListener, ActionListener {
/** /**
* Sets the color to use when marking occurrences. * Sets the color to use when marking occurrences.
* *
* @param color * @param color The color to use.
* The color to use.
* @see #getColor() * @see #getColor()
* @see #setPaintBorder(boolean) * @see #setPaintBorder(boolean)
*/ */
@@ -221,12 +213,11 @@ class MarkOccurrencesSupport implements CaretListener, ActionListener {
} }
/** /**
* Sets the delay between the last caret position change and when the * Sets the delay between the last caret position change and when the text is
* text is scanned for matching identifiers. A delay is needed to prevent * scanned for matching identifiers. A delay is needed to prevent repeated
* repeated scanning while the user is typing. * scanning while the user is typing.
* *
* @param delay * @param delay The new delay.
* The new delay.
* @see #getDelay() * @see #getDelay()
*/ */
public void setDelay(int delay) { public void setDelay(int delay) {
@@ -236,8 +227,7 @@ class MarkOccurrencesSupport implements CaretListener, ActionListener {
/** /**
* Toggles whether a border is painted around marked highlights. * Toggles whether a border is painted around marked highlights.
* *
* @param paint * @param paint Whether to paint a border.
* Whether to paint a border.
* @see #getPaintBorder() * @see #getPaintBorder()
* @see #setColor(Color) * @see #setColor(Color)
*/ */
@@ -251,8 +241,8 @@ class MarkOccurrencesSupport implements CaretListener, ActionListener {
} }
/** /**
* Uninstalls this listener from the current text area. Does nothing if * Uninstalls this listener from the current text area. Does nothing if it not
* it not currently installed on any text area. * currently installed on any text area.
* *
* @see #install(RSyntaxTextArea) * @see #install(RSyntaxTextArea)
*/ */
@@ -123,8 +123,7 @@ class MatchedBracketPopup extends JWindow {
} }
/** /**
* Positions this popup to be in the top right-hand corner of the parent * Positions this popup to be in the top right-hand corner of the parent editor.
* editor.
*/ */
private void setLocation() { private void setLocation() {
Point topLeft = textArea.getVisibleRect().getLocation(); Point topLeft = textArea.getVisibleRect().getLocation();
@@ -10,9 +10,9 @@ import org.fife.ui.rtextarea.SmartHighlightPainter;
/** /**
* An <code>OccurrenceMarker</code> is called when the caret stops moving after * An <code>OccurrenceMarker</code> is called when the caret stops moving after
* a short period. If the current {@link TokenMaker} returns an instance of * a short period. If the current {@link TokenMaker} returns an instance of this
* this class, it is told to mark all occurrences of the identifier at the * class, it is told to mark all occurrences of the identifier at the caret
* caret position. * position.
* *
* @author Robert Futrell * @author Robert Futrell
* @version 1.0 * @version 1.0
@@ -20,27 +20,23 @@ import org.fife.ui.rtextarea.SmartHighlightPainter;
public interface OccurrenceMarker { public interface OccurrenceMarker {
/** /**
* Returns the token to mark occurrences, of, provided it matches the * Returns the token to mark occurrences, of, provided it matches the criteria
* criteria put forth by {@link #isValidType(RSyntaxTextArea, Token)}. * put forth by {@link #isValidType(RSyntaxTextArea, Token)}. For most
* For most languages, this method should return the token at the caret * languages, this method should return the token at the caret position.
* position.
* *
* @param textArea * @param textArea The text area.
* The text area. * @return The token to (possibly) mark occurrences of, or <code>null</code> if
* @return The token to (possibly) mark occurrences of, or * none.
* <code>null</code> if none.
*/ */
Token getTokenToMark(RSyntaxTextArea textArea); Token getTokenToMark(RSyntaxTextArea textArea);
/** /**
* Returns whether the specified token is a type that we can do a * Returns whether the specified token is a type that we can do a "mark
* "mark occurrences" of. Typically, this will delegate to * occurrences" of. Typically, this will delegate to
* {@link RSyntaxTextArea#getMarkOccurrencesOfTokenType(int)}. * {@link RSyntaxTextArea#getMarkOccurrencesOfTokenType(int)}.
* *
* @param textArea * @param textArea The text area.
* The text area. * @param t The token.
* @param t
* The token.
* @return Whether we should mark all occurrences of this token. * @return Whether we should mark all occurrences of this token.
*/ */
boolean isValidType(RSyntaxTextArea textArea, Token t); boolean isValidType(RSyntaxTextArea textArea, Token t);
@@ -48,14 +44,10 @@ public interface OccurrenceMarker {
/** /**
* Called when occurrences of a token should be marked. * Called when occurrences of a token should be marked.
* *
* @param doc * @param doc The document.
* The document. * @param t The document whose relevant occurrences should be marked.
* @param t * @param h The highlighter to add the highlights to.
* The document whose relevant occurrences should be marked. * @param p The painter for the highlights.
* @param h
* The highlighter to add the highlights to.
* @param p
* The painter for the highlights.
*/ */
void markOccurrences(RSyntaxDocument doc, Token t, RSyntaxTextAreaHighlighter h, SmartHighlightPainter p); void markOccurrences(RSyntaxDocument doc, Token t, RSyntaxTextAreaHighlighter h, SmartHighlightPainter p);
} }
@@ -55,20 +55,21 @@ class ParserManager implements DocumentListener, ActionListener, HyperlinkListen
private Position firstOffsetModded; private Position firstOffsetModded;
private Position lastOffsetModded; private Position lastOffsetModded;
/** /**
* Mapping of notices to their highlights in the editor. Can't use a Map * Mapping of notices to their highlights in the editor. Can't use a Map since
* since parsers could return two <code>ParserNotice</code>s that compare * parsers could return two <code>ParserNotice</code>s that compare equally via
* equally via <code>equals()</code>. Real-world example: The Perl * <code>equals()</code>. Real-world example: The Perl compiler will return 2+
* compiler will return 2+ identical error messages if the same error is * identical error messages if the same error is committed in a single line more
* committed in a single line more than once. * than once.
*/ */
private List<NoticeHighlightPair> noticeHighlightPairs; private List<NoticeHighlightPair> noticeHighlightPairs;
/** /**
* Painter used to underline errors. * Painter used to underline errors.
*/ */
private SquiggleUnderlineHighlightPainter parserErrorHighlightPainter = new SquiggleUnderlineHighlightPainter(Color.RED); private SquiggleUnderlineHighlightPainter parserErrorHighlightPainter = new SquiggleUnderlineHighlightPainter(
Color.RED);
/** /**
* If this system property is set to <code>true</code>, debug messages * If this system property is set to <code>true</code>, debug messages will be
* will be printed to stdout to help diagnose parsing issues. * printed to stdout to help diagnose parsing issues.
*/ */
private static final String PROPERTY_DEBUG_PARSING = "rsta.debugParsing"; private static final String PROPERTY_DEBUG_PARSING = "rsta.debugParsing";
/** /**
@@ -76,17 +77,15 @@ class ParserManager implements DocumentListener, ActionListener, HyperlinkListen
*/ */
private static final boolean DEBUG_PARSING; private static final boolean DEBUG_PARSING;
/** /**
* The default delay between the last key press and when the document * The default delay between the last key press and when the document is parsed,
* is parsed, in milliseconds. * in milliseconds.
*/ */
private static final int DEFAULT_DELAY_MS = 1250; private static final int DEFAULT_DELAY_MS = 1250;
/** /**
* Constructor. * Constructor.
* *
* @param textArea * @param textArea The text area whose document the parser will be parsing.
* The text area whose document the parser will be
* parsing.
*/ */
ParserManager(RSyntaxTextArea textArea) { ParserManager(RSyntaxTextArea textArea) {
this(DEFAULT_DELAY_MS, textArea); this(DEFAULT_DELAY_MS, textArea);
@@ -95,12 +94,9 @@ class ParserManager implements DocumentListener, ActionListener, HyperlinkListen
/** /**
* Constructor. * Constructor.
* *
* @param delay * @param delay The delay between the last key press and when the document is
* The delay between the last key press and when the document * parsed.
* is parsed. * @param textArea The text area whose document the parser will be parsing.
* @param textArea
* The text area whose document the parser will be
* parsing.
*/ */
ParserManager(int delay, RSyntaxTextArea textArea) { ParserManager(int delay, RSyntaxTextArea textArea) {
this.textArea = textArea; this.textArea = textArea;
@@ -115,8 +111,7 @@ class ParserManager implements DocumentListener, ActionListener, HyperlinkListen
/** /**
* Called when the timer fires (e.g. it's time to parse the document). * Called when the timer fires (e.g. it's time to parse the document).
* *
* @param e * @param e The event.
* The event.
*/ */
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
@@ -132,7 +127,8 @@ class ParserManager implements DocumentListener, ActionListener, HyperlinkListen
RSyntaxDocument doc = (RSyntaxDocument) textArea.getDocument(); RSyntaxDocument doc = (RSyntaxDocument) textArea.getDocument();
Element root = doc.getDefaultRootElement(); Element root = doc.getDefaultRootElement();
int firstLine = firstOffsetModded == null ? 0 : root.getElementIndex(firstOffsetModded.getOffset()); int firstLine = firstOffsetModded == null ? 0 : root.getElementIndex(firstOffsetModded.getOffset());
int lastLine = lastOffsetModded == null ? root.getElementCount() - 1 : root.getElementIndex(lastOffsetModded.getOffset()); int lastLine = lastOffsetModded == null ? root.getElementCount() - 1
: root.getElementIndex(lastOffsetModded.getOffset());
firstOffsetModded = lastOffsetModded = null; firstOffsetModded = lastOffsetModded = null;
if (DEBUG_PARSING) { if (DEBUG_PARSING) {
System.out.println("[DEBUG]: Minimum lines to parse: " + firstLine + "-" + lastLine); System.out.println("[DEBUG]: Minimum lines to parse: " + firstLine + "-" + lastLine);
@@ -162,9 +158,7 @@ class ParserManager implements DocumentListener, ActionListener, HyperlinkListen
/** /**
* Adds a parser for the text area. * Adds a parser for the text area.
* *
* @param parser * @param parser The new parser. If this is <code>null</code>, nothing happens.
* The new parser. If this is <code>null</code>, nothing
* happens.
* @see #getParser(int) * @see #getParser(int)
* @see #removeParser(Parser) * @see #removeParser(Parser)
*/ */
@@ -185,11 +179,10 @@ class ParserManager implements DocumentListener, ActionListener, HyperlinkListen
} }
/** /**
* Adds highlights for a list of parser notices. Any current notices * Adds highlights for a list of parser notices. Any current notices from the
* from the same Parser, in the same parsed range, are removed. * same Parser, in the same parsed range, are removed.
* *
* @param res * @param res The result of a parsing.
* The result of a parsing.
* @see #clearParserNoticeHighlights() * @see #clearParserNoticeHighlights()
*/ */
private void addParserNoticeHighlights(ParseResult res) { private void addParserNoticeHighlights(ParseResult res) {
@@ -231,11 +224,11 @@ class ParserManager implements DocumentListener, ActionListener, HyperlinkListen
/** /**
* Called when the document is modified. * Called when the document is modified.
* *
* @param e * @param e The document event.
* The document event.
*/ */
@Override @Override
public void changedUpdate(DocumentEvent e) {} public void changedUpdate(DocumentEvent e) {
}
private void clearParserNoticeHighlights() { private void clearParserNoticeHighlights() {
RSyntaxTextAreaHighlighter h = (RSyntaxTextAreaHighlighter) textArea.getHighlighter(); RSyntaxTextAreaHighlighter h = (RSyntaxTextAreaHighlighter) textArea.getHighlighter();
@@ -250,8 +243,7 @@ class ParserManager implements DocumentListener, ActionListener, HyperlinkListen
/** /**
* Removes all parser notice highlights for a specific parser. * Removes all parser notice highlights for a specific parser.
* *
* @param parser * @param parser The parser whose highlights to remove.
* The parser whose highlights to remove.
*/ */
private void clearParserNoticeHighlights(Parser parser) { private void clearParserNoticeHighlights(Parser parser) {
RSyntaxTextAreaHighlighter h = (RSyntaxTextAreaHighlighter) textArea.getHighlighter(); RSyntaxTextAreaHighlighter h = (RSyntaxTextAreaHighlighter) textArea.getHighlighter();
@@ -282,18 +274,16 @@ class ParserManager implements DocumentListener, ActionListener, HyperlinkListen
} }
/** /**
* Forces the given {@link Parser} to re-parse the content of this text * Forces the given {@link Parser} to re-parse the content of this text area.
* area.
* <p> * <p>
* *
* This method can be useful when a <code>Parser</code> can be configured * This method can be useful when a <code>Parser</code> can be configured as to
* as to what notices it returns. For example, if a Java language parser * what notices it returns. For example, if a Java language parser can be
* can be configured to set whether no serialVersionUID is a warning, * configured to set whether no serialVersionUID is a warning, error, or
* error, or ignored, this method can be called after changing the expected * ignored, this method can be called after changing the expected notice type to
* notice type to have the document re-parsed. * have the document re-parsed.
* *
* @param parser * @param parser The index of the <code>Parser</code> to re-run.
* The index of the <code>Parser</code> to re-run.
* @see #getParser(int) * @see #getParser(int)
*/ */
public void forceReparsing(int parser) { public void forceReparsing(int parser) {
@@ -315,8 +305,8 @@ class ParserManager implements DocumentListener, ActionListener, HyperlinkListen
} }
/** /**
* Returns the delay between the last "concurrent" edit and when the * Returns the delay between the last "concurrent" edit and when the document is
* document is re-parsed. * re-parsed.
* *
* @return The delay, in milliseconds. * @return The delay, in milliseconds.
* @see #setDelay(int) * @see #setDelay(int)
@@ -328,8 +318,7 @@ class ParserManager implements DocumentListener, ActionListener, HyperlinkListen
/** /**
* Returns the specified parser. * Returns the specified parser.
* *
* @param index * @param index The index of the parser.
* The index of the parser.
* @return The parser. * @return The parser.
* @see #getParserCount() * @see #getParserCount()
* @see #addParser(Parser) * @see #addParser(Parser)
@@ -349,12 +338,10 @@ class ParserManager implements DocumentListener, ActionListener, HyperlinkListen
} }
/** /**
* Returns a list of the current parser notices for this text area. * Returns a list of the current parser notices for this text area. This method
* This method (like most Swing methods) should only be called on the * (like most Swing methods) should only be called on the EDT.
* EDT.
* *
* @return The list of notices. This will be an empty list if there are * @return The list of notices. This will be an empty list if there are none.
* none.
*/ */
public List<ParserNotice> getParserNotices() { public List<ParserNotice> getParserNotices() {
List<ParserNotice> notices = new ArrayList<ParserNotice>(); List<ParserNotice> notices = new ArrayList<ParserNotice>();
@@ -367,13 +354,11 @@ class ParserManager implements DocumentListener, ActionListener, HyperlinkListen
} }
/** /**
* Returns the tool tip to display for a mouse event at the given * Returns the tool tip to display for a mouse event at the given location. This
* location. This method is overridden to give a registered parser a * method is overridden to give a registered parser a chance to display a tool
* chance to display a tool tip (such as an error description when the * tip (such as an error description when the mouse is over an error highlight).
* mouse is over an error highlight).
* *
* @param e * @param e The mouse event.
* The mouse event.
* @return The tool tip to display, and possibly a hyperlink event handler. * @return The tool tip to display, and possibly a hyperlink event handler.
*/ */
public ToolTipInfo getToolTipText(MouseEvent e) { public ToolTipInfo getToolTipText(MouseEvent e) {
@@ -385,19 +370,12 @@ class ParserManager implements DocumentListener, ActionListener, HyperlinkListen
int pos = textArea.viewToModel(p); int pos = textArea.viewToModel(p);
/* /*
* Highlighter.Highlight[] highlights = textArea.getHighlighter(). * Highlighter.Highlight[] highlights = textArea.getHighlighter().
* getHighlights(); * getHighlights(); for (int i=0; i<highlights.length; i++) {
* for (int i=0; i<highlights.length; i++) { * Highlighter.Highlight h = highlights[i]; //if (h instanceof
* Highlighter.Highlight h = highlights[i]; * ParserNoticeHighlight) { // ParserNoticeHighlight pnh =
* //if (h instanceof ParserNoticeHighlight) { * (ParserNoticeHighlight)h; int start = h.getStartOffset(); int end =
* // ParserNoticeHighlight pnh = (ParserNoticeHighlight)h; * h.getEndOffset(); if (start<=pos && end>=pos) { //return pnh.getMessage();
* int start = h.getStartOffset(); * return textArea.getText(start, end-start); } //} }
* int end = h.getEndOffset();
* if (start<=pos && end>=pos) {
* //return pnh.getMessage();
* return textArea.getText(start, end-start);
* }
* //}
* }
*/ */
if (noticeHighlightPairs != null) { if (noticeHighlightPairs != null) {
for (NoticeHighlightPair pair : noticeHighlightPairs) { for (NoticeHighlightPair pair : noticeHighlightPairs) {
@@ -422,8 +400,7 @@ class ParserManager implements DocumentListener, ActionListener, HyperlinkListen
/** /**
* Called when the document is modified. * Called when the document is modified.
* *
* @param e * @param e The document event.
* The document event.
*/ */
public void handleDocumentEvent(DocumentEvent e) { public void handleDocumentEvent(DocumentEvent e) {
if (running && parsers.size() > 0) { if (running && parsers.size() > 0) {
@@ -435,8 +412,7 @@ class ParserManager implements DocumentListener, ActionListener, HyperlinkListen
* Called when the user clicks a hyperlink in a * Called when the user clicks a hyperlink in a
* {@link org.fife.ui.rsyntaxtextarea.focusabletip.FocusableTip}. * {@link org.fife.ui.rsyntaxtextarea.focusabletip.FocusableTip}.
* *
* @param e * @param e The event.
* The event.
*/ */
@Override @Override
public void hyperlinkUpdate(HyperlinkEvent e) { public void hyperlinkUpdate(HyperlinkEvent e) {
@@ -448,8 +424,7 @@ class ParserManager implements DocumentListener, ActionListener, HyperlinkListen
/** /**
* Called when the document is modified. * Called when the document is modified.
* *
* @param e * @param e The document event.
* The document event.
*/ */
@Override @Override
public void insertUpdate(DocumentEvent e) { public void insertUpdate(DocumentEvent e) {
@@ -473,10 +448,8 @@ class ParserManager implements DocumentListener, ActionListener, HyperlinkListen
/** /**
* Returns whether a parser notice contains the specified offset. * Returns whether a parser notice contains the specified offset.
* *
* @param notice * @param notice The notice.
* The notice. * @param offs The offset.
* @param offs
* The offset.
* @return Whether the notice contains the offset. * @return Whether the notice contains the offset.
*/ */
private boolean noticeContainsPosition(ParserNotice notice, int offs) { private boolean noticeContainsPosition(ParserNotice notice, int offs) {
@@ -494,18 +467,16 @@ class ParserManager implements DocumentListener, ActionListener, HyperlinkListen
} }
/** /**
* Since <code>viewToModel()</code> returns the <em>closest</em> model * Since <code>viewToModel()</code> returns the <em>closest</em> model position,
* position, and the position doesn't <em>necessarily</em> contain the * and the position doesn't <em>necessarily</em> contain the point passed in as
* point passed in as an argument, this method checks whether the point is * an argument, this method checks whether the point is indeed contained in the
* indeed contained in the view rectangle for the specified offset. * view rectangle for the specified offset.
* *
* @param notice * @param notice The parser notice.
* The parser notice. * @param p The point possibly contained in the view range of the parser
* @param p * notice.
* The point possibly contained in the view range of the * @return Whether the parser notice actually contains the specified point in
* parser notice. * the view.
* @return Whether the parser notice actually contains the specified point
* in the view.
*/ */
private boolean noticeContainsPointInView(ParserNotice notice, Point p) { private boolean noticeContainsPointInView(ParserNotice notice, Point p) {
try { try {
@@ -547,8 +518,7 @@ class ParserManager implements DocumentListener, ActionListener, HyperlinkListen
/** /**
* Called when a property we're interested in changes. * Called when a property we're interested in changes.
* *
* @param e * @param e The property change event.
* The property change event.
*/ */
@Override @Override
public void propertyChange(PropertyChangeEvent e) { public void propertyChange(PropertyChangeEvent e) {
@@ -569,8 +539,7 @@ class ParserManager implements DocumentListener, ActionListener, HyperlinkListen
/** /**
* Removes a parser. * Removes a parser.
* *
* @param parser * @param parser The parser to remove.
* The parser to remove.
* @return Whether the parser was found. * @return Whether the parser was found.
* @see #addParser(Parser) * @see #addParser(Parser)
* @see #getParser(int) * @see #getParser(int)
@@ -585,11 +554,10 @@ class ParserManager implements DocumentListener, ActionListener, HyperlinkListen
} }
/** /**
* Removes all parser notices (and clears highlights in the editor) from * Removes all parser notices (and clears highlights in the editor) from a
* a particular parser. * particular parser.
* *
* @param parser * @param parser The parser.
* The parser.
*/ */
private void removeParserNotices(Parser parser) { private void removeParserNotices(Parser parser) {
if (noticeHighlightPairs != null) { if (noticeHighlightPairs != null) {
@@ -605,12 +573,11 @@ class ParserManager implements DocumentListener, ActionListener, HyperlinkListen
} }
/** /**
* Removes any currently stored notices (and the corresponding highlights * Removes any currently stored notices (and the corresponding highlights from
* from the editor) from the same Parser, and in the given line range, * the editor) from the same Parser, and in the given line range, as in the
* as in the results. * results.
* *
* @param res * @param res The results.
* The results.
*/ */
private void removeParserNotices(ParseResult res) { private void removeParserNotices(ParseResult res) {
if (noticeHighlightPairs != null) { if (noticeHighlightPairs != null) {
@@ -636,8 +603,7 @@ class ParserManager implements DocumentListener, ActionListener, HyperlinkListen
/** /**
* Called when the document is modified. * Called when the document is modified.
* *
* @param e * @param e The document event.
* The document event.
*/ */
@Override @Override
public void removeUpdate(DocumentEvent e) { public void removeUpdate(DocumentEvent e) {
@@ -670,12 +636,11 @@ class ParserManager implements DocumentListener, ActionListener, HyperlinkListen
} }
/** /**
* Sets the delay between the last "concurrent" edit and when the document * Sets the delay between the last "concurrent" edit and when the document is
* is re-parsed. * re-parsed.
* *
* @param millis * @param millis The new delay, in milliseconds. This must be greater than
* The new delay, in milliseconds. This must be greater * <code>0</code>.
* than <code>0</code>.
* @see #getDelay() * @see #getDelay()
*/ */
public void setDelay(int millis) { public void setDelay(int millis) {
@@ -690,18 +655,16 @@ class ParserManager implements DocumentListener, ActionListener, HyperlinkListen
} }
/** /**
* Returns whether a parser notice should be removed, based on a parse * Returns whether a parser notice should be removed, based on a parse result.
* result.
* *
* @param notice * @param notice The notice in question.
* The notice in question. * @param res The result.
* @param res
* The result.
* @return Whether the notice should be removed. * @return Whether the notice should be removed.
*/ */
private boolean shouldRemoveNotice(ParserNotice notice, ParseResult res) { private boolean shouldRemoveNotice(ParserNotice notice, ParseResult res) {
if (DEBUG_PARSING) { if (DEBUG_PARSING) {
System.out.println("[DEBUG]: ... ... shouldRemoveNotice " + notice + ": " + (notice.getParser() == res.getParser())); System.out.println(
"[DEBUG]: ... ... shouldRemoveNotice " + notice + ": " + (notice.getParser() == res.getParser()));
} }
// NOTE: We must currently remove all notices for the parser. Parser // NOTE: We must currently remove all notices for the parser. Parser
// implementors are required to parse the entire document each parsing // implementors are required to parse the entire document each parsing
@@ -12,8 +12,8 @@ import javax.swing.JWindow;
/** /**
* A hook allowing hosting applications to decorate JWindows created by the * A hook allowing hosting applications to decorate JWindows created by the
* AutoComplete library. For example, you could use the * AutoComplete library. For example, you could use the
* <a href="http://jgoodies.com/">JGoodies</a> library to add drop shadows * <a href="http://jgoodies.com/">JGoodies</a> library to add drop shadows to
* to the windows. * the windows.
* *
* @author Robert Futrell * @author Robert Futrell
* @version 1.0 * @version 1.0
@@ -27,20 +27,18 @@ public abstract class PopupWindowDecorator {
/** /**
* Callback called whenever an appropriate JWindow is created by the * Callback called whenever an appropriate JWindow is created by the
* AutoComplete library. Implementations can decorate the window however * AutoComplete library. Implementations can decorate the window however they
* they see fit. * see fit.
* *
* @param window * @param window The newly-created window.
* The newly-created window.
*/ */
public abstract void decorate(JWindow window); public abstract void decorate(JWindow window);
/** /**
* Returns the singleton instance of this class. This should only be * Returns the singleton instance of this class. This should only be called on
* called on the EDT. * the EDT.
* *
* @return The singleton instance of this class, or <code>null</code> * @return The singleton instance of this class, or <code>null</code> for none.
* for none.
* @see #set(PopupWindowDecorator) * @see #set(PopupWindowDecorator)
*/ */
public static PopupWindowDecorator get() { public static PopupWindowDecorator get() {
@@ -48,12 +46,11 @@ public abstract class PopupWindowDecorator {
} }
/** /**
* Sets the singleton instance of this class. This should only be called * Sets the singleton instance of this class. This should only be called on the
* on the EDT. * EDT.
* *
* @param decorator * @param decorator The new instance of this class. This may be
* The new instance of this class. This may be * <code>null</code>.
* <code>null</code>.
* @see #get() * @see #get()
*/ */
public static void set(PopupWindowDecorator decorator) { public static void set(PopupWindowDecorator decorator) {
+18 -26
View File
@@ -22,20 +22,16 @@ interface RSTAView {
* Returns the y-coordinate of the specified line. * Returns the y-coordinate of the specified line.
* <p> * <p>
* *
* This method is quicker than using traditional * This method is quicker than using traditional <code>modelToView(int)</code>
* <code>modelToView(int)</code> calls, as the entire bounding box isn't * calls, as the entire bounding box isn't computed.
* computed.
* *
* @param alloc * @param alloc The area the text area can render into.
* The area the text area can render into. * @param line The line number.
* @param line * @return The y-coordinate of the top of the line, or <code>-1</code> if this
* The line number. * text area doesn't yet have a positive size or the line is hidden
* @return The y-coordinate of the top of the line, or <code>-1</code> if * (i.e. from folding).
* this text area doesn't yet have a positive size or the line is * @throws BadLocationException If <code>line</code> isn't a valid line number
* hidden (i.e. from folding). * for this document.
* @throws BadLocationException
* If <code>line</code> isn't a valid line
* number for this document.
*/ */
int yForLine(Rectangle alloc, int line) throws BadLocationException; int yForLine(Rectangle alloc, int line) throws BadLocationException;
@@ -43,20 +39,16 @@ interface RSTAView {
* Returns the y-coordinate of the line containing a specified offset. * Returns the y-coordinate of the line containing a specified offset.
* <p> * <p>
* *
* This method is quicker than using traditional * This method is quicker than using traditional <code>modelToView(int)</code>
* <code>modelToView(int)</code> calls, as the entire bounding box isn't * calls, as the entire bounding box isn't computed.
* computed.
* *
* @param alloc * @param alloc The area the text area can render into.
* The area the text area can render into. * @param offs The offset info the document.
* @param offs * @return The y-coordinate of the top of the offset, or <code>-1</code> if this
* The offset info the document. * text area doesn't yet have a positive size or the line is hidden
* @return The y-coordinate of the top of the offset, or <code>-1</code> if * (i.e. from folding).
* this text area doesn't yet have a positive size or the line is * @throws BadLocationException If <code>offs</code> isn't a valid offset into
* hidden (i.e. from folding). * the document.
* @throws BadLocationException
* If <code>offs</code> isn't a valid offset
* into the document.
*/ */
int yForLineContaining(Rectangle alloc, int offs) throws BadLocationException; int yForLineContaining(Rectangle alloc, int offs) throws BadLocationException;
} }
@@ -51,8 +51,7 @@ import me.ByteEdit.edit.JavaAssemblyTokenMaker;
public class RSyntaxDocument extends RDocument implements Iterable<Token>, SyntaxConstants { public class RSyntaxDocument extends RDocument implements Iterable<Token>, SyntaxConstants {
/** /**
* Creates a {@link TokenMaker} appropriate for a given programming * Creates a {@link TokenMaker} appropriate for a given programming language.
* language.
*/ */
private transient TokenMakerFactory tokenMakerFactory; private transient TokenMakerFactory tokenMakerFactory;
/** /**
@@ -64,8 +63,7 @@ public class RSyntaxDocument extends RDocument implements Iterable<Token>, Synta
*/ */
private String syntaxStyle; private String syntaxStyle;
/** /**
* Array of values representing the "last token type" on each line. This is * Array of values representing the "last token type" on each line. This is used
* used
* in cases such as multi-line comments: if the previous line ended with an * in cases such as multi-line comments: if the previous line ended with an
* (unclosed) multi-line comment, we can use this knowledge and start the * (unclosed) multi-line comment, we can use this knowledge and start the
* current line's syntax highlighting in multi-line comment state. * current line's syntax highlighting in multi-line comment state.
@@ -77,35 +75,28 @@ public class RSyntaxDocument extends RDocument implements Iterable<Token>, Synta
private transient int tokenRetrievalCount = 0; private transient int tokenRetrievalCount = 0;
private transient Segment s; private transient Segment s;
/** /**
* If this is set to <code>true</code>, debug information about how much * If this is set to <code>true</code>, debug information about how much token
* token
* caching is helping is printed to stdout. * caching is helping is printed to stdout.
*/ */
private static final boolean DEBUG_TOKEN_CACHING = false; private static final boolean DEBUG_TOKEN_CACHING = false;
/** /**
* Constructs a plain text document. A default root element is created, and * Constructs a plain text document. A default root element is created, and the
* the
* tab size set to 5. * tab size set to 5.
* *
* @param syntaxStyle * @param syntaxStyle The syntax highlighting scheme to use.
* The syntax highlighting scheme to use.
*/ */
public RSyntaxDocument(String syntaxStyle) { public RSyntaxDocument(String syntaxStyle) {
this(null, syntaxStyle); this(null, syntaxStyle);
} }
/** /**
* Constructs a plain text document. A default root element is created, and * Constructs a plain text document. A default root element is created, and the
* the
* tab size set to 5. * tab size set to 5.
* *
* @param tmf * @param tmf The <code>TokenMakerFactory</code> for this document. If
* The <code>TokenMakerFactory</code> for this document. If this * this is <code>null</code>, a default factory is used.
* is * @param syntaxStyle The syntax highlighting scheme to use.
* <code>null</code>, a default factory is used.
* @param syntaxStyle
* The syntax highlighting scheme to use.
*/ */
public RSyntaxDocument(TokenMakerFactory tmf, String syntaxStyle) { public RSyntaxDocument(TokenMakerFactory tmf, String syntaxStyle) {
putProperty(tabSizeAttribute, Integer.valueOf(5)); putProperty(tabSizeAttribute, Integer.valueOf(5));
@@ -117,25 +108,21 @@ public class RSyntaxDocument extends RDocument implements Iterable<Token>, Synta
} }
/** /**
* Alerts all listeners to this document of an insertion. This is overridden * Alerts all listeners to this document of an insertion. This is overridden so
* so
* we can update our syntax highlighting stuff. * we can update our syntax highlighting stuff.
* <p> * <p>
* The syntax highlighting stuff has to be here instead of in * The syntax highlighting stuff has to be here instead of in
* <code>insertUpdate</code> because <code>insertUpdate</code> is not called * <code>insertUpdate</code> because <code>insertUpdate</code> is not called by
* by
* the undo/redo actions, but this method is. * the undo/redo actions, but this method is.
* *
* @param e * @param e The change.
* The change.
*/ */
@Override @Override
protected void fireInsertUpdate(DocumentEvent e) { protected void fireInsertUpdate(DocumentEvent e) {
cachedTokenList = null; cachedTokenList = null;
/* /*
* Now that the text is actually inserted into the content and element * Now that the text is actually inserted into the content and element
* structure, we can update our token elements and * structure, we can update our token elements and "last tokens on lines"
* "last tokens on lines"
* structure. * structure.
*/ */
Element lineMap = getDefaultRootElement(); Element lineMap = getDefaultRootElement();
@@ -176,21 +163,18 @@ public class RSyntaxDocument extends RDocument implements Iterable<Token>, Synta
} }
/** /**
* This method is called AFTER the content has been inserted into the * This method is called AFTER the content has been inserted into the document
* document
* and the element structure has been updated. * and the element structure has been updated.
* <p> * <p>
* The syntax-highlighting updates need to be done here (as opposed to an * The syntax-highlighting updates need to be done here (as opposed to an
* override of <code>postRemoveUpdate</code>) as this method is called in * override of <code>postRemoveUpdate</code>) as this method is called in
* response to undo/redo events, whereas <code>postRemoveUpdate</code> is * response to undo/redo events, whereas <code>postRemoveUpdate</code> is not.
* not.
* <p> * <p>
* Now that the text is actually inserted into the content and element * Now that the text is actually inserted into the content and element
* structure, we can update our token elements and "last tokens on lines" * structure, we can update our token elements and "last tokens on lines"
* structure. * structure.
* *
* @param chng * @param chng The change that occurred.
* The change that occurred.
* @see #removeUpdate * @see #removeUpdate
*/ */
@Override @Override
@@ -245,10 +229,8 @@ public class RSyntaxDocument extends RDocument implements Iterable<Token>, Synta
* Returns the closest {@link TokenTypes "standard" token type} for a given * Returns the closest {@link TokenTypes "standard" token type} for a given
* "internal" token type (e.g. one whose value is <code>&lt; 0</code>). * "internal" token type (e.g. one whose value is <code>&lt; 0</code>).
* *
* @param type * @param type The token type.
* The token type. * @return The closest "standard" token type. If a mapping is not defined for
* @return The closest "standard" token type. If a mapping is not defined
* for
* this language, then <code>type</code> is returned. * this language, then <code>type</code> is returned.
*/ */
public int getClosestStandardTokenTypeForInternalType(int type) { public int getClosestStandardTokenTypeForInternalType(int type) {
@@ -256,10 +238,8 @@ public class RSyntaxDocument extends RDocument implements Iterable<Token>, Synta
} }
/** /**
* Returns whether closing markup tags should be automatically completed. * Returns whether closing markup tags should be automatically completed. This
* This * method only returns <code>true</code> if {@link #getLanguageIsMarkup()} also
* method only returns <code>true</code> if {@link #getLanguageIsMarkup()}
* also
* returns <code>true</code>. * returns <code>true</code>.
* *
* @return Whether markup closing tags should be automatically completed. * @return Whether markup closing tags should be automatically completed.
@@ -274,12 +254,11 @@ public class RSyntaxDocument extends RDocument implements Iterable<Token>, Synta
* Returns whether the current programming language uses curly braces * Returns whether the current programming language uses curly braces
* ('<code>{</code>' and '<code>}</code>') to denote code blocks. * ('<code>{</code>' and '<code>}</code>') to denote code blocks.
* *
* @param languageIndex * @param languageIndex The language index at the offset in question. Since some
* The language index at the offset in question. Since some * <code>TokenMaker</code>s effectively have nested
* <code>TokenMaker</code>s effectively have nested languages * languages (such as JavaScript in HTML), this parameter
* (such * tells the <code>TokenMaker</code> what sub-language to
* as JavaScript in HTML), this parameter tells the * look at.
* <code>TokenMaker</code> what sub-language to look at.
* @return Whether curly braces denote code blocks. * @return Whether curly braces denote code blocks.
*/ */
public boolean getCurlyBracesDenoteCodeBlocks(int languageIndex) { public boolean getCurlyBracesDenoteCodeBlocks(int languageIndex) {
@@ -287,8 +266,7 @@ public class RSyntaxDocument extends RDocument implements Iterable<Token>, Synta
} }
/** /**
* Returns whether the current language is a markup language, such as HTML, * Returns whether the current language is a markup language, such as HTML, XML
* XML
* or PHP. * or PHP.
* *
* @return Whether the current language is a markup language. * @return Whether the current language is a markup language.
@@ -300,10 +278,8 @@ public class RSyntaxDocument extends RDocument implements Iterable<Token>, Synta
/** /**
* Returns the token type of the last token on the given line. * Returns the token type of the last token on the given line.
* *
* @param line * @param line The line to inspect.
* The line to inspect. * @return The token type of the last token on the specified line. If the line
* @return The token type of the last token on the specified line. If the
* line
* is invalid, an exception is thrown. * is invalid, an exception is thrown.
*/ */
public int getLastTokenTypeOnLine(int line) { public int getLastTokenTypeOnLine(int line) {
@@ -311,15 +287,12 @@ public class RSyntaxDocument extends RDocument implements Iterable<Token>, Synta
} }
/** /**
* Returns the text to place at the beginning and end of a line to "comment" * Returns the text to place at the beginning and end of a line to "comment" it
* it
* in this programming language. * in this programming language.
* *
* @return The start and end strings to add to a line to "comment" it out. A * @return The start and end strings to add to a line to "comment" it out. A
* <code>null</code> value for either means there is no string to * <code>null</code> value for either means there is no string to add
* add * for that part. A value of <code>null</code> for the array means this
* for that part. A value of <code>null</code> for the array means
* this
* language does not support commenting/uncommenting lines. * language does not support commenting/uncommenting lines.
*/ */
public String[] getLineCommentStartAndEnd(int languageIndex) { public String[] getLineCommentStartAndEnd(int languageIndex) {
@@ -327,14 +300,11 @@ public class RSyntaxDocument extends RDocument implements Iterable<Token>, Synta
} }
/** /**
* Returns whether tokens of the specified type should have "mark * Returns whether tokens of the specified type should have "mark occurrences"
* occurrences"
* enabled for the current programming language. * enabled for the current programming language.
* *
* @param type * @param type The token type.
* The token type. * @return Whether tokens of this type should have "mark occurrences" enabled.
* @return Whether tokens of this type should have "mark occurrences"
* enabled.
*/ */
boolean getMarkOccurrencesOfTokenType(int type) { boolean getMarkOccurrencesOfTokenType(int type) {
return tokenMaker.getMarkOccurrencesOfTokenType(type); return tokenMaker.getMarkOccurrencesOfTokenType(type);
@@ -353,8 +323,7 @@ public class RSyntaxDocument extends RDocument implements Iterable<Token>, Synta
* This method returns whether auto indentation should be done if Enter is * This method returns whether auto indentation should be done if Enter is
* pressed at the end of the specified line. * pressed at the end of the specified line.
* *
* @param line * @param line The line to check.
* The line to check.
* @return Whether an extra indentation should be done. * @return Whether an extra indentation should be done.
*/ */
public boolean getShouldIndentNextLine(int line) { public boolean getShouldIndentNextLine(int line) {
@@ -376,12 +345,10 @@ public class RSyntaxDocument extends RDocument implements Iterable<Token>, Synta
/** /**
* Returns a token list for the specified segment of text representing the * Returns a token list for the specified segment of text representing the
* specified line number. This method is basically a wrapper for * specified line number. This method is basically a wrapper for
* <code>tokenMaker.getTokenList</code> that takes into account the last * <code>tokenMaker.getTokenList</code> that takes into account the last token
* token
* on the previous line to assure token accuracy. * on the previous line to assure token accuracy.
* *
* @param line * @param line The line number of <code>text</code> in the document, &gt;= 0.
* The line number of <code>text</code> in the document, &gt;= 0.
* @return A token list representing the specified line. * @return A token list representing the specified line.
*/ */
public final Token getTokenListForLine(int line) { public final Token getTokenListForLine(int line) {
@@ -424,14 +391,11 @@ public class RSyntaxDocument extends RDocument implements Iterable<Token>, Synta
/** /**
* Returns whether a character could be part of an "identifier" token in a * Returns whether a character could be part of an "identifier" token in a
* specific language. This is used to identify such things as the bounds of * specific language. This is used to identify such things as the bounds of the
* the
* "word" to select on double-clicking. * "word" to select on double-clicking.
* *
* @param languageIndex * @param languageIndex The language index the character was found in.
* The language index the character was found in. * @param ch The character.
* @param ch
* The character.
* @return Whether the character could be part of an "identifier" token. * @return Whether the character could be part of an "identifier" token.
*/ */
public boolean isIdentifierChar(int languageIndex, char ch) { public boolean isIdentifierChar(int languageIndex, char ch) {
@@ -439,10 +403,8 @@ public class RSyntaxDocument extends RDocument implements Iterable<Token>, Synta
} }
/** /**
* Returns an iterator over the paintable tokens in this document. Results * Returns an iterator over the paintable tokens in this document. Results are
* are * undefined if this document is modified while the iterator is being iterated
* undefined if this document is modified while the iterator is being
* iterated
* through, so this should only be used on the EDT. * through, so this should only be used on the EDT.
* <p> * <p>
* *
@@ -459,8 +421,7 @@ public class RSyntaxDocument extends RDocument implements Iterable<Token>, Synta
/** /**
* Deserializes a document. * Deserializes a document.
* *
* @param in * @param in The stream to read from.
* The stream to read from.
* @throws ClassNotFoundException * @throws ClassNotFoundException
* @throws IOException * @throws IOException
*/ */
@@ -478,14 +439,11 @@ public class RSyntaxDocument extends RDocument implements Iterable<Token>, Synta
} }
/** /**
* Makes our private <code>Segment s</code> point to the text in our * Makes our private <code>Segment s</code> point to the text in our document
* document * referenced by the specified element. Note that <code>line</code> MUST be a
* referenced by the specified element. Note that <code>line</code> MUST be
* a
* valid line number in the document. * valid line number in the document.
* *
* @param line * @param line The line number you want to get.
* The line number you want to get.
*/ */
private void setSharedSegment(int line) { private void setSharedSegment(int line) {
Element map = getDefaultRootElement(); Element map = getDefaultRootElement();
@@ -506,18 +464,15 @@ public class RSyntaxDocument extends RDocument implements Iterable<Token>, Synta
} }
/** /**
* Sets the syntax style being used for syntax highlighting in this * Sets the syntax style being used for syntax highlighting in this document.
* document.
* What styles are supported by a document is determined by its * What styles are supported by a document is determined by its
* {@link TokenMakerFactory}. By default, all <code>RSyntaxDocument</code>s * {@link TokenMakerFactory}. By default, all <code>RSyntaxDocument</code>s
* support all languages built into <code>RSyntaxTextArea</code>. * support all languages built into <code>RSyntaxTextArea</code>.
* *
* @param styleKey * @param styleKey The new style to use, such as
* The new style to use, such as * {@link SyntaxConstants#SYNTAX_STYLE_JAVA}. If this style is
* {@link SyntaxConstants#SYNTAX_STYLE_JAVA}. If this style is * not known or supported by this document, then
* not * {@link SyntaxConstants#SYNTAX_STYLE_NONE} is used.
* known or supported by this document, then
* {@link SyntaxConstants#SYNTAX_STYLE_NONE} is used.
* @see #setSyntaxStyle(TokenMaker) * @see #setSyntaxStyle(TokenMaker)
* @see #getSyntaxStyle() * @see #getSyntaxStyle()
*/ */
@@ -532,13 +487,11 @@ public class RSyntaxDocument extends RDocument implements Iterable<Token>, Synta
} }
/** /**
* Sets the syntax style being used for syntax highlighting in this * Sets the syntax style being used for syntax highlighting in this document.
* document.
* You should call this method if you've created a custom token maker for a * You should call this method if you've created a custom token maker for a
* language not normally supported by <code>RSyntaxTextArea</code>. * language not normally supported by <code>RSyntaxTextArea</code>.
* *
* @param tokenMaker * @param tokenMaker The new token maker to use.
* The new token maker to use.
* @see #setSyntaxStyle(String) * @see #setSyntaxStyle(String)
*/ */
public void setSyntaxStyle(TokenMaker tokenMaker) { public void setSyntaxStyle(TokenMaker tokenMaker) {
@@ -550,9 +503,7 @@ public class RSyntaxDocument extends RDocument implements Iterable<Token>, Synta
/** /**
* Sets the token maker factory used by this document. * Sets the token maker factory used by this document.
* *
* @param tmf * @param tmf The <code>TokenMakerFactory</code> for this document. If this is
* The <code>TokenMakerFactory</code> for this document. If this
* is
* <code>null</code>, a default factory is used. * <code>null</code>, a default factory is used.
*/ */
public void setTokenMakerFactory(TokenMakerFactory tmf) { public void setTokenMakerFactory(TokenMakerFactory tmf) {
@@ -560,21 +511,16 @@ public class RSyntaxDocument extends RDocument implements Iterable<Token>, Synta
} }
/** /**
* Loops through the last-tokens-on-lines array from a specified point * Loops through the last-tokens-on-lines array from a specified point onward,
* onward, * updating last-token values until they stop changing. This should be called
* updating last-token values until they stop changing. This should be * when lines are updated/inserted/removed, as doing so may cause lines below to
* called
* when lines are updated/inserted/removed, as doing so may cause lines
* below to
* change color. * change color.
* *
* @param line * @param line The first line to check for a change in last-token
* The first line to check for a change in last-token value. * value.
* @param numLines * @param numLines The number of lines in the document.
* The number of lines in the document. * @param previousTokenType The last-token value of the line just before
* @param previousTokenType * <code>line</code>.
* The last-token value of the line just before
* <code>line</code>.
* @return The last line that needs repainting. * @return The last line that needs repainting.
*/ */
private int updateLastTokensBelow(int line, int numLines, int previousTokenType) { private int updateLastTokensBelow(int line, int numLines, int previousTokenType) {
File diff suppressed because it is too large. Load diff
@@ -27,8 +27,8 @@ import org.fife.ui.rtextarea.SmartHighlightPainter;
/** /**
* The highlighter implementation used by {@link RSyntaxTextArea}s. It knows to * The highlighter implementation used by {@link RSyntaxTextArea}s. It knows to
* always paint "marked occurrences" highlights below selection highlights, * always paint "marked occurrences" highlights below selection highlights, and
* and squiggle underline highlights above all other highlights. * squiggle underline highlights above all other highlights.
* <p> * <p>
* *
* Most of this code is copied from javax.swing.text.DefaultHighlighter; * Most of this code is copied from javax.swing.text.DefaultHighlighter;
@@ -40,13 +40,13 @@ import org.fife.ui.rtextarea.SmartHighlightPainter;
public class RSyntaxTextAreaHighlighter extends RTextAreaHighlighter { public class RSyntaxTextAreaHighlighter extends RTextAreaHighlighter {
/** /**
* Marked occurrences in the document (to be painted separately from * Marked occurrences in the document (to be painted separately from other
* other highlights). * highlights).
*/ */
private List<SyntaxLayeredHighlightInfoImpl> markedOccurrences; private List<SyntaxLayeredHighlightInfoImpl> markedOccurrences;
/** /**
* Highlights from document parsers. These should be painted "on top of" * Highlights from document parsers. These should be painted "on top of" all
* all other highlights to ensure they are always above the selection. * other highlights to ensure they are always above the selection.
*/ */
private List<SyntaxLayeredHighlightInfoImpl> parserHighlights; private List<SyntaxLayeredHighlightInfoImpl> parserHighlights;
/** /**
@@ -92,8 +92,7 @@ public class RSyntaxTextAreaHighlighter extends RTextAreaHighlighter {
/** /**
* Adds a highlight from a parser. * Adds a highlight from a parser.
* *
* @param notice * @param notice The notice from a {@link Parser}.
* The notice from a {@link Parser}.
* @return A tag with which to reference the highlight. * @return A tag with which to reference the highlight.
* @throws BadLocationException * @throws BadLocationException
* @see #clearParserHighlights() * @see #clearParserHighlights()
@@ -161,8 +160,7 @@ public class RSyntaxTextAreaHighlighter extends RTextAreaHighlighter {
/** /**
* Removes all of the highlights for a specific parser. * Removes all of the highlights for a specific parser.
* *
* @param parser * @param parser The parser.
* The parser.
*/ */
public void clearParserHighlights(Parser parser) { public void clearParserHighlights(Parser parser) {
Iterator<SyntaxLayeredHighlightInfoImpl> i = parserHighlights.iterator(); Iterator<SyntaxLayeredHighlightInfoImpl> i = parserHighlights.iterator();
@@ -188,8 +186,8 @@ public class RSyntaxTextAreaHighlighter extends RTextAreaHighlighter {
} }
/** /**
* Returns a list of "marked occurrences" in the text area. If there are * Returns a list of "marked occurrences" in the text area. If there are no
* no marked occurrences, this will be an empty list. * marked occurrences, this will be an empty list.
* *
* @return The list of marked occurrences, or an empty list if none. The * @return The list of marked occurrences, or an empty list if none. The
* contents of this list will be of type {@link DocumentRange}. * contents of this list will be of type {@link DocumentRange}.
@@ -212,7 +210,8 @@ public class RSyntaxTextAreaHighlighter extends RTextAreaHighlighter {
} }
@Override @Override
public void paintLayeredHighlights(Graphics g, int lineStart, int lineEnd, Shape viewBounds, JTextComponent editor, View view) { public void paintLayeredHighlights(Graphics g, int lineStart, int lineEnd, Shape viewBounds, JTextComponent editor,
View view) {
paintListLayered(g, lineStart, lineEnd, viewBounds, editor, view, markedOccurrences); paintListLayered(g, lineStart, lineEnd, viewBounds, editor, view, markedOccurrences);
super.paintLayeredHighlights(g, lineStart, lineEnd, viewBounds, editor, view); super.paintLayeredHighlights(g, lineStart, lineEnd, viewBounds, editor, view);
paintListLayered(g, lineStart, lineEnd, viewBounds, editor, view, parserHighlights); paintListLayered(g, lineStart, lineEnd, viewBounds, editor, view, parserHighlights);
@@ -221,8 +220,7 @@ public class RSyntaxTextAreaHighlighter extends RTextAreaHighlighter {
/** /**
* Removes a parser highlight from this view. * Removes a parser highlight from this view.
* *
* @param tag * @param tag The reference to the highlight.
* The reference to the highlight.
* @see #addParserHighlight(ParserNotice, * @see #addParserHighlight(ParserNotice,
* javax.swing.text.Highlighter.HighlightPainter) * javax.swing.text.Highlighter.HighlightPainter)
*/ */
@@ -232,8 +230,7 @@ public class RSyntaxTextAreaHighlighter extends RTextAreaHighlighter {
} }
/** /**
* Highlight info implementation used for parser notices and marked * Highlight info implementation used for parser notices and marked occurrences.
* occurrences.
*/ */
private static class SyntaxLayeredHighlightInfoImpl extends LayeredHighlightInfoImpl { private static class SyntaxLayeredHighlightInfoImpl extends LayeredHighlightInfoImpl {
@@ -255,8 +252,8 @@ public class RSyntaxTextAreaHighlighter extends RTextAreaHighlighter {
@Override @Override
public String toString() { public String toString() {
return "[SyntaxLayeredHighlightInfoImpl: " + "startOffs=" + getStartOffset() + ", endOffs=" + getEndOffset() + ", color=" return "[SyntaxLayeredHighlightInfoImpl: " + "startOffs=" + getStartOffset() + ", endOffs=" + getEndOffset()
+ getColor() + "]"; + ", color=" + getColor() + "]";
} }
} }
} }
@@ -27,8 +27,8 @@ import org.fife.ui.rtextarea.RTextArea;
import org.fife.ui.rtextarea.RTextAreaUI; import org.fife.ui.rtextarea.RTextAreaUI;
/** /**
* UI used by <code>RSyntaxTextArea</code>. This allows us to implement * UI used by <code>RSyntaxTextArea</code>. This allows us to implement syntax
* syntax highlighting. * highlighting.
* *
* @author Robert Futrell * @author Robert Futrell
* @version 0.1 * @version 0.1
@@ -53,8 +53,7 @@ public class RSyntaxTextAreaUI extends RTextAreaUI {
/** /**
* Creates the view for an element. * Creates the view for an element.
* *
* @param elem * @param elem The element.
* The element.
* @return The view. * @return The view.
*/ */
@Override @Override
@@ -84,9 +83,9 @@ public class RSyntaxTextAreaUI extends RTextAreaUI {
} }
/** /**
* Returns the name to use to cache/fetch the shared action map. This * Returns the name to use to cache/fetch the shared action map. This should be
* should be overridden by subclasses if the subclass has its own custom * overridden by subclasses if the subclass has its own custom editor kit to
* editor kit to install, so its actions get picked up. * install, so its actions get picked up.
* *
* @return The name of the cached action map. * @return The name of the cached action map.
*/ */
@@ -98,8 +97,7 @@ public class RSyntaxTextAreaUI extends RTextAreaUI {
/** /**
* Fetches the EditorKit for the UI. * Fetches the EditorKit for the UI.
* *
* @param tc * @param tc The text component for which this UI is installed.
* The text component for which this UI is installed.
* @return The editor capabilities. * @return The editor capabilities.
* @see javax.swing.plaf.TextUI#getEditorKit * @see javax.swing.plaf.TextUI#getEditorKit
*/ */
@@ -112,11 +110,11 @@ public class RSyntaxTextAreaUI extends RTextAreaUI {
* Get the InputMap to use for the UI. * Get the InputMap to use for the UI.
* <p> * <p>
* *
* This method is not named <code>getInputMap()</code> because there is * This method is not named <code>getInputMap()</code> because there is a
* a package-private method in <code>BasicTextAreaUI</code> with that name. * package-private method in <code>BasicTextAreaUI</code> with that name. Thus,
* Thus, creating a new method with that name causes certain compilers to * creating a new method with that name causes certain compilers to issue
* issue warnings that you are not actually overriding the original method * warnings that you are not actually overriding the original method (since it
* (since it is package-private). * is package-private).
*/ */
@Override @Override
protected InputMap getRTextAreaInputMap() { protected InputMap getRTextAreaInputMap() {
@@ -142,8 +140,7 @@ public class RSyntaxTextAreaUI extends RTextAreaUI {
/** /**
* Paints the "matched bracket", if any. * Paints the "matched bracket", if any.
* *
* @param g * @param g The graphics context.
* The graphics context.
*/ */
protected void paintMatchedBracket(Graphics g) { protected void paintMatchedBracket(Graphics g) {
RSyntaxTextArea rsta = (RSyntaxTextArea) textArea; RSyntaxTextArea rsta = (RSyntaxTextArea) textArea;
@@ -188,8 +185,7 @@ public class RSyntaxTextAreaUI extends RTextAreaUI {
* Gets called whenever a bound property is changed on this UI's * Gets called whenever a bound property is changed on this UI's
* <code>RSyntaxTextArea</code>. * <code>RSyntaxTextArea</code>.
* *
* @param e * @param e The property change event.
* The property change event.
*/ */
@Override @Override
protected void propertyChange(PropertyChangeEvent e) { protected void propertyChange(PropertyChangeEvent e) {
@@ -217,9 +213,8 @@ public class RSyntaxTextAreaUI extends RTextAreaUI {
* Returns the y-coordinate of the specified line. * Returns the y-coordinate of the specified line.
* <p> * <p>
* *
* This method is quicker than using traditional * This method is quicker than using traditional <code>modelToView(int)</code>
* <code>modelToView(int)</code> calls, as the entire bounding box isn't * calls, as the entire bounding box isn't computed.
* computed.
*/ */
@Override @Override
public int yForLine(int line) throws BadLocationException { public int yForLine(int line) throws BadLocationException {
File diff suppressed because it is too large. Load diff
+80 -92
View File
@@ -20,8 +20,8 @@ import java.io.StringReader;
* Gets the plain text version of RTF documents. * Gets the plain text version of RTF documents.
* <p> * <p>
* *
* This is used by <code>RtfTransferable</code> to return the plain text * This is used by <code>RtfTransferable</code> to return the plain text version
* version of the transferable when the receiver does not support RTF. * of the transferable when the receiver does not support RTF.
* *
* @author Robert Futrell * @author Robert Futrell
* @version 1.0 * @version 1.0
@@ -37,8 +37,7 @@ final class RtfToText {
/** /**
* Private constructor. * Private constructor.
* *
* @param r * @param r The reader to read RTF text from.
* The reader to read RTF text from.
*/ */
private RtfToText(Reader r) { private RtfToText(Reader r) {
this.r = r; this.r = r;
@@ -49,13 +48,12 @@ final class RtfToText {
} }
/** /**
* Converts the RTF text read from this converter's <code>Reader</code> * Converts the RTF text read from this converter's <code>Reader</code> into
* into plain text. It is the caller's responsibility to close the * plain text. It is the caller's responsibility to close the reader after this
* reader after this method is called. * method is called.
* *
* @return The plain text. * @return The plain text.
* @throws IOException * @throws IOException If an IO error occurs.
* If an IO error occurs.
*/ */
private String convert() throws IOException { private String convert() throws IOException {
// Skip over first curly brace as the whole file is in '{' and '}' // Skip over first curly brace as the whole file is in '{' and '}'
@@ -66,76 +64,76 @@ final class RtfToText {
while ((i = r.read()) != -1) { while ((i = r.read()) != -1) {
char ch = (char) i; char ch = (char) i;
switch (ch) { switch (ch) {
case '{': case '{':
if (inControlWord && controlWord.length() == 0) { // "\{" if (inControlWord && controlWord.length() == 0) { // "\{"
sb.append('{'); sb.append('{');
controlWord.setLength(0); controlWord.setLength(0);
inControlWord = false; inControlWord = false;
} else { } else {
blockCount++; blockCount++;
} }
break; break;
case '}': case '}':
if (inControlWord && controlWord.length() == 0) { // "\}" if (inControlWord && controlWord.length() == 0) { // "\}"
sb.append('}'); sb.append('}');
controlWord.setLength(0); controlWord.setLength(0);
inControlWord = false; inControlWord = false;
} else { } else {
blockCount--; blockCount--;
} }
break; break;
case '\\': case '\\':
if (blockCount == 0) { if (blockCount == 0) {
if (inControlWord) { if (inControlWord) {
if (controlWord.length() == 0) { // "\\" if (controlWord.length() == 0) { // "\\"
sb.append('\\'); sb.append('\\');
controlWord.setLength(0); controlWord.setLength(0);
inControlWord = false; inControlWord = false;
} else {
endControlWord();
inControlWord = true;
}
} else { } else {
endControlWord();
inControlWord = true; inControlWord = true;
} }
} else {
inControlWord = true;
} }
break; }
case ' ': break;
if (blockCount == 0) { case ' ':
if (inControlWord) { if (blockCount == 0) {
endControlWord(); if (inControlWord) {
} else { endControlWord();
sb.append(' '); } else {
} sb.append(' ');
} }
break; }
case '\r': break;
case '\n': case '\r':
if (blockCount == 0) { case '\n':
if (inControlWord) { if (blockCount == 0) {
endControlWord(); if (inControlWord) {
} endControlWord();
// Otherwise, ignore
} }
break; // Otherwise, ignore
default: }
if (blockCount == 0) { break;
if (inControlWord) { default:
controlWord.append(ch); if (blockCount == 0) {
} else { if (inControlWord) {
sb.append(ch); controlWord.append(ch);
} } else {
sb.append(ch);
} }
break; }
break;
} }
} }
return sb.toString(); return sb.toString();
} }
/** /**
* Ends a control word. Checks whether it is a common one that affects * Ends a control word. Checks whether it is a common one that affects the plain
* the plain text output (such as "<code>par</code>" or "<code>tab</code>") * text output (such as "<code>par</code>" or "<code>tab</code>") and updates
* and updates the text buffer accordingly. * the text buffer accordingly.
*/ */
private void endControlWord() { private void endControlWord() {
String word = controlWord.toString(); String word = controlWord.toString();
@@ -149,14 +147,12 @@ final class RtfToText {
} }
/** /**
* Converts the contents of the specified byte array representing * Converts the contents of the specified byte array representing an RTF
* an RTF document into plain text. * document into plain text.
* *
* @param rtf * @param rtf The byte array representing an RTF document.
* The byte array representing an RTF document.
* @return The contents of the RTF document, in plain text. * @return The contents of the RTF document, in plain text.
* @throws IOException * @throws IOException If an IO error occurs.
* If an IO error occurs.
*/ */
public static String getPlainText(byte[] rtf) throws IOException { public static String getPlainText(byte[] rtf) throws IOException {
return getPlainText(new ByteArrayInputStream(rtf)); return getPlainText(new ByteArrayInputStream(rtf));
@@ -165,26 +161,22 @@ final class RtfToText {
/** /**
* Converts the contents of the specified RTF file to plain text. * Converts the contents of the specified RTF file to plain text.
* *
* @param file * @param file The RTF file to convert.
* The RTF file to convert.
* @return The contents of the file, in plain text. * @return The contents of the file, in plain text.
* @throws IOException * @throws IOException If an IO error occurs.
* If an IO error occurs.
*/ */
public static String getPlainText(File file) throws IOException { public static String getPlainText(File file) throws IOException {
return getPlainText(new BufferedReader(new FileReader(file))); return getPlainText(new BufferedReader(new FileReader(file)));
} }
/** /**
* Converts the contents of the specified input stream to plain text. * Converts the contents of the specified input stream to plain text. The input
* The input stream will be closed when this method returns. * stream will be closed when this method returns.
* *
* @param in * @param in The input stream to convert. This will be closed when this method
* The input stream to convert. This will be closed when this * returns.
* method returns.
* @return The contents of the stream, in plain text. * @return The contents of the stream, in plain text.
* @throws IOException * @throws IOException If an IO error occurs.
* If an IO error occurs.
*/ */
public static String getPlainText(InputStream in) throws IOException { public static String getPlainText(InputStream in) throws IOException {
return getPlainText(new InputStreamReader(in, "US-ASCII")); return getPlainText(new InputStreamReader(in, "US-ASCII"));
@@ -193,12 +185,10 @@ final class RtfToText {
/** /**
* Converts the contents of the specified <code>Reader</code> to plain text. * Converts the contents of the specified <code>Reader</code> to plain text.
* *
* @param r * @param r The <code>Reader</code>. This will be closed when this method
* The <code>Reader</code>. This will be closed when this method * returns.
* returns.
* @return The contents of the <code>Reader</code>, in plain text. * @return The contents of the <code>Reader</code>, in plain text.
* @throws IOException * @throws IOException If an IO error occurs.
* If an IO error occurs.
*/ */
private static String getPlainText(Reader r) throws IOException { private static String getPlainText(Reader r) throws IOException {
try { try {
@@ -212,11 +202,9 @@ final class RtfToText {
/** /**
* Converts the contents of the specified String to plain text. * Converts the contents of the specified String to plain text.
* *
* @param rtf * @param rtf A string whose contents represent an RTF document.
* A string whose contents represent an RTF document.
* @return The contents of the String, in plain text. * @return The contents of the String, in plain text.
* @throws IOException * @throws IOException If an IO error occurs.
* If an IO error occurs.
*/ */
public static String getPlainText(String rtf) throws IOException { public static String getPlainText(String rtf) throws IOException {
return getPlainText(new StringReader(rtf)); return getPlainText(new StringReader(rtf));
+86 -119
View File
@@ -27,12 +27,10 @@ import org.fife.ui.rtextarea.RTextArea;
* </ul> * </ul>
* *
* The RTF generated isn't really "optimized," but it will do, especially for * The RTF generated isn't really "optimized," but it will do, especially for
* small amounts of text, such as what's common when copy-and-pasting. It * small amounts of text, such as what's common when copy-and-pasting. It tries
* tries to be sufficient for the use case of copying syntax highlighted * to be sufficient for the use case of copying syntax highlighted code:
* code:
* <ul> * <ul>
* <li>It assumes that tokens changing foreground color often is fairly * <li>It assumes that tokens changing foreground color often is fairly common.
* common.
* <li>It assumes that background highlighting is fairly uncommon. * <li>It assumes that background highlighting is fairly uncommon.
* </ul> * </ul>
* *
@@ -53,13 +51,12 @@ public class RtfGenerator {
/** /**
* Java2D assumes a 72 dpi screen resolution, but on Windows the screen * Java2D assumes a 72 dpi screen resolution, but on Windows the screen
* resolution is either 96 dpi or 120 dpi, depending on your font display * resolution is either 96 dpi or 120 dpi, depending on your font display
* settings. This is an attempt to make the RTF generated match the * settings. This is an attempt to make the RTF generated match the size of
* size of what's displayed in the RSyntaxTextArea. * what's displayed in the RSyntaxTextArea.
*/ */
private int screenRes; private int screenRes;
/** /**
* The default font size for RTF. This is point size, in half * The default font size for RTF. This is point size, in half points.
* points.
*/ */
private static final int DEFAULT_FONT_SIZE = 12;// 24; private static final int DEFAULT_FONT_SIZE = 12;// 24;
@@ -87,17 +84,13 @@ public class RtfGenerator {
/** /**
* Appends styled text to the RTF document being generated. * Appends styled text to the RTF document being generated.
* *
* @param text * @param text The text to append.
* The text to append. * @param f The font of the text. If this is <code>null</code>, the default
* @param f * font is used.
* The font of the text. If this is <code>null</code>, the * @param fg The foreground of the text. If this is <code>null</code>, the
* default font is used. * default foreground color is used.
* @param fg * @param bg The background color of the text. If this is <code>null</code>,
* The foreground of the text. If this is <code>null</code>, * the default background color is used.
* the default foreground color is used.
* @param bg
* The background color of the text. If this is
* <code>null</code>, the default background color is used.
* @see #appendNewline() * @see #appendNewline()
*/ */
public void appendToDoc(String text, Font f, Color fg, Color bg) { public void appendToDoc(String text, Font f, Color fg, Color bg) {
@@ -107,16 +100,12 @@ public class RtfGenerator {
/** /**
* Appends styled text to the RTF document being generated. * Appends styled text to the RTF document being generated.
* *
* @param text * @param text The text to append.
* The text to append. * @param f The font of the text. If this is <code>null</code>, the
* @param f * default font is used.
* The font of the text. If this is <code>null</code>, the * @param bg The background color of the text. If this is
* default font is used. * <code>null</code>, the default background color is used.
* @param bg * @param underline Whether the text should be underlined.
* The background color of the text. If this is
* <code>null</code>, the default background color is used.
* @param underline
* Whether the text should be underlined.
* @see #appendNewline() * @see #appendNewline()
*/ */
public void appendToDocNoFG(String text, Font f, Color bg, boolean underline) { public void appendToDocNoFG(String text, Font f, Color bg, boolean underline) {
@@ -126,19 +115,14 @@ public class RtfGenerator {
/** /**
* Appends styled text to the RTF document being generated. * Appends styled text to the RTF document being generated.
* *
* @param text * @param text The text to append.
* The text to append. * @param f The font of the text. If this is <code>null</code>, the
* @param f * default font is used.
* The font of the text. If this is <code>null</code>, the * @param fg The foreground of the text. If this is <code>null</code>,
* default font is used. * the default foreground color is used.
* @param fg * @param bg The background color of the text. If this is
* The foreground of the text. If this is <code>null</code>, * <code>null</code>, the default background color is used.
* the default foreground color is used. * @param underline Whether the text should be underlined.
* @param bg
* The background color of the text. If this is
* <code>null</code>, the default background color is used.
* @param underline
* Whether the text should be underlined.
* @see #appendNewline() * @see #appendNewline()
*/ */
public void appendToDoc(String text, Font f, Color fg, Color bg, boolean underline) { public void appendToDoc(String text, Font f, Color fg, Color bg, boolean underline) {
@@ -148,22 +132,16 @@ public class RtfGenerator {
/** /**
* Appends styled text to the RTF document being generated. * Appends styled text to the RTF document being generated.
* *
* @param text * @param text The text to append.
* The text to append. * @param f The font of the text. If this is <code>null</code>, the
* @param f * default font is used.
* The font of the text. If this is <code>null</code>, the * @param fg The foreground of the text. If this is <code>null</code>,
* default font is used. * the default foreground color is used.
* @param fg * @param bg The background color of the text. If this is
* The foreground of the text. If this is <code>null</code>, * <code>null</code>, the default background color is used.
* the default foreground color is used. * @param underline Whether the text should be underlined.
* @param bg * @param setFG Whether the foreground specified by <code>fg</code> should
* The background color of the text. If this is * be honored (if it is non-<code>null</code>).
* <code>null</code>, the default background color is used.
* @param underline
* Whether the text should be underlined.
* @param setFG
* Whether the foreground specified by <code>fg</code> should
* be honored (if it is non-<code>null</code>).
* @see #appendNewline() * @see #appendNewline()
*/ */
public void appendToDoc(String text, Font f, Color fg, Color bg, boolean underline, boolean setFG) { public void appendToDoc(String text, Font f, Color fg, Color bg, boolean underline, boolean setFG) {
@@ -250,49 +228,46 @@ public class RtfGenerator {
} }
/** /**
* Appends some text to a buffer, with special care taken for special * Appends some text to a buffer, with special care taken for special characters
* characters as defined by the RTF spec. * as defined by the RTF spec.
* *
* <ul> * <ul>
* <li>All tab characters are replaced with the string * <li>All tab characters are replaced with the string "<code>\tab</code>"
* "<code>\tab</code>"
* <li>'\', '{' and '}' are changed to "\\", "\{" and "\}" * <li>'\', '{' and '}' are changed to "\\", "\{" and "\}"
* </ul> * </ul>
* *
* @param text * @param text The text to append (with tab chars substituted).
* The text to append (with tab chars substituted). * @param sb The buffer to append to.
* @param sb
* The buffer to append to.
*/ */
private void escapeAndAdd(StringBuilder sb, String text) { private void escapeAndAdd(StringBuilder sb, String text) {
int count = text.length(); int count = text.length();
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
char ch = text.charAt(i); char ch = text.charAt(i);
switch (ch) { switch (ch) {
case '\t': case '\t':
// Micro-optimization: for syntax highlighting with // Micro-optimization: for syntax highlighting with
// tab indentation, there are often multiple tabs // tab indentation, there are often multiple tabs
// back-to-back at the start of lines, so don't put // back-to-back at the start of lines, so don't put
// spaces between each "\tab". // spaces between each "\tab".
sb.append("\\tab");
while ((++i < count) && text.charAt(i) == '\t') {
sb.append("\\tab"); sb.append("\\tab");
while ((++i < count) && text.charAt(i) == '\t') { }
sb.append("\\tab"); sb.append(' ');
} i--; // We read one too far.
sb.append(' '); break;
i--; // We read one too far. case '\\':
break; case '{':
case '\\': case '}':
case '{': sb.append('\\').append(ch);
case '}': break;
sb.append('\\').append(ch); default:
break; if (ch <= 127) {
default: sb.append(ch);
if (ch <= 127) { } else {
sb.append(ch); sb.append("\\u").append((int) ch);
} else { }
sb.append("\\u").append((int) ch); break;
}
break;
} }
} }
} }
@@ -301,17 +276,15 @@ public class RtfGenerator {
* Returns a font point size, adjusted for the current screen resolution. * Returns a font point size, adjusted for the current screen resolution.
* <p> * <p>
* *
* Java2D assumes 72 dpi. On systems with larger dpi (Windows, GTK, etc.), * Java2D assumes 72 dpi. On systems with larger dpi (Windows, GTK, etc.), font
* font rendering will appear too small if we simply return a Java "Font" * rendering will appear too small if we simply return a Java "Font" object's
* object's getSize() value. We need to adjust it for the screen * getSize() value. We need to adjust it for the screen resolution.
* resolution.
* *
* @param pointSize * @param pointSize A Java Font's point size, as returned from
* A Java Font's point size, as returned from * <code>getSize2D()</code>.
* <code>getSize2D()</code>. * @return The font point size, adjusted for the current screen resolution. This
* @return The font point size, adjusted for the current screen resolution. * will allow other applications to render fonts the same size as they
* This will allow other applications to render fonts the same * appear in the Java application.
* size as they appear in the Java application.
*/ */
private int fixFontSize(float pointSize) { private int fixFontSize(float pointSize) {
if (screenRes != 72) { // Java2D assumes 72 dpi if (screenRes != 72) { // Java2D assumes 72 dpi
@@ -321,13 +294,11 @@ public class RtfGenerator {
} }
/** /**
* Returns the index of the specified item in a list. If the item * Returns the index of the specified item in a list. If the item is not in the
* is not in the list, it is added, and its new index is returned. * list, it is added, and its new index is returned.
* *
* @param list * @param list The list (possibly) containing the item.
* The list (possibly) containing the item. * @param item The item to get the index of.
* @param item
* The item to get the index of.
* @return The index of the item. * @return The index of the item.
*/ */
private static int getColorIndex(List<Color> list, Color item) { private static int getColorIndex(List<Color> list, Color item) {
@@ -355,18 +326,15 @@ public class RtfGenerator {
} }
/** /**
* Returns the index of the specified font in a list of fonts. This * Returns the index of the specified font in a list of fonts. This method only
* method only checks for a font by its family name; its attributes such * checks for a font by its family name; its attributes such as bold and italic
* as bold and italic are ignored. * are ignored.
* <p> * <p>
* *
* If the font is not in the list, it is added, and its new index is * If the font is not in the list, it is added, and its new index is returned.
* returned.
* *
* @param list * @param list The list (possibly) containing the font.
* The list (possibly) containing the font. * @param font The font to get the index of.
* @param font
* The font to get the index of.
* @return The index of the font. * @return The index of the font.
*/ */
private static int getFontIndex(List<Font> list, Font font) { private static int getFontIndex(List<Font> list, Font font) {
@@ -404,8 +372,8 @@ public class RtfGenerator {
} }
/** /**
* Returns a good "default" monospaced font to use when Java's logical * Returns a good "default" monospaced font to use when Java's logical font
* font "Monospaced" is found. * "Monospaced" is found.
* *
* @return The monospaced font family to use. * @return The monospaced font family to use.
*/ */
@@ -442,8 +410,7 @@ public class RtfGenerator {
} }
/** /**
* Resets this generator. All document information and content is * Resets this generator. All document information and content is cleared.
* cleared.
*/ */
public void reset() { public void reset() {
fontList.clear(); fontList.clear();
@@ -14,11 +14,10 @@ import java.io.IOException;
import java.io.StringReader; import java.io.StringReader;
/** /**
* Object used during copy/paste and DnD operations to represent RTF text. * Object used during copy/paste and DnD operations to represent RTF text. It
* It can return the text being moved as either RTF or plain text. This * can return the text being moved as either RTF or plain text. This class is
* class is basically the same as * basically the same as <code>java.awt.datatransfer.StringSelection</code>,
* <code>java.awt.datatransfer.StringSelection</code>, except that it can also * except that it can also return the text as RTF.
* return the text as RTF.
* *
* @author Robert Futrell * @author Robert Futrell
* @version 1.0 * @version 1.0
@@ -32,14 +31,14 @@ class RtfTransferable implements Transferable {
/** /**
* The "flavors" the text can be returned as. * The "flavors" the text can be returned as.
*/ */
private static final DataFlavor[] FLAVORS = { new DataFlavor("text/rtf", "RTF"), DataFlavor.stringFlavor, DataFlavor.plainTextFlavor // deprecated private static final DataFlavor[] FLAVORS = { new DataFlavor("text/rtf", "RTF"), DataFlavor.stringFlavor,
DataFlavor.plainTextFlavor // deprecated
}; };
/** /**
* Constructor. * Constructor.
* *
* @param data * @param data The RTF data.
* The RTF data.
*/ */
RtfTransferable(byte[] data) { RtfTransferable(byte[] data) {
this.data = data; this.data = data;
@@ -11,9 +11,9 @@ package org.fife.ui.rsyntaxtextarea;
import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkEvent;
/** /**
* A link generator result that selects a region of text in the text area. * A link generator result that selects a region of text in the text area. This
* This will typically be used by IDE-style applications, to provide support * will typically be used by IDE-style applications, to provide support for
* for "linking" the use of a variable in a document to its declaration. * "linking" the use of a variable in a document to its declaration.
* *
* @author Robert Futrell * @author Robert Futrell
* @version 1.0 * @version 1.0
@@ -38,9 +38,7 @@ public class SquiggleUnderlineHighlightPainter extends ChangeableHighlightPainte
/** /**
* Constructor. * Constructor.
* *
* @param color * @param color The color of the squiggle. This cannot be <code>null</code>.
* The color of the squiggle. This cannot be
* <code>null</code>.
*/ */
public SquiggleUnderlineHighlightPainter(Color color) { public SquiggleUnderlineHighlightPainter(Color color) {
super(color); super(color);
@@ -50,19 +48,13 @@ public class SquiggleUnderlineHighlightPainter extends ChangeableHighlightPainte
/** /**
* Paints a portion of a highlight. * Paints a portion of a highlight.
* *
* @param g * @param g the graphics context
* the graphics context * @param offs0 the starting model offset &gt;= 0
* @param offs0 * @param offs1 the ending model offset &gt;= offs1
* the starting model offset &gt;= 0 * @param bounds the bounding box of the view, which is not necessarily the
* @param offs1 * region to paint.
* the ending model offset &gt;= offs1 * @param c the editor
* @param bounds * @param view View painting for
* the bounding box of the view, which is not
* necessarily the region to paint.
* @param c
* the editor
* @param view
* View painting for
* @return region drawing occurred in * @return region drawing occurred in
*/ */
@Override @Override
@@ -96,10 +88,8 @@ public class SquiggleUnderlineHighlightPainter extends ChangeableHighlightPainte
/** /**
* Paints a squiggle underneath text in the specified rectangle. * Paints a squiggle underneath text in the specified rectangle.
* *
* @param g * @param g The graphics context with which to paint.
* The graphics context with which to paint. * @param r The rectangle containing the text.
* @param r
* The rectangle containing the text.
*/ */
protected void paintSquiggle(Graphics g, Rectangle r) { protected void paintSquiggle(Graphics g, Rectangle r) {
int x = r.x; int x = r.x;
@@ -8,8 +8,8 @@ package org.fife.ui.rsyntaxtextarea;
/** /**
* Constants that define the different programming languages understood by * Constants that define the different programming languages understood by
* <code>RSyntaxTextArea</code>. These constants are the values you can pass * <code>RSyntaxTextArea</code>. These constants are the values you can pass to
* to {@link RSyntaxTextArea#setSyntaxEditingStyle(String)} to get syntax * {@link RSyntaxTextArea#setSyntaxEditingStyle(String)} to get syntax
* highlighting. * highlighting.
* <p> * <p>
* *
@@ -123,8 +123,8 @@ public interface SyntaxConstants {
*/ */
String SYNTAX_STYLE_JSON = "text/json"; String SYNTAX_STYLE_JSON = "text/json";
/** /**
* Style for highlighting .jshintrc files (JSON with comments, so can be * Style for highlighting .jshintrc files (JSON with comments, so can be used
* used for other times when you want this behavior). * for other times when you want this behavior).
*/ */
String SYNTAX_STYLE_JSON_WITH_COMMENTS = "text/jshintrc"; String SYNTAX_STYLE_JSON_WITH_COMMENTS = "text/jshintrc";
/** /**
+179 -240
View File
@@ -30,14 +30,14 @@ import org.fife.ui.rsyntaxtextarea.folding.FoldManager;
/** /**
* The <code>javax.swing.text.View</code> object used by {@link RSyntaxTextArea} * The <code>javax.swing.text.View</code> object used by {@link RSyntaxTextArea}
* when word wrap is disabled. It implements syntax highlighting for * when word wrap is disabled. It implements syntax highlighting for programming
* programming languages using the colors and font styles specified by the * languages using the colors and font styles specified by the
* <code>RSyntaxTextArea</code>. * <code>RSyntaxTextArea</code>.
* <p> * <p>
* *
* You don't really have to do anything to use this class, as * You don't really have to do anything to use this class, as
* {@link RSyntaxTextAreaUI} automatically sets the text area's view to be * {@link RSyntaxTextAreaUI} automatically sets the text area's view to be an
* an instance of this class if word wrap is disabled. * instance of this class if word wrap is disabled.
* <p> * <p>
* *
* The tokens that specify how to paint the syntax-highlighted text are gleaned * The tokens that specify how to paint the syntax-highlighted text are gleaned
@@ -58,9 +58,9 @@ public class SyntaxView extends View implements TabExpander, TokenOrientedView,
*/ */
private FontMetrics metrics; private FontMetrics metrics;
/** /**
* The current longest line. This is used to calculate the preferred width * The current longest line. This is used to calculate the preferred width of
* of the view. Since the calculation is potentially expensive, we try to * the view. Since the calculation is potentially expensive, we try to avoid it
* avoid it by stashing which line is currently the longest. * by stashing which line is currently the longest.
*/ */
private Element longLine; private Element longLine;
private float longLineWidth; private float longLineWidth;
@@ -78,17 +78,16 @@ public class SyntaxView extends View implements TabExpander, TokenOrientedView,
private int clipStart; private int clipStart;
private int clipEnd; private int clipEnd;
/** /**
* Temporary token used when we need to "modify" tokens for rendering * Temporary token used when we need to "modify" tokens for rendering purposes.
* purposes. Since tokens returned from RSyntaxDocuments are treated as * Since tokens returned from RSyntaxDocuments are treated as immutable, we use
* immutable, we use this temporary token to do that work. * this temporary token to do that work.
*/ */
private TokenImpl tempToken; private TokenImpl tempToken;
/** /**
* Constructs a new <code>SyntaxView</code> wrapped around an element. * Constructs a new <code>SyntaxView</code> wrapped around an element.
* *
* @param elem * @param elem The element representing the text to display.
* The element representing the text to display.
*/ */
public SyntaxView(Element elem) { public SyntaxView(Element elem) {
super(elem); super(elem);
@@ -96,12 +95,11 @@ public class SyntaxView extends View implements TabExpander, TokenOrientedView,
} }
/** /**
* Iterate over the lines represented by the child elements * Iterate over the lines represented by the child elements of the element this
* of the element this view represents, looking for the line * view represents, looking for the line that is the longest. The
* that is the longest. The <em>longLine</em> variable is updated to * <em>longLine</em> variable is updated to represent the longest line
* represent the longest line contained. The <em>font</em> variable * contained. The <em>font</em> variable is updated to indicate the font used to
* is updated to indicate the font used to calculate the * calculate the longest line.
* longest line.
*/ */
void calculateLongestLine() { void calculateLongestLine() {
Component c = getContainer(); Component c = getContainer();
@@ -121,15 +119,12 @@ public class SyntaxView extends View implements TabExpander, TokenOrientedView,
} }
/** /**
* Gives notification from the document that attributes were changed * Gives notification from the document that attributes were changed in a
* in a location that this view is responsible for. * location that this view is responsible for.
* *
* @param changes * @param changes the change information from the associated document
* the change information from the associated document * @param a the current allocation of the view
* @param a * @param f the factory to use to rebuild if the view has children
* the current allocation of the view
* @param f
* the factory to use to rebuild if the view has children
* @see View#changedUpdate * @see View#changedUpdate
*/ */
@Override @Override
@@ -140,16 +135,12 @@ public class SyntaxView extends View implements TabExpander, TokenOrientedView,
/** /**
* Repaint the given line range. * Repaint the given line range.
* *
* @param line0 * @param line0 The starting line number to repaint. This must be a valid line
* The starting line number to repaint. This must * number in the model.
* be a valid line number in the model. * @param line1 The ending line number to repaint. This must be a valid line
* @param line1 * number in the model.
* The ending line number to repaint. This must * @param a The region allocated for the view to render into.
* be a valid line number in the model. * @param host The component hosting the view (used to call repaint).
* @param a
* The region allocated for the view to render into.
* @param host
* The component hosting the view (used to call repaint).
*/ */
protected void damageLineRange(int line0, int line1, Shape a, Component host) { protected void damageLineRange(int line0, int line1, Shape a, Component host) {
if (a != null) { if (a != null) {
@@ -165,21 +156,15 @@ public class SyntaxView extends View implements TabExpander, TokenOrientedView,
} }
/** /**
* Draws the passed-in text using syntax highlighting for the current * Draws the passed-in text using syntax highlighting for the current language.
* language. It is assumed that the entire line is either not in a * It is assumed that the entire line is either not in a selected region, or
* selected region, or painting with a selection-foreground color is turned * painting with a selection-foreground color is turned off.
* off.
* *
* @param painter * @param painter The painter to render the tokens.
* The painter to render the tokens. * @param token The list of tokens to draw.
* @param token * @param g The graphics context in which to draw.
* The list of tokens to draw. * @param x The x-coordinate at which to draw.
* @param g * @param y The y-coordinate at which to draw.
* The graphics context in which to draw.
* @param x
* The x-coordinate at which to draw.
* @param y
* The y-coordinate at which to draw.
* @return The x-coordinate representing the end of the painted text. * @return The x-coordinate representing the end of the painted text.
*/ */
private float drawLine(TokenPainter painter, Token token, Graphics2D g, float x, float y, int line) { private float drawLine(TokenPainter painter, Token token, Graphics2D g, float x, float y, int line) {
@@ -201,27 +186,21 @@ public class SyntaxView extends View implements TabExpander, TokenOrientedView,
} }
/** /**
* Draws the passed-in text using syntax highlighting for the current * Draws the passed-in text using syntax highlighting for the current language.
* language. Tokens are checked for being in a selected region, and are * Tokens are checked for being in a selected region, and are rendered
* rendered appropriately if they are. * appropriately if they are.
* *
* @param painter * @param painter The painter to render the tokens.
* The painter to render the tokens. * @param token The list of tokens to draw.
* @param token * @param g The graphics context in which to draw.
* The list of tokens to draw. * @param x The x-coordinate at which to draw.
* @param g * @param y The y-coordinate at which to draw.
* The graphics context in which to draw. * @param selStart The start of the selection.
* @param x * @param selEnd The end of the selection.
* The x-coordinate at which to draw.
* @param y
* The y-coordinate at which to draw.
* @param selStart
* The start of the selection.
* @param selEnd
* The end of the selection.
* @return The x-coordinate representing the end of the painted text. * @return The x-coordinate representing the end of the painted text.
*/ */
private float drawLineWithSelection(TokenPainter painter, Token token, Graphics2D g, float x, float y, int selStart, int selEnd) { private float drawLineWithSelection(TokenPainter painter, Token token, Graphics2D g, float x, float y, int selStart,
int selEnd) {
float nextX = x; // The x-value at the end of our text. float nextX = x; // The x-value at the end of our text.
boolean useSTC = host.getUseSelectedTextColor(); boolean useSTC = host.getUseSelectedTextColor();
while (token != null && token.isPaintable() && nextX < clipEnd) { while (token != null && token.isPaintable() && nextX < clipEnd) {
@@ -285,10 +264,8 @@ public class SyntaxView extends View implements TabExpander, TokenOrientedView,
/** /**
* Calculates the width of the line represented by the given element. * Calculates the width of the line represented by the given element.
* *
* @param line * @param line The line for which to get the length.
* The line for which to get the length. * @param lineNumber The line number of the specified line in the document.
* @param lineNumber
* The line number of the specified line in the document.
* @return The width of the line. * @return The width of the line.
*/ */
private float getLineWidth(int lineNumber) { private float getLineWidth(int lineNumber) {
@@ -297,25 +274,21 @@ public class SyntaxView extends View implements TabExpander, TokenOrientedView,
} }
/** /**
* Provides a way to determine the next visually represented model * Provides a way to determine the next visually represented model location that
* location that one might place a caret. Some views may not be visible, * one might place a caret. Some views may not be visible, they might not be in
* they might not be in the same order found in the model, or they just * the same order found in the model, or they just might not allow access to
* might not allow access to some of the locations in the model. * some of the locations in the model.
* *
* @param pos * @param pos the position to convert &gt;= 0
* the position to convert &gt;= 0 * @param a the allocated region to render into
* @param a * @param direction the direction from the current position that can be thought
* the allocated region to render into * of as the arrow keys typically found on a keyboard. This may
* @param direction * be SwingConstants.WEST, SwingConstants.EAST,
* the direction from the current position that can * SwingConstants.NORTH, or SwingConstants.SOUTH.
* be thought of as the arrow keys typically found on a keyboard. * @return the location within the model that best represents the next location
* This may be SwingConstants.WEST, SwingConstants.EAST, * visual position.
* SwingConstants.NORTH, or SwingConstants.SOUTH.
* @return the location within the model that best represents the next
* location visual position.
* @exception BadLocationException * @exception BadLocationException
* @exception IllegalArgumentException * @exception IllegalArgumentException for an invalid direction
* for an invalid direction
*/ */
@Override @Override
public int getNextVisualPositionFrom(int pos, Position.Bias b, Shape a, int direction, Position.Bias[] biasRet) public int getNextVisualPositionFrom(int pos, Position.Bias b, Shape a, int direction, Position.Bias[] biasRet)
@@ -324,47 +297,44 @@ public class SyntaxView extends View implements TabExpander, TokenOrientedView,
} }
/** /**
* Determines the preferred span for this view along an * Determines the preferred span for this view along an axis.
* axis.
* *
* @param axis * @param axis may be either View.X_AXIS or View.Y_AXIS
* may be either View.X_AXIS or View.Y_AXIS * @return the span the view would like to be rendered into &gt;= 0. Typically
* @return the span the view would like to be rendered into &gt;= 0. * the view is told to render into the span that is returned, although
* Typically the view is told to render into the span * there is no guarantee. The parent may choose to resize or break the
* that is returned, although there is no guarantee. * view.
* The parent may choose to resize or break the view. * @exception IllegalArgumentException for an invalid axis
* @exception IllegalArgumentException
* for an invalid axis
*/ */
@Override @Override
public float getPreferredSpan(int axis) { public float getPreferredSpan(int axis) {
updateMetrics(); updateMetrics();
switch (axis) { switch (axis) {
case View.X_AXIS: case View.X_AXIS:
float span = longLineWidth + getRhsCorrection(); // fudge factor float span = longLineWidth + getRhsCorrection(); // fudge factor
if (host.getEOLMarkersVisible()) { if (host.getEOLMarkersVisible()) {
span += metrics.charWidth('\u00B6'); span += metrics.charWidth('\u00B6');
} }
return span; return span;
case View.Y_AXIS: case View.Y_AXIS:
// We update lineHeight here as when this method is first // We update lineHeight here as when this method is first
// called, lineHeight isn't initialized. If we don't do it // called, lineHeight isn't initialized. If we don't do it
// here, we get no vertical scrollbar (as lineHeight==0). // here, we get no vertical scrollbar (as lineHeight==0).
lineHeight = host != null ? host.getLineHeight() : lineHeight; lineHeight = host != null ? host.getLineHeight() : lineHeight;
// return getElement().getElementCount() * lineHeight; // return getElement().getElementCount() * lineHeight;
int visibleLineCount = getElement().getElementCount(); int visibleLineCount = getElement().getElementCount();
if (host.isCodeFoldingEnabled()) { if (host.isCodeFoldingEnabled()) {
visibleLineCount -= host.getFoldManager().getHiddenLineCount(); visibleLineCount -= host.getFoldManager().getHiddenLineCount();
} }
return visibleLineCount * (float) lineHeight; return visibleLineCount * (float) lineHeight;
default: default:
throw new IllegalArgumentException("Invalid axis: " + axis); throw new IllegalArgumentException("Invalid axis: " + axis);
} }
} }
/** /**
* Workaround for JTextComponents allowing the caret to be rendered * Workaround for JTextComponents allowing the caret to be rendered entirely
* entirely off-screen if the entire "previous" character fit entirely. * off-screen if the entire "previous" character fit entirely.
* *
* @return The amount of space to add to the x-axis preferred span. * @return The amount of space to add to the x-axis preferred span.
*/ */
@@ -388,17 +358,15 @@ public class SyntaxView extends View implements TabExpander, TokenOrientedView,
} }
/** /**
* Returns a token list for the <i>physical</i> line above the physical * Returns a token list for the <i>physical</i> line above the physical line
* line containing the specified offset into the document. Note that for * containing the specified offset into the document. Note that for this plain
* this plain (non-wrapped) view, this is simply the token list for the * (non-wrapped) view, this is simply the token list for the logical line above
* logical line above the line containing <code>offset</code>, since lines * the line containing <code>offset</code>, since lines are not wrapped.
* are not wrapped.
* *
* @param offset * @param offset The offset in question.
* The offset in question. * @return A token list for the physical (and in this view, logical) line before
* @return A token list for the physical (and in this view, logical) line * this one. If <code>offset</code> is in the first line in the
* before this one. If <code>offset</code> is in the first line in * document, <code>null</code> is returned.
* the document, <code>null</code> is returned.
*/ */
@Override @Override
public Token getTokenListForPhysicalLineAbove(int offset) { public Token getTokenListForPhysicalLineAbove(int offset) {
@@ -424,17 +392,15 @@ public class SyntaxView extends View implements TabExpander, TokenOrientedView,
} }
/** /**
* Returns a token list for the <i>physical</i> line below the physical * Returns a token list for the <i>physical</i> line below the physical line
* line containing the specified offset into the document. Note that for * containing the specified offset into the document. Note that for this plain
* this plain (non-wrapped) view, this is simply the token list for the * (non-wrapped) view, this is simply the token list for the logical line below
* logical line below the line containing <code>offset</code>, since lines * the line containing <code>offset</code>, since lines are not wrapped.
* are not wrapped.
* *
* @param offset * @param offset The offset in question.
* The offset in question. * @return A token list for the physical (and in this view, logical) line after
* @return A token list for the physical (and in this view, logical) line * this one. If <code>offset</code> is in the last physical line in the
* after this one. If <code>offset</code> is in the last physical * document, <code>null</code> is returned.
* line in the document, <code>null</code> is returned.
*/ */
@Override @Override
public Token getTokenListForPhysicalLineBelow(int offset) { public Token getTokenListForPhysicalLineBelow(int offset) {
@@ -461,15 +427,12 @@ public class SyntaxView extends View implements TabExpander, TokenOrientedView,
} }
/** /**
* Gives notification that something was inserted into the document * Gives notification that something was inserted into the document in a
* in a location that this view is responsible for. * location that this view is responsible for.
* *
* @param changes * @param changes The change information from the associated document.
* The change information from the associated document. * @param a The current allocation of the view.
* @param a * @param f The factory to use to rebuild if the view has children.
* The current allocation of the view.
* @param f
* The factory to use to rebuild if the view has children.
*/ */
@Override @Override
public void insertUpdate(DocumentEvent changes, Shape a, ViewFactory f) { public void insertUpdate(DocumentEvent changes, Shape a, ViewFactory f) {
@@ -479,11 +442,9 @@ public class SyntaxView extends View implements TabExpander, TokenOrientedView,
/** /**
* Determine the rectangle that represents the given line. * Determine the rectangle that represents the given line.
* *
* @param a * @param a The region allocated for the view to render into
* The region allocated for the view to render into * @param line The line number to find the region of. This must be a valid line
* @param line * number in the model.
* The line number to find the region of. This must
* be a valid line number in the model.
*/ */
protected Rectangle lineToRect(Shape a, int line) { protected Rectangle lineToRect(Shape a, int line) {
Rectangle r = null; Rectangle r = null;
@@ -505,17 +466,14 @@ public class SyntaxView extends View implements TabExpander, TokenOrientedView,
} }
/** /**
* Provides a mapping from the document model coordinate space * Provides a mapping from the document model coordinate space to the coordinate
* to the coordinate space of the view mapped to it. * space of the view mapped to it.
* *
* @param pos * @param pos the position to convert &gt;= 0
* the position to convert &gt;= 0 * @param a the allocated region to render into
* @param a
* the allocated region to render into
* @return the bounding box of the given position * @return the bounding box of the given position
* @exception BadLocationException * @exception BadLocationException if the given position does not represent a
* if the given position does not * valid location in the associated document
* represent a valid location in the associated document
* @see View#modelToView * @see View#modelToView
*/ */
@Override @Override
@@ -537,46 +495,41 @@ public class SyntaxView extends View implements TabExpander, TokenOrientedView,
} }
/** /**
* Provides a mapping, for a given region, from the document model * Provides a mapping, for a given region, from the document model coordinate
* coordinate space to the view coordinate space. The specified region is * space to the view coordinate space. The specified region is created as a
* created as a union of the first and last character positions. * union of the first and last character positions.
* <p> * <p>
* *
* This is implemented to subtract the width of the second character, as * This is implemented to subtract the width of the second character, as this
* this view's <code>modelToView</code> actually returns the width of the * view's <code>modelToView</code> actually returns the width of the character
* character instead of "1" or "0" like the View implementations in * instead of "1" or "0" like the View implementations in
* <code>javax.swing.text</code>. Thus, if we don't override this method, * <code>javax.swing.text</code>. Thus, if we don't override this method, the
* the <code>View</code> implementation will return one character's width * <code>View</code> implementation will return one character's width too much
* too much for its consumers (implementations of * for its consumers (implementations of
* <code>javax.swing.text.Highlighter</code>). * <code>javax.swing.text.Highlighter</code>).
* *
* @param p0 * @param p0 the position of the first character (&gt;=0)
* the position of the first character (&gt;=0) * @param b0 The bias of the first character position, toward the previous
* @param b0 * character or the next character represented by the offset, in case
* The bias of the first character position, toward the previous * the position is a boundary of two views; <code>b0</code> will have
* character or the next character represented by the offset, in * one of these values:
* case the position is a boundary of two views; <code>b0</code> * <ul>
* will have one of these values: * <li><code>Position.Bias.Forward</code>
* <ul> * <li><code>Position.Bias.Backward</code>
* <li><code>Position.Bias.Forward</code> * </ul>
* <li><code>Position.Bias.Backward</code> * @param p1 the position of the last character (&gt;=0)
* </ul> * @param b1 the bias for the second character position, defined one of the
* @param p1 * legal values shown above
* the position of the last character (&gt;=0) * @param a the area of the view, which encompasses the requested region
* @param b1 * @return the bounding box which is a union of the region specified by the
* the bias for the second character position, defined * first and last character positions
* one of the legal values shown above * @exception BadLocationException if the given position does not represent
* @param a * a valid location in the associated
* the area of the view, which encompasses the requested region * document
* @return the bounding box which is a union of the region specified * @exception IllegalArgumentException if <code>b0</code> or <code>b1</code> are
* by the first and last character positions * not one of the legal
* @exception BadLocationException * <code>Position.Bias</code> values listed
* if the given position does * above
* not represent a valid location in the associated document
* @exception IllegalArgumentException
* if <code>b0</code> or
* <code>b1</code> are not one of the
* legal <code>Position.Bias</code> values listed above
* @see View#viewToModel * @see View#viewToModel
*/ */
@Override @Override
@@ -620,15 +573,13 @@ public class SyntaxView extends View implements TabExpander, TokenOrientedView,
} }
/** /**
* Returns the next tab stop position after a given reference position. * Returns the next tab stop position after a given reference position. This
* This implementation does not support things like centering so it * implementation does not support things like centering so it ignores the
* ignores the tabOffset argument. * tabOffset argument.
* *
* @param x * @param x the current position &gt;= 0
* the current position &gt;= 0 * @param tabOffset the position within the text stream that the tab occurred at
* @param tabOffset * &gt;= 0.
* the position within the text stream
* that the tab occurred at &gt;= 0.
* @return the tab stop, measured in points &gt;= 0 * @return the tab stop, measured in points &gt;= 0
*/ */
@Override @Override
@@ -644,10 +595,8 @@ public class SyntaxView extends View implements TabExpander, TokenOrientedView,
* Actually paints the text area. Only lines that have been damaged are * Actually paints the text area. Only lines that have been damaged are
* repainted. * repainted.
* *
* @param g * @param g The graphics context with which to paint.
* The graphics context with which to paint. * @param a The allocated region in which to render.
* @param a
* The allocated region in which to render.
*/ */
@Override @Override
public void paint(Graphics g, Shape a) { public void paint(Graphics g, Shape a) {
@@ -728,13 +677,11 @@ public class SyntaxView extends View implements TabExpander, TokenOrientedView,
} }
/** /**
* If the passed-in line is longer than the current longest line, then * If the passed-in line is longer than the current longest line, then the
* the longest line is updated. * longest line is updated.
* *
* @param line * @param line The line to test against the current longest.
* The line to test against the current longest. * @param lineNumber The line number of the passed-in line.
* @param lineNumber
* The line number of the passed-in line.
* @return <code>true</code> iff the current longest line was updated. * @return <code>true</code> iff the current longest line was updated.
*/ */
private boolean possiblyUpdateLongLine(Element line, int lineNumber) { private boolean possiblyUpdateLongLine(Element line, int lineNumber) {
@@ -748,15 +695,12 @@ public class SyntaxView extends View implements TabExpander, TokenOrientedView,
} }
/** /**
* Gives notification that something was removed from the document * Gives notification that something was removed from the document in a location
* in a location that this view is responsible for. * that this view is responsible for.
* *
* @param changes * @param changes the change information from the associated document
* the change information from the associated document * @param a the current allocation of the view
* @param a * @param f the factory to use to rebuild if the view has children
* the current allocation of the view
* @param f
* the factory to use to rebuild if the view has children
*/ */
@Override @Override
public void removeUpdate(DocumentEvent changes, Shape a, ViewFactory f) { public void removeUpdate(DocumentEvent changes, Shape a, ViewFactory f) {
@@ -770,12 +714,10 @@ public class SyntaxView extends View implements TabExpander, TokenOrientedView,
} }
/** /**
* Repaint the region of change covered by the given document * Repaint the region of change covered by the given document event. Damages the
* event. Damages the line that begins the range to cover * line that begins the range to cover the case when the insert/remove is only
* the case when the insert/remove is only on one line. * on one line. If lines are added or removed, damages the whole view. The
* If lines are added or removed, damages the whole * longest line is checked to see if it has changed.
* view. The longest line is checked to see if it has
* changed.
*/ */
protected void updateDamage(DocumentEvent changes, Shape a, ViewFactory f) { protected void updateDamage(DocumentEvent changes, Shape a, ViewFactory f) {
Component host = getContainer(); Component host = getContainer();
@@ -856,17 +798,14 @@ public class SyntaxView extends View implements TabExpander, TokenOrientedView,
} }
/** /**
* Provides a mapping from the view coordinate space to the logical * Provides a mapping from the view coordinate space to the logical coordinate
* coordinate space of the model. * space of the model.
* *
* @param fx * @param fx the X coordinate &gt;= 0
* the X coordinate &gt;= 0 * @param fy the Y coordinate &gt;= 0
* @param fy * @param a the allocated region to render into
* the Y coordinate &gt;= 0 * @return the location within the model that best represents the given point in
* @param a * the view &gt;= 0
* the allocated region to render into
* @return the location within the model that best represents the
* given point in the view &gt;= 0
*/ */
@Override @Override
public int viewToModel(float fx, float fy, Shape a, Position.Bias[] bias) { public int viewToModel(float fx, float fy, Shape a, Position.Bias[] bias) {
@@ -28,8 +28,8 @@ import org.fife.io.UnicodeWriter;
import org.fife.ui.rtextarea.RTextAreaEditorKit; import org.fife.ui.rtextarea.RTextAreaEditorKit;
/** /**
* An extension of {@link org.fife.ui.rsyntaxtextarea.RSyntaxTextArea} * An extension of {@link org.fife.ui.rsyntaxtextarea.RSyntaxTextArea} that adds
* that adds information about the file being edited, such as: * information about the file being edited, such as:
* *
* <ul> * <ul>
* <li>Its name and location. * <li>Its name and location.
@@ -43,10 +43,10 @@ import org.fife.ui.rtextarea.RTextAreaEditorKit;
* Loading and saving is also built into the editor. * Loading and saving is also built into the editor.
* <p> * <p>
* *
* When saving UTF-8 files, whether or not a BOM is written is controlled by * When saving UTF-8 files, whether or not a BOM is written is controlled by the
* the {@link UnicodeWriter} class. * {@link UnicodeWriter} class. Use
* Use {@link UnicodeWriter#setWriteUtf8BOM(boolean)} to toggle writing BOMs * {@link UnicodeWriter#setWriteUtf8BOM(boolean)} to toggle writing BOMs for
* for UTF-8 files. * UTF-8 files.
* <p> * <p>
* *
* Both local and remote files (e.g. ftp) are supported. See the * Both local and remote files (e.g. ftp) are supported. See the
@@ -60,8 +60,8 @@ public class TextEditorPane extends RSyntaxTextArea implements DocumentListener
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** /**
* Property change event fired when the file path this text area references * Property change event fired when the file path this text area references is
* is updated. * updated.
* *
* @see #load(FileLocation, String) * @see #load(FileLocation, String)
* @see #saveAs(FileLocation) * @see #saveAs(FileLocation)
@@ -103,9 +103,8 @@ public class TextEditorPane extends RSyntaxTextArea implements DocumentListener
*/ */
private boolean dirty; private boolean dirty;
/** /**
* The last time this file was modified on disk, for local files. * The last time this file was modified on disk, for local files. For remote
* For remote files, this value should always be * files, this value should always be {@link #LAST_MODIFIED_UNKNOWN}.
* {@link #LAST_MODIFIED_UNKNOWN}.
*/ */
private long lastSaveOrLoadTime; private long lastSaveOrLoadTime;
/** /**
@@ -127,23 +126,20 @@ public class TextEditorPane extends RSyntaxTextArea implements DocumentListener
/** /**
* Constructor. The file will be given a default name. * Constructor. The file will be given a default name.
* *
* @param textMode * @param textMode Either <code>INSERT_MODE</code> or
* Either <code>INSERT_MODE</code> or * <code>OVERWRITE_MODE</code>.
* <code>OVERWRITE_MODE</code>.
*/ */
public TextEditorPane(int textMode) { public TextEditorPane(int textMode) {
this(textMode, false); this(textMode, false);
} }
/** /**
* Creates a new <code>TextEditorPane</code>. The file will be given * Creates a new <code>TextEditorPane</code>. The file will be given a default
* a default name. * name.
* *
* @param textMode * @param textMode Either <code>INSERT_MODE</code> or
* Either <code>INSERT_MODE</code> or * <code>OVERWRITE_MODE</code>.
* <code>OVERWRITE_MODE</code>. * @param wordWrapEnabled Whether or not to use word wrap in this pane.
* @param wordWrapEnabled
* Whether or not to use word wrap in this pane.
*/ */
public TextEditorPane(int textMode, boolean wordWrapEnabled) { public TextEditorPane(int textMode, boolean wordWrapEnabled) {
super(textMode); super(textMode);
@@ -158,20 +154,15 @@ public class TextEditorPane extends RSyntaxTextArea implements DocumentListener
/** /**
* Creates a new <code>TextEditorPane</code>. * Creates a new <code>TextEditorPane</code>.
* *
* @param textMode * @param textMode Either <code>INSERT_MODE</code> or
* Either <code>INSERT_MODE</code> or * <code>OVERWRITE_MODE</code>.
* <code>OVERWRITE_MODE</code>. * @param wordWrapEnabled Whether or not to use word wrap in this pane.
* @param wordWrapEnabled * @param loc The location of the text file being edited. If this
* Whether or not to use word wrap in this pane. * value is <code>null</code>, a file named
* @param loc * "Untitled.txt" in the current directory is used.
* The location of the text file being edited. If this value * @throws IOException If an IO error occurs reading the file at
* is <code>null</code>, a file named "Untitled.txt" in the * <code>loc</code>. This of course won't happen if
* current * <code>loc</code> is <code>null</code>.
* directory is used.
* @throws IOException
* If an IO error occurs reading the file at
* <code>loc</code>. This of course won't happen if
* <code>loc</code> is <code>null</code>.
*/ */
public TextEditorPane(int textMode, boolean wordWrapEnabled, FileLocation loc) throws IOException { public TextEditorPane(int textMode, boolean wordWrapEnabled, FileLocation loc) throws IOException {
this(textMode, wordWrapEnabled, loc, null); this(textMode, wordWrapEnabled, loc, null);
@@ -180,42 +171,36 @@ public class TextEditorPane extends RSyntaxTextArea implements DocumentListener
/** /**
* Creates a new <code>TextEditorPane</code>. * Creates a new <code>TextEditorPane</code>.
* *
* @param textMode * @param textMode Either <code>INSERT_MODE</code> or
* Either <code>INSERT_MODE</code> or * <code>OVERWRITE_MODE</code>.
* <code>OVERWRITE_MODE</code>. * @param wordWrapEnabled Whether or not to use word wrap in this pane.
* @param wordWrapEnabled * @param loc The location of the text file being edited. If this
* Whether or not to use word wrap in this pane. * value is <code>null</code>, a file named
* @param loc * "Untitled.txt" in the current directory is used. This
* The location of the text file being edited. If this value * file is displayed as empty even if it actually exists.
* is <code>null</code>, a file named "Untitled.txt" in the * @param defaultEnc The default encoding to use when opening the file, if
* current * the file is not Unicode. If this value is
* directory is used. This file is displayed as empty even if it * <code>null</code>, a system default value is used.
* actually exists. * @throws IOException If an IO error occurs reading the file at
* @param defaultEnc * <code>loc</code>. This of course won't happen if
* The default encoding to use when opening the file, * <code>loc</code> is <code>null</code>.
* if the file is not Unicode. If this value is
* <code>null</code>,
* a system default value is used.
* @throws IOException
* If an IO error occurs reading the file at
* <code>loc</code>. This of course won't happen if
* <code>loc</code> is <code>null</code>.
*/ */
public TextEditorPane(int textMode, boolean wordWrapEnabled, FileLocation loc, String defaultEnc) throws IOException { public TextEditorPane(int textMode, boolean wordWrapEnabled, FileLocation loc, String defaultEnc)
throws IOException {
super(textMode); super(textMode);
setLineWrap(wordWrapEnabled); setLineWrap(wordWrapEnabled);
init(loc, defaultEnc); init(loc, defaultEnc);
} }
/** /**
* Callback for when styles in the current document change. * Callback for when styles in the current document change. This method is never
* This method is never called. * called.
* *
* @param e * @param e The document event.
* The document event.
*/ */
@Override @Override
public void changedUpdate(DocumentEvent e) {} public void changedUpdate(DocumentEvent e) {
}
/** /**
* Returns the default encoding for this operating system. * Returns the default encoding for this operating system.
@@ -269,18 +254,18 @@ public class TextEditorPane extends RSyntaxTextArea implements DocumentListener
} }
/** /**
* Returns the timestamp for when this file was last loaded or saved * Returns the timestamp for when this file was last loaded or saved <em>by this
* <em>by this editor pane</em>. If the file has been modified on disk by * editor pane</em>. If the file has been modified on disk by another process
* another process after it was loaded into this editor pane, this method * after it was loaded into this editor pane, this method will not return the
* will not return the actual file's last modified time. * actual file's last modified time.
* <p> * <p>
* *
* For remote files, this method will always return * For remote files, this method will always return
* {@link #LAST_MODIFIED_UNKNOWN}. * {@link #LAST_MODIFIED_UNKNOWN}.
* *
* @return The timestamp when this file was last loaded or saved by this * @return The timestamp when this file was last loaded or saved by this editor
* editor pane, if it is a local file, or * pane, if it is a local file, or {@link #LAST_MODIFIED_UNKNOWN} if it
* {@link #LAST_MODIFIED_UNKNOWN} if it is a remote file. * is a remote file.
* @see #isModifiedOutsideEditor() * @see #isModifiedOutsideEditor()
*/ */
public long getLastSaveOrLoadTime() { public long getLastSaveOrLoadTime() {
@@ -292,15 +277,15 @@ public class TextEditorPane extends RSyntaxTextArea implements DocumentListener
* "<code>\n</code>", "<code>\r\n</code>", or "<code>\r</code>"). * "<code>\n</code>", "<code>\r\n</code>", or "<code>\r</code>").
* <p> * <p>
* *
* Note that this value is an <code>Object</code> and not a * Note that this value is an <code>Object</code> and not a <code>String</code>
* <code>String</code> as that is the way the {@link Document} interface * as that is the way the {@link Document} interface defines its property
* defines its property values. If you always use * values. If you always use {@link #setLineSeparator(String)} to modify this
* {@link #setLineSeparator(String)} to modify this value, then the value * value, then the value returned from this method will always be a
* returned from this method will always be a <code>String</code>. * <code>String</code>.
* *
* @return The line separator. If this value is <code>null</code>, then * @return The line separator. If this value is <code>null</code>, then the
* the system default line separator is used (usually the value * system default line separator is used (usually the value of
* of <code>System.getProperty("line.separator")</code>). * <code>System.getProperty("line.separator")</code>).
* @see #setLineSeparator(String) * @see #setLineSeparator(String)
* @see #setLineSeparator(String, boolean) * @see #setLineSeparator(String, boolean)
*/ */
@@ -311,17 +296,14 @@ public class TextEditorPane extends RSyntaxTextArea implements DocumentListener
/** /**
* Initializes this editor with the specified file location. * Initializes this editor with the specified file location.
* *
* @param loc * @param loc The file location. If this is <code>null</code>, a default
* The file location. If this is <code>null</code>, a default * location is used and an empty file is displayed.
* location is used and an empty file is displayed. * @param defaultEnc The default encoding to use when opening the file, if the
* @param defaultEnc * file is not Unicode. If this value is <code>null</code>, a
* The default encoding to use when opening the file, * system default value is used.
* if the file is not Unicode. If this value is * @throws IOException If an IO error occurs reading from <code>loc</code>. If
* <code>null</code>, * <code>loc</code> is <code>null</code>, this cannot
* a system default value is used. * happen.
* @throws IOException
* If an IO error occurs reading from <code>loc</code>.
* If <code>loc</code> is <code>null</code>, this cannot happen.
*/ */
private void init(FileLocation loc, String defaultEnc) throws IOException { private void init(FileLocation loc, String defaultEnc) throws IOException {
if (loc == null) { if (loc == null) {
@@ -351,8 +333,7 @@ public class TextEditorPane extends RSyntaxTextArea implements DocumentListener
/** /**
* Callback for when text is inserted into the document. * Callback for when text is inserted into the document.
* *
* @param e * @param e Information on the insertion.
* Information on the insertion.
*/ */
@Override @Override
public void insertUpdate(DocumentEvent e) { public void insertUpdate(DocumentEvent e) {
@@ -390,17 +371,16 @@ public class TextEditorPane extends RSyntaxTextArea implements DocumentListener
} }
/** /**
* Returns whether the text file has been modified outside of this editor * Returns whether the text file has been modified outside of this editor since
* since the last load or save operation. Note that if this is a remote * the last load or save operation. Note that if this is a remote file, this
* file, this method will always return <code>false</code>. * method will always return <code>false</code>.
* <p> * <p>
* *
* This method may be used by applications to implement a reloading * This method may be used by applications to implement a reloading feature,
* feature, where the user is prompted to reload a file if it has been * where the user is prompted to reload a file if it has been modified since
* modified since their last open or save. * their last open or save.
* *
* @return Whether the text file has been modified outside of this * @return Whether the text file has been modified outside of this editor.
* editor.
* @see #getLastSaveOrLoadTime() * @see #getLastSaveOrLoadTime()
*/ */
public boolean isModifiedOutsideEditor() { public boolean isModifiedOutsideEditor() {
@@ -418,20 +398,16 @@ public class TextEditorPane extends RSyntaxTextArea implements DocumentListener
} }
/** /**
* Loads the specified file in this editor. This method fires a property * Loads the specified file in this editor. This method fires a property change
* change event of type {@link #FULL_PATH_PROPERTY}. * event of type {@link #FULL_PATH_PROPERTY}.
* *
* @param loc * @param loc The location of the file to load. This cannot be
* The location of the file to load. This cannot be * <code>null</code>.
* <code>null</code>. * @param defaultEnc The encoding to use when loading/saving the file. This
* @param defaultEnc * encoding will only be used if the file is not Unicode. If
* The encoding to use when loading/saving the file. * this value is <code>null</code>, the system default
* This encoding will only be used if the file is not Unicode. * encoding is used.
* If this value is <code>null</code>, the system default * @throws IOException If an IO error occurs.
* encoding
* is used.
* @throws IOException
* If an IO error occurs.
* @see #save() * @see #save()
* @see #saveAs(FileLocation) * @see #saveAs(FileLocation)
*/ */
@@ -470,23 +446,22 @@ public class TextEditorPane extends RSyntaxTextArea implements DocumentListener
} }
/** /**
* Reloads this file from disk. The file must exist for this operation * Reloads this file from disk. The file must exist for this operation to not
* to not throw an exception. * throw an exception.
* <p> * <p>
* *
* The file's "dirty" state will be set to <code>false</code> after this * The file's "dirty" state will be set to <code>false</code> after this
* operation. If this is a local file, its "last modified" time is * operation. If this is a local file, its "last modified" time is updated to
* updated to reflect that of the actual file. * reflect that of the actual file.
* <p> * <p>
* *
* Note that if the file has been modified on disk, and is now a Unicode * Note that if the file has been modified on disk, and is now a Unicode
* encoding when before it wasn't (or if it is a different Unicode now), * encoding when before it wasn't (or if it is a different Unicode now), this
* this will cause this {@link TextEditorPane}'s encoding to change. * will cause this {@link TextEditorPane}'s encoding to change. Otherwise, the
* Otherwise, the file's encoding will stay the same. * file's encoding will stay the same.
* *
* @throws IOException * @throws IOException If the file does not exist, or if an IO error occurs
* If the file does not exist, or if an IO error * reading the file.
* occurs reading the file.
* @see #isLocalAndExists() * @see #isLocalAndExists()
*/ */
public void reload() throws IOException { public void reload() throws IOException {
@@ -508,8 +483,7 @@ public class TextEditorPane extends RSyntaxTextArea implements DocumentListener
/** /**
* Called whenever text is removed from this editor. * Called whenever text is removed from this editor.
* *
* @param e * @param e The document event.
* The document event.
*/ */
@Override @Override
public void removeUpdate(DocumentEvent e) { public void removeUpdate(DocumentEvent e) {
@@ -522,11 +496,10 @@ public class TextEditorPane extends RSyntaxTextArea implements DocumentListener
* Saves the file in its current encoding. * Saves the file in its current encoding.
* <p> * <p>
* *
* The text area's "dirty" state is set to <code>false</code>, and if * The text area's "dirty" state is set to <code>false</code>, and if this is a
* this is a local file, its "last modified" time is updated. * local file, its "last modified" time is updated.
* *
* @throws IOException * @throws IOException If an IO error occurs.
* If an IO error occurs.
* @see #saveAs(FileLocation) * @see #saveAs(FileLocation)
* @see #load(FileLocation, String) * @see #load(FileLocation, String)
*/ */
@@ -537,13 +510,11 @@ public class TextEditorPane extends RSyntaxTextArea implements DocumentListener
} }
/** /**
* Saves this file in a new local location. This method fires a property * Saves this file in a new local location. This method fires a property change
* change event of type {@link #FULL_PATH_PROPERTY}. * event of type {@link #FULL_PATH_PROPERTY}.
* *
* @param loc * @param loc The location to save to.
* The location to save to. * @throws IOException If an IO error occurs.
* @throws IOException
* If an IO error occurs.
* @see #save() * @see #save()
* @see #load(FileLocation, String) * @see #load(FileLocation, String)
*/ */
@@ -560,10 +531,8 @@ public class TextEditorPane extends RSyntaxTextArea implements DocumentListener
/** /**
* Saves the text in this editor to the specified location. * Saves the text in this editor to the specified location.
* *
* @param loc * @param loc The location to save to.
* The location to save to. * @throws IOException If an IO error occurs.
* @throws IOException
* If an IO error occurs.
*/ */
private void saveImpl(FileLocation loc) throws IOException { private void saveImpl(FileLocation loc) throws IOException {
OutputStream out = loc.getOutputStream(); OutputStream out = loc.getOutputStream();
@@ -576,21 +545,20 @@ public class TextEditorPane extends RSyntaxTextArea implements DocumentListener
} }
/** /**
* Sets whether or not this text in this editor has unsaved changes. * Sets whether or not this text in this editor has unsaved changes. This fires
* This fires a property change event of type {@link #DIRTY_PROPERTY}. * a property change event of type {@link #DIRTY_PROPERTY}.
* <p> * <p>
* *
* Applications will usually have no need to call this method directly; the * Applications will usually have no need to call this method directly; the only
* only time you might have a need to call this method directly is if you * time you might have a need to call this method directly is if you have to
* have to initialize an instance of TextEditorPane with content that does * initialize an instance of TextEditorPane with content that does not come from
* not come from a file. <code>TextEditorPane</code> automatically sets its * a file. <code>TextEditorPane</code> automatically sets its own dirty flag
* own dirty flag when its content is edited, when its encoding is changed, * when its content is edited, when its encoding is changed, or when its line
* or when its line ending property is changed. It is cleared whenever * ending property is changed. It is cleared whenever <code>load()</code>,
* <code>load()</code>, <code>reload()</code>, <code>save()</code>, or * <code>reload()</code>, <code>save()</code>, or <code>saveAs()</code> are
* <code>saveAs()</code> are called. * called.
* *
* @param dirty * @param dirty Whether or not the text has been modified.
* Whether or not the text has been modified.
* @see #isDirty() * @see #isDirty()
*/ */
public void setDirty(boolean dirty) { public void setDirty(boolean dirty) {
@@ -603,8 +571,7 @@ public class TextEditorPane extends RSyntaxTextArea implements DocumentListener
/** /**
* Sets the document for this editor. * Sets the document for this editor.
* *
* @param doc * @param doc The new document.
* The new document.
*/ */
@Override @Override
public void setDocument(Document doc) { public void setDocument(Document doc) {
@@ -617,17 +584,14 @@ public class TextEditorPane extends RSyntaxTextArea implements DocumentListener
} }
/** /**
* Sets the encoding to use when reading or writing this file. This * Sets the encoding to use when reading or writing this file. This method sets
* method sets the editor's dirty flag when the encoding is changed, and * the editor's dirty flag when the encoding is changed, and fires a property
* fires a property change event of type {@link #ENCODING_PROPERTY}. * change event of type {@link #ENCODING_PROPERTY}.
* *
* @param encoding * @param encoding The new encoding.
* The new encoding. * @throws UnsupportedCharsetException If the encoding is not supported.
* @throws UnsupportedCharsetException * @throws NullPointerException If <code>encoding</code> is
* If the encoding is not supported. * <code>null</code>.
* @throws NullPointerException
* If <code>encoding</code> is
* <code>null</code>.
* @see #getEncoding() * @see #getEncoding()
*/ */
public void setEncoding(String encoding) { public void setEncoding(String encoding) {
@@ -649,18 +613,15 @@ public class TextEditorPane extends RSyntaxTextArea implements DocumentListener
* "<code>\n</code>", "<code>\r\n</code>" or "<code>\r</code>"). * "<code>\n</code>", "<code>\r\n</code>" or "<code>\r</code>").
* *
* Besides parameter checking, this method is preferred over * Besides parameter checking, this method is preferred over
* <code>getDocument().putProperty()</code> because it sets the editor's * <code>getDocument().putProperty()</code> because it sets the editor's dirty
* dirty flag when the line separator is changed. * flag when the line separator is changed.
* *
* @param separator * @param separator The new line separator.
* The new line separator. * @throws NullPointerException If <code>separator</code> is
* @throws NullPointerException * <code>null</code>.
* If <code>separator</code> is * @throws IllegalArgumentException If <code>separator</code> is not one of
* <code>null</code>. * "<code>\n</code>", "<code>\r\n</code>" or
* @throws IllegalArgumentException * "<code>\r</code>".
* If <code>separator</code> is not one
* of "<code>\n</code>", "<code>\r\n</code>" or
* "<code>\r</code>".
* @see #getLineSeparator() * @see #getLineSeparator()
*/ */
public void setLineSeparator(String separator) { public void setLineSeparator(String separator) {
@@ -672,21 +633,17 @@ public class TextEditorPane extends RSyntaxTextArea implements DocumentListener
* "<code>\n</code>", "<code>\r\n</code>" or "<code>\r</code>"). * "<code>\n</code>", "<code>\r\n</code>" or "<code>\r</code>").
* *
* Besides parameter checking, this method is preferred over * Besides parameter checking, this method is preferred over
* <code>getDocument().putProperty()</code> because can set the editor's * <code>getDocument().putProperty()</code> because can set the editor's dirty
* dirty flag when the line separator is changed. * flag when the line separator is changed.
* *
* @param separator * @param separator The new line separator.
* The new line separator. * @param setDirty Whether the dirty flag should be set if the line separator
* @param setDirty * is changed.
* Whether the dirty flag should be set if the line * @throws NullPointerException If <code>separator</code> is
* separator is changed. * <code>null</code>.
* @throws NullPointerException * @throws IllegalArgumentException If <code>separator</code> is not one of
* If <code>separator</code> is * "<code>\n</code>", "<code>\r\n</code>" or
* <code>null</code>. * "<code>\r</code>".
* @throws IllegalArgumentException
* If <code>separator</code> is not one
* of "<code>\n</code>", "<code>\r\n</code>" or
* "<code>\r</code>".
* @see #getLineSeparator() * @see #getLineSeparator()
*/ */
public void setLineSeparator(String separator, boolean setDirty) { public void setLineSeparator(String separator, boolean setDirty) {
@@ -707,11 +664,10 @@ public class TextEditorPane extends RSyntaxTextArea implements DocumentListener
} }
/** /**
* Sets whether or not this text area should be treated as read-only. * Sets whether or not this text area should be treated as read-only. This fires
* This fires a property change event of type {@link #READ_ONLY_PROPERTY}. * a property change event of type {@link #READ_ONLY_PROPERTY}.
* *
* @param readOnly * @param readOnly Whether or not the document is read-only.
* Whether or not the document is read-only.
* @see #isReadOnly() * @see #isReadOnly()
*/ */
public void setReadOnly(boolean readOnly) { public void setReadOnly(boolean readOnly) {
@@ -722,14 +678,14 @@ public class TextEditorPane extends RSyntaxTextArea implements DocumentListener
} }
/** /**
* Syncs this text area's "last saved or loaded" time to that of the file * Syncs this text area's "last saved or loaded" time to that of the file being
* being edited, if that file is local and exists. If the file is * edited, if that file is local and exists. If the file is remote or is local
* remote or is local but does not yet exist, nothing happens. * but does not yet exist, nothing happens.
* <p> * <p>
* *
* You normally do not have to call this method, as the "last saved or * You normally do not have to call this method, as the "last saved or loaded"
* loaded" time for {@link TextEditorPane}s is kept up-to-date internally * time for {@link TextEditorPane}s is kept up-to-date internally during such
* during such operations as {@link #save()}, {@link #reload()}, etc. * operations as {@link #save()}, {@link #reload()}, etc.
* *
* @see #getLastSaveOrLoadTime() * @see #getLastSaveOrLoadTime()
* @see #isModifiedOutsideEditor() * @see #isModifiedOutsideEditor()
+150 -203
View File
@@ -40,79 +40,69 @@ import javax.swing.text.TabExpander;
public interface Token extends TokenTypes { public interface Token extends TokenTypes {
/** /**
* Appends HTML code for painting this token, using the given text area's * Appends HTML code for painting this token, using the given text area's color
* color scheme. * scheme.
* *
* @param sb * @param sb The buffer to append to.
* The buffer to append to. * @param textArea The text area whose color scheme to use.
* @param textArea * @param fontFamily Whether to include the font family in the HTML for this
* The text area whose color scheme to use. * token. You can pass <code>false</code> for this parameter
* @param fontFamily * if, for example, you are making all your HTML be
* Whether to include the font family in the HTML for * monospaced, and don't want any crazy fonts being used in
* this token. You can pass <code>false</code> for this parameter * the editor to be reflected in your HTML.
* if, for example, you are making all your HTML be monospaced,
* and don't want any crazy fonts being used in the editor to be
* reflected in your HTML.
* @return The buffer appended to. * @return The buffer appended to.
* @see #getHTMLRepresentation(RSyntaxTextArea) * @see #getHTMLRepresentation(RSyntaxTextArea)
*/ */
StringBuilder appendHTMLRepresentation(StringBuilder sb, RSyntaxTextArea textArea, boolean fontFamily); StringBuilder appendHTMLRepresentation(StringBuilder sb, RSyntaxTextArea textArea, boolean fontFamily);
/** /**
* Appends HTML code for painting this token, using the given text area's * Appends HTML code for painting this token, using the given text area's color
* color scheme. * scheme.
* *
* @param sb * @param sb The buffer to append to.
* The buffer to append to. * @param textArea The text area whose color scheme to use.
* @param textArea * @param fontFamily Whether to include the font family in the HTML for this
* The text area whose color scheme to use. * token. You can pass <code>false</code> for this parameter
* @param fontFamily * if, for example, you are making all your HTML be
* Whether to include the font family in the HTML for * monospaced, and don't want any crazy fonts being used in
* this token. You can pass <code>false</code> for this parameter * the editor to be reflected in your HTML.
* if, for example, you are making all your HTML be monospaced, * @param tabsToSpaces Whether to convert tabs into spaces.
* and don't want any crazy fonts being used in the editor to be
* reflected in your HTML.
* @param tabsToSpaces
* Whether to convert tabs into spaces.
* @return The buffer appended to. * @return The buffer appended to.
* @see #getHTMLRepresentation(RSyntaxTextArea) * @see #getHTMLRepresentation(RSyntaxTextArea)
*/ */
StringBuilder appendHTMLRepresentation(StringBuilder sb, RSyntaxTextArea textArea, boolean fontFamily, boolean tabsToSpaces); StringBuilder appendHTMLRepresentation(StringBuilder sb, RSyntaxTextArea textArea, boolean fontFamily,
boolean tabsToSpaces);
/** /**
* Returns the character at the specified offset in the token. * Returns the character at the specified offset in the token.
* *
* @param index * @param index The index. This should be in the range
* The index. This should be in the range * <code>0-({@link #length()}-1)</code>.
* <code>0-({@link #length()}-1)</code>.
* @return The character. * @return The character.
* @see #length() * @see #length()
*/ */
char charAt(int index); char charAt(int index);
/** /**
* Returns whether the token straddles the specified position in the * Returns whether the token straddles the specified position in the document.
* document.
* *
* @param pos * @param pos The position in the document to check.
* The position in the document to check.
* @return Whether the specified position is straddled by this token. * @return Whether the specified position is straddled by this token.
*/ */
boolean containsPosition(int pos); boolean containsPosition(int pos);
/** /**
* Returns the position in the token's internal char array corresponding * Returns the position in the token's internal char array corresponding to the
* to the specified document position. * specified document position.
* <p> * <p>
* Note that this method does NOT do any bounds checking; you can pass in * Note that this method does NOT do any bounds checking; you can pass in a
* a document position that does not correspond to a position in this * document position that does not correspond to a position in this token, and
* token, and you will not receive an Exception or any other notification; * you will not receive an Exception or any other notification; it is up to the
* it is up to the caller to ensure valid input. * caller to ensure valid input.
* *
* @param pos * @param pos A position in the document that is represented by this token.
* A position in the document that is represented by this token. * @return The corresponding token position &gt;= <code>textOffset</code> and
* @return The corresponding token position &gt;= <code>textOffset</code> * &lt; <code>textOffset+textCount</code>.
* and &lt; <code>textOffset+textCount</code>.
* @see #tokenToDocument * @see #tokenToDocument
*/ */
int documentToToken(int pos); int documentToToken(int pos);
@@ -120,17 +110,15 @@ public interface Token extends TokenTypes {
/** /**
* Returns whether this token's lexeme ends with the specified characters. * Returns whether this token's lexeme ends with the specified characters.
* *
* @param ch * @param ch The characters.
* The characters.
* @return Whether this token's lexeme ends with the specified characters. * @return Whether this token's lexeme ends with the specified characters.
* @see #startsWith(char[]) * @see #startsWith(char[])
*/ */
boolean endsWith(char[] ch); boolean endsWith(char[] ch);
/** /**
* Returns the end offset of this token in the document (exclusive). In * Returns the end offset of this token in the document (exclusive). In other
* other words, the token ranges from * words, the token ranges from <code>[getOffset(), getEndOffset())</code>.
* <code>[getOffset(), getEndOffset())</code>.
* *
* @return The end offset of this token. * @return The end offset of this token.
* @see #getOffset() * @see #getOffset()
@@ -138,11 +126,10 @@ public interface Token extends TokenTypes {
int getEndOffset(); int getEndOffset();
/** /**
* Returns a <code>String</code> containing HTML code for painting this * Returns a <code>String</code> containing HTML code for painting this token,
* token, using the given text area's color scheme. * using the given text area's color scheme.
* *
* @param textArea * @param textArea The text area whose color scheme to use.
* The text area whose color scheme to use.
* @return The HTML representation of the token. * @return The HTML representation of the token.
* @see #appendHTMLRepresentation(StringBuilder, RSyntaxTextArea, boolean) * @see #appendHTMLRepresentation(StringBuilder, RSyntaxTextArea, boolean)
*/ */
@@ -151,25 +138,23 @@ public interface Token extends TokenTypes {
/** /**
* Returns the language index of this token. * Returns the language index of this token.
* *
* @return The language index. A value of <code>0</code> denotes the * @return The language index. A value of <code>0</code> denotes the "main"
* "main" language, any positive value denotes a specific secondary * language, any positive value denotes a specific secondary language.
* language.
* @see #setLanguageIndex(int) * @see #setLanguageIndex(int)
*/ */
int getLanguageIndex(); int getLanguageIndex();
/** /**
* Returns the last token in this list that is not whitespace or a * Returns the last token in this list that is not whitespace or a comment.
* comment.
* *
* @return The last non-comment, non-whitespace token, or <code>null</code> * @return The last non-comment, non-whitespace token, or <code>null</code> if
* if there isn't one. * there isn't one.
*/ */
Token getLastNonCommentNonWhitespaceToken(); Token getLastNonCommentNonWhitespaceToken();
/** /**
* Returns the last paintable token in this token list, or <code>null</code> * Returns the last paintable token in this token list, or <code>null</code> if
* if there is no paintable token. * there is no paintable token.
* *
* @return The last paintable token in this token list. * @return The last paintable token in this token list.
*/ */
@@ -179,44 +164,37 @@ public interface Token extends TokenTypes {
* Returns the text of this token, as a string. * Returns the text of this token, as a string.
* <p> * <p>
* *
* Note that this method isn't used much by the * Note that this method isn't used much by the <code>ryntaxtextarea</code>
* <code>ryntaxtextarea</code> package internally, as it tries to limit * package internally, as it tries to limit memory allocation.
* memory allocation.
* *
* @return The text of this token. * @return The text of this token.
*/ */
String getLexeme(); String getLexeme();
/** /**
* Determines the offset into this token list (i.e., into the * Determines the offset into this token list (i.e., into the document) that
* document) that covers pixel location <code>x</code> if the token list * covers pixel location <code>x</code> if the token list starts at pixel
* starts at pixel location <code>x0</code> * location <code>x0</code>
* <p> * <p>
* . * . This method will return the document position "closest" to the x-coordinate
* This method will return the document position "closest" to the * (i.e., if they click on the "right-half" of the <code>w</code> in
* x-coordinate (i.e., if they click on the "right-half" of the * <code>awe</code>, the caret will be placed in between the <code>w</code> and
* <code>w</code> in <code>awe</code>, the caret will be placed in * <code>e</code>; similarly, clicking on the left-half places the caret between
* between the <code>w</code> and <code>e</code>; similarly, clicking on * the <code>a</code> and <code>w</code>). This makes it useful for methods such
* the left-half places the caret between the <code>a</code> and * as <code>viewToModel</code> found in <code>javax.swing.text.View</code>
* <code>w</code>). This makes it useful for methods such as
* <code>viewToModel</code> found in <code>javax.swing.text.View</code>
* subclasses. * subclasses.
* *
* @param textArea * @param textArea The text area from which the token list was derived.
* The text area from which the token list was derived. * @param e How to expand tabs.
* @param e * @param x0 The pixel x-location that is the beginning of
* How to expand tabs. * <code>tokenList</code>.
* @param x0 * @param x The pixel-position for which you want to get the
* The pixel x-location that is the beginning of * corresponding offset.
* <code>tokenList</code>. * @return The position (in the document, NOT into the token list!) that covers
* @param x * the pixel location. If <code>tokenList</code> is <code>null</code> or
* The pixel-position for which you want to get the corresponding * has type <code>Token.NULL</code>, then <code>-1</code> is returned;
* offset. * the caller should recognize this and return the actual end position
* @return The position (in the document, NOT into the token list!) that * of the (empty) line.
* covers the pixel location. If <code>tokenList</code> is
* <code>null</code> or has type <code>Token.NULL</code>, then
* <code>-1</code> is returned; the caller should recognize this and
* return the actual end position of the (empty) line.
*/ */
int getListOffset(RSyntaxTextArea textArea, TabExpander e, float x0, float x); int getListOffset(RSyntaxTextArea textArea, TabExpander e, float x0, float x);
@@ -236,40 +214,34 @@ public interface Token extends TokenTypes {
int getOffset(); int getOffset();
/** /**
* Returns the position in the document that represents the last character * Returns the position in the document that represents the last character in
* in the token that will fit into <code>endBeforeX-startX</code> pixels. * the token that will fit into <code>endBeforeX-startX</code> pixels. For
* For example, if you're using a monospaced 8-pixel-per-character font, * example, if you're using a monospaced 8-pixel-per-character font, have the
* have the token "while" and <code>startX</code> is <code>0</code> and * token "while" and <code>startX</code> is <code>0</code> and
* <code>endBeforeX</code> is <code>30</code>, this method will return the * <code>endBeforeX</code> is <code>30</code>, this method will return the
* document position of the "i" in "while", because the "i" ends at pixel * document position of the "i" in "while", because the "i" ends at pixel
* <code>24</code>, while the "l" ends at <code>32</code>. If not even the * <code>24</code>, while the "l" ends at <code>32</code>. If not even the first
* first character fits in <code>endBeforeX-startX</code>, the first * character fits in <code>endBeforeX-startX</code>, the first character's
* character's position is still returned so calling methods don't go into * position is still returned so calling methods don't go into infinite loops.
* infinite loops.
* *
* @param textArea * @param textArea The text area in which this token is being painted.
* The text area in which this token is being painted. * @param e How to expand tabs.
* @param e * @param startX The x-coordinate at which the token will be painted. This
* How to expand tabs. * is needed because of tabs.
* @param startX * @param endBeforeX The x-coordinate for which you want to find the last
* The x-coordinate at which the token will be painted. This * character of <code>t</code> which comes before it.
* is needed because of tabs. * @return The last document position that will fit in the specified amount of
* @param endBeforeX * pixels.
* The x-coordinate for which you want to find the last
* character of <code>t</code> which comes before it.
* @return The last document position that will fit in the specified amount
* of pixels.
*/ */
/* /*
* @see #getTokenListOffsetBeforeX * @see #getTokenListOffsetBeforeX FIXME: This method does not compute
* FIXME: This method does not compute correctly! It needs to be abstract * correctly! It needs to be abstract and implemented by subclasses.
* and implemented by subclasses.
*/ */
int getOffsetBeforeX(RSyntaxTextArea textArea, TabExpander e, float startX, float endBeforeX); int getOffsetBeforeX(RSyntaxTextArea textArea, TabExpander e, float startX, float endBeforeX);
/** /**
* Returns the character array backing the lexeme of this token. This * Returns the character array backing the lexeme of this token. This value
* value should be treated as read-only. * should be treated as read-only.
* *
* @return A character array containing the lexeme of this token. * @return A character array containing the lexeme of this token.
* @see #getTextOffset() * @see #getTextOffset()
@@ -298,33 +270,26 @@ public interface Token extends TokenTypes {
/** /**
* Returns the width of this token given the specified parameters. * Returns the width of this token given the specified parameters.
* *
* @param textArea * @param textArea The text area in which the token is being painted.
* The text area in which the token is being painted. * @param e Describes how to expand tabs. This parameter cannot be
* @param e * <code>null</code>.
* Describes how to expand tabs. This parameter cannot be * @param x0 The pixel-location at which the token begins. This is needed
* <code>null</code>. * because of tabs.
* @param x0
* The pixel-location at which the token begins. This is needed
* because of tabs.
* @return The width of the token, in pixels. * @return The width of the token, in pixels.
* @see #getWidthUpTo * @see #getWidthUpTo
*/ */
float getWidth(RSyntaxTextArea textArea, TabExpander e, float x0); float getWidth(RSyntaxTextArea textArea, TabExpander e, float x0);
/** /**
* Returns the width of a specified number of characters in this token. * Returns the width of a specified number of characters in this token. For
* For example, for the token "while", specifying a value of <code>3</code> * example, for the token "while", specifying a value of <code>3</code> here
* here returns the width of the "whi" portion of the token. * returns the width of the "whi" portion of the token.
* *
* @param numChars * @param numChars The number of characters for which to get the width.
* The number of characters for which to get the width. * @param textArea The text area in which the token is being painted.
* @param textArea * @param e How to expand tabs. This value cannot be <code>null</code>.
* The text area in which the token is being painted. * @param x0 The pixel-location at which this token begins. This is needed
* @param e * because of tabs.
* How to expand tabs. This value cannot be <code>null</code>.
* @param x0
* The pixel-location at which this token begins. This is needed
* because of tabs.
* @return The width of the specified number of characters in this token. * @return The width of the specified number of characters in this token.
* @see #getWidth * @see #getWidth
*/ */
@@ -333,8 +298,7 @@ public interface Token extends TokenTypes {
/** /**
* Returns whether this token's lexeme matches a specific character array. * Returns whether this token's lexeme matches a specific character array.
* *
* @param lexeme * @param lexeme The lexeme to check for.
* The lexeme to check for.
* @return Whether this token has that lexeme. * @return Whether this token has that lexeme.
* @see #is(int, char[]) * @see #is(int, char[])
* @see #is(int, String) * @see #is(int, String)
@@ -347,14 +311,12 @@ public interface Token extends TokenTypes {
* Returns whether this token is of the specified type, with the specified * Returns whether this token is of the specified type, with the specified
* lexeme. * lexeme.
* <p> * <p>
* This method is preferred over the other overload in performance-critical * This method is preferred over the other overload in performance-critical code
* code where this operation may be called frequently, since it does not * where this operation may be called frequently, since it does not involve any
* involve any String allocations. * String allocations.
* *
* @param type * @param type The type to check for.
* The type to check for. * @param lexeme The lexeme to check for.
* @param lexeme
* The lexeme to check for.
* @return Whether this token has that type and lexeme. * @return Whether this token has that type and lexeme.
* @see #is(int, String) * @see #is(int, String)
* @see #is(char[]) * @see #is(char[])
@@ -368,13 +330,11 @@ public interface Token extends TokenTypes {
* lexeme. * lexeme.
* <p> * <p>
* The other overload of this method is preferred over this one in * The other overload of this method is preferred over this one in
* performance-critical code, as this one involves a String allocation * performance-critical code, as this one involves a String allocation while the
* while the other does not. * other does not.
* *
* @param type * @param type The type to check for.
* The type to check for. * @param lexeme The lexeme to check for.
* @param lexeme
* The lexeme to check for.
* @return Whether this token has that type and lexeme. * @return Whether this token has that type and lexeme.
* @see #is(int, char[]) * @see #is(int, char[])
* @see #isSingleChar(int, char) * @see #isSingleChar(int, char)
@@ -416,8 +376,8 @@ public interface Token extends TokenTypes {
boolean isIdentifier(); boolean isIdentifier();
/** /**
* Returns whether this token is a {@link #SEPARATOR} representing a single * Returns whether this token is a {@link #SEPARATOR} representing a single left
* left curly brace. * curly brace.
* *
* @return Whether this token is a left curly brace. * @return Whether this token is a left curly brace.
* @see #isRightCurly() * @see #isRightCurly()
@@ -434,10 +394,10 @@ public interface Token extends TokenTypes {
boolean isRightCurly(); boolean isRightCurly();
/** /**
* Returns whether or not this token is "paintable;" i.e., whether or not * Returns whether or not this token is "paintable;" i.e., whether or not the
* the type of this token is one such that it has an associated syntax * type of this token is one such that it has an associated syntax style. What
* style. What this boils down to is whether the token type is greater * this boils down to is whether the token type is greater than
* than <code>Token.NULL</code>. * <code>Token.NULL</code>.
* *
* @return Whether or not this token is paintable. * @return Whether or not this token is paintable.
*/ */
@@ -446,8 +406,7 @@ public interface Token extends TokenTypes {
/** /**
* Returns whether this token is the specified single character. * Returns whether this token is the specified single character.
* *
* @param ch * @param ch The character to check for.
* The character to check for.
* @return Whether this token's lexeme is the single character specified. * @return Whether this token's lexeme is the single character specified.
* @see #isSingleChar(int, char) * @see #isSingleChar(int, char)
*/ */
@@ -457,10 +416,8 @@ public interface Token extends TokenTypes {
* Returns whether this token is the specified single character, and of a * Returns whether this token is the specified single character, and of a
* specific type. * specific type.
* *
* @param type * @param type The token type.
* The token type. * @param ch The character to check for.
* @param ch
* The character to check for.
* @return Whether this token is of the specified type, and with a lexeme * @return Whether this token is of the specified type, and with a lexeme
* Equaling the single character specified. * Equaling the single character specified.
* @see #isSingleChar(char) * @see #isSingleChar(char)
@@ -485,23 +442,18 @@ public interface Token extends TokenTypes {
int length(); int length();
/** /**
* Returns the bounding box for the specified document location. The * Returns the bounding box for the specified document location. The location
* location must be in the specified token list; if it isn't, * must be in the specified token list; if it isn't, <code>null</code> is
* <code>null</code> is returned. * returned.
* *
* @param textArea * @param textArea The text area from which the token list was derived.
* The text area from which the token list was derived. * @param e How to expand tabs.
* @param e * @param pos The position in the document for which to get the bounding
* How to expand tabs. * box in the view.
* @param pos * @param x0 The pixel x-location that is the beginning of
* The position in the document for which to get the bounding * <code>tokenList</code>.
* box in the view. * @param rect The rectangle in which we'll be returning the results. This
* @param x0 * object is reused to keep from frequent memory allocations.
* The pixel x-location that is the beginning of
* <code>tokenList</code>.
* @param rect
* The rectangle in which we'll be returning the results. This
* object is reused to keep from frequent memory allocations.
* @return The bounding box for the specified position in the model. * @return The bounding box for the specified position in the model.
*/ */
Rectangle listOffsetToView(RSyntaxTextArea textArea, TabExpander e, int pos, int x0, Rectangle rect); Rectangle listOffsetToView(RSyntaxTextArea textArea, TabExpander e, int pos, int x0, Rectangle rect);
@@ -509,24 +461,22 @@ public interface Token extends TokenTypes {
/** /**
* Sets whether this token is a hyperlink. * Sets whether this token is a hyperlink.
* *
* @param hyperlink * @param hyperlink Whether this token is a hyperlink.
* Whether this token is a hyperlink.
* @see #isHyperlink() * @see #isHyperlink()
*/ */
void setHyperlink(boolean hyperlink); void setHyperlink(boolean hyperlink);
/** /**
* Sets the language index for this token. If this value is positive, it * Sets the language index for this token. If this value is positive, it denotes
* denotes a specific "secondary" language this token represents (such as * a specific "secondary" language this token represents (such as JavaScript
* JavaScript code or CSS embedded in an HTML file). If this value is * code or CSS embedded in an HTML file). If this value is <code>0</code>, this
* <code>0</code>, this token is in the "main" language being edited. * token is in the "main" language being edited. Negative values are invalid and
* Negative values are invalid and treated as <code>0</code>. * treated as <code>0</code>.
* *
* @param languageIndex * @param languageIndex The new language index. A value of <code>0</code>
* The new language index. A value of * denotes the "main" language, any positive value denotes
* <code>0</code> denotes the "main" language, any positive value * a specific secondary language. Negative values will be
* denotes a specific secondary language. Negative values will * treated as <code>0</code>.
* be treated as <code>0</code>.
* @see #getLanguageIndex() * @see #getLanguageIndex()
*/ */
void setLanguageIndex(int languageIndex); void setLanguageIndex(int languageIndex);
@@ -534,8 +484,7 @@ public interface Token extends TokenTypes {
/** /**
* Sets the type of this token. * Sets the type of this token.
* *
* @param type * @param type The new token type.
* The new token type.
* @see TokenTypes * @see TokenTypes
* @see #getType() * @see #getType()
*/ */
@@ -544,8 +493,7 @@ public interface Token extends TokenTypes {
/** /**
* Returns whether this token starts with the specified characters. * Returns whether this token starts with the specified characters.
* *
* @param chars * @param chars The characters.
* The characters.
* @return Whether this token starts with those characters. * @return Whether this token starts with those characters.
* @see #endsWith(char[]) * @see #endsWith(char[])
* @see #is(int, char[]) * @see #is(int, char[])
@@ -553,17 +501,16 @@ public interface Token extends TokenTypes {
boolean startsWith(char[] chars); boolean startsWith(char[] chars);
/** /**
* Returns the position in the document corresponding to the specified * Returns the position in the document corresponding to the specified position
* position in this token's internal char array (<code>textOffset</code> - * in this token's internal char array (<code>textOffset</code> -
* <code>textOffset+textCount-1</code>). * <code>textOffset+textCount-1</code>).
* <p> * <p>
* Note that this method does NOT do any bounds checking; you can pass in * Note that this method does NOT do any bounds checking; you can pass in an
* an invalid token position, and you will not receive an Exception or any * invalid token position, and you will not receive an Exception or any other
* other indication that the returned document position is invalid. It is * indication that the returned document position is invalid. It is up to the
* up to the user to ensure valid input. * user to ensure valid input.
* *
* @param pos * @param pos A position in the token's internal char array
* A position in the token's internal char array
* (<code>textOffset</code> - <code>textOffset+textCount</code>). * (<code>textOffset</code> - <code>textOffset+textCount</code>).
* @return The corresponding position in the document. * @return The corresponding position in the document.
* @see #documentToToken(int) * @see #documentToToken(int)
@@ -26,16 +26,11 @@ interface TokenFactory {
/** /**
* Returns a token. * Returns a token.
* *
* @param line * @param line The segment from which to get the token's text.
* The segment from which to get the token's text. * @param beg The starting offset of the token's text in the segment.
* @param beg * @param end The ending offset of the token's text in the segment.
* The starting offset of the token's text in the segment. * @param startOffset The offset in the document of the token.
* @param end * @param type The type of token.
* The ending offset of the token's text in the segment.
* @param startOffset
* The offset in the document of the token.
* @param type
* The type of token.
* @return The token. * @return The token.
*/ */
TokenImpl createToken(final Segment line, final int beg, final int end, final int startOffset, final int type); TokenImpl createToken(final Segment line, final int beg, final int end, final int startOffset, final int type);
@@ -43,24 +38,19 @@ interface TokenFactory {
/** /**
* Returns a token. * Returns a token.
* *
* @param line * @param line The char array from which to get the token's text.
* The char array from which to get the token's text. * @param beg The starting offset of the token's text in the char array.
* @param beg * @param end The ending offset of the token's text in the char array.
* The starting offset of the token's text in the char array. * @param startOffset The offset in the document of the token.
* @param end * @param type The type of token.
* The ending offset of the token's text in the char array.
* @param startOffset
* The offset in the document of the token.
* @param type
* The type of token.
* @return The token. * @return The token.
*/ */
TokenImpl createToken(final char[] line, final int beg, final int end, final int startOffset, final int type); TokenImpl createToken(final char[] line, final int beg, final int end, final int startOffset, final int type);
/** /**
* Resets the state of this token maker. This method should be called * Resets the state of this token maker. This method should be called by the
* by the <code>TokenMaker</code> every time a token list is generated for * <code>TokenMaker</code> every time a token list is generated for a new line
* a new line so the tokens can be reused. * so the tokens can be reused.
*/ */
void resetAllTokens(); void resetAllTokens();
} }
@@ -24,8 +24,7 @@ class TokenIterator implements Iterator<Token> {
/** /**
* Constructor. * Constructor.
* *
* @param doc * @param doc The document whose tokens we should iterate over.
* The document whose tokens we should iterate over.
*/ */
TokenIterator(RSyntaxDocument doc) { TokenIterator(RSyntaxDocument doc) {
this.doc = doc; this.doc = doc;
@@ -98,11 +97,10 @@ class TokenIterator implements Iterator<Token> {
} }
/** /**
* Always throws {@link UnsupportedOperationException}, as * Always throws {@link UnsupportedOperationException}, as <code>Token</code>
* <code>Token</code> removal is not supported. * removal is not supported.
* *
* @throws UnsupportedOperationException * @throws UnsupportedOperationException always.
* always.
*/ */
@Override @Override
public void remove() { public void remove() {
+71 -93
View File
@@ -12,8 +12,8 @@ import javax.swing.text.Segment;
/** /**
* An implementation of <code>TokenMaker</code> is a class that turns text into * An implementation of <code>TokenMaker</code> is a class that turns text into
* a linked list of <code>Token</code>s for syntax highlighting * a linked list of <code>Token</code>s for syntax highlighting in a particular
* in a particular language. * language.
* *
* @see Token * @see Token
* @see AbstractTokenMaker * @see AbstractTokenMaker
@@ -24,26 +24,20 @@ import javax.swing.text.Segment;
public interface TokenMaker { public interface TokenMaker {
/** /**
* Adds a null token to the end of the current linked list of tokens. * Adds a null token to the end of the current linked list of tokens. This
* This should be put at the end of the linked list whenever the last * should be put at the end of the linked list whenever the last token on the
* token on the current line is NOT a multi-line token. * current line is NOT a multi-line token.
*/ */
public void addNullToken(); public void addNullToken();
/** /**
* Adds the token specified to the current linked list of tokens. * Adds the token specified to the current linked list of tokens.
* *
* @param array * @param array The character array from which to get the text.
* The character array from which to get the text. * @param start Start offset in <code>segment</code> of token.
* @param start * @param end End offset in <code>segment</code> of token.
* Start offset in <code>segment</code> of token. * @param tokenType The token's type.
* @param end * @param startOffset The offset in the document at which this token occurs.
* End offset in <code>segment</code> of token.
* @param tokenType
* The token's type.
* @param startOffset
* The offset in the document at which this token
* occurs.
*/ */
public void addToken(char[] array, int start, int end, int tokenType, int startOffset); public void addToken(char[] array, int start, int end, int tokenType, int startOffset);
@@ -51,131 +45,115 @@ public interface TokenMaker {
* Returns the closest {@link TokenTypes "standard" token type} for a given * Returns the closest {@link TokenTypes "standard" token type} for a given
* "internal" token type (e.g. one whose value is <code>&lt; 0</code>). * "internal" token type (e.g. one whose value is <code>&lt; 0</code>).
* *
* @param type * @param type The token type.
* The token type. * @return The closest "standard" token type. If a mapping is not defined for
* @return The closest "standard" token type. If a mapping is not defined * this language, then <code>type</code> is returned.
* for this language, then <code>type</code> is returned.
*/ */
public int getClosestStandardTokenTypeForInternalType(int type); public int getClosestStandardTokenTypeForInternalType(int type);
/** /**
* Returns whether this programming language uses curly braces * Returns whether this programming language uses curly braces ('<code>{</code>'
* ('<code>{</code>' and '<code>}</code>') to denote code blocks. * and '<code>}</code>') to denote code blocks.
* *
* @param languageIndex * @param languageIndex The language index at the offset in question. Since some
* The language index at the offset in question. * <code>TokenMaker</code>s effectively have nested
* Since some <code>TokenMaker</code>s effectively have nested * languages (such as JavaScript in HTML), this parameter
* languages (such as JavaScript in HTML), this parameter tells * tells the <code>TokenMaker</code> what sub-language to
* the * look at.
* <code>TokenMaker</code> what sub-language to look at.
* @return Whether curly braces denote code blocks. * @return Whether curly braces denote code blocks.
*/ */
public boolean getCurlyBracesDenoteCodeBlocks(int languageIndex); public boolean getCurlyBracesDenoteCodeBlocks(int languageIndex);
/** /**
* Returns the last token on this line's type if the token is "unfinished", * Returns the last token on this line's type if the token is "unfinished", or
* or {@link Token#NULL} if it was finished. For example, if C-style * {@link Token#NULL} if it was finished. For example, if C-style syntax
* syntax highlighting is being implemented, and <code>text</code> * highlighting is being implemented, and <code>text</code> contained a line of
* contained a line of code that contained the beginning of a comment but * code that contained the beginning of a comment but no end-comment marker
* no end-comment marker ("*\/"), then this method would return * ("*\/"), then this method would return {@link Token#COMMENT_MULTILINE} for
* {@link Token#COMMENT_MULTILINE} for that line. This is useful * that line. This is useful for doing syntax highlighting.
* for doing syntax highlighting.
* *
* @param text * @param text The line of tokens to examine.
* The line of tokens to examine. * @param initialTokenType The token type to start with (i.e., the value of
* @param initialTokenType * <code>getLastTokenTypeOnLine</code> for the line
* The token type to start with (i.e., the value * before <code>text</code>).
* of <code>getLastTokenTypeOnLine</code> for the line before * @return The last token on this line's type, or {@link Token#NULL} if the line
* <code>text</code>). * was completed.
* @return The last token on this line's type, or {@link Token#NULL}
* if the line was completed.
*/ */
public int getLastTokenTypeOnLine(Segment text, int initialTokenType); public int getLastTokenTypeOnLine(Segment text, int initialTokenType);
/** /**
* Returns the text to place at the beginning and end of a * Returns the text to place at the beginning and end of a line to "comment" it
* line to "comment" it in this programming language. * in this programming language.
* *
* @param languageIndex * @param languageIndex The language index at the offset in question. Since some
* The language index at the offset in question. * <code>TokenMaker</code>s effectively have nested
* Since some <code>TokenMaker</code>s effectively have nested * languages (such as JavaScript in HTML), this parameter
* languages (such as JavaScript in HTML), this parameter tells * tells the <code>TokenMaker</code> what sub-language to
* the * look at.
* <code>TokenMaker</code> what sub-language to look at. * @return The start and end strings to add to a line to "comment" it out. A
* @return The start and end strings to add to a line to "comment" * <code>null</code> value for either means there is no string to add
* it out. A <code>null</code> value for either means there * for that part. A value of <code>null</code> for the array means this
* is no string to add for that part. A value of * language does not support commenting/uncommenting lines.
* <code>null</code> for the array means this language
* does not support commenting/uncommenting lines.
*/ */
public String[] getLineCommentStartAndEnd(int languageIndex); public String[] getLineCommentStartAndEnd(int languageIndex);
/** /**
* Returns an action to handle "insert break" key presses (i.e. Enter). * Returns an action to handle "insert break" key presses (i.e. Enter).
* *
* @return The action, or <code>null</code> if the default action should * @return The action, or <code>null</code> if the default action should be
* be used. * used.
*/ */
public Action getInsertBreakAction(); public Action getInsertBreakAction();
/** /**
* Returns whether tokens of the specified type should have "mark * Returns whether tokens of the specified type should have "mark occurrences"
* occurrences" enabled for the current programming language. * enabled for the current programming language.
* *
* @param type * @param type The token type.
* The token type. * @return Whether tokens of this type should have "mark occurrences" enabled.
* @return Whether tokens of this type should have "mark occurrences"
* enabled.
*/ */
public boolean getMarkOccurrencesOfTokenType(int type); public boolean getMarkOccurrencesOfTokenType(int type);
/** /**
* Returns the object in charge of marking all occurrences of the token * Returns the object in charge of marking all occurrences of the token at the
* at the current caret position, if it is a relevant token. If * current caret position, if it is a relevant token. If <code>null</code> is
* <code>null</code> is returned, a default <code>OccurrenceMarker</code> * returned, a default <code>OccurrenceMarker</code> is used.
* is used.
* *
* @return The occurrence marker for this language, or <code>null</code> * @return The occurrence marker for this language, or <code>null</code> for
* for none. * none.
*/ */
public OccurrenceMarker getOccurrenceMarker(); public OccurrenceMarker getOccurrenceMarker();
/** /**
* If a line ends in the specified token, this method returns whether * If a line ends in the specified token, this method returns whether a new line
* a new line inserted after that line should be indented. * inserted after that line should be indented.
* *
* @param token * @param token The token the previous line ends with.
* The token the previous line ends with.
* @return Whether the next line should be indented. * @return Whether the next line should be indented.
*/ */
public boolean getShouldIndentNextLineAfter(Token token); public boolean getShouldIndentNextLineAfter(Token token);
/** /**
* Returns the first token in the linked list of tokens generated * Returns the first token in the linked list of tokens generated from
* from <code>text</code>. This method must be implemented by * <code>text</code>. This method must be implemented by subclasses so they can
* subclasses so they can correctly implement syntax highlighting. * correctly implement syntax highlighting.
* *
* @param text * @param text The text from which to get tokens.
* The text from which to get tokens. * @param initialTokenType The token type we should start with.
* @param initialTokenType * @param startOffset The offset into the document at which
* The token type we should start with. * <code>text</code> starts.
* @param startOffset * @return The first <code>Token</code> in a linked list representing the syntax
* The offset into the document at which * highlighted text.
* <code>text</code> starts.
* @return The first <code>Token</code> in a linked list representing
* the syntax highlighted text.
*/ */
public Token getTokenList(Segment text, int initialTokenType, int startOffset); public Token getTokenList(Segment text, int initialTokenType, int startOffset);
/** /**
* Returns whether a character could be part of an "identifier" token * Returns whether a character could be part of an "identifier" token in a
* in a specific language. This is used to identify such things as the * specific language. This is used to identify such things as the bounds of the
* bounds of the "word" to select on double-clicking. * "word" to select on double-clicking.
* *
* @param languageIndex * @param languageIndex The language index the character was found in.
* The language index the character was found in. * @param ch The character.
* @param ch
* The character.
* @return Whether the character could be part of an "identifier" token. * @return Whether the character could be part of an "identifier" token.
*/ */
public boolean isIdentifierChar(int languageIndex, char ch); public boolean isIdentifierChar(int languageIndex, char ch);
@@ -34,17 +34,15 @@ public abstract class TokenMakerBase implements TokenMaker {
*/ */
private TokenFactory tokenFactory; private TokenFactory tokenFactory;
/** /**
* Highlights occurrences of the current token in the editor, if it is * Highlights occurrences of the current token in the editor, if it is relevant.
* relevant.
*/ */
private OccurrenceMarker occurrenceMarker; private OccurrenceMarker occurrenceMarker;
/** /**
* "0" implies this is the "main" language being highlighted. Positive * "0" implies this is the "main" language being highlighted. Positive values
* values imply various "secondary" or "embedded" languages, such as CSS * imply various "secondary" or "embedded" languages, such as CSS or JavaScript
* or JavaScript in HTML. While this value is non-zero, tokens will be * in HTML. While this value is non-zero, tokens will be generated with this
* generated with this language index so they can (possibly) be painted * language index so they can (possibly) be painted differently, so "embedded"
* differently, so "embedded" languages can be rendered with a special * languages can be rendered with a special background.
* background.
*/ */
private int languageIndex; private int languageIndex;
@@ -76,17 +74,11 @@ public abstract class TokenMakerBase implements TokenMaker {
/** /**
* Adds the token specified to the current linked list of tokens. * Adds the token specified to the current linked list of tokens.
* *
* @param segment * @param segment <code>Segment</code> to get text from.
* <code>Segment</code> to get text from. * @param start Start offset in <code>segment</code> of token.
* @param start * @param end End offset in <code>segment</code> of token.
* Start offset in <code>segment</code> of token. * @param tokenType The token's type.
* @param end * @param startOffset The offset in the document at which this token occurs.
* End offset in <code>segment</code> of token.
* @param tokenType
* The token's type.
* @param startOffset
* The offset in the document at which this token
* occurs.
*/ */
public void addToken(Segment segment, int start, int end, int tokenType, int startOffset) { public void addToken(Segment segment, int start, int end, int tokenType, int startOffset) {
addToken(segment.array, start, end, tokenType, startOffset); addToken(segment.array, start, end, tokenType, startOffset);
@@ -103,19 +95,12 @@ public abstract class TokenMakerBase implements TokenMaker {
/** /**
* Adds the token specified to the current linked list of tokens. * Adds the token specified to the current linked list of tokens.
* *
* @param array * @param array The character array.
* The character array. * @param start The starting offset in the array.
* @param start * @param end The ending offset in the array.
* The starting offset in the array. * @param tokenType The token's type.
* @param end * @param startOffset The offset in the document at which this token occurs.
* The ending offset in the array. * @param hyperlink Whether this token is a hyperlink.
* @param tokenType
* The token's type.
* @param startOffset
* The offset in the document at which this token
* occurs.
* @param hyperlink
* Whether this token is a hyperlink.
*/ */
public void addToken(char[] array, int start, int end, int tokenType, int startOffset, boolean hyperlink) { public void addToken(char[] array, int start, int end, int tokenType, int startOffset, boolean hyperlink) {
if (firstToken == null) { if (firstToken == null) {
@@ -132,8 +117,8 @@ public abstract class TokenMakerBase implements TokenMaker {
} }
/** /**
* Returns the occurrence marker to use for this token maker. Subclasses * Returns the occurrence marker to use for this token maker. Subclasses can
* can override to use different implementations. * override to use different implementations.
* *
* @return The occurrence marker to use. * @return The occurrence marker to use.
*/ */
@@ -146,12 +131,11 @@ public abstract class TokenMakerBase implements TokenMaker {
* "internal" token type (e.g. one whose value is <code>&lt; 0</code>). * "internal" token type (e.g. one whose value is <code>&lt; 0</code>).
* <p> * <p>
* *
* The default implementation returns <code>type</code> always, which * The default implementation returns <code>type</code> always, which denotes
* denotes that a mapping from internal token types to standard token types * that a mapping from internal token types to standard token types is not
* is not defined; subclasses can override. * defined; subclasses can override.
* *
* @param type * @param type The token type.
* The token type.
* @return The closest "standard" token type. * @return The closest "standard" token type.
*/ */
@Override @Override
@@ -160,18 +144,17 @@ public abstract class TokenMakerBase implements TokenMaker {
} }
/** /**
* Returns whether this programming language uses curly braces * Returns whether this programming language uses curly braces ('<code>{</code>'
* ('<code>{</code>' and '<code>}</code>') to denote code blocks. * and '<code>}</code>') to denote code blocks.
* *
* The default implementation returns <code>false</code>; subclasses can * The default implementation returns <code>false</code>; subclasses can
* override this method if necessary. * override this method if necessary.
* *
* @param languageIndex * @param languageIndex The language index at the offset in question. Since some
* The language index at the offset in question. * <code>TokenMaker</code>s effectively have nested
* Since some <code>TokenMaker</code>s effectively have nested * languages (such as JavaScript in HTML), this parameter
* languages (such as JavaScript in HTML), this parameter tells * tells the <code>TokenMaker</code> what sub-language to
* the * look at.
* <code>TokenMaker</code> what sub-language to look at.
* @return Whether curly braces denote code blocks. * @return Whether curly braces denote code blocks.
*/ */
@Override @Override
@@ -180,9 +163,8 @@ public abstract class TokenMakerBase implements TokenMaker {
} }
/** /**
* Returns an action to handle "insert break" key presses (i.e. Enter). * Returns an action to handle "insert break" key presses (i.e. Enter). The
* The default implementation returns <code>null</code>. Subclasses * default implementation returns <code>null</code>. Subclasses can override.
* can override.
* *
* @return The default implementation always returns <code>null</code>. * @return The default implementation always returns <code>null</code>.
*/ */
@@ -223,16 +205,14 @@ public abstract class TokenMakerBase implements TokenMaker {
} }
/** /**
* Returns whether tokens of the specified type should have "mark * Returns whether tokens of the specified type should have "mark occurrences"
* occurrences" enabled for the current programming language. The default * enabled for the current programming language. The default implementation
* implementation returns true if <tt>type</tt> is {@link Token#IDENTIFIER}. * returns true if <tt>type</tt> is {@link Token#IDENTIFIER}. Subclasses can
* Subclasses can override this method to support other token types, such * override this method to support other token types, such as
* as {@link Token#VARIABLE}. * {@link Token#VARIABLE}.
* *
* @param type * @param type The token type.
* The token type. * @return Whether tokens of this type should have "mark occurrences" enabled.
* @return Whether tokens of this type should have "mark occurrences"
* enabled.
*/ */
@Override @Override
public boolean getMarkOccurrencesOfTokenType(int type) { public boolean getMarkOccurrencesOfTokenType(int type) {
@@ -251,11 +231,10 @@ public abstract class TokenMakerBase implements TokenMaker {
} }
/** /**
* The default implementation returns <code>false</code> always. Languages * The default implementation returns <code>false</code> always. Languages that
* that wish to better support auto-indentation can override this method. * wish to better support auto-indentation can override this method.
* *
* @param token * @param token The token the previous line ends with.
* The token the previous line ends with.
* @return Whether the next line should be indented. * @return Whether the next line should be indented.
*/ */
@Override @Override
@@ -264,9 +243,9 @@ public abstract class TokenMakerBase implements TokenMaker {
} }
/** /**
* Returns whether a character could be part of an "identifier" token * Returns whether a character could be part of an "identifier" token in a
* in a specific language. The default implementation returns * specific language. The default implementation returns <code>true</code> for
* <code>true</code> for letters, numbers, and certain symbols. * letters, numbers, and certain symbols.
*/ */
@Override @Override
public boolean isIdentifierChar(int languageIndex, char ch) { public boolean isIdentifierChar(int languageIndex, char ch) {
@@ -274,9 +253,9 @@ public abstract class TokenMakerBase implements TokenMaker {
} }
/** /**
* The default implementation returns <code>false</code> always. * The default implementation returns <code>false</code> always. Subclasses that
* Subclasses that are highlighting a markup language should override this * are highlighting a markup language should override this method to return
* method to return <code>true</code>. * <code>true</code>.
* *
* @return <code>false</code> always. * @return <code>false</code> always.
*/ */
@@ -286,10 +265,9 @@ public abstract class TokenMakerBase implements TokenMaker {
} }
/** /**
* Deletes the linked list of tokens so we can begin anew. This should * Deletes the linked list of tokens so we can begin anew. This should never
* never have to be called by the programmer, as it is automatically * have to be called by the programmer, as it is automatically called whenever
* called whenever the user calls * the user calls {@link #getLastTokenTypeOnLine(Segment, int)} or
* {@link #getLastTokenTypeOnLine(Segment, int)} or
* {@link #getTokenList(Segment, int, int)}. * {@link #getTokenList(Segment, int, int)}.
*/ */
protected void resetTokenList() { protected void resetTokenList() {
@@ -298,15 +276,14 @@ public abstract class TokenMakerBase implements TokenMaker {
} }
/** /**
* Sets the language index to assign to tokens moving forward. This * Sets the language index to assign to tokens moving forward. This property is
* property is used to designate tokens as being in "secondary" languages * used to designate tokens as being in "secondary" languages (such as CSS or
* (such as CSS or JavaScript in HTML). * JavaScript in HTML).
* *
* @param languageIndex * @param languageIndex The new language index. A value of <code>0</code>
* The new language index. A value of * denotes the "main" language, any positive value denotes
* <code>0</code> denotes the "main" language, any positive value * a specific secondary language. Negative values will be
* denotes a specific secondary language. Negative values will * treated as <code>0</code>.
* be treated as <code>0</code>.
* @see #getLanguageIndex() * @see #getLanguageIndex()
*/ */
protected void setLanguageIndex(int languageIndex) { protected void setLanguageIndex(int languageIndex) {
@@ -20,8 +20,7 @@ import org.fife.ui.rsyntaxtextarea.modes.PlainTextTokenMaker;
public abstract class TokenMakerFactory { public abstract class TokenMakerFactory {
/** /**
* If this system property is set, a custom <code>TokenMakerFactory</code> * If this system property is set, a custom <code>TokenMakerFactory</code> of
* of
* the specified class will be used as the default token maker factory. * the specified class will be used as the default token maker factory.
*/ */
public static final String PROPERTY_DEFAULT_TOKEN_MAKER_FACTORY = "TokenMakerFactory"; public static final String PROPERTY_DEFAULT_TOKEN_MAKER_FACTORY = "TokenMakerFactory";
@@ -63,8 +62,7 @@ public abstract class TokenMakerFactory {
/** /**
* Returns a {@link TokenMaker} for the specified key. * Returns a {@link TokenMaker} for the specified key.
* *
* @param key * @param key The key.
* The key.
* @return The corresponding <code>TokenMaker</code>, or * @return The corresponding <code>TokenMaker</code>, or
* {@link PlainTextTokenMaker} if none matches the specified key. * {@link PlainTextTokenMaker} if none matches the specified key.
*/ */
@@ -79,10 +77,8 @@ public abstract class TokenMakerFactory {
/** /**
* Returns a {@link TokenMaker} for the specified key. * Returns a {@link TokenMaker} for the specified key.
* *
* @param key * @param key The key.
* The key. * @return The corresponding <code>TokenMaker</code>, or <code>null</code> if
* @return The corresponding <code>TokenMaker</code>, or <code>null</code>
* if
* none matches the specified key. * none matches the specified key.
*/ */
protected abstract TokenMaker getTokenMakerImpl(String key); protected abstract TokenMaker getTokenMakerImpl(String key);
@@ -95,16 +91,13 @@ public abstract class TokenMakerFactory {
public abstract Set<String> keySet(); public abstract Set<String> keySet();
/** /**
* Sets the default <code>TokenMakerFactory</code> instance. This is the * Sets the default <code>TokenMakerFactory</code> instance. This is the factory
* factory
* used by all future {@link RSyntaxDocument}s by default. * used by all future {@link RSyntaxDocument}s by default.
* <code>RSyntaxDocument</code>s that have already been created are not * <code>RSyntaxDocument</code>s that have already been created are not
* affected. * affected.
* *
* @param tmf * @param tmf The factory.
* The factory. * @throws IllegalArgumentException If <code>tmf</code> is <code>null</code>.
* @throws IllegalArgumentException
* If <code>tmf</code> is <code>null</code>.
* @see #getDefaultInstance() * @see #getDefaultInstance()
*/ */
public static synchronized void setDefaultInstance(TokenMakerFactory tmf) { public static synchronized void setDefaultInstance(TokenMakerFactory tmf) {
+49 -69
View File
@@ -10,8 +10,8 @@ package org.fife.ui.rsyntaxtextarea;
import javax.swing.text.Segment; import javax.swing.text.Segment;
/** /**
* A hash table for reserved words, etc. defined by a {@link TokenMaker}. * A hash table for reserved words, etc. defined by a {@link TokenMaker}. This
* This class is designed for the quick lookup of tokens, as it can compare * class is designed for the quick lookup of tokens, as it can compare
* <code>Segment</code>s without the need to allocate a new string. * <code>Segment</code>s without the need to allocate a new string.
* <p> * <p>
* *
@@ -43,8 +43,7 @@ public class TokenMap {
/** /**
* Constructs a new token map that is case-sensitive. * Constructs a new token map that is case-sensitive.
* *
* @param size * @param size The size of the token map.
* The size of the token map.
*/ */
public TokenMap(int size) { public TokenMap(int size) {
this(size, false); this(size, false);
@@ -53,9 +52,8 @@ public class TokenMap {
/** /**
* Constructs a new token map. * Constructs a new token map.
* *
* @param ignoreCase * @param ignoreCase Whether or not this token map should ignore case when
* Whether or not this token map should ignore case * comparing tokens.
* when comparing tokens.
*/ */
public TokenMap(boolean ignoreCase) { public TokenMap(boolean ignoreCase) {
this(DEFAULT_TOKEN_MAP_SIZE, ignoreCase); this(DEFAULT_TOKEN_MAP_SIZE, ignoreCase);
@@ -64,11 +62,9 @@ public class TokenMap {
/** /**
* Constructs a new token map. * Constructs a new token map.
* *
* @param size * @param size The size of the token map.
* The size of the token map. * @param ignoreCase Whether or not this token map should ignore case when
* @param ignoreCase * comparing tokens.
* Whether or not this token map should ignore case
* when comparing tokens.
*/ */
public TokenMap(int size, boolean ignoreCase) { public TokenMap(int size, boolean ignoreCase) {
this.size = size; this.size = size;
@@ -79,10 +75,8 @@ public class TokenMap {
/** /**
* Adds a token to a specified bucket in the token map. * Adds a token to a specified bucket in the token map.
* *
* @param bucket * @param bucket The bucket in which to add the token.
* The bucket in which to add the token. * @param token The token to add.
* @param token
* The token to add.
*/ */
private void addTokenToBucket(int bucket, TokenMapToken token) { private void addTokenToBucket(int bucket, TokenMapToken token) {
TokenMapToken old = tokenMap[bucket]; TokenMapToken old = tokenMap[bucket];
@@ -91,34 +85,28 @@ public class TokenMap {
} }
/** /**
* Returns the token type associated with the given text, if the given * Returns the token type associated with the given text, if the given text is
* text is in this token map. If it isn't, <code>-1</code> is returned. * in this token map. If it isn't, <code>-1</code> is returned.
* *
* @param text * @param text The segment from which to get the text to compare.
* The segment from which to get the text to compare. * @param start The starting index in the segment of the text.
* @param start * @param end The ending index in the segment of the text.
* The starting index in the segment of the text. * @return The token type associated with the given text, or <code>-1</code> if
* @param end * this token was not specified in this map.
* The ending index in the segment of the text.
* @return The token type associated with the given text, or
* <code>-1</code> if this token was not specified in this map.
*/ */
public int get(Segment text, int start, int end) { public int get(Segment text, int start, int end) {
return get(text.array, start, end); return get(text.array, start, end);
} }
/** /**
* Returns the token type associated with the given text, if the given * Returns the token type associated with the given text, if the given text is
* text is in this token map. If it isn't, <code>-1</code> is returned. * in this token map. If it isn't, <code>-1</code> is returned.
* *
* @param array1 * @param array1 An array of characters containing the text.
* An array of characters containing the text. * @param start The starting index in the array of the text.
* @param start * @param end The ending index in the array of the text.
* The starting index in the array of the text. * @return The token type associated with the given text, or <code>-1</code> if
* @param end * this token was not specified in this map.
* The ending index in the array of the text.
* @return The token type associated with the given text, or
* <code>-1</code> if this token was not specified in this map.
*/ */
public int get(char[] array1, int start, int end) { public int get(char[] array1, int start, int end) {
int length1 = end - start + 1; int length1 = end - start + 1;
@@ -129,14 +117,13 @@ public class TokenMap {
int offset1; int offset1;
int length; int length;
/* /*
* We check whether or not to ignore case before doing any looping to * We check whether or not to ignore case before doing any looping to minimize
* minimize the number of extraneous comparisons we do. This makes * the number of extraneous comparisons we do. This makes for slightly redundant
* for slightly redundant code, but it'll be a little more efficient. * code, but it'll be a little more efficient.
*/ */
// If matches are case-sensitive (C, C++, Java, etc.)... // If matches are case-sensitive (C, C++, Java, etc.)...
if (!ignoreCase) { if (!ignoreCase) {
mainLoop: mainLoop: while (token != null) {
while (token != null) {
if (token.length == length1) { if (token.length == length1) {
array2 = token.text; array2 = token.text;
offset2 = token.offset; offset2 = token.offset;
@@ -157,8 +144,7 @@ public class TokenMap {
// Note that all tokens saved in this map were converted to // Note that all tokens saved in this map were converted to
// lower-case already. // lower-case already.
else { else {
mainLoop2: mainLoop2: while (token != null) {
while (token != null) {
if (token.length == length1) { if (token.length == length1) {
array2 = token.text; array2 = token.text;
offset2 = token.offset; offset2 = token.offset;
@@ -182,22 +168,20 @@ public class TokenMap {
/** /**
* Returns the hash code for a given string. * Returns the hash code for a given string.
* *
* @param text * @param text The text to hash.
* The text to hash. * @param offset The offset into the text at which to start hashing.
* @param offset * @param length The last character in the text to hash.
* The offset into the text at which to start hashing.
* @param length
* The last character in the text to hash.
* @return The hash code. * @return The hash code.
*/ */
private int getHashCode(char[] text, int offset, int length) { private int getHashCode(char[] text, int offset, int length) {
return (RSyntaxUtilities.toLowerCase(text[offset]) + RSyntaxUtilities.toLowerCase(text[offset + length - 1])) % size; return (RSyntaxUtilities.toLowerCase(text[offset]) + RSyntaxUtilities.toLowerCase(text[offset + length - 1]))
% size;
} }
/** /**
* Returns whether this token map ignores case when checking for tokens. * Returns whether this token map ignores case when checking for tokens. This
* This property is set in the constructor and cannot be changed, as this * property is set in the constructor and cannot be changed, as this is an
* is an intrinsic property of a particular programming language. * intrinsic property of a particular programming language.
* *
* @return Whether or not this token maker is ignoring case. * @return Whether or not this token maker is ignoring case.
*/ */
@@ -208,10 +192,8 @@ public class TokenMap {
/** /**
* Adds a string to this token map. * Adds a string to this token map.
* *
* @param string * @param string The string to add.
* The string to add. * @param tokenType The type of token the string is.
* @param tokenType
* The type of token the string is.
*/ */
public void put(final String string, final int tokenType) { public void put(final String string, final int tokenType) {
if (isIgnoringCase()) { if (isIgnoringCase()) {
@@ -222,16 +204,14 @@ public class TokenMap {
} }
/** /**
* Adds a string to this token map. The char array passed-in will be used * Adds a string to this token map. The char array passed-in will be used as the
* as the actual data for the token, so it may well be modified (such as * actual data for the token, so it may well be modified (such as lower-casing
* lower-casing it if <code>ignoreCase</code> is <code>true</code>). This * it if <code>ignoreCase</code> is <code>true</code>). This shouldn't be an
* shouldn't be an issue though as this method is only called from the * issue though as this method is only called from the public <code>put</code>
* public <code>put</code> method, which allocates a new char array. * method, which allocates a new char array.
* *
* @param string * @param string The string to add.
* The string to add. * @param tokenType The type of token the string is.
* @param tokenType
* The type of token the string is.
*/ */
private void put(char[] string, int tokenType) { private void put(char[] string, int tokenType) {
int hashCode = getHashCode(string, 0, string.length); int hashCode = getHashCode(string, 0, string.length);
@@ -239,9 +219,9 @@ public class TokenMap {
} }
/** /**
* The "token" used by a token map. Note that this isn't the same thing * The "token" used by a token map. Note that this isn't the same thing as the
* as the {@link Token} class, but it's basically a 1-1 correspondence * {@link Token} class, but it's basically a 1-1 correspondence for reserved
* for reserved words, etc. * words, etc.
*/ */
private static final class TokenMapToken { private static final class TokenMapToken {
@@ -24,34 +24,30 @@ package org.fife.ui.rsyntaxtextarea;
public interface TokenOrientedView { public interface TokenOrientedView {
/** /**
* Returns a token list for the <i>physical</i> line above the physical * Returns a token list for the <i>physical</i> line above the physical line
* line containing the specified offset into the document. Note that for * containing the specified offset into the document. Note that for a plain
* a plain (non-wrapped) view, this is simply the token list for the * (non-wrapped) view, this is simply the token list for the logical line above
* logical line above the line containing <code>offset</code>, since lines * the line containing <code>offset</code>, since lines are not wrapped. For a
* are not wrapped. For a wrapped view, this may or may not be tokens from * wrapped view, this may or may not be tokens from the same line.
* the same line.
* *
* @param offset * @param offset The offset in question.
* The offset in question. * @return A token list for the physical (and in this view, logical) line before
* @return A token list for the physical (and in this view, logical) line * this one. If no physical line is above the one containing
* before this one. If no physical line is above the one * <code>offset</code>, <code>null</code> is returned.
* containing <code>offset</code>, <code>null</code> is returned.
*/ */
Token getTokenListForPhysicalLineAbove(int offset); Token getTokenListForPhysicalLineAbove(int offset);
/** /**
* Returns a token list for the <i>physical</i> line below the physical * Returns a token list for the <i>physical</i> line below the physical line
* line containing the specified offset into the document. Note that for * containing the specified offset into the document. Note that for a plain
* a plain (non-wrapped) view, this is simply the token list for the * (non-wrapped) view, this is simply the token list for the logical line below
* logical line below the line containing <code>offset</code>, since lines * the line containing <code>offset</code>, since lines are not wrapped. For a
* are not wrapped. For a wrapped view, this may or may not be tokens from * wrapped view, this may or may not be tokens from the same line.
* the same line.
* *
* @param offset * @param offset The offset in question.
* The offset in question. * @return A token list for the physical (and in this view, logical) line after
* @return A token list for the physical (and in this view, logical) line * this one. If no physical line is after the one containing
* after this one. If no physical line is after the one * <code>offset</code>, <code>null</code> is returned.
* containing <code>offset</code>, <code>null</code> is returned.
*/ */
Token getTokenListForPhysicalLineBelow(int offset); Token getTokenListForPhysicalLineBelow(int offset);
} }
@@ -11,8 +11,8 @@ import java.awt.Graphics2D;
import javax.swing.text.TabExpander; import javax.swing.text.TabExpander;
/** /**
* Renders tokens in an instance of {@link RSyntaxTextArea}. One instance * Renders tokens in an instance of {@link RSyntaxTextArea}. One instance may
* may render tokens "regularly," another may render visible whitespace, for * render tokens "regularly," another may render visible whitespace, for
* example. * example.
* *
* @author Robert Futrell * @author Robert Futrell
@@ -23,18 +23,12 @@ interface TokenPainter {
/** /**
* Paints this token. * Paints this token.
* *
* @param token * @param token The token to render.
* The token to render. * @param g The graphics context in which to paint.
* @param g * @param x The x-coordinate at which to paint.
* The graphics context in which to paint. * @param y The y-coordinate at which to paint.
* @param x * @param host The text area this token is in.
* The x-coordinate at which to paint. * @param e How to expand tabs.
* @param y
* The y-coordinate at which to paint.
* @param host
* The text area this token is in.
* @param e
* How to expand tabs.
* @return The x-coordinate representing the end of the painted text. * @return The x-coordinate representing the end of the painted text.
*/ */
float paint(Token token, Graphics2D g, float x, float y, RSyntaxTextArea host, TabExpander e); float paint(Token token, Graphics2D g, float x, float y, RSyntaxTextArea host, TabExpander e);
@@ -42,22 +36,16 @@ interface TokenPainter {
/** /**
* Paints this token. * Paints this token.
* *
* @param token * @param token The token to render.
* The token to render. * @param g The graphics context in which to paint.
* @param g * @param x The x-coordinate at which to paint.
* The graphics context in which to paint. * @param y The y-coordinate at which to paint.
* @param x * @param host The text area this token is in.
* The x-coordinate at which to paint. * @param e How to expand tabs.
* @param y * @param clipStart The left boundary of the clip rectangle in which we're
* The y-coordinate at which to paint. * painting. This optimizes painting by allowing us to not
* @param host * paint paint when this token is "to the left" of the clip
* The text area this token is in. * rectangle.
* @param e
* How to expand tabs.
* @param clipStart
* The left boundary of the clip rectangle in which we're
* painting. This optimizes painting by allowing us to not paint
* paint when this token is "to the left" of the clip rectangle.
* @return The x-coordinate representing the end of the painted text. * @return The x-coordinate representing the end of the painted text.
*/ */
float paint(Token token, Graphics2D g, float x, float y, RSyntaxTextArea host, TabExpander e, float clipStart); float paint(Token token, Graphics2D g, float x, float y, RSyntaxTextArea host, TabExpander e, float clipStart);
@@ -65,75 +53,57 @@ interface TokenPainter {
/** /**
* Paints this token. * Paints this token.
* *
* @param token * @param token The token to render.
* The token to render. * @param g The graphics context in which to paint.
* @param g * @param x The x-coordinate at which to paint.
* The graphics context in which to paint. * @param y The y-coordinate at which to paint.
* @param x * @param host The text area this token is in.
* The x-coordinate at which to paint. * @param e How to expand tabs.
* @param y * @param clipStart The left boundary of the clip rectangle in which we're
* The y-coordinate at which to paint. * painting. This optimizes painting by allowing us to not
* @param host * paint paint when this token is "to the left" of the clip
* The text area this token is in. * rectangle.
* @param e * @param paintBG Whether to paint the background.
* How to expand tabs.
* @param clipStart
* The left boundary of the clip rectangle in which we're
* painting. This optimizes painting by allowing us to not paint
* paint when this token is "to the left" of the clip rectangle.
* @param paintBG
* Whether to paint the background.
* @return The x-coordinate representing the end of the painted text. * @return The x-coordinate representing the end of the painted text.
*/ */
float paint(Token token, Graphics2D g, float x, float y, RSyntaxTextArea host, TabExpander e, float clipStart, boolean paintBG); float paint(Token token, Graphics2D g, float x, float y, RSyntaxTextArea host, TabExpander e, float clipStart,
boolean paintBG);
/** /**
* Paints this token as it should appear in a selected region of text * Paints this token as it should appear in a selected region of text (assuming
* (assuming painting with a selection-foreground color is enabled in the * painting with a selection-foreground color is enabled in the parent
* parent <code>RSyntaxTextArea</code>). * <code>RSyntaxTextArea</code>).
* *
* @param token * @param token The token to render.
* The token to render. * @param g The graphics context in which to paint.
* @param g * @param x The x-coordinate at which to paint.
* The graphics context in which to paint. * @param y The y-coordinate at which to paint.
* @param x * @param host The text area this token is in.
* The x-coordinate at which to paint. * @param e How to expand tabs.
* @param y * @param useSTC Whether to use the text area's "selected text color."
* The y-coordinate at which to paint.
* @param host
* The text area this token is in.
* @param e
* How to expand tabs.
* @param useSTC
* Whether to use the text area's "selected text color."
* @return The x-coordinate representing the end of the painted text. * @return The x-coordinate representing the end of the painted text.
*/ */
float paintSelected(Token token, Graphics2D g, float x, float y, RSyntaxTextArea host, TabExpander e, boolean useSTC); float paintSelected(Token token, Graphics2D g, float x, float y, RSyntaxTextArea host, TabExpander e,
boolean useSTC);
/** /**
* Paints this token as it should appear in a selected region of text * Paints this token as it should appear in a selected region of text (assuming
* (assuming painting with a selection-foreground color is enabled in the * painting with a selection-foreground color is enabled in the parent
* parent <code>RSyntaxTextArea</code>). * <code>RSyntaxTextArea</code>).
* *
* @param token * @param token The token to render.
* The token to render. * @param g The graphics context in which to paint.
* @param g * @param x The x-coordinate at which to paint.
* The graphics context in which to paint. * @param y The y-coordinate at which to paint.
* @param x * @param host The text area this token is in.
* The x-coordinate at which to paint. * @param e How to expand tabs.
* @param y * @param clipStart The left boundary of the clip rectangle in which we're
* The y-coordinate at which to paint. * painting. This optimizes painting by allowing us to not
* @param host * paint paint when this token is "to the left" of the clip
* The text area this token is in. * rectangle.
* @param e * @param useSTC Whether to use the text area's "selected text color."
* How to expand tabs.
* @param clipStart
* The left boundary of the clip rectangle in which we're
* painting. This optimizes painting by allowing us to not paint
* paint when this token is "to the left" of the clip rectangle.
* @param useSTC
* Whether to use the text area's "selected text color."
* @return The x-coordinate representing the end of the painted text. * @return The x-coordinate representing the end of the painted text.
*/ */
float paintSelected(Token token, Graphics2D g, float x, float y, RSyntaxTextArea host, TabExpander e, float clipStart, boolean useSTC); float paintSelected(Token token, Graphics2D g, float x, float y, RSyntaxTextArea host, TabExpander e,
float clipStart, boolean useSTC);
} }
@@ -11,8 +11,8 @@ package org.fife.ui.rsyntaxtextarea;
* <p> * <p>
* *
* Note that all valid token types are &gt;= 0, so extensions of the TokenMaker * Note that all valid token types are &gt;= 0, so extensions of the TokenMaker
* class are free to internally use all ints &lt; 0 ONLY for "end-of-line" * class are free to internally use all ints &lt; 0 ONLY for "end-of-line" style
* style markers; they are ignored by painting implementations. * markers; they are ignored by painting implementations.
* *
* @author Robert Futrell * @author Robert Futrell
* @version 1.0 * @version 1.0
@@ -20,8 +20,8 @@ package org.fife.ui.rsyntaxtextarea;
public interface TokenTypes { public interface TokenTypes {
/** /**
* Tokens of type <code>NULL</code> mark the end of lines with no * Tokens of type <code>NULL</code> mark the end of lines with no multi-line
* multi-line token at the end (such as a block comment in C++). * token at the end (such as a block comment in C++).
*/ */
int NULL = 0; int NULL = 0;
int COMMENT_EOL = 1; int COMMENT_EOL = 1;
@@ -36,8 +36,7 @@ class URLFileLocation extends FileLocation {
/** /**
* Constructor. * Constructor.
* *
* @param url * @param url The URL of the file.
* The URL of the file.
*/ */
URLFileLocation(URL url) { URLFileLocation(URL url) {
this.url = url; this.url = url;
@@ -46,8 +45,8 @@ class URLFileLocation extends FileLocation {
} }
/** /**
* Creates a "prettied-up" URL to use. This will be stripped of * Creates a "prettied-up" URL to use. This will be stripped of sensitive
* sensitive information such as passwords. * information such as passwords.
* *
* @return The full path to use. * @return The full path to use.
*/ */
@@ -74,8 +73,8 @@ class URLFileLocation extends FileLocation {
/** /**
* Returns the last time this file was modified, or * Returns the last time this file was modified, or
* {@link TextEditorPane#LAST_MODIFIED_UNKNOWN} if this value cannot be * {@link TextEditorPane#LAST_MODIFIED_UNKNOWN} if this value cannot be computed
* computed (such as for a remote file). * (such as for a remote file).
* *
* @return The last time this file was modified. This will always be * @return The last time this file was modified. This will always be
* {@link TextEditorPane#LAST_MODIFIED_UNKNOWN} for URL's. * {@link TextEditorPane#LAST_MODIFIED_UNKNOWN} for URL's.
@@ -129,9 +128,9 @@ class URLFileLocation extends FileLocation {
} }
/** /**
* Returns whether this file location is a local file and already * Returns whether this file location is a local file and already exists. This
* exists. This method always returns <code>false</code> since we * method always returns <code>false</code> since we cannot check this value
* cannot check this value easily. * easily.
* *
* @return <code>false</code> always. * @return <code>false</code> always.
* @see #isLocal() * @see #isLocal()
@@ -20,13 +20,11 @@ import javax.swing.text.TabExpander;
* The current implementation paints as follows: * The current implementation paints as follows:
* <ul> * <ul>
* <li>The first tab or space, if any, is found in the token.</li> * <li>The first tab or space, if any, is found in the token.</li>
* <li>If a tab was found, all characters up to it are painted as a * <li>If a tab was found, all characters up to it are painted as a group.</li>
* group.</li> * <li>If a space was found, all characters up to and including it are painted
* <li>If a space was found, all characters up to and including it are * (it is painted with a special symbol to denote it as a space).</li>
* painted (it is painted with a special symbol to denote it as * <li>If neither a tab nor a whitespace was found, all characters in the token
* a space).</li> * are painted.</li>
* <li>If neither a tab nor a whitespace was found, all characters in the
* token are painted.</li>
* <li>Repeat until all characters are painted.</li> * <li>Repeat until all characters are painted.</li>
* </ul> * </ul>
* This means that rendering hints are applied to all groups of characters * This means that rendering hints are applied to all groups of characters
@@ -51,8 +49,8 @@ class VisibleWhitespaceTokenPainter extends DefaultTokenPainter {
* {@inheritDoc} * {@inheritDoc}
*/ */
@Override @Override
protected float paintImpl(Token token, Graphics2D g, float x, float y, RSyntaxTextArea host, TabExpander e, float clipStart, protected float paintImpl(Token token, Graphics2D g, float x, float y, RSyntaxTextArea host, TabExpander e,
boolean selected, boolean useSTC) { float clipStart, boolean selected, boolean useSTC) {
int origX = (int) x; int origX = (int) x;
int textOffs = token.getTextOffset(); int textOffs = token.getTextOffset();
char[] text = token.getTextArray(); char[] text = token.getTextArray();
@@ -68,65 +66,65 @@ class VisibleWhitespaceTokenPainter extends DefaultTokenPainter {
int height = fm.getHeight(); int height = fm.getHeight();
for (int i = textOffs; i < end; i++) { for (int i = textOffs; i < end; i++) {
switch (text[i]) { switch (text[i]) {
case '\t': case '\t':
// Fill in background. // Fill in background.
nextX = x + fm.charsWidth(text, flushIndex, flushLen); nextX = x + fm.charsWidth(text, flushIndex, flushLen);
float nextNextX = e.nextTabStop(nextX, 0); float nextNextX = e.nextTabStop(nextX, 0);
if (bg != null) { if (bg != null) {
paintBackground(x, y, nextNextX - x, height, g, ascent, host, bg); paintBackground(x, y, nextNextX - x, height, g, ascent, host, bg);
} }
g.setColor(fg); g.setColor(fg);
// Paint chars cached before the tab. // Paint chars cached before the tab.
if (flushLen > 0) { if (flushLen > 0) {
g.drawChars(text, flushIndex, flushLen, (int) x, (int) y); g.drawChars(text, flushIndex, flushLen, (int) x, (int) y);
flushLen = 0; flushLen = 0;
} }
flushIndex = i + 1; flushIndex = i + 1;
// Draw an arrow representing the tab. // Draw an arrow representing the tab.
int halfHeight = height / 2; int halfHeight = height / 2;
int quarterHeight = halfHeight / 2; int quarterHeight = halfHeight / 2;
int ymid = (int) y - ascent + halfHeight; int ymid = (int) y - ascent + halfHeight;
g.drawLine((int) nextX, ymid, (int) nextNextX, ymid); g.drawLine((int) nextX, ymid, (int) nextNextX, ymid);
g.drawLine((int) nextNextX, ymid, (int) nextNextX - 4, ymid - quarterHeight); g.drawLine((int) nextNextX, ymid, (int) nextNextX - 4, ymid - quarterHeight);
g.drawLine((int) nextNextX, ymid, (int) nextNextX - 4, ymid + quarterHeight); g.drawLine((int) nextNextX, ymid, (int) nextNextX - 4, ymid + quarterHeight);
x = nextNextX; x = nextNextX;
break; break;
case ' ': case ' ':
// NOTE: There is a little bit of a "fudge factor" // NOTE: There is a little bit of a "fudge factor"
// here when "smooth text" is enabled, as "width" // here when "smooth text" is enabled, as "width"
// below may well not be the width given to the space // below may well not be the width given to the space
// by fm.charsWidth() (it depends on how it places the // by fm.charsWidth() (it depends on how it places the
// space with respect to the preceding character). // space with respect to the preceding character).
// But, we assume the approximation is close enough for // But, we assume the approximation is close enough for
// our drawing a dot for the space. // our drawing a dot for the space.
// "flushLen+1" ensures text is aligned correctly (or, // "flushLen+1" ensures text is aligned correctly (or,
// aligned the same as in getWidth()). // aligned the same as in getWidth()).
nextX = x + fm.charsWidth(text, flushIndex, flushLen + 1); nextX = x + fm.charsWidth(text, flushIndex, flushLen + 1);
int width = fm.charWidth(' '); int width = fm.charWidth(' ');
// Paint background. // Paint background.
if (bg != null) { if (bg != null) {
paintBackground(x, y, nextX - x, height, g, ascent, host, bg); paintBackground(x, y, nextX - x, height, g, ascent, host, bg);
} }
g.setColor(fg); g.setColor(fg);
// Paint chars before space. // Paint chars before space.
if (flushLen > 0) { if (flushLen > 0) {
g.drawChars(text, flushIndex, flushLen, (int) x, (int) y); g.drawChars(text, flushIndex, flushLen, (int) x, (int) y);
flushLen = 0; flushLen = 0;
} }
// Paint a dot representing the space. // Paint a dot representing the space.
int dotX = (int) (nextX - width / 2f); // "2.0f" for int dotX = (int) (nextX - width / 2f); // "2.0f" for
// FindBugs // FindBugs
int dotY = (int) (y - ascent + height / 2f); // Ditto int dotY = (int) (y - ascent + height / 2f); // Ditto
g.drawLine(dotX, dotY, dotX, dotY); g.drawLine(dotX, dotY, dotX, dotY);
flushIndex = i + 1; flushIndex = i + 1;
x = nextX; x = nextX;
break; break;
case '\f': case '\f':
// ??? // ???
// fall-through for now. // fall-through for now.
default: default:
flushLen += 1; flushLen += 1;
break; break;
} }
} }
nextX = x + fm.charsWidth(text, flushIndex, flushLen); nextX = x + fm.charsWidth(text, flushIndex, flushLen);
@@ -67,17 +67,16 @@ public class WrappedSyntaxView extends BoxView implements TabExpander, RSTAView
// */ // */
// private static final char[] eolMarker = { '.' }; // private static final char[] eolMarker = { '.' };
/** /**
* The width of this view cannot be below this amount, as if the width * The width of this view cannot be below this amount, as if the width is ever 0
* is ever 0 (really a bug), we'll go into an infinite loop. * (really a bug), we'll go into an infinite loop.
*/ */
private static final int MIN_WIDTH = 20; private static final int MIN_WIDTH = 20;
/** /**
* Creates a new WrappedSyntaxView. Lines will be wrapped * Creates a new WrappedSyntaxView. Lines will be wrapped on character
* on character boundaries. * boundaries.
* *
* @param elem * @param elem the element underlying the view
* the element underlying the view
*/ */
public WrappedSyntaxView(Element elem) { public WrappedSyntaxView(Element elem) {
super(elem, Y_AXIS); super(elem, Y_AXIS);
@@ -89,12 +88,10 @@ public class WrappedSyntaxView extends BoxView implements TabExpander, RSTAView
} }
/** /**
* This is called by the nested wrapped line * This is called by the nested wrapped line views to determine the break
* views to determine the break location. This can * location. This can be reimplemented to alter the breaking behavior. It will
* be reimplemented to alter the breaking behavior. * either break at word or character boundaries depending upon the break
* It will either break at word or character boundaries * argument given at construction.
* depending upon the break argument given at
* construction.
*/ */
protected int calculateBreakPosition(int p0, Token tokenList, float x0) { protected int calculateBreakPosition(int p0, Token tokenList, float x0) {
// System.err.println("------ beginning calculateBreakPosition() // System.err.println("------ beginning calculateBreakPosition()
@@ -153,15 +150,12 @@ public class WrappedSyntaxView extends BoxView implements TabExpander, RSTAView
// return t.offset + Utilities.getBreakLocation(s, fm, x0, x, e, t.offset); // return t.offset + Utilities.getBreakLocation(s, fm, x0, x, e, t.offset);
// } // }
/** /**
* Gives notification from the document that attributes were changed * Gives notification from the document that attributes were changed in a
* in a location that this view is responsible for. * location that this view is responsible for.
* *
* @param e * @param e the change information from the associated document
* the change information from the associated document * @param a the current allocation of the view
* @param a * @param f the factory to use to rebuild if the view has children
* the current allocation of the view
* @param f
* the factory to use to rebuild if the view has children
* @see View#changedUpdate * @see View#changedUpdate
*/ */
@Override @Override
@@ -170,10 +164,10 @@ public class WrappedSyntaxView extends BoxView implements TabExpander, RSTAView
} }
/** /**
* Sets the allocation rectangle for a given line's view, but sets the * Sets the allocation rectangle for a given line's view, but sets the y value
* y value to the passed-in value. This should be used instead of * to the passed-in value. This should be used instead of
* {@link #childAllocation(int, Rectangle)} since it allows you to account * {@link #childAllocation(int, Rectangle)} since it allows you to account for
* for hidden lines in collapsed fold regions. * hidden lines in collapsed fold regions.
* *
* @param line * @param line
* @param y * @param y
@@ -194,23 +188,18 @@ public class WrappedSyntaxView extends BoxView implements TabExpander, RSTAView
} }
/** /**
* Draws a single view (i.e., a line of text for a wrapped view), * Draws a single view (i.e., a line of text for a wrapped view), wrapping the
* wrapping the text onto multiple lines if necessary. * text onto multiple lines if necessary.
* *
* @param painter * @param painter The painter to use to render tokens.
* The painter to use to render tokens. * @param g The graphics context in which to paint.
* @param g * @param r The rectangle in which to paint.
* The graphics context in which to paint. * @param view The <code>View</code> to paint.
* @param r * @param fontHeight The height of the font being used.
* The rectangle in which to paint. * @param y The y-coordinate at which to begin painting.
* @param view
* The <code>View</code> to paint.
* @param fontHeight
* The height of the font being used.
* @param y
* The y-coordinate at which to begin painting.
*/ */
protected void drawView(TokenPainter painter, Graphics2D g, Rectangle r, View view, int fontHeight, int y, int line) { protected void drawView(TokenPainter painter, Graphics2D g, Rectangle r, View view, int fontHeight, int y,
int line) {
float x = r.x; float x = r.x;
LayeredHighlighter h = (LayeredHighlighter) host.getHighlighter(); LayeredHighlighter h = (LayeredHighlighter) host.getHighlighter();
RSyntaxDocument document = (RSyntaxDocument) getDocument(); RSyntaxDocument document = (RSyntaxDocument) getDocument();
@@ -264,29 +253,21 @@ public class WrappedSyntaxView extends BoxView implements TabExpander, RSTAView
} }
/** /**
* Draws a single view (i.e., a line of text for a wrapped view), wrapping * Draws a single view (i.e., a line of text for a wrapped view), wrapping the
* the text onto multiple lines if necessary. Any selected text is * text onto multiple lines if necessary. Any selected text is rendered with the
* rendered with the editor's "selected text" color. * editor's "selected text" color.
* *
* @param painter * @param painter The painter to use to render tokens.
* The painter to use to render tokens. * @param g The graphics context in which to paint.
* @param g * @param r The rectangle in which to paint.
* The graphics context in which to paint. * @param view The <code>View</code> to paint.
* @param r * @param fontHeight The height of the font being used.
* The rectangle in which to paint. * @param y The y-coordinate at which to begin painting.
* @param view * @param selStart The start of the selection.
* The <code>View</code> to paint. * @param selEnd The end of the selection.
* @param fontHeight
* The height of the font being used.
* @param y
* The y-coordinate at which to begin painting.
* @param selStart
* The start of the selection.
* @param selEnd
* The end of the selection.
*/ */
protected void drawViewWithSelection(TokenPainter painter, Graphics2D g, Rectangle r, View view, int fontHeight, int y, int selStart, protected void drawViewWithSelection(TokenPainter painter, Graphics2D g, Rectangle r, View view, int fontHeight,
int selEnd) { int y, int selStart, int selEnd) {
float x = r.x; float x = r.x;
boolean useSTC = host.getUseSelectedTextColor(); boolean useSTC = host.getUseSelectedTextColor();
LayeredHighlighter h = (LayeredHighlighter) host.getHighlighter(); LayeredHighlighter h = (LayeredHighlighter) host.getHighlighter();
@@ -363,7 +344,8 @@ public class WrappedSyntaxView extends BoxView implements TabExpander, RSTAView
if (token != null && token.isPaintable() && token.getOffset() < p) { if (token != null && token.isPaintable() && token.getOffset() < p) {
int tokenOffset = token.getOffset(); int tokenOffset = token.getOffset();
Token orig = token; Token orig = token;
token = new TokenImpl(drawSeg, tokenOffset - start, p - 1 - start, tokenOffset, token.getType(), token.getLanguageIndex()); token = new TokenImpl(drawSeg, tokenOffset - start, p - 1 - start, tokenOffset, token.getType(),
token.getLanguageIndex());
token.setLanguageIndex(token.getLanguageIndex()); token.setLanguageIndex(token.getLanguageIndex());
// Selection starts in this token // Selection starts in this token
if (token.containsPosition(selStart)) { if (token.containsPosition(selStart)) {
@@ -428,13 +410,10 @@ public class WrappedSyntaxView extends BoxView implements TabExpander, RSTAView
* <p> * <p>
* Overridden to account for code folding. * Overridden to account for code folding.
* *
* @param index * @param index The index of the child, &gt;= 0 &amp;&amp;&lt; getViewCount().
* The index of the child, &gt;= 0 &amp;&amp;&lt; getViewCount(). * @param a The allocation to this view
* @param a * @return The allocation to the child; or <code>null</code> if <code>a</code>
* The allocation to this view * is <code>null</code>; or <code>null</code> if the layout is invalid
* @return The allocation to the child; or <code>null</code> if
* <code>a</code> is <code>null</code>; or <code>null</code> if the
* layout is invalid
*/ */
@Override @Override
public Shape getChildAllocation(int index, Shape a) { public Shape getChildAllocation(int index, Shape a) {
@@ -457,10 +436,8 @@ public class WrappedSyntaxView extends BoxView implements TabExpander, RSTAView
* <p> * <p>
* Overridden to account for lines hidden by collapsed folded regions. * Overridden to account for lines hidden by collapsed folded regions.
* *
* @param line * @param line The index of the child, &gt;= 0 &amp;&amp;&lt; getViewCount()
* The index of the child, &gt;= 0 &amp;&amp;&lt; getViewCount() * @param a The allocation to this view
* @param a
* The allocation to this view
* @return The allocation to the child * @return The allocation to the child
*/ */
public Shape getChildAllocationImpl(int line, Shape a) { public Shape getChildAllocationImpl(int line, Shape a) {
@@ -482,19 +459,15 @@ public class WrappedSyntaxView extends BoxView implements TabExpander, RSTAView
} }
/** /**
* Determines the maximum span for this view along an * Determines the maximum span for this view along an axis. This is implemented
* axis. This is implemented to provide the superclass * to provide the superclass behavior after first making sure that the current
* behavior after first making sure that the current font * font metrics are cached (for the nested lines which use the metrics to
* metrics are cached (for the nested lines which use * determine the height of the potentially wrapped lines).
* the metrics to determine the height of the potentially
* wrapped lines).
* *
* @param axis * @param axis may be either View.X_AXIS or View.Y_AXIS
* may be either View.X_AXIS or View.Y_AXIS * @return the span the view would like to be rendered into. Typically the view
* @return the span the view would like to be rendered into. * is told to render into the span that is returned, although there is
* Typically the view is told to render into the span * no guarantee. The parent may choose to resize or break the view.
* that is returned, although there is no guarantee.
* The parent may choose to resize or break the view.
* @see View#getMaximumSpan * @see View#getMaximumSpan
*/ */
@Override @Override
@@ -508,19 +481,15 @@ public class WrappedSyntaxView extends BoxView implements TabExpander, RSTAView
} }
/** /**
* Determines the minimum span for this view along an * Determines the minimum span for this view along an axis. This is implemented
* axis. This is implemented to provide the superclass * to provide the superclass behavior after first making sure that the current
* behavior after first making sure that the current font * font metrics are cached (for the nested lines which use the metrics to
* metrics are cached (for the nested lines which use * determine the height of the potentially wrapped lines).
* the metrics to determine the height of the potentially
* wrapped lines).
* *
* @param axis * @param axis may be either View.X_AXIS or View.Y_AXIS
* may be either View.X_AXIS or View.Y_AXIS * @return the span the view would like to be rendered into. Typically the view
* @return the span the view would like to be rendered into. * is told to render into the span that is returned, although there is
* Typically the view is told to render into the span * no guarantee. The parent may choose to resize or break the view.
* that is returned, although there is no guarantee.
* The parent may choose to resize or break the view.
* @see View#getMinimumSpan * @see View#getMinimumSpan
*/ */
@Override @Override
@@ -534,19 +503,15 @@ public class WrappedSyntaxView extends BoxView implements TabExpander, RSTAView
} }
/** /**
* Determines the preferred span for this view along an * Determines the preferred span for this view along an axis. This is
* axis. This is implemented to provide the superclass * implemented to provide the superclass behavior after first making sure that
* behavior after first making sure that the current font * the current font metrics are cached (for the nested lines which use the
* metrics are cached (for the nested lines which use * metrics to determine the height of the potentially wrapped lines).
* the metrics to determine the height of the potentially
* wrapped lines).
* *
* @param axis * @param axis may be either View.X_AXIS or View.Y_AXIS
* may be either View.X_AXIS or View.Y_AXIS * @return the span the view would like to be rendered into. Typically the view
* @return the span the view would like to be rendered into. * is told to render into the span that is returned, although there is
* Typically the view is told to render into the span * no guarantee. The parent may choose to resize or break the view.
* that is returned, although there is no guarantee.
* The parent may choose to resize or break the view.
* @see View#getPreferredSpan * @see View#getPreferredSpan
*/ */
@Override @Override
@@ -612,16 +577,13 @@ public class WrappedSyntaxView extends BoxView implements TabExpander, RSTAView
} }
/** /**
* Gives notification that something was inserted into the * Gives notification that something was inserted into the document in a
* document in a location that this view is responsible for. * location that this view is responsible for. This is implemented to simply
* This is implemented to simply update the children. * update the children.
* *
* @param changes * @param changes The change information from the associated document.
* The change information from the associated document. * @param a the current allocation of the view
* @param a * @param f the factory to use to rebuild if the view has children
* the current allocation of the view
* @param f
* the factory to use to rebuild if the view has children
* @see View#insertUpdate * @see View#insertUpdate
*/ */
@Override @Override
@@ -636,15 +598,12 @@ public class WrappedSyntaxView extends BoxView implements TabExpander, RSTAView
} }
/** /**
* Loads all of the children to initialize the view. * Loads all of the children to initialize the view. This is called by the
* This is called by the <code>setParent</code> method. * <code>setParent</code> method. Subclasses can re-implement this to initialize
* Subclasses can re-implement this to initialize their * their child views in a different manner. The default implementation creates a
* child views in a different manner. The default * child view for each child element.
* implementation creates a child view for each
* child element.
* *
* @param f * @param f the view factory
* the view factory
*/ */
@Override @Override
protected void loadChildren(ViewFactory f) { protected void loadChildren(ViewFactory f) {
@@ -693,46 +652,41 @@ public class WrappedSyntaxView extends BoxView implements TabExpander, RSTAView
} }
/** /**
* Provides a mapping, for a given region, from the document model * Provides a mapping, for a given region, from the document model coordinate
* coordinate space to the view coordinate space. The specified region is * space to the view coordinate space. The specified region is created as a
* created as a union of the first and last character positions. * union of the first and last character positions.
* <p> * <p>
* *
* This is implemented to subtract the width of the second character, as * This is implemented to subtract the width of the second character, as this
* this view's <code>modelToView</code> actually returns the width of the * view's <code>modelToView</code> actually returns the width of the character
* character instead of "1" or "0" like the View implementations in * instead of "1" or "0" like the View implementations in
* <code>javax.swing.text</code>. Thus, if we don't override this method, * <code>javax.swing.text</code>. Thus, if we don't override this method, the
* the <code>View</code> implementation will return one character's width * <code>View</code> implementation will return one character's width too much
* too much for its consumers (implementations of * for its consumers (implementations of
* <code>javax.swing.text.Highlighter</code>). * <code>javax.swing.text.Highlighter</code>).
* *
* @param p0 * @param p0 the position of the first character (&gt;=0)
* the position of the first character (&gt;=0) * @param b0 The bias of the first character position, toward the previous
* @param b0 * character or the next character represented by the offset, in case
* The bias of the first character position, toward the previous * the position is a boundary of two views; <code>b0</code> will have
* character or the next character represented by the offset, in * one of these values:
* case the position is a boundary of two views; <code>b0</code> * <ul>
* will have one of these values: * <li><code>Position.Bias.Forward</code>
* <ul> * <li><code>Position.Bias.Backward</code>
* <li><code>Position.Bias.Forward</code> * </ul>
* <li><code>Position.Bias.Backward</code> * @param p1 the position of the last character (&gt;=0)
* </ul> * @param b1 the bias for the second character position, defined one of the
* @param p1 * legal values shown above
* the position of the last character (&gt;=0) * @param a the area of the view, which encompasses the requested region
* @param b1 * @return the bounding box which is a union of the region specified by the
* the bias for the second character position, defined * first and last character positions
* one of the legal values shown above * @exception BadLocationException if the given position does not represent
* @param a * a valid location in the associated
* the area of the view, which encompasses the requested region * document
* @return the bounding box which is a union of the region specified * @exception IllegalArgumentException if <code>b0</code> or <code>b1</code> are
* by the first and last character positions * not one of the legal
* @exception BadLocationException * <code>Position.Bias</code> values listed
* if the given position does * above
* not represent a valid location in the associated document
* @exception IllegalArgumentException
* if <code>b0</code> or
* <code>b1</code> are not one of the
* legal <code>Position.Bias</code> values listed above
* @see View#viewToModel * @see View#viewToModel
*/ */
@Override @Override
@@ -776,15 +730,13 @@ public class WrappedSyntaxView extends BoxView implements TabExpander, RSTAView
} }
/** /**
* Returns the next tab stop position after a given reference position. * Returns the next tab stop position after a given reference position. This
* This implementation does not support things like centering so it * implementation does not support things like centering so it ignores the
* ignores the tabOffset argument. * tabOffset argument.
* *
* @param x * @param x the current position &gt;= 0
* the current position &gt;= 0 * @param tabOffset the position within the text stream that the tab occurred at
* @param tabOffset * &gt;= 0.
* the position within the text stream
* that the tab occurred at &gt;= 0.
* @return the tab stop, measured in points &gt;= 0 * @return the tab stop, measured in points &gt;= 0
*/ */
@Override @Override
@@ -799,10 +751,8 @@ public class WrappedSyntaxView extends BoxView implements TabExpander, RSTAView
/** /**
* Paints the word-wrapped text. * Paints the word-wrapped text.
* *
* @param g * @param g The graphics context in which to paint.
* The graphics context in which to paint. * @param a The shape (usually a rectangle) in which to paint.
* @param a
* The shape (usually a rectangle) in which to paint.
*/ */
@Override @Override
public void paint(Graphics g, Shape a) { public void paint(Graphics g, Shape a) {
@@ -856,16 +806,13 @@ public class WrappedSyntaxView extends BoxView implements TabExpander, RSTAView
} }
/** /**
* Gives notification that something was removed from the * Gives notification that something was removed from the document in a location
* document in a location that this view is responsible for. * that this view is responsible for. This is implemented to simply update the
* This is implemented to simply update the children. * children.
* *
* @param changes * @param changes The change information from the associated document.
* The change information from the associated document. * @param a the current allocation of the view
* @param a * @param f the factory to use to rebuild if the view has children
* the current allocation of the view
* @param f
* the factory to use to rebuild if the view has children
* @see View#removeUpdate * @see View#removeUpdate
*/ */
@Override @Override
@@ -880,18 +827,14 @@ public class WrappedSyntaxView extends BoxView implements TabExpander, RSTAView
} }
/** /**
* Makes a <code>Segment</code> point to the text in our * Makes a <code>Segment</code> point to the text in our document between the
* document between the given positions. Note that the positions MUST be * given positions. Note that the positions MUST be valid positions in the
* valid positions in the document. * document.
* *
* @param p0 * @param p0 The first position in the document.
* The first position in the document. * @param p1 The second position in the document.
* @param p1 * @param document The document from which you want to get the text.
* The second position in the document. * @param seg The segment in which to load the text.
* @param document
* The document from which you want to get the text.
* @param seg
* The segment in which to load the text.
*/ */
private void setSegment(int p0, int p1, Document document, Segment seg) { private void setSegment(int p0, int p1, Document document, Segment seg) {
try { try {
@@ -906,13 +849,11 @@ public class WrappedSyntaxView extends BoxView implements TabExpander, RSTAView
} }
/** /**
* Sets the size of the view. This should cause layout of the view along * Sets the size of the view. This should cause layout of the view along the
* the given axis, if it has any layout duties. * given axis, if it has any layout duties.
* *
* @param width * @param width the width &gt;= 0
* the width &gt;= 0 * @param height the height &gt;= 0
* @param height
* the height &gt;= 0
*/ */
@Override @Override
public void setSize(float width, float height) { public void setSize(float width, float height) {
@@ -928,8 +869,7 @@ public class WrappedSyntaxView extends BoxView implements TabExpander, RSTAView
} }
/** /**
* Update the child views in response to a * Update the child views in response to a document event.
* document event.
*/ */
void updateChildren(DocumentEvent e, Shape a) { void updateChildren(DocumentEvent e, Shape a) {
Element elem = getElement(); Element elem = getElement();
@@ -1026,11 +966,9 @@ public class WrappedSyntaxView extends BoxView implements TabExpander, RSTAView
} }
/** /**
* Simple view of a line that wraps if it doesn't * Simple view of a line that wraps if it doesn't fit within the horizontal
* fit within the horizontal space allocated. * space allocated. This class tries to be lightweight by carrying little state
* This class tries to be lightweight by carrying little * of it's own and sharing the state of the outer class with it's siblings.
* state of it's own and sharing the state of the outer class
* with it's siblings.
*/ */
class WrappedLine extends View { class WrappedLine extends View {
@@ -1041,8 +979,8 @@ public class WrappedSyntaxView extends BoxView implements TabExpander, RSTAView
} }
/** /**
* Calculate the number of lines that will be rendered * Calculate the number of lines that will be rendered by logical line when it
* by logical line when it is wrapped. * is wrapped.
*/ */
final int calculateLineCount() { final int calculateLineCount() {
int nlines = 0; int nlines = 0;
@@ -1062,7 +1000,8 @@ public class WrappedSyntaxView extends BoxView implements TabExpander, RSTAView
for (int p0 = startOffset; p0 < p1;) { for (int p0 = startOffset; p0 < p1;) {
// System.err.println("... ... " + p0 + ", " + p1); // System.err.println("... ... " + p0 + ", " + p1);
nlines += 1; nlines += 1;
TokenSubList subList = TokenUtils.getSubTokenList(tokenList, p0, WrappedSyntaxView.this, textArea, x0, lineCountTempToken); TokenSubList subList = TokenUtils.getSubTokenList(tokenList, p0, WrappedSyntaxView.this, textArea, x0,
lineCountTempToken);
x0 = subList != null ? subList.x : x0; x0 = subList != null ? subList.x : x0;
tokenList = subList != null ? subList.tokenList : null; tokenList = subList != null ? subList.tokenList : null;
int p = calculateBreakPosition(p0, tokenList, x0); int p = calculateBreakPosition(p0, tokenList, x0);
@@ -1075,62 +1014,52 @@ public class WrappedSyntaxView extends BoxView implements TabExpander, RSTAView
// System.err.println("... ... ... new p0==" + p0); // System.err.println("... ... ... new p0==" + p0);
} }
/* /*
* int numLines = 0; * int numLines = 0; try { numLines = textArea.getLineCount(); } catch
* try { * (BadLocationException ble) { ble.printStackTrace(); } System.err.
* numLines = textArea.getLineCount(); * println(">>> >>> calculated number of lines for this view (line " + line +
* } catch (BadLocationException ble) { * "/" + numLines + ": " + nlines);
* ble.printStackTrace();
* }
* System.err.
* println(">>> >>> calculated number of lines for this view (line "
* + line + "/" + numLines + ": " + nlines);
*/ */
return nlines; return nlines;
} }
/** /**
* Determines the preferred span for this view along an * Determines the preferred span for this view along an axis.
* axis.
* *
* @param axis * @param axis may be either X_AXIS or Y_AXIS
* may be either X_AXIS or Y_AXIS * @return the span the view would like to be rendered into. Typically the view
* @return the span the view would like to be rendered into. * is told to render into the span that is returned, although there is
* Typically the view is told to render into the span * no guarantee. The parent may choose to resize or break the view.
* that is returned, although there is no guarantee.
* The parent may choose to resize or break the view.
* @see View#getPreferredSpan * @see View#getPreferredSpan
*/ */
@Override @Override
public float getPreferredSpan(int axis) { public float getPreferredSpan(int axis) {
switch (axis) { switch (axis) {
case View.X_AXIS: case View.X_AXIS:
float width = getWidth(); float width = getWidth();
if (width == Integer.MAX_VALUE) { if (width == Integer.MAX_VALUE) {
// We have been initially set to MAX_VALUE, but we don't // We have been initially set to MAX_VALUE, but we don't
// want this as our preferred. // want this as our preferred.
return 100f; return 100f;
} }
return width; return width;
case View.Y_AXIS: case View.Y_AXIS:
if (nlines == 0 || widthChanging) { if (nlines == 0 || widthChanging) {
nlines = calculateLineCount(); nlines = calculateLineCount();
} }
int h = nlines * ((RSyntaxTextArea) getContainer()).getLineHeight(); int h = nlines * ((RSyntaxTextArea) getContainer()).getLineHeight();
return h; return h;
default: default:
throw new IllegalArgumentException("Invalid axis: " + axis); throw new IllegalArgumentException("Invalid axis: " + axis);
} }
} }
/** /**
* Renders using the given rendering surface and area on that * Renders using the given rendering surface and area on that surface. The view
* surface. The view may need to do layout and create child * may need to do layout and create child views to enable itself to render into
* views to enable itself to render into the given allocation. * the given allocation.
* *
* @param g * @param g the rendering surface to use
* the rendering surface to use * @param a the allocated region to render into
* @param a
* the allocated region to render into
* @see View#paint * @see View#paint
*/ */
@Override @Override
@@ -1139,17 +1068,14 @@ public class WrappedSyntaxView extends BoxView implements TabExpander, RSTAView
} }
/** /**
* Provides a mapping from the document model coordinate space * Provides a mapping from the document model coordinate space to the coordinate
* to the coordinate space of the view mapped to it. * space of the view mapped to it.
* *
* @param pos * @param pos the position to convert
* the position to convert * @param a the allocated region to render into
* @param a
* the allocated region to render into
* @return the bounding box of the given position is returned * @return the bounding box of the given position is returned
* @exception BadLocationException * @exception BadLocationException if the given position does not represent a
* if the given position does not * valid location in the associated document.
* represent a valid location in the associated document.
*/ */
@Override @Override
public Shape modelToView(int pos, Shape a, Position.Bias b) throws BadLocationException { public Shape modelToView(int pos, Shape a, Position.Bias b) throws BadLocationException {
@@ -1170,13 +1096,15 @@ public class WrappedSyntaxView extends BoxView implements TabExpander, RSTAView
Token tokenList = doc.getTokenListForLine(line); Token tokenList = doc.getTokenListForLine(line);
float x0 = alloc.x;// 0; float x0 = alloc.x;// 0;
while (p0 < p1) { while (p0 < p1) {
TokenSubList subList = TokenUtils.getSubTokenList(tokenList, p0, WrappedSyntaxView.this, textArea, x0, lineCountTempToken); TokenSubList subList = TokenUtils.getSubTokenList(tokenList, p0, WrappedSyntaxView.this, textArea, x0,
lineCountTempToken);
x0 = subList != null ? subList.x : x0; x0 = subList != null ? subList.x : x0;
tokenList = subList != null ? subList.tokenList : null; tokenList = subList != null ? subList.tokenList : null;
int p = calculateBreakPosition(p0, tokenList, x0); int p = calculateBreakPosition(p0, tokenList, x0);
if ((pos >= p0) && (testP < p)) {// pos < p)) { if ((pos >= p0) && (testP < p)) {// pos < p)) {
// it's in this line // it's in this line
alloc = RSyntaxUtilities.getLineWidthUpTo(textArea, s, p0, pos, WrappedSyntaxView.this, alloc, alloc.x); alloc = RSyntaxUtilities.getLineWidthUpTo(textArea, s, p0, pos, WrappedSyntaxView.this, alloc,
alloc.x);
// System.err.println("--- end modelToView ---"); // System.err.println("--- end modelToView ---");
return alloc; return alloc;
} }
@@ -1184,7 +1112,8 @@ public class WrappedSyntaxView extends BoxView implements TabExpander, RSTAView
if (p == p1 - 1 && pos == p1 - 1) { if (p == p1 - 1 && pos == p1 - 1) {
// Wants end. // Wants end.
if (pos > p0) { if (pos > p0) {
alloc = RSyntaxUtilities.getLineWidthUpTo(textArea, s, p0, pos, WrappedSyntaxView.this, alloc, alloc.x); alloc = RSyntaxUtilities.getLineWidthUpTo(textArea, s, p0, pos, WrappedSyntaxView.this, alloc,
alloc.x);
} }
// System.err.println("--- end modelToView ---"); // System.err.println("--- end modelToView ---");
return alloc; return alloc;
@@ -1197,17 +1126,14 @@ public class WrappedSyntaxView extends BoxView implements TabExpander, RSTAView
} }
/** /**
* Provides a mapping from the view coordinate space to the logical * Provides a mapping from the view coordinate space to the logical coordinate
* coordinate space of the model. * space of the model.
* *
* @param fx * @param fx the X coordinate
* the X coordinate * @param fy the Y coordinate
* @param fy * @param a the allocated region to render into
* the Y coordinate * @return the location within the model that best represents the given point in
* @param a * the view
* the allocated region to render into
* @return the location within the model that best represents the
* given point in the view
* @see View#viewToModel * @see View#viewToModel
*/ */
@Override @Override
@@ -1247,8 +1173,8 @@ public class WrappedSyntaxView extends BoxView implements TabExpander, RSTAView
// We can always use alloc.x since we always break // We can always use alloc.x since we always break
// lines so they start at the beginning of a physical // lines so they start at the beginning of a physical
// line. // line.
TokenSubList subList = TokenUtils.getSubTokenList(tlist, p0, WrappedSyntaxView.this, textArea, alloc.x, TokenSubList subList = TokenUtils.getSubTokenList(tlist, p0, WrappedSyntaxView.this, textArea,
lineCountTempToken); alloc.x, lineCountTempToken);
tlist = subList != null ? subList.tokenList : null; tlist = subList != null ? subList.tokenList : null;
int p = calculateBreakPosition(p0, tlist, alloc.x); int p = calculateBreakPosition(p0, tlist, alloc.x);
// If desired view position is in this physical chunk. // If desired view position is in this physical chunk.
@@ -9,8 +9,8 @@ import javax.swing.text.Element;
// import javax.swing.text.View; // import javax.swing.text.View;
/** /**
* Replacement for the old <code>WrappedSyntaxView</code> class, designed to * Replacement for the old <code>WrappedSyntaxView</code> class, designed to be
* be faster with large wrapped documents. Heavily based off of * faster with large wrapped documents. Heavily based off of
* <code>BoxView</code>, but streamlined to only care about the y-axis, and * <code>BoxView</code>, but streamlined to only care about the y-axis, and
* takes code folding into account. * takes code folding into account.
* <p> * <p>
@@ -33,8 +33,8 @@ import javax.swing.event.MouseInputAdapter;
import org.fife.ui.rsyntaxtextarea.PopupWindowDecorator; import org.fife.ui.rsyntaxtextarea.PopupWindowDecorator;
/** /**
* A focusable tool tip, similar to those found in Eclipse. The user * A focusable tool tip, similar to those found in Eclipse. The user can click
* can click in the tip and it becomes a "real," resizable window. * in the tip and it becomes a "real," resizable window.
* *
* @author Robert Futrell * @author Robert Futrell
* @version 1.0 * @version 1.0
@@ -49,8 +49,8 @@ public class FocusableTip {
private String lastText; private String lastText;
private Dimension maxSize; // null to automatic. private Dimension maxSize; // null to automatic.
/** /**
* The screen bounds in which the mouse has to stay for the currently * The screen bounds in which the mouse has to stay for the currently displayed
* displayed tip to stay visible. * tip to stay visible.
*/ */
private Rectangle tipVisibleBounds; private Rectangle tipVisibleBounds;
/** /**
@@ -61,7 +61,8 @@ public class FocusableTip {
* Margin from mouse cursor at which to draw focusable tip. * Margin from mouse cursor at which to draw focusable tip.
*/ */
private static final int Y_MARGIN = 12; private static final int Y_MARGIN = 12;
private static final ResourceBundle MSG = ResourceBundle.getBundle("org.fife.ui.rsyntaxtextarea.focusabletip.FocusableTip"); private static final ResourceBundle MSG = ResourceBundle
.getBundle("org.fife.ui.rsyntaxtextarea.focusabletip.FocusableTip");
public FocusableTip(JTextArea textArea, HyperlinkListener listener) { public FocusableTip(JTextArea textArea, HyperlinkListener listener) {
setTextArea(textArea); setTextArea(textArea);
@@ -71,8 +72,8 @@ public class FocusableTip {
} }
/** /**
* Compute the bounds in which the user can move the mouse without the * Compute the bounds in which the user can move the mouse without the tip
* tip window disappearing. * window disappearing.
*/ */
private void computeTipVisibleBounds() { private void computeTipVisibleBounds() {
// Compute area that the mouse can move in without hiding the // Compute area that the mouse can move in without hiding the
@@ -173,8 +174,7 @@ public class FocusableTip {
/** /**
* Returns localized text for the given key. * Returns localized text for the given key.
* *
* @param key * @param key The key into the resource bundle.
* The key into the resource bundle.
* @return The localized text. * @return The localized text.
*/ */
static String getString(String key) { static String getString(String key) {
@@ -203,8 +203,7 @@ public class FocusableTip {
/** /**
* Sets the base URL to use when loading images in this focusable tip. * Sets the base URL to use when loading images in this focusable tip.
* *
* @param url * @param url The base URL to use.
* The base URL to use.
* @see #getImageBase() * @see #getImageBase()
*/ */
public void setImageBase(URL url) { public void setImageBase(URL url) {
@@ -214,9 +213,8 @@ public class FocusableTip {
/** /**
* Sets the maximum size for unfocused tool tips. * Sets the maximum size for unfocused tool tips.
* *
* @param maxSize * @param maxSize The new maximum size. A value of <code>null</code> will cause
* The new maximum size. A value of <code>null</code> will * a default size to be used.
* cause a default size to be used.
* @see #getMaxSize() * @see #getMaxSize()
*/ */
public void setMaxSize(Dimension maxSize) { public void setMaxSize(Dimension maxSize) {
@@ -244,7 +242,8 @@ public class FocusableTip {
/** /**
* Listens for events in a text area. * Listens for events in a text area.
*/ */
private class TextAreaListener extends MouseInputAdapter implements CaretListener, ComponentListener, FocusListener, KeyListener { private class TextAreaListener extends MouseInputAdapter
implements CaretListener, ComponentListener, FocusListener, KeyListener {
@Override @Override
public void caretUpdate(CaretEvent e) { public void caretUpdate(CaretEvent e) {
@@ -275,7 +274,8 @@ public class FocusableTip {
} }
@Override @Override
public void focusGained(FocusEvent e) {} public void focusGained(FocusEvent e) {
}
@Override @Override
public void focusLost(FocusEvent e) { public void focusLost(FocusEvent e) {
@@ -284,7 +284,8 @@ public class FocusableTip {
// calling SwingUtilities.getWindowAncestor() to guard against an // calling SwingUtilities.getWindowAncestor() to guard against an
// NPE. // NPE.
Component c = e.getOppositeComponent(); Component c = e.getOppositeComponent();
boolean tipClicked = (c instanceof TipWindow) || (c != null && SwingUtilities.getWindowAncestor(c) instanceof TipWindow); boolean tipClicked = (c instanceof TipWindow)
|| (c != null && SwingUtilities.getWindowAncestor(c) instanceof TipWindow);
if (!tipClicked) { if (!tipClicked) {
possiblyDisposeOfTipWindow(); possiblyDisposeOfTipWindow();
} }
@@ -316,10 +317,12 @@ public class FocusableTip {
} }
@Override @Override
public void keyReleased(KeyEvent e) {} public void keyReleased(KeyEvent e) {
}
@Override @Override
public void keyTyped(KeyEvent e) {} public void keyTyped(KeyEvent e) {
}
@Override @Override
public void mouseExited(MouseEvent e) { public void mouseExited(MouseEvent e) {
@@ -31,15 +31,15 @@ import org.fife.ui.rsyntaxtextarea.RSyntaxUtilities;
*/ */
public final class TipUtil { public final class TipUtil {
private TipUtil() {} private TipUtil() {
}
/** /**
* Returns a hex string for the specified color, suitable for HTML. * Returns a hex string for the specified color, suitable for HTML.
* *
* @param c * @param c The color.
* The color. * @return The string representation, in the form "<code>#rrggbb</code>", or
* @return The string representation, in the form "<code>#rrggbb</code>", * <code>null</code> if <code>c</code> is <code>null</code>.
* or <code>null</code> if <code>c</code> is <code>null</code>.
*/ */
private static String getHexString(Color c) { private static String getHexString(Color c) {
if (c == null) { if (c == null) {
@@ -65,14 +65,12 @@ public final class TipUtil {
} }
/** /**
* Returns the screen coordinates for the monitor that contains the * Returns the screen coordinates for the monitor that contains the specified
* specified point. This is useful for setups with multiple monitors, * point. This is useful for setups with multiple monitors, to ensure that popup
* to ensure that popup windows are positioned properly. * windows are positioned properly.
* *
* @param x * @param x The x-coordinate, in screen coordinates.
* The x-coordinate, in screen coordinates. * @param y The y-coordinate, in screen coordinates.
* @param y
* The y-coordinate, in screen coordinates.
* @return The bounds of the monitor that contains the specified point. * @return The bounds of the monitor that contains the specified point.
*/ */
public static Rectangle getScreenBoundsForPoint(int x, int y) { public static Rectangle getScreenBoundsForPoint(int x, int y) {
@@ -131,12 +129,11 @@ public final class TipUtil {
} }
/** /**
* Returns whether a color is a Nimbus DerivedColor, which is troublesome * Returns whether a color is a Nimbus DerivedColor, which is troublesome in
* in that it doesn't use its RGB values (uses HSB instead?) and so * that it doesn't use its RGB values (uses HSB instead?) and so querying them
* querying them is useless. * is useless.
* *
* @param c * @param c The color to check.
* The color to check.
* @return Whether it is a DerivedColor * @return Whether it is a DerivedColor
*/ */
private static boolean isDerivedColor(Color c) { private static boolean isDerivedColor(Color c) {
@@ -153,12 +150,11 @@ public final class TipUtil {
} }
/** /**
* Tweaks a <code>JEditorPane</code> so it can be used to render the * Tweaks a <code>JEditorPane</code> so it can be used to render the content in
* content in a focusable pseudo-tool tip. It is assumed that the editor * a focusable pseudo-tool tip. It is assumed that the editor pane is using an
* pane is using an <code>HTMLDocument</code>. * <code>HTMLDocument</code>.
* *
* @param textArea * @param textArea The editor pane to tweak.
* The editor pane to tweak.
*/ */
public static void tweakTipEditorPane(JEditorPane textArea) { public static void tweakTipEditorPane(JEditorPane textArea) {
// Jump through a few hoops to get things looking nice in Nimbus // Jump through a few hoops to get things looking nice in Nimbus
@@ -200,19 +196,16 @@ public final class TipUtil {
} }
/** /**
* Sets the default font for an HTML document (e.g., in a tool tip * Sets the default font for an HTML document (e.g., in a tool tip displaying
* displaying HTML). This is here because when rendering HTML, * HTML). This is here because when rendering HTML, {@code setFont()} is not
* {@code setFont()} is not honored. * honored.
* *
* @param doc * @param doc The document to modify.
* The document to modify. * @param font The font to use.
* @param font * @param fg The default foreground color.
* The font to use.
* @param fg
* The default foreground color.
*/ */
public static void setFont(HTMLDocument doc, Font font, Color fg) { public static void setFont(HTMLDocument doc, Font font, Color fg) {
doc.getStyleSheet().addRule("body { font-family: " + font.getFamily() + "; font-size: " + font.getSize() + "pt" + "; color: " doc.getStyleSheet().addRule("body { font-family: " + font.getFamily() + "; font-size: " + font.getSize() + "pt"
+ getHexString(fg) + "; }"); + "; color: " + getHexString(fg) + "; }");
} }
} }
Loaded 100 of 204 files, more files were not shown because too many files have changed in this diff. Show more