[autocomplete] 16/143: Adding ToolTipSupplier to RTextArea so hosting apps can supply tooltips without subclassing RSTA. AutoComplete has optional support for this through CCompletionProvider (to be expanded on later). Fixed recently-broken hyperlinks in description autocomplete window. Made command+c the copy shortcut for the description window on OS X.

Benjamin Mesing ben at alioth.debian.org
Sat Oct 19 12:53:10 UTC 2013


This is an automated email from the git hooks/post-receive script.

ben pushed a commit to branch master
in repository autocomplete.

commit 2cc629346a5f5b17a362c43b9351fa66015a51bd
Author: bobbylight <robert at fifesoft.com>
Date:   Thu Feb 5 21:31:20 2009 +0000

    Adding ToolTipSupplier to RTextArea so hosting apps can supply tooltips without subclassing RSTA.  AutoComplete has optional support for this through CCompletionProvider (to be expanded on later).  Fixed recently-broken hyperlinks in description autocomplete window.  Made command+c the copy shortcut for the description window on OS X.
---
 .../fife/ui/autocomplete/AbstractCompletion.java   |   11 +
 .../autocomplete/AbstractCompletionProvider.java   |    8 +-
 .../ui/autocomplete/AutoCompleteDescWindow.java    |    2 +-
 .../ui/autocomplete/AutoCompletePopupWindow.java   |   22 +-
 src/org/fife/ui/autocomplete/AutoCompletion.java   |    2 +-
 .../fife/ui/autocomplete/CCompletionProvider.java  |   61 ++++-
 src/org/fife/ui/autocomplete/Completion.java       |   21 ++
 .../fife/ui/autocomplete/CompletionProvider.java   |   17 +-
 .../ui/autocomplete/DefaultCompletionProvider.java |   76 +++++-
 .../fife/ui/autocomplete/FunctionCompletion.java   |   23 ++
 .../ui/autocomplete/JarCompletionProvider.java     |  282 --------------------
 .../fife/ui/autocomplete/VariableCompletion.java   |   32 ++-
 12 files changed, 253 insertions(+), 304 deletions(-)

