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

ben pushed a commit to branch master
in repository autocomplete.

commit eb0012afb95483c5241cb8c286ae1bc6777726d7
Author: bobbylight <[email protected]>
Date:   Sat Jan 10 22:34:57 2009 +0000

    Lots of work on parameter assistance.  Functions/methods can have 
descriptions of their return values.
---
 .../autocomplete/AbstractCompletionProvider.java   |  125 +++++++-------------
 .../ui/autocomplete/AutoCompleteDescWindow.java    |   11 +-
 src/org/fife/ui/autocomplete/AutoCompletion.java   |   74 ++++++++++--
 .../fife/ui/autocomplete/CCompletionProvider.java  |   79 +++++++++++--
 .../fife/ui/autocomplete/CompletionProvider.java   |   36 +++++-
 .../ui/autocomplete/CompletionProviderBase.java    |   86 ++++++++++++++
 .../fife/ui/autocomplete/CompletionXMLParser.java  |   22 +++-
 .../ui/autocomplete/DefaultCompletionProvider.java |   29 +++--
 .../fife/ui/autocomplete/FunctionCompletion.java   |   38 +++++-
 .../ParameterizedCompletionDescriptionToolTip.java |  102 ++++++++++++----
 10 files changed, 459 insertions(+), 143 deletions(-)

diff --git a/src/org/fife/ui/autocomplete/AbstractCompletionProvider.java 
b/src/org/fife/ui/autocomplete/AbstractCompletionProvider.java
index 0e930ff..2ddc480 100644
--- a/src/org/fife/ui/autocomplete/AbstractCompletionProvider.java
+++ b/src/org/fife/ui/autocomplete/AbstractCompletionProvider.java
@@ -27,12 +27,7 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
-import javax.swing.ListCellRenderer;
-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;
 
 
 /**
@@ -44,12 +39,8 @@ import javax.swing.text.Segment;
  * @author Robert Futrell
  * @version 1.0
  */
-public abstract class AbstractCompletionProvider implements CompletionProvider 
{
-
-       /**
-        * The parent completion provider.
-        */
-       private CompletionProvider parent;
+public abstract class AbstractCompletionProvider
+                                                               extends 
CompletionProviderBase {
 
        /**
         * The completions this provider is aware of.  Subclasses should ensure
@@ -58,41 +49,33 @@ public abstract class AbstractCompletionProvider implements 
CompletionProvider {
        protected List completions;
 
        /**
-        * The renderer to use for completions from this provider.  If this is
-        * <code>null</code>, a default renderer is used.
-        */
-       private ListCellRenderer listCellRenderer;
-
-       /**
         * The case-insensitive {@link Completion} comparator.
         */
        private Comparator comparator;
 
        /**
-        * Text that marks the beginning of a parameter list, for example, "(".
+        * Text that marks the beginning of a parameter list, for example, '('.
         */
-       private String paramListStart;
+       private char paramListStart;
 
        /**
-        * Text that marks the end of a parameter list, for example, ")".
+        * Text that marks the end of a parameter list, for example, ')'.
         */
-       private String paramListEnd;
+       private char paramListEnd;
 
        /**
         * Text that separates items in a parameter list, for example, ", ".
         */
        private String paramListSeparator;
 
-       protected static final String EMPTY_STRING = "";
-
 
        /**
         * Constructor.
         */
        public AbstractCompletionProvider() {
                comparator = new CaseInsensitiveComparator();
-               paramListStart = "(";
-               paramListEnd = ")";
+               paramListStart = '(';
+               paramListEnd = ')';
                paramListSeparator = ", ";
        }
 
@@ -173,44 +156,47 @@ public abstract class AbstractCompletionProvider 
implements CompletionProvider {
 
 
        /**
-        * Returns the first <tt>Completion</tt> in this provider with the
-        * specified input text.
-        *
-        * @param inputText The input text to search for.
-        * @return The {@link Completion}, or <code>null</code> if there is no 
such
-        *         <tt>Completion</tt>.
+        * {@inheritDoc}
         */
-       public Completion getCompletionByInputText(String inputText) {
-               // TODO: Do a binary search for performance
-               for (int i=0; i<completions.size(); i++) {
-                       Completion c = (Completion)completions.get(i);
-                       if (c.getInputText().equals(inputText)) {
-                               return c;
-                       }
-               }
-               return null;
+       public void clearParameterizedCompletionParams() {
+               paramListEnd = paramListStart = 0;
+               paramListSeparator = null;
        }
 
 
        /**
-        * {@inheritDoc}
+        * Returns a list of <tt>Completion</tt>s in this provider with the
+        * specified input text.
+        *
+        * @param inputText The input text to search for.
+        * @return A list of {@link Completion}s, or <code>null</code> if there
+        *         are no matching <tt>Completion</tt>s.
         */
-       public final List getCompletions(JTextComponent comp) {
-               List completions = getCompletionsImpl(comp);
-               if (parent!=null) {
-                       completions.addAll(parent.getCompletions(comp));
-                       Collections.sort(completions);
+       public List getCompletionByInputText(String inputText) {
+
+               // Find any entry that matches this input text (there may be > 
1).
+               int end = Collections.binarySearch(completions, inputText, 
comparator);
+               if (end<0) {
+                       return null;
+               }
+
+               // There might be multiple entries with the same input text.
+               int start = end;
+               while (start>0 &&
+                               comparator.compare(completions.get(start-1), 
inputText)==0) {
+                       start--;
                }
-               return completions;
+               int count = completions.size();
+               while (++end<count &&
+                               comparator.compare(completions.get(end), 
inputText)==0);
+
+               return completions.subList(start, end); // (inclusive, 
exclusive)
+
        }
 
 
        /**
-        * 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.
+        * {@inheritDoc}
         */
        protected List getCompletionsImpl(JTextComponent comp) {
 
@@ -242,15 +228,7 @@ public abstract class AbstractCompletionProvider 
implements CompletionProvider {
        /**
         * {@inheritDoc}
         */
-       public ListCellRenderer getListCellRenderer() {
-               return listCellRenderer;
-       }
-
-
-       /**
-        * {@inheritDoc}
-        */
-       public String getParameterListEnd() {
+       public char getParameterListEnd() {
                return paramListEnd;
        }
 
@@ -266,20 +244,12 @@ public abstract class AbstractCompletionProvider 
implements CompletionProvider {
        /**
         * {@inheritDoc}
         */
-       public String getParameterListStart() {
+       public char getParameterListStart() {
                return paramListStart;
        }
 
 
        /**
-        * {@inheritDoc}
-        */
-       public CompletionProvider getParent() {
-               return parent;
-       }
-
-
-       /**
         * Removes the specified completion from this provider.  This method
         * will not remove completions from the parent provider, if there is 
one.
         *
@@ -304,16 +274,11 @@ public abstract class AbstractCompletionProvider 
implements CompletionProvider {
        /**
         * {@inheritDoc}
         */
-       public void setListCellRenderer(ListCellRenderer r) {
-               listCellRenderer = r;
-       }
-
-
-       /**
-        * {@inheritDoc}
-        */
-       public void setParent(CompletionProvider parent) {
-               this.parent = parent;
+       public void setParameterizedCompletionParams(char listStart,
+                                                                               
String separator, char listEnd) {
+               paramListStart = listStart;
+               paramListSeparator = separator;
+               paramListEnd = listEnd;
        }
 
 
diff --git a/src/org/fife/ui/autocomplete/AutoCompleteDescWindow.java 
b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow.java
index 2e30837..60b5794 100644
--- a/src/org/fife/ui/autocomplete/AutoCompleteDescWindow.java
+++ b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow.java
@@ -294,9 +294,16 @@ class AutoCompleteDescWindow extends JWindow implements 
HyperlinkListener {
                                CompletionProvider p = 
parent.getSelection().getProvider();
                                if (p instanceof AbstractCompletionProvider) {
                                        String name = e.getDescription();
-                                       Completion c = 
((AbstractCompletionProvider)p).
+                                       List l = 
((AbstractCompletionProvider)p).
                                                                                
getCompletionByInputText(name);
-                                       setDescriptionFor(c, true);
+                                       if (l!=null && !l.isEmpty()) {
+                                               // Just use the 1st one if 
there's more than 1
+                                               Completion c = 
(Completion)l.get(0);
+                                               setDescriptionFor(c, true);
+                                       }
+                                       else {
+                                               
UIManager.getLookAndFeel().provideErrorFeedback(descArea);
+                                       }
                                }
                        }
                }
diff --git a/src/org/fife/ui/autocomplete/AutoCompletion.java 
b/src/org/fife/ui/autocomplete/AutoCompletion.java
index a7d7ac9..2727327 100644
--- a/src/org/fife/ui/autocomplete/AutoCompletion.java
+++ b/src/org/fife/ui/autocomplete/AutoCompletion.java
@@ -33,6 +33,21 @@ import javax.swing.text.*;
  * Adds autocompletion to a text component.  Provides a popup window with a
  * list of autocomplete choices on a given keystroke, such as Crtrl+Space.<p>
  *
+ * Depending on the {@link CompletionProvider} installed, the following
+ * auto-completion features may be enabled:
+ * 
+ * <ul>
+ *    <li>An auto-complete choices list made visible via e.g. Ctrl+Space</li>
+ *    <li>A "description" window displayed alongside the choices list that
+ *        provides documentation on the currently selected completion choice
+ *        (as seen in Eclipse and NetBeans).</li>
+ *    <li>Parameter assistance.  If this is enabled, if the user enters a
+ *        "parameterized" completion, such as a method or a function, then
+ *        they will receive a tooltip describing the arguments they have to
+ *        enter to the completion.  Also, the arguments can be navigated via
+ *        tab and shift+tab (ala Eclipse and NetBeans).</li>
+ * </ul>
+ *
  * @author Robert Futrell
  * @version 1.0
  */
@@ -100,6 +115,11 @@ public class AutoCompletion implements HierarchyListener {
        private boolean autoCompleteSingleChoices;
 
        /**
+        * Whether parameter assistance is enabled.
+        */
+       private boolean parameterAssistanceEnabled;
+
+       /**
         * The keystroke that triggers the completion window.
         */
        private KeyStroke trigger;
@@ -161,8 +181,11 @@ public class AutoCompletion implements HierarchyListener {
                // Don't bother with a tooltip if there are no parameters.
                if (pc.getParamCount()==0) {
                        CompletionProvider p = pc.getProvider();
-                       
textComponent.replaceSelection(p.getParameterListStart() +
-                                                                       
p.getParameterListEnd());
+                       String text = 
Character.toString(p.getParameterListEnd());
+                       if (addParamListStart) {
+                               text = p.getParameterListStart() + text;
+                       }
+                       textComponent.replaceSelection(text);
                        return;
                }
 
@@ -381,12 +404,7 @@ public class AutoCompletion implements HierarchyListener {
                caret.setDot(start);
                caret.moveDot(dot);
                textComp.replaceSelection(replacement);
-
-               if (c instanceof ParameterizedCompletion) {
-                       ParameterizedCompletion pc = (ParameterizedCompletion)c;
-                       displayDescriptionToolTip(pc, true);
-               }
-/*
+               /*
                Document doc = textComp.getDocument();
 try {
                if (doc instanceof AbstractDocument) {
@@ -398,6 +416,13 @@ try {
                }
 } catch (javax.swing.text.BadLocationException ble) { ble.printStackTrace(); }
 */
+
+               if (isParameterAssistanceEnabled() &&
+                               (c instanceof ParameterizedCompletion)) {
+                       ParameterizedCompletion pc = (ParameterizedCompletion)c;
+                       displayDescriptionToolTip(pc, true);
+               }
+
        }
 
 
@@ -418,6 +443,7 @@ try {
                this.textComponent = c;
                installTriggerKey(getTriggerKey());
 
+               // TODO: Fix me
                InputMap im = c.getInputMap();
                ActionMap am = c.getActionMap();
                KeyStroke ks = KeyStroke.getKeyStroke('(');
@@ -427,6 +453,9 @@ try {
                am.put("AutoCompletion.FunctionStart", new 
javax.swing.AbstractAction() {
                        public void actionPerformed(java.awt.event.ActionEvent 
e) {
                                textComponent.replaceSelection("(");
+                               if (!isParameterAssistanceEnabled()) {
+                                       return;
+                               }
                                List completions = 
provider.getParameterizedCompletionsAt(textComponent);
                                if (completions!=null && completions.size()>0) {
                                        // TODO: Have tooltip let you select 
between multiple, like VS
@@ -470,6 +499,17 @@ try {
 
 
        /**
+        * Returns whether parameter assistance is enabled.
+        *
+        * @return Whether parameter assistance is enabled.
+        * @see #setParameterAssistanceEnabled(boolean)
+        */
+       public boolean isParameterAssistanceEnabled() {
+               return parameterAssistanceEnabled;
+       }
+
+
+       /**
         * Returns whether the popup window is visible.
         *
         * @return Whether the popup window is visible.
@@ -620,6 +660,21 @@ try {
 
 
        /**
+        * Sets whether parameter assistance is enabled.  If parameter 
assistance
+        * is enabled, and a "parameterized" completion (such as a function or
+        * method) is inserted, the user will get "assistance" in inserting the
+        * parameters in the form of a popup window with documentation and easy
+        * tabbing through the arguments (as seen in Eclipse and NetBeans).
+        *
+        * @param enabled Whether parameter assistance should be enabled.
+        * @see #isParameterAssistanceEnabled()
+        */
+       public void setParameterAssistanceEnabled(boolean enabled) {
+               parameterAssistanceEnabled = enabled;
+       }
+
+
+       /**
         * Sets whether the "description window" should be shown beside the
         * completion window.
         *
@@ -698,6 +753,9 @@ try {
                if (popupWindow!=null) {
                        popupWindow.updateUI();
                }
+               if (descToolTip!=null) {
+                       descToolTip.updateUI();
+               }
        }
 
 
diff --git a/src/org/fife/ui/autocomplete/CCompletionProvider.java 
b/src/org/fife/ui/autocomplete/CCompletionProvider.java
index 258422e..4821122 100644
--- a/src/org/fife/ui/autocomplete/CCompletionProvider.java
+++ b/src/org/fife/ui/autocomplete/CCompletionProvider.java
@@ -51,7 +51,7 @@ import org.fife.ui.rsyntaxtextarea.Token;
  * @author Robert Futrell
  * @version 1.0
  */
-public class CCompletionProvider extends AbstractCompletionProvider{
+public class CCompletionProvider extends CompletionProviderBase {
 
        /**
         * The provider to use when no provider is assigned to a particular 
token
@@ -83,10 +83,26 @@ public class CCompletionProvider extends 
AbstractCompletionProvider{
         */
        public CCompletionProvider(CompletionProvider defaultProvider) {
                setDefaultCompletionProvider(defaultProvider);
-               completions = new ArrayList(0); // TODO: Remove me.
        }
 
 
+       /**
+        * Calling this method will result in an
+        * {@link UnsupportedOperationException} being thrown.  To set the
+        * parameter completion parameters, do so on the provider returned by
+        * {@link #getDefaultCompletionProvider()}.
+        *
+        * @throws UnsupportedOperationException Always.
+        * @see #setParameterizedCompletionParams(char, String, char)
+        */
+       public void clearParameterizedCompletionParams() {
+               throw new UnsupportedOperationException();
+       }
+
+
+       /**
+        * {@inheritDoc}
+        */
        public String getAlreadyEnteredText(JTextComponent comp) {
                if (!(comp instanceof RSyntaxTextArea)) {
                        return EMPTY_STRING;
@@ -151,12 +167,46 @@ public class CCompletionProvider extends 
AbstractCompletionProvider{
         * {@inheritDoc}
         */
        public List getParameterizedCompletionsAt(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!=null ? 
provider.getParameterizedCompletionsAt(tc) :
-                                                               null;
+               return provider==defaultProvider ?
+                               provider.getParameterizedCompletionsAt(tc) : 
null;
+       }
+
+
+       /**
+        * {@inheritDoc}
+        */
+       public char getParameterListEnd() {
+               return defaultProvider.getParameterListEnd();
        }
 
 
+       /**
+        * {@inheritDoc}
+        */
+       public String getParameterListSeparator() {
+               return defaultProvider.getParameterListSeparator();
+       }
+
+
+       /**
+        * {@inheritDoc}
+        */
+       public char getParameterListStart() {
+               return defaultProvider.getParameterListStart();
+       }
+
+
+       /**
+        * Returns the completion provider to use at the current caret position 
in
+        * a text component.
+        *
+        * @param comp The text component to check.
+        * @return The completion provider to use.
+        */
        private CompletionProvider getProviderFor(JTextComponent comp) {
 
                RSyntaxTextArea rsta = (RSyntaxTextArea)comp;
@@ -244,9 +294,6 @@ public class CCompletionProvider extends 
AbstractCompletionProvider{
         * @see #getCommentCompletionProvider()
         */
        public void setCommentCompletionProvider(CompletionProvider provider) {
-               if (provider==null) {
-                       throw new IllegalArgumentException("provider cannot be 
null");
-               }
                this.commentCompletionProvider = provider;
        }
 
@@ -273,14 +320,26 @@ public class CCompletionProvider extends 
AbstractCompletionProvider{
         * @see #getDocCommentCompletionProvider()
         */
        public void setDocCommentCompletionProvider(CompletionProvider 
provider) {
-               if (provider==null) {
-                       throw new IllegalArgumentException("provider cannot be 
null");
-               }
                this.docCommentCompletionProvider = provider;
        }
 
 
        /**
+        * Calling this method will result in an
+        * {@link UnsupportedOperationException} being thrown.  To set the
+        * parameter completion parameters, do so on the provider returned by
+        * {@link #getDefaultCompletionProvider()}.
+        *
+        * @throws UnsupportedOperationException Always.
+        * @see #clearParameterizedCompletionParams()
+        */
+       public void setParameterizedCompletionParams(char listStart,
+                                                                               
String separator, char listEnd) {
+               throw new UnsupportedOperationException();
+       }
+
+
+       /**
         * Sets the completion provider to use while in a string.
         *
         * @param provider The provider to use.
diff --git a/src/org/fife/ui/autocomplete/CompletionProvider.java 
b/src/org/fife/ui/autocomplete/CompletionProvider.java
index f5ebcab..cf51934 100644
--- a/src/org/fife/ui/autocomplete/CompletionProvider.java
+++ b/src/org/fife/ui/autocomplete/CompletionProvider.java
@@ -43,6 +43,16 @@ public interface CompletionProvider {
 
 
        /**
+        * Clears the values used to identify and insert "parameterized 
completions"
+        * (e.g. functions or methods).  After this method is called, functions 
and
+        * methods will not have their parameters auto-completed.
+        *
+        * @see #setParameterizedCompletionParams(char, String, char)
+        */
+       public void clearParameterizedCompletionParams();
+
+
+       /**
         * Returns the text just before the current caret position that could be
         * the start of something auto-completable.
         *
@@ -90,11 +100,12 @@ public interface CompletionProvider {
         * function or method.
         *
         * @return The text for a parameter list end, for example,
-        *         "<code>)</code>".
+        *         '<code>)</code>'.
         * @see #getParameterListStart()
         * @see #getParameterListSeparator()
+        * @see #setParameterizedCompletionParams(char, String, char)
         */
-       public String getParameterListEnd();
+       public char getParameterListEnd();
 
 
        /**
@@ -104,6 +115,7 @@ public interface CompletionProvider {
         *         "<code>, </code>".
         * @see #getParameterListStart()
         * @see #getParameterListEnd()
+        * @see #setParameterizedCompletionParams(char, String, char)
         */
        public String getParameterListSeparator();
 
@@ -116,8 +128,9 @@ public interface CompletionProvider {
         *         "<code>(</code>".
         * @see #getParameterListEnd()
         * @see #getParameterListSeparator()
+        * @see #setParameterizedCompletionParams(char, String, char)
         */
-       public String getParameterListStart();
+       public char getParameterListStart();
 
 
        /**
@@ -139,6 +152,23 @@ public interface CompletionProvider {
 
 
        /**
+        * Sets the values used to identify and insert "parameterized 
completions"
+        * (e.g. functions or methods).  If this method isn't called, functions
+        * and methods will not have their parameters auto-completed.
+        *
+        * @param listStart The character that marks the beginning of a list of
+        *        parameters, such as '<tt>(</tt>' in C or Java.
+        * @param separator Text that should separate parameters in a parameter
+        *        list when one is inserted.  For example, "<tt>, </tt>".
+        * @param listEnd The character that marks the end of a list of 
parameters,
+        *        such as '<tt>)</tt>' in C or Java.
+        * @see #clearParameterizedCompletionParams()
+        */
+       public void setParameterizedCompletionParams(char listStart,
+                                                                               
String separator, char listEnd);
+
+
+       /**
         * Sets the parent completion provider.
         *
         * @param parent The parent provider.  <code>null</code> means there 
will
diff --git a/src/org/fife/ui/autocomplete/CompletionProviderBase.java 
b/src/org/fife/ui/autocomplete/CompletionProviderBase.java
new file mode 100644
index 0000000..fa4632d
--- /dev/null
+++ b/src/org/fife/ui/autocomplete/CompletionProviderBase.java
@@ -0,0 +1,86 @@
+package org.fife.ui.autocomplete;
+
+import java.util.Collections;
+import java.util.List;
+import javax.swing.ListCellRenderer;
+import javax.swing.text.JTextComponent;
+
+
+/**
+ * A base class for all standard completion providers.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+abstract class CompletionProviderBase implements CompletionProvider {
+
+       /**
+        * The parent completion provider.
+        */
+       private CompletionProvider parent;
+
+       /**
+        * The renderer to use for completions from this provider.  If this is
+        * <code>null</code>, a default renderer is used.
+        */
+       private ListCellRenderer listCellRenderer;
+
+       protected static final String EMPTY_STRING = "";
+
+
+       /**
+        * {@inheritDoc}
+        */
+       public List getCompletions(JTextComponent comp) {
+               List completions = getCompletionsImpl(comp);
+               if (parent!=null) {
+                       completions.addAll(parent.getCompletions(comp));
+                       Collections.sort(completions);
+               }
+               return completions;
+       }
+
+
+       /**
+        * 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 abstract List getCompletionsImpl(JTextComponent comp);
+
+
+       /**
+        * {@inheritDoc}
+        */
+       public ListCellRenderer getListCellRenderer() {
+               return listCellRenderer;
+       }
+
+
+       /**
+        * {@inheritDoc}
+        */
+       public CompletionProvider getParent() {
+               return parent;
+       }
+
+
+       /**
+        * {@inheritDoc}
+        */
+       public void setListCellRenderer(ListCellRenderer r) {
+               listCellRenderer = r;
+       }
+
+
+       /**
+        * {@inheritDoc}
+        */
+       public void setParent(CompletionProvider parent) {
+               this.parent = parent;
+       }
+
+
+}
\ No newline at end of file
diff --git a/src/org/fife/ui/autocomplete/CompletionXMLParser.java 
b/src/org/fife/ui/autocomplete/CompletionXMLParser.java
index 5102774..5d74e0b 100644
--- a/src/org/fife/ui/autocomplete/CompletionXMLParser.java
+++ b/src/org/fife/ui/autocomplete/CompletionXMLParser.java
@@ -27,6 +27,7 @@ class CompletionXMLParser extends DefaultHandler {
        private String name;
        private String type;
        private String returnType;
+       private StringBuffer returnValDesc;
        private StringBuffer desc;
        private String paramName;
        private String paramType;
@@ -35,6 +36,7 @@ class CompletionXMLParser extends DefaultHandler {
        private String definedIn;
        private boolean doingKeywords;
        private boolean inKeyword;
+       private boolean gettingReturnValDesc;
        private boolean gettingDesc;
        private boolean gettingParams;
        private boolean inParam;
@@ -53,6 +55,7 @@ class CompletionXMLParser extends DefaultHandler {
                params = new ArrayList(1);
                desc = new StringBuffer();
                paramDesc = new StringBuffer();
+               returnValDesc = new StringBuffer();
        }
 
 
@@ -66,6 +69,9 @@ class CompletionXMLParser extends DefaultHandler {
                else if (gettingParamDesc) {
                        paramDesc.append(ch, start, length);
                }
+               else if (gettingReturnValDesc) {
+                       returnValDesc.append(ch, start, length);
+               }
        }
 
 
@@ -78,6 +84,10 @@ class CompletionXMLParser extends DefaultHandler {
                }
                fc.setParams(params);
                fc.setDefinedIn(definedIn);
+               if (returnValDesc.length()>0) {
+                       fc.setReturnValueDescription(returnValDesc.toString());
+                       returnValDesc.setLength(0);
+               }
                return fc;
        }
 
@@ -136,8 +146,8 @@ class CompletionXMLParser extends DefaultHandler {
                                inKeyword = false;
                        }
                        else if (inKeyword) {
-                               if ("desc".equals(qName)) {
-                                       gettingDesc = false;
+                               if ("returnValDesc".equals(qName)) {
+                                       gettingReturnValDesc = false;
                                }
                                else if (gettingParams) {
                                        if ("params".equals(qName)) {
@@ -160,6 +170,9 @@ class CompletionXMLParser extends DefaultHandler {
                                                }
                                        }
                                }
+                               else if ("desc".equals(qName)) {
+                                       gettingDesc = false;
+                               }
                        }
 
                }
@@ -208,7 +221,10 @@ class CompletionXMLParser extends DefaultHandler {
                                inKeyword = true;
                        }
                        else if (inKeyword) {
-                               if ("params".equals(qName)) {
+                               if ("returnValDesc".equals(qName)) {
+                                       gettingReturnValDesc = true;
+                               }
+                               else if ("params".equals(qName)) {
                                        gettingParams = true;
                                }
                                else if (gettingParams) {
diff --git a/src/org/fife/ui/autocomplete/DefaultCompletionProvider.java 
b/src/org/fife/ui/autocomplete/DefaultCompletionProvider.java
index f1737ce..6fe44e4 100644
--- a/src/org/fife/ui/autocomplete/DefaultCompletionProvider.java
+++ b/src/org/fife/ui/autocomplete/DefaultCompletionProvider.java
@@ -125,8 +125,10 @@ public class DefaultCompletionProvider extends 
AbstractCompletionProvider {
 
                List list = null;
 
-               String paramListStart = getParameterListStart();
-               if (paramListStart==null) {
+               // If this provider doesn't support parameterized completions,
+               // bail out now.
+               char paramListStart = getParameterListStart();
+               if (paramListStart==0) {
                        return list; // null
                }
 
@@ -137,7 +139,7 @@ public class DefaultCompletionProvider extends 
AbstractCompletionProvider {
                int line = root.getElementIndex(dot);
                Element elem = root.getElement(line);
                int offs = elem.getStartOffset();
-               int len = dot - offs - paramListStart.length();
+               int len = dot - offs - 1/*paramListStart.length()*/;
                if (len<=0) { // Not enough chars on line for a method.
                        return list; // null
                }
@@ -145,25 +147,34 @@ public class DefaultCompletionProvider extends 
AbstractCompletionProvider {
                try {
 
                        doc.getText(offs, len, s);
+
+                       // Get the identifier preceeding the '(', ignoring any 
whitespace
+                       // between them.
                        offs = s.offset + len - 1;
                        while (offs>=s.offset && 
Character.isWhitespace(s.array[offs])) {
                                offs--;
                        }
                        int end = offs;
                        while (offs>=s.offset && isValidChar(s.array[offs])) {
-                               System.out.println("... Examining '" + 
s.array[offs] + "'");
                                offs--;
                        }
 
                        String text = new String(s.array, offs+1, end-offs);
                        System.out.println("... ... \"" + text + "\"");
 
-                       Completion c = getCompletionByInputText(text);
-                       if (c instanceof ParameterizedCompletion) {
-                               if (list==null) {
-                                       list = new ArrayList(1);
+                       // Get a list of all Completions matching the text, but 
then
+                       // narrow it down to just the ParameterizedCompletions.
+                       List l = getCompletionByInputText(text);
+                       if (l!=null && !l.isEmpty()) {
+                               for (int i=0; i<l.size(); i++) {
+                                       Object o = l.get(i);
+                                       if (o instanceof 
ParameterizedCompletion) {
+                                               if (list==null) {
+                                                       list = new ArrayList(1);
+                                               }
+                                               list.add(o);
+                                       }
                                }
-                               list.add(c);
                        }
 
                } catch (BadLocationException ble) {
diff --git a/src/org/fife/ui/autocomplete/FunctionCompletion.java 
b/src/org/fife/ui/autocomplete/FunctionCompletion.java
index 31ccfaf..52bdd20 100644
--- a/src/org/fife/ui/autocomplete/FunctionCompletion.java
+++ b/src/org/fife/ui/autocomplete/FunctionCompletion.java
@@ -40,6 +40,11 @@ public class FunctionCompletion extends VariableCompletion
         */
        private List params;
 
+       /**
+        * A description of the return value of this function.
+        */
+       private String returnValDesc;
+
 
        /**
         * Constructor.
@@ -68,8 +73,11 @@ public class FunctionCompletion extends VariableCompletion
         */
        protected void addParameters(StringBuffer sb) {
 
+               // TODO: Localize me
+               // TODO: Use tables (?) to improve indentation of long 
descriptions
+
                if (params!=null && params.size()>0) {
-                       sb.append("<b>Parameters:</b><br>"); // TODO: Localize 
me
+                       sb.append("<b>Parameters:</b><br>");
                        for (int i=0; i<getParamCount(); i++) {
                                Parameter param = getParam(i);
                                sb.append("&nbsp;&nbsp;&nbsp;<b>");
@@ -85,7 +93,11 @@ public class FunctionCompletion extends VariableCompletion
                        sb.append("<br><br>");
                }
 
-               // TODO: Add description of return type.
+               if (returnValDesc!=null) {
+                       sb.append("<b>Returns:</b><br>&nbsp;&nbsp;&nbsp;");
+                       sb.append(returnValDesc);
+                       sb.append("<br><br>");
+               }
 
        }
 
@@ -162,6 +174,17 @@ public class FunctionCompletion extends VariableCompletion
 
 
        /**
+        * Returns the description of the return value of this function.
+        *
+        * @return The description, or <code>null</code> if there is none.
+        * @see #setReturnValueDescription(String)
+        */
+       public String getReturnValueDescription() {
+               return returnValDesc;
+       }
+
+
+       /**
         * {@inheritDoc}
         */
        public String getSummary() {
@@ -188,4 +211,15 @@ public class FunctionCompletion extends VariableCompletion
        }
 
 
+       /**
+        * Sets the description of the return value of this function.
+        *
+        * @param desc The description.
+        * @see #getReturnValueDescription()
+        */
+       public void setReturnValueDescription(String desc) {
+               this.returnValDesc = desc;
+       }
+
+
 }
\ No newline at end of file
diff --git 
a/src/org/fife/ui/autocomplete/ParameterizedCompletionDescriptionToolTip.java 
b/src/org/fife/ui/autocomplete/ParameterizedCompletionDescriptionToolTip.java
index 9a43069..881af58 100644
--- 
a/src/org/fife/ui/autocomplete/ParameterizedCompletionDescriptionToolTip.java
+++ 
b/src/org/fife/ui/autocomplete/ParameterizedCompletionDescriptionToolTip.java
@@ -45,10 +45,12 @@ import javax.swing.InputMap;
 import javax.swing.JLabel;
 import javax.swing.JWindow;
 import javax.swing.KeyStroke;
+import javax.swing.SwingUtilities;
 import javax.swing.UIManager;
 import javax.swing.event.CaretEvent;
 import javax.swing.event.CaretListener;
 import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
 import javax.swing.text.Highlighter;
 import javax.swing.text.JTextComponent;
 import javax.swing.text.Position;
@@ -226,15 +228,13 @@ class ParameterizedCompletionDescriptionToolTip {
                oldEscapeAction = am.get(IM_KEY_ESCAPE);
                am.put(IM_KEY_ESCAPE, new HideAction());
 
-               String end = pc.getProvider().getParameterListEnd();
-               if (end.length()==1) { // Practically always true, usually ')'
-                       char ch = end.charAt(0);
-                       ks = KeyStroke.getKeyStroke(ch);
-                       oldClosingKey = im.get(ks);
-                       im.put(ks, IM_KEY_CLOSING);
-                       oldClosingAction = am.get(IM_KEY_CLOSING);
-                       am.put(IM_KEY_CLOSING, new ClosingAction());
-               }
+               char end = pc.getProvider().getParameterListEnd();
+               ks = KeyStroke.getKeyStroke(end);
+               oldClosingKey = im.get(ks);
+               im.put(ks, IM_KEY_CLOSING);
+               oldClosingAction = am.get(IM_KEY_CLOSING);
+               am.put(IM_KEY_CLOSING, new ClosingAction());
+
        }
 
 
@@ -251,7 +251,7 @@ class ParameterizedCompletionDescriptionToolTip {
                int tagCount = tags.size();
                if (tagCount==0) {
                        tc.setCaretPosition(maxPos.getOffset());
-                       tooltip.setVisible(false);
+                       setVisible(false, false);
                }
 
                Highlight currentNext = null;
@@ -275,7 +275,7 @@ class ParameterizedCompletionDescriptionToolTip {
                }
                else {
                        tc.setCaretPosition(maxPos.getOffset());
-                       tooltip.setVisible(false);
+                       setVisible(false, false);
                }
 
        }
@@ -293,7 +293,7 @@ class ParameterizedCompletionDescriptionToolTip {
                int tagCount = tags.size();
                if (tagCount==0) { // Should never happen
                        tc.setCaretPosition(maxPos.getOffset());
-                       tooltip.setVisible(false);
+                       setVisible(false, false);
                }
 
                int dot = tc.getCaretPosition();
@@ -322,7 +322,7 @@ class ParameterizedCompletionDescriptionToolTip {
                }
                else {
                        tc.setCaretPosition(maxPos.getOffset());
-                       tooltip.setVisible(false);
+                       setVisible(false, false);
                }
 
        }
@@ -417,13 +417,10 @@ class ParameterizedCompletionDescriptionToolTip {
                im.put(ks, oldEscapeKey);
                am.put(IM_KEY_ESCAPE, oldEscapeAction);
 
-               String end = pc.getProvider().getParameterListEnd();
-               if (end.length()==1) { // Practically always true, usually ')'
-                       char ch = end.charAt(0);
-                       ks = KeyStroke.getKeyStroke(ch);
-                       im.put(ks, oldClosingKey);
-                       am.put(IM_KEY_CLOSING, oldClosingAction);
-               }
+               char end = pc.getProvider().getParameterListEnd();
+               ks = KeyStroke.getKeyStroke(end);
+               im.put(ks, oldClosingKey);
+               am.put(IM_KEY_CLOSING, oldClosingAction);
 
        }
 
@@ -486,6 +483,16 @@ class ParameterizedCompletionDescriptionToolTip {
                        }
                }
 
+               if (selectedParam>=0 && selectedParam<paramCount) {
+                       ParameterizedCompletion.Parameter param =
+                                                       
pc.getParam(selectedParam);
+                       String desc = param.getDescription();
+                       if (desc!=null) {
+                               sb.append("<br>");
+                               sb.append(desc);
+                       }
+               }
+
                descLabel.setText(sb.toString());
                tooltip.pack();
 
@@ -493,6 +500,15 @@ class ParameterizedCompletionDescriptionToolTip {
 
 
        /**
+        * Updates the <tt>LookAndFeel</tt> of this window and the description
+        * window.
+        */
+       public void updateUI() {
+               SwingUtilities.updateComponentTreeUI(tooltip);
+       }
+
+
+       /**
         * Called when the user types the character marking the closing of the
         * parameter list, such as '<code>)</code>'.
         *
@@ -503,8 +519,42 @@ class ParameterizedCompletionDescriptionToolTip {
 
                public void actionPerformed(ActionEvent e) {
                        JTextComponent tc = ac.getTextComponent();
-                       tc.setCaretPosition(maxPos.getOffset());
-                       tooltip.setVisible(false);
+                       int dot = tc.getCaretPosition();
+                       if (dot>=maxPos.getOffset()-1) { // ">=" for overwrite 
mode
+                               if (dot==maxPos.getOffset()) { // Happens in 
overwrite mode
+                                       char ch = 
pc.getProvider().getParameterListEnd();
+                                       
tc.replaceSelection(Character.toString(ch));
+                               }
+                               else {
+                                       tc.setCaretPosition(maxPos.getOffset());
+                               }
+                               setVisible(false, false);
+                       }
+                       else {
+                               char ch = 
pc.getProvider().getParameterListEnd();
+                               tc.replaceSelection(Character.toString(ch));
+                       }
+               }
+
+               public String getArgumentText(int arg) {
+                       if (arg<0 || arg>=pc.getParamCount()) {
+                               return null;
+                       }
+                       List paramHighlights = getParameterHighlights();
+                       if (paramHighlights==null || 
arg>=paramHighlights.size()) {
+                               return null;
+                       }
+                       Highlight h = (Highlight)paramHighlights.get(arg);
+                       int len = h.getEndOffset() - h.getStartOffset();
+                       JTextComponent tc = ac.getTextComponent();
+                       Document doc = tc.getDocument();
+                       try {
+                               return doc.getText(h.getStartOffset(), len);
+                       } catch (BadLocationException ble) {
+                               
UIManager.getLookAndFeel().provideErrorFeedback(tc);
+                               ble.printStackTrace();
+                               return null;
+                       }
                }
 
        }
@@ -519,7 +569,7 @@ class ParameterizedCompletionDescriptionToolTip {
        private class HideAction extends AbstractAction {
 
                public void actionPerformed(ActionEvent e) {
-                       tooltip.setVisible(false);
+                       setVisible(false, false);
                }
 
        }
@@ -541,11 +591,11 @@ class ParameterizedCompletionDescriptionToolTip {
                 */
                public void caretUpdate(CaretEvent e) {
                        if (maxPos==null) { // Sanity check
-                               tooltip.setVisible(false);
+                               setVisible(false, false);
                        }
                        int dot = e.getDot();
                        if (dot<minPos || dot>maxPos.getOffset()) {
-                               tooltip.setVisible(false);
+                               setVisible(false, false);
                        }
                        updateText();
                }
@@ -567,7 +617,7 @@ class ParameterizedCompletionDescriptionToolTip {
                 * @param e The event.
                 */
                public void focusLost(FocusEvent e) {
-                       tooltip.setVisible(false);
+                       setVisible(false, false);
                }
 
 

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

_______________________________________________
pkg-java-commits mailing list
[email protected]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-java-commits

Reply via email to