diff --git a/src/org/fife/ui/autocomplete/AbstractCompletion.java b/src/org/fife/ui/autocomplete/AbstractCompletion.java
index 4faf659..7a9d36c 100644
--- a/src/org/fife/ui/autocomplete/AbstractCompletion.java
+++ b/src/org/fife/ui/autocomplete/AbstractCompletion.java
@@ -108,6 +108,17 @@ public abstract class AbstractCompletion implements Completion, Comparable {
 
 
 	/**
+	 * The default implementation returns <code>null</code>.  Subclasses
+	 * can override this method.
+	 *
+	 * @return The tool tip text.
+	 */
+	public String getToolTipText() {
+		return null;
+	}
+
+
+	/**
 	 * Returns a string representation of this completion.  The default
 	 * implementation returns {@link #getInputText()}.
 	 *
diff --git a/src/org/fife/ui/autocomplete/AbstractCompletionProvider.java b/src/org/fife/ui/autocomplete/AbstractCompletionProvider.java
index 1113b50..24b098e 100644
--- a/src/org/fife/ui/autocomplete/AbstractCompletionProvider.java
+++ b/src/org/fife/ui/autocomplete/AbstractCompletionProvider.java
@@ -49,9 +49,9 @@ public abstract class AbstractCompletionProvider
 	protected List completions;
 
 	/**
-	 * The case-insensitive {@link Completion} comparator.
+	 * Compares a {@link Completion} against a String.
 	 */
-	private Comparator comparator;
+	protected Comparator comparator;
 
 
 	/**
@@ -246,8 +246,8 @@ public abstract class AbstractCompletionProvider
 
 
 	/**
-	 * A comparator that compares the input text of two {@link Completion}s
-	 * lexicographically, ignoring case.
+	 * A comparator that compares the input text of a {@link Completion}
+	 * against a String lexicographically, ignoring case.
 	 *
 	 * @author Robert Futrell
 	 * @version 1.0
diff --git a/src/org/fife/ui/autocomplete/AutoCompleteDescWindow.java b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow.java
index dfed8c5..022a7fa 100644
--- a/src/org/fife/ui/autocomplete/AutoCompleteDescWindow.java
+++ b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow.java
@@ -367,7 +367,7 @@ class AutoCompleteDescWindow extends JWindow implements HyperlinkListener {
 			descArea.setSelectionColor(selBG);
 		}
 
-//		descArea.setEditable(false);
+		descArea.setEditable(false); // Required for links to work!
 
 		// Make selection visible even though we are not focusable.
 		descArea.getCaret().setSelectionVisible(true);
diff --git a/src/org/fife/ui/autocomplete/AutoCompletePopupWindow.java b/src/org/fife/ui/autocomplete/AutoCompletePopupWindow.java
index f96284c..09e2c80 100644
--- a/src/org/fife/ui/autocomplete/AutoCompletePopupWindow.java
+++ b/src/org/fife/ui/autocomplete/AutoCompletePopupWindow.java
@@ -26,9 +26,9 @@ package org.fife.ui.autocomplete;
 import java.awt.BorderLayout;
 import java.awt.Dimension;
 import java.awt.Rectangle;
+import java.awt.Toolkit;
 import java.awt.Window;
 import java.awt.event.ActionEvent;
-import java.awt.event.InputEvent;
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseListener;
@@ -132,7 +132,7 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener,
 		super(parent);
 
 		this.ac = ac;
-		model = new CompletionListModel();//DefaultListModel();
+		model = new CompletionListModel();
 		list = new JList(model);
 		list.setCellRenderer(new DelegatingCellRenderer());
 		list.addListSelectionListener(this);
@@ -242,6 +242,18 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener,
 
 
 	/**
+	 * Returns the copy keystroke to use for this platform.
+	 *
+	 * @return The copy keystroke.
+	 */
+	private static final KeyStroke getCopyKeyStroke() {
+		int key = KeyEvent.VK_C;
+		int mask = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
+		return KeyStroke.getKeyStroke(key, mask);
+	}
+
+
+	/**
 	 * Returns the default list cell renderer used when a completion provider
 	 * does not supply its own.
 	 *
@@ -314,8 +326,7 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener,
 		// Make Ctrl+C copy from description window.  This isn't done
 		// automagically because the desc. window is not focusable, and copying
 		// from text components can only be done from focused components.
-		int key = KeyEvent.VK_C;
-		KeyStroke ks = KeyStroke.getKeyStroke(key, InputEvent.CTRL_MASK);
+		KeyStroke ks = getCopyKeyStroke();
 		oldCtrlC.key = im.get(ks);
 		im.put(ks, ctrlCKap.key);
 		oldCtrlC.action = am.get(ctrlCKap.key);
@@ -668,8 +679,7 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener,
 		putBackAction(im, am, KeyEvent.VK_PAGE_DOWN, oldPageDown);
 
 		// Ctrl+C
-		int key = KeyEvent.VK_C;
-		KeyStroke ks = KeyStroke.getKeyStroke(key, InputEvent.CTRL_MASK);
+		KeyStroke ks = getCopyKeyStroke();
 		am.put(im.get(ks), oldCtrlC.action); // Original action
 		im.put(ks, oldCtrlC.key); // Original key
 
diff --git a/src/org/fife/ui/autocomplete/AutoCompletion.java b/src/org/fife/ui/autocomplete/AutoCompletion.java
index a36bce8..cc2802c 100644
--- a/src/org/fife/ui/autocomplete/AutoCompletion.java
+++ b/src/org/fife/ui/autocomplete/AutoCompletion.java
@@ -941,7 +941,7 @@ try {
 				return;
 			}
 			List completions = provider.
-								getParameterizedCompletionsAt(textComponent);
+								getParameterizedCompletions(textComponent);
 			if (completions!=null && completions.size()>0) {
 				// TODO: Have tooltip let you select between multiple, like VS
 				ParameterizedCompletion pc =
diff --git a/src/org/fife/ui/autocomplete/CCompletionProvider.java b/src/org/fife/ui/autocomplete/CCompletionProvider.java
index 4821122..a237a22 100644
--- a/src/org/fife/ui/autocomplete/CCompletionProvider.java
+++ b/src/org/fife/ui/autocomplete/CCompletionProvider.java
@@ -23,6 +23,8 @@
  */
 package org.fife.ui.autocomplete;
 
+import java.awt.Point;
+import java.awt.event.MouseEvent;
 import java.util.ArrayList;
 import java.util.List;
 import javax.swing.text.JTextComponent;
@@ -31,6 +33,8 @@ import org.fife.ui.rsyntaxtextarea.RSyntaxDocument;
 import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
 import org.fife.ui.rsyntaxtextarea.RSyntaxUtilities;
 import org.fife.ui.rsyntaxtextarea.Token;
+import org.fife.ui.rtextarea.RTextArea;
+import org.fife.ui.rtextarea.ToolTipSupplier;
 
 
 /**
@@ -39,19 +43,28 @@ import org.fife.ui.rsyntaxtextarea.Token;
  * depending on whether the caret is in:
  * 
  * <ul>
+ *    <li>Code (plain text)</li>
  *    <li>A string</li>
  *    <li>A comment</li>
  *    <li>A documentation comment</li>
- *    <li>Plain text</li>
  * </ul>
  *
  * This allows for different completion choices in comments than  in code,
- * for example.
+ * for example.<p>
+ *
+ * This provider also implements the
+ * <tt>org.fife.ui.rtextarea.ToolTipSupplier</tt> interface, which allows it
+ * to display tooltips for completion choices.  Thus the standard
+ * {@link VariableCompletion} and {@link FunctionCompletion} completions should
+ * be able to display tooltips with the variable declaration or function
+ * definition (provided the <tt>RSyntaxTextArea</tt> was registered with the
+ * <tt>javax.swing.ToolTipManager</tt>).
  *
  * @author Robert Futrell
  * @version 1.0
  */
-public class CCompletionProvider extends CompletionProviderBase {
+public class CCompletionProvider extends CompletionProviderBase
+								implements ToolTipSupplier {
 
 	/**
 	 * The provider to use when no provider is assigned to a particular token
@@ -124,6 +137,14 @@ public class CCompletionProvider extends CompletionProviderBase {
 
 
 	/**
+	 * {@inheritDoc}
+	 */
+	public List getCompletionsAt(JTextComponent tc, Point p) {
+		return defaultProvider==null ? null :
+				defaultProvider.getCompletionsAt(tc, p);
+	}
+
+	/**
 	 * Does the dirty work of creating a list of completions.
 	 *
 	 * @param comp The text component to look in.
@@ -166,13 +187,13 @@ public class CCompletionProvider extends CompletionProviderBase {
 	/**
 	 * {@inheritDoc}
 	 */
-	public List getParameterizedCompletionsAt(JTextComponent tc) {
+	public List getParameterizedCompletions(JTextComponent tc) {
 		// Parameterized completions can only come from the "code" completion
 		// provider.  We do not do function/method completions while editing
 		// strings or comments.
 		CompletionProvider provider = getProviderFor(tc);
 		return provider==defaultProvider ?
-				provider.getParameterizedCompletionsAt(tc) : null;
+				provider.getParameterizedCompletions(tc) : null;
 	}
 
 
@@ -350,4 +371,34 @@ public class CCompletionProvider extends CompletionProviderBase {
 	}
 
 
+	/**
+	 * Returns the tool tip to display for a mouse event.<p>
+	 *
+	 * For this method to be called, the <tt>RSyntaxTextArea</tt> must be
+	 * registered with the <tt>javax.swing.ToolTipManager</tt> like so:
+	 * 
+	 * <pre>
+	 * ToolTipManager.sharedInstance().registerComponent(textArea);
+	 * </pre>
+	 *
+	 * @param textArea The text area.
+	 * @param e The mouse event.
+	 * @return The tool tip text, or <code>null</code> if none.
+	 */
+	public String getToolTipText(RTextArea textArea, MouseEvent e) {
+
+		String tip = null;
+
+		List completions = getCompletionsAt(textArea, e.getPoint());
+		if (completions!=null && completions.size()>0) {
+			// Only ever 1 match for us in C...
+			Completion c = (Completion)completions.get(0);
+			tip = c.getToolTipText();
+		}
+
+		return tip;
+
+	}
+
+
 }
\ No newline at end of file
diff --git a/src/org/fife/ui/autocomplete/Completion.java b/src/org/fife/ui/autocomplete/Completion.java
index b912ede..a5b9eb8 100644
--- a/src/org/fife/ui/autocomplete/Completion.java
+++ b/src/org/fife/ui/autocomplete/Completion.java
@@ -41,6 +41,8 @@ import javax.swing.text.JTextComponent;
  *       completion list.  This may be <code>null</code>.  It may also be
  *       lazily generated to cut down on memory usage.
  *   <li>The <tt>CompletionProvider</tt> that returned this completion.
+ *   <li>Tool tip text that can be displayed when a mouse hovers over this
+ *       completion in a text component.
  * </ul>
  *
  * @author Robert Futrell
@@ -107,4 +109,23 @@ public interface Completion {
 	public String getSummary();
 
 
+	/**
+	 * Returns the tool tip text to display for mouse hovers over this
+	 * completion.<p>
+	 *
+	 * Note that for this functionality to be enabled, a
+	 * <tt>JTextComponent</tt> must be registered with the
+	 * <tt>ToolTipManager</tt>, and the text component must know to search
+	 * for this value.  In the case of an
+	 * <a href="http://fifesoft.com/rsyntaxtextarea">RSyntaxTextArea</a>, this
+	 * can be done with a <tt>org.fife.ui.rtextarea.ToolTipSupplier</tt> that
+	 * calls into
+	 * {@link CompletionProvider#getCompletionsAt(JTextComponent, java.awt.Point)}.
+	 *
+	 * @return The tool tip text for this completion, or <code>null</code> if
+	 *         none.
+	 */
+	public String getToolTipText();
+
+
 }
\ No newline at end of file
diff --git a/src/org/fife/ui/autocomplete/CompletionProvider.java b/src/org/fife/ui/autocomplete/CompletionProvider.java
index db9a9b4..0e9d69b 100644
--- a/src/org/fife/ui/autocomplete/CompletionProvider.java
+++ b/src/org/fife/ui/autocomplete/CompletionProvider.java
@@ -23,6 +23,7 @@
  */
 package org.fife.ui.autocomplete;
 
+import java.awt.Point;
 import java.util.List;
 
 import javax.swing.ListCellRenderer;
@@ -68,12 +69,24 @@ public interface CompletionProvider {
 	 *
 	 * @param comp The text component.
 	 * @return The list of {@link Completion}s.  If no completions are
-	 *         available, an empty list is returned.
+	 *         available, this may be <code>null</code>.
 	 */
 	public List getCompletions(JTextComponent comp);
 
 
 	/**
+	 * Returns the completions that have been entered at the specified visual
+	 * location.  This can be used for tool tips when the user hovers the
+	 * mouse over completed text.
+	 * 
+	 * @param comp The text component.
+	 * @param p The position, usually from a <tt>MouseEvent</tt>.
+	 * @return The completions, or an empty list if there are none.
+	 */
+	public List getCompletionsAt(JTextComponent comp, Point p);
+
+
+	/**
 	 * Returns the cell renderer for completions returned from this provider.
 	 *
 	 * @return The cell renderer, or <code>null</code> if the default should
@@ -92,7 +105,7 @@ public interface CompletionProvider {
 	 * @return The list of {@link ParameterizedCompletion}s.  If no completions
 	 *         are available, this may be <code>null</code>.
 	 */
-	public List getParameterizedCompletionsAt(JTextComponent tc);
+	public List getParameterizedCompletions(JTextComponent tc);
 
 
 	/**
diff --git a/src/org/fife/ui/autocomplete/DefaultCompletionProvider.java b/src/org/fife/ui/autocomplete/DefaultCompletionProvider.java
index f3c8319..62dc1e5 100644
--- a/src/org/fife/ui/autocomplete/DefaultCompletionProvider.java
+++ b/src/org/fife/ui/autocomplete/DefaultCompletionProvider.java
@@ -22,6 +22,7 @@
  */
 package org.fife.ui.autocomplete;
 
+import java.awt.Point;
 import java.io.BufferedInputStream;
 import java.io.File;
 import java.io.FileInputStream;
@@ -53,6 +54,19 @@ public class DefaultCompletionProvider extends AbstractCompletionProvider {
 
 	protected Segment seg;
 
+	/**
+	 * Used to speed up {@link #getCompletionsAt(JTextComponent, Point)}.
+	 */
+	private String lastCompletionsAtText;
+
+	/**
+	 * Used to speed up {@link #getCompletionsAt(JTextComponent, Point)},
+	 * since this may be called multiple times in succession (this is usually
+	 * called by <tt>JTextComponent.getToolTipText()</tt>, and if the user
+	 * wiggles the mouse while a tool tip is displayed, this method gets
+	 * repeatedly called.  It can be costly so we try to speed it up a tad).
+	 */
+	private List lastParameterizedCompletionsAt;
 
 	/**
 	 * Constructor.  The returned provider will not be aware of any completions.
@@ -121,7 +135,67 @@ public class DefaultCompletionProvider extends AbstractCompletionProvider {
 	/**
 	 * {@inheritDoc}
 	 */
-	public List getParameterizedCompletionsAt(JTextComponent tc) {
+	public List getCompletionsAt(JTextComponent tc, Point p) {
+
+		int offset = tc.viewToModel(p);
+		if (offset<0 || offset>=tc.getDocument().getLength()) {
+			lastCompletionsAtText = null;
+			return lastParameterizedCompletionsAt = null;
+		}
+
+		Segment s = new Segment();
+		Document doc = tc.getDocument();
+		Element root = doc.getDefaultRootElement();
+		int line = root.getElementIndex(offset);
+		Element elem = root.getElement(line);
+		int start = elem.getStartOffset();
+		int end = elem.getEndOffset() - 1;
+
+		try {
+
+			doc.getText(start, end-start, s);
+
+			// Get the valid chars before the specified offset.
+			int startOffs = s.offset + (offset-start) - 1;
+			while (startOffs>=s.offset && isValidChar(s.array[startOffs])) {
+				startOffs--;
+			}
+
+			// Get the valid chars at and after the specified offset.
+			int endOffs = s.offset;
+			while (endOffs<s.offset+s.count && isValidChar(s.array[endOffs])) {
+				endOffs++;
+			}
+
+			int len = endOffs - startOffs - 1;
+			if (len<=0) {
+				return lastParameterizedCompletionsAt = null;
+			}
+			String text = new String(s.array, startOffs+1, len);
+
+			if (text.equals(lastCompletionsAtText)) {
+				return lastParameterizedCompletionsAt;
+			}
+
+			// Get a list of all Completions matching the text.
+			List list = getCompletionByInputText(text);
+			lastCompletionsAtText = text;
+			return lastParameterizedCompletionsAt = list;
+
+		} catch (BadLocationException ble) {
+			ble.printStackTrace(); // Never happens
+		}
+
+		lastCompletionsAtText = null;
+		return lastParameterizedCompletionsAt = null;
+
+	}
+
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public List getParameterizedCompletions(JTextComponent tc) {
 
 		List list = null;
 
diff --git a/src/org/fife/ui/autocomplete/FunctionCompletion.java b/src/org/fife/ui/autocomplete/FunctionCompletion.java
index c911a33..25cfd71 100644
--- a/src/org/fife/ui/autocomplete/FunctionCompletion.java
+++ b/src/org/fife/ui/autocomplete/FunctionCompletion.java
@@ -25,6 +25,8 @@ package org.fife.ui.autocomplete;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.swing.text.JTextComponent;
+
 
 /**
  * A completion choice representing a function.
@@ -198,6 +200,27 @@ public class FunctionCompletion extends VariableCompletion
 
 
 	/**
+	 * Returns the tool tip text to display for mouse hovers over this
+	 * completion.<p>
+	 *
+	 * Note that for this functionality to be enabled, a
+	 * <tt>JTextComponent</tt> must be registered with the
+	 * <tt>ToolTipManager</tt>, and the text component must know to search
+	 * for this value.  In the case of an
+	 * <a href="http://fifesoft.com/rsyntaxtextarea">RSyntaxTextArea</a>, this
+	 * can be done with a <tt>org.fife.ui.rtextarea.ToolTipSupplier</tt> that
+	 * calls into
+	 * {@link CompletionProvider#getCompletionsAt(JTextComponent, java.awt.Point)}.
+	 *
+	 * @return The tool tip text for this completion, or <code>null</code> if
+	 *         none.
+	 */
+	public String getToolTipText() {
+		return getDefinitionString();
+	}
+
+
+	/**
 	 * Sets the parameters to this function.
 	 *
 	 * @param params The parameters.  This should be a list of
diff --git a/src/org/fife/ui/autocomplete/JarCompletionProvider.java b/src/org/fife/ui/autocomplete/JarCompletionProvider.java
deleted file mode 100644
index b6a0839..0000000
--- a/src/org/fife/ui/autocomplete/JarCompletionProvider.java
+++ /dev/null
@@ -1,282 +0,0 @@
-package org.fife.ui.autocomplete;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.SortedMap;
-import java.util.TreeMap;
-import java.util.jar.JarFile;
-import java.util.zip.ZipEntry;
-import javax.swing.text.BadLocationException;
-import javax.swing.text.Document;
-import javax.swing.text.Element;
-import javax.swing.text.JTextComponent;
-import javax.swing.text.Segment;
-
-
-/**
- * The beginnings of a provider that uses reflection to offer completions for
- * all classes in a jar.<p>
- *
- * This class is unfinished and should not be used.
- *
- * @author Robert Futrell
- * @version 1.0
- */
-public class JarCompletionProvider extends AbstractCompletionProvider {
-
-	private Segment seg;
-	private boolean loaded;
-	private TreeMap packageSet;
-
-
-	public JarCompletionProvider() {
-		seg = new Segment();
-		completions = new ArrayList(0);
-		packageSet = new TreeMap();
-	}
-
-
-	public String getAlreadyEnteredText(JTextComponent comp) {
-
-		Document doc = comp.getDocument();
-
-		int dot = comp.getCaretPosition();
-		Element root = doc.getDefaultRootElement();
-		int index = root.getElementIndex(dot);
-		Element elem = root.getElement(index);
-		int start = elem.getStartOffset();
-		int len = dot-start;
-		try {
-			doc.getText(start, len, seg);
-		} catch (BadLocationException ble) {
-			ble.printStackTrace();
-			return EMPTY_STRING;
-		}
-
-		int segEnd = seg.offset + len;
-		start = segEnd - 1;
-		while (start>=seg.offset && isValidChar(seg.array[start])) {
-			start--;
-		}
-		start++;
-
-		len = segEnd - start;
-		return len==0 ? EMPTY_STRING : new String(seg.array, start, len);
-
-	}
-
-
-	private String getAlreadyEnteredText2(JTextComponent comp) {
-
-		Document doc = comp.getDocument();
-
-		int dot = comp.getCaretPosition();
-		Element root = doc.getDefaultRootElement();
-		int index = root.getElementIndex(dot);
-		Element elem = root.getElement(index);
-		int start = elem.getStartOffset();
-		int len = dot-start;
-		try {
-			doc.getText(start, len, seg);
-		} catch (BadLocationException ble) {
-			ble.printStackTrace();
-			return EMPTY_STRING;
-		}
-
-		int segEnd = seg.offset + len;
-		start = segEnd - 1;
-		while (start>=seg.offset && isValidChar2(seg.array[start])) {
-			start--;
-		}
-		start++;
-
-		len = segEnd - start;
-		return len==0 ? EMPTY_STRING : new String(seg.array, start, len);
-
-	}
-
-
-	/**
-	 * Does the dirty work of creating a list of completions.
-	 *
-	 * @param comp The text component to look in.
-	 * @return The list of possible completions, or an empty list if there
-	 *         are none.
-	 */
-	protected List getCompletionsImpl(JTextComponent comp) {
-
-		if (!loaded) {
-			loadCompletions();
-		}
-
-		List retVal = new ArrayList();
-
-		String text2 = getAlreadyEnteredText2(comp);
-		String[] pkgNames = splitOnChar(text2, '.');
-
-		TreeMap map = packageSet;
-		for (int i=0; i<pkgNames.length-1; i++) {
-
-			Object obj = map.get(pkgNames[i]);
-
-			if (obj==null) {
-				return retVal; // empty
-			}
-
-			if (obj instanceof TreeMap) {
-				map = (TreeMap)obj;
-			}
-			else {
-				return retVal; // Will be empty
-			}
-
-		}
-
-		String fromKey = pkgNames[pkgNames.length-1];
-		String toKey = fromKey + '{'; // Ascii char > largest valid class char
-		SortedMap sm = map.subMap(fromKey, toKey);
-
-		for (Iterator i=sm.keySet().iterator(); i.hasNext(); ) {
-			Object obj = i.next();
-			retVal.add(new BasicCompletion(this, obj.toString()));
-		}
-
-		return retVal;
-
-	}
-
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public List getParameterizedCompletionsAt(JTextComponent tc) {
-		return null; // This provider knows no functions or methods.
-	}
-
-
-	/**
-	 * Returns whether the specified character is valid in an auto-completion.
-	 *
-	 * @param ch The character.
-	 * @return Whether the character is valid.
-	 */
-	protected boolean isValidChar(char ch) {
-		return Character.isLetterOrDigit(ch) || ch=='_';
-	}
-
-
-	/**
-	 * Returns whether the specified character is valid in an auto-completion.
-	 *
-	 * @param ch The character.
-	 * @return Whether the character is valid.
-	 */
-	protected boolean isValidChar2(char ch) {
-		return Character.isLetterOrDigit(ch) || ch=='.' || ch=='_';
-	}
-
-
-	protected void loadCompletions() {
-
-		loaded = true;
-
-		String javaHome = System.getProperty("java.home");
-		//System.out.println(javaHome);
-		JarFile jar = null;
-		try {
-			jar = new JarFile(new File(javaHome, "lib/rt.jar"));
-		} catch (Exception e) {
-			e.printStackTrace();
-			return;
-		}
-
-		java.util.Enumeration e = jar.entries();
-		while (e.hasMoreElements()) {
-			ZipEntry entry = (ZipEntry)e.nextElement();
-			String entryName = entry.getName();
-			if (entryName.endsWith(".class")) {
-				entryName = entryName.substring(0, entryName.length()-6);
-				String[] items = splitOnChar(entryName, '/');
-				TreeMap m = packageSet;
-				for (int i=0; i<items.length-1; i++) {
-					TreeMap submap = (TreeMap)m.get(items[i]);
-					if (submap==null) {
-						submap = new TreeMap();
-						m.put(items[i], submap);
-					}
-					m = submap;
-				}
-				String className = items[items.length-1];
-				m.put(className, null);
-			}
-		}
-
-	}
-
-
-	/**
-	 * A faster way to split on a single char than String#split(), since
-	 * we'll be doing this in a tight loop possibly thousands of times (rt.jar).
-	 *
-	 * @param str The string to split.
-	 * @return The string, split on '<tt>/</tt>'.
-	 */
-	private String[] splitOnChar(String str, int ch) {
-		List list = new ArrayList(3);
-		int pos = 0;
-		int old = 0;
-		while ((pos=str.indexOf(ch, old))>-1) {
-			list.add(str.substring(old, pos));
-			old = pos+1;
-		}
-		// If str ends in ch, this adds an empty item to the end of the list.
-		// This is what we want.
-		list.add(str.substring(old));
-		String[] array = new String[list.size()];
-		return (String[])list.toArray(array);
-	}
-
-/*
-	private class ClassOrInterfaceCompletion extends AbstractCompletion {
-
-		private String replacementText;
-
-		public ClassOrInterfaceCompletion(String name) {
-			super(JarCompletionProvider.this);
-			this.replacementText = name;
-		}
-
-		public String getReplacementText() {
-			return replacementText;
-		}
-
-		public String getSummary() {
-			return null;
-		}
-		
-	}
-
-
-	private class PackageCompletion extends AbstractCompletion {
-
-		private String replacementText;
-
-		public PackageCompletion(String name) {
-			super(JarCompletionProvider.this);
-			this.replacementText = name;
-		}
-
-		public String getReplacementText() {
-			return replacementText;
-		}
-
-		public String getSummary() {
-			return null;
-		}
-		
-	}
-*/
-
-}
\ No newline at end of file
diff --git a/src/org/fife/ui/autocomplete/VariableCompletion.java b/src/org/fife/ui/autocomplete/VariableCompletion.java
index c3fa77f..20c5c65 100644
--- a/src/org/fife/ui/autocomplete/VariableCompletion.java
+++ b/src/org/fife/ui/autocomplete/VariableCompletion.java
@@ -22,6 +22,8 @@
  */
 package org.fife.ui.autocomplete;
 
+import javax.swing.text.JTextComponent;
+
 
 /**
  * A completion for a variable (or constant) in a programming language.<p>
@@ -64,8 +66,13 @@ public class VariableCompletion extends BasicCompletion {
 
 
 	protected void addDefinitionString(StringBuffer sb) {
+		sb.append("<html><b>").append(getDefinitionString()).append("</b>");
+	}
 
-		sb.append("<html><b>");
+
+	public String getDefinitionString() {
+
+		StringBuffer sb = new StringBuffer();
 
 		// Add the return type if applicable (C macros like NULL have no type).
 		if (type!=null) {
@@ -75,7 +82,7 @@ public class VariableCompletion extends BasicCompletion {
 		// Add the item being described's name.
 		sb.append(getName());
 
-		sb.append("</b>");
+		return sb.toString();
 
 	}
 
@@ -114,6 +121,27 @@ public class VariableCompletion extends BasicCompletion {
 
 
 	/**
+	 * Returns the tool tip text to display for mouse hovers over this
+	 * completion.<p>
+	 *
+	 * Note that for this functionality to be enabled, a
+	 * <tt>JTextComponent</tt> must be registered with the
+	 * <tt>ToolTipManager</tt>, and the text component must know to search
+	 * for this value.  In the case of an
+	 * <a href="http://fifesoft.com/rsyntaxtextarea">RSyntaxTextArea</a>, this
+	 * can be done with a <tt>org.fife.ui.rtextarea.ToolTipSupplier</tt> that
+	 * calls into
+	 * {@link CompletionProvider#getCompletionsAt(JTextComponent, java.awt.Point)}.
+	 *
+	 * @return The tool tip text for this completion, or <code>null</code> if
+	 *         none.
+	 */
+	public String getToolTipText() {
+		return getDefinitionString();
+	}
+
+
+	/**
 	 * Returns the type of this variable.
 	 *
 	 * @return The type.

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/autocomplete.git



More information about the pkg-java-commits mailing list