This is an automated email from the git hooks/post-receive script. ben pushed a commit to branch master in repository autocomplete.
commit c6488a255748db475dd87a1710afe8cadd260a77 Author: bobbylight <[email protected]> Date: Sat Jan 3 06:36:25 2009 +0000 Fixing input issue when >1 JTextComponent has an AutoComplete installed. Adding beginnings of language-aware completion support. --- .classpath | 1 + .../ui/autocomplete/AutoCompletePopupWindow.java | 1 - src/org/fife/ui/autocomplete/AutoCompletion.java | 116 ++++++++----- src/org/fife/ui/autocomplete/BasicCompletion.java | 107 ++++++++++++ .../fife/ui/autocomplete/FunctionCompletion.java | 12 +- .../LanguageAwareCompletionProvider.java | 182 ++++++++++++++++++++ .../ProceduralLanguageCellRenderer.java | 6 +- .../ProceduralLanguageCompletionProvider.java | 156 +++++++++++------ .../fife/ui/autocomplete/VariableCompletion.java | 18 +- 9 files changed, 500 insertions(+), 99 deletions(-) diff --git a/.classpath b/.classpath index fe5be44..3e0eb1d 100644 --- a/.classpath +++ b/.classpath @@ -4,5 +4,6 @@ <classpathentry kind="src" path="i18n"/> <classpathentry kind="src" path="img"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> + <classpathentry combineaccessrules="false" kind="src" path="/RSyntaxTextArea"/> <classpathentry kind="output" path="bin"/> </classpath> diff --git a/src/org/fife/ui/autocomplete/AutoCompletePopupWindow.java b/src/org/fife/ui/autocomplete/AutoCompletePopupWindow.java index ef5fe05..0dafc7e 100644 --- a/src/org/fife/ui/autocomplete/AutoCompletePopupWindow.java +++ b/src/org/fife/ui/autocomplete/AutoCompletePopupWindow.java @@ -32,7 +32,6 @@ import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.List; - import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.JList; diff --git a/src/org/fife/ui/autocomplete/AutoCompletion.java b/src/org/fife/ui/autocomplete/AutoCompletion.java index 2f40157..91fe502 100644 --- a/src/org/fife/ui/autocomplete/AutoCompletion.java +++ b/src/org/fife/ui/autocomplete/AutoCompletion.java @@ -42,7 +42,7 @@ import javax.swing.text.*; * It also handles communication between the CompletionProvider and the actual * popup Window. */ -public class AutoCompletion implements HierarchyListener, ComponentListener { +public class AutoCompletion implements HierarchyListener { /** * The text component we're providing completion for. @@ -94,11 +94,28 @@ public class AutoCompletion implements HierarchyListener, ComponentListener { private KeyStroke trigger; /** + * The previous key in the text component's <code>InputMap</code> for the + * trigger key. + */ + private Object oldTriggerKey; + + /** * The action previously assigned to {@link #trigger}, so we can reset it * if the user disables auto-completion. */ private Action oldTriggerAction; + /** + * Listens for events in the parent window that affect the visibility of + * the popup window. + */ + private Listener parentWindowListener; + + /** + * The key used in the input map for the AutoComplete action. + */ + private static final String ACTION_MAP_KEY = "AutoComplete"; + /** * Constructor. @@ -112,25 +129,7 @@ public class AutoCompletion implements HierarchyListener, ComponentListener { setAutoCompleteEnabled(true); setAutoCompleteSingleChoices(true); setShowDescWindow(false); - } - - - public void componentHidden(ComponentEvent e) { - hidePopupWindow(); - } - - - public void componentMoved(ComponentEvent e) { - hidePopupWindow(); - } - - - public void componentResized(ComponentEvent e) { - hidePopupWindow(); - } - - - public void componentShown(ComponentEvent e) { + parentWindowListener = new Listener(); } @@ -163,7 +162,7 @@ public class AutoCompletion implements HierarchyListener, ComponentListener { */ public static KeyStroke getDefaultTriggerKey() { // Default to CTRL, even on Mac, since Ctrl+Space activates Spotlight - int mask = Event.CTRL_MASK; + int mask = InputEvent.CTRL_MASK; return KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, mask); } @@ -187,13 +186,6 @@ public class AutoCompletion implements HierarchyListener, ComponentListener { } - CompletionProvider getProviderAtCaretPosition() { - // TODO: Delegate to provider in case the provider itself delegates. - //return provider.getProviderAtCaretPosition(textComponent); - return provider; - } - - /** * Returns whether the "description window" should be shown alongside * the completion window. @@ -245,10 +237,10 @@ public class AutoCompletion implements HierarchyListener, ComponentListener { parentWindow = SwingUtilities.getWindowAncestor(textComponent); if (parentWindow!=oldParentWindow) { if (oldParentWindow!=null) { - oldParentWindow.removeComponentListener(this); + parentWindowListener.removeFrom(oldParentWindow); } if (parentWindow!=null) { - parentWindow.addComponentListener(this); + parentWindowListener.addTo(parentWindow); } } @@ -330,9 +322,12 @@ try { * @see #uninstallTriggerKey() */ private void installTriggerKey(KeyStroke ks) { - Keymap km = textComponent.getKeymap(); - oldTriggerAction = km.getAction(ks); - km.addActionForKeyStroke(ks, new AutoCompleteAction()); + InputMap im = textComponent.getInputMap(); + oldTriggerKey = im.get(ks); + im.put(ks, ACTION_MAP_KEY); + ActionMap am = textComponent.getActionMap(); + oldTriggerAction = am.get(ACTION_MAP_KEY); + am.put(ACTION_MAP_KEY, new AutoCompleteAction()); } @@ -525,7 +520,7 @@ try { uninstallTriggerKey(); textComponent.removeHierarchyListener(this); if (parentWindow!=null) { - parentWindow.removeComponentListener(this); + parentWindowListener.removeFrom(parentWindow); } textComponent = null; } @@ -539,13 +534,10 @@ try { * @see #installTriggerKey(KeyStroke) */ private void uninstallTriggerKey() { - Keymap km = textComponent.getKeymap(); - if (oldTriggerAction!=null) { - km.addActionForKeyStroke(trigger, oldTriggerAction); - } - else { - km.removeKeyStrokeBinding(trigger); - } + InputMap im = textComponent.getInputMap(); + im.put(trigger, oldTriggerKey); + ActionMap am = textComponent.getActionMap(); + am.put(ACTION_MAP_KEY, oldTriggerAction); } @@ -582,4 +574,46 @@ try { } + /** + * Listens for events in the parent window of the text component with + * autocompletion enabled. + * + * @author Robert Futrell + * @version 1.0 + */ + private class Listener extends ComponentAdapter + implements WindowFocusListener { + + public void addTo(Window w) { + w.addComponentListener(this); + w.addWindowFocusListener(this); + } + + public void componentHidden(ComponentEvent e) { + hidePopupWindow(); + } + + public void componentMoved(ComponentEvent e) { + hidePopupWindow(); + } + + public void componentResized(ComponentEvent e) { + hidePopupWindow(); + } + + public void removeFrom(Window w) { + w.removeComponentListener(this); + w.removeWindowFocusListener(this); + } + + public void windowGainedFocus(WindowEvent e) { + } + + public void windowLostFocus(WindowEvent e) { + hidePopupWindow(); + } + + } + + } \ No newline at end of file diff --git a/src/org/fife/ui/autocomplete/BasicCompletion.java b/src/org/fife/ui/autocomplete/BasicCompletion.java new file mode 100644 index 0000000..a2034fd --- /dev/null +++ b/src/org/fife/ui/autocomplete/BasicCompletion.java @@ -0,0 +1,107 @@ +/* + * 01/03/2009 + * + * BasicCompletion.java - A straightforward Completion implementation. + * Copyright (C) 2009 Robert Futrell + * robert_futrell at users.sourceforge.net + * http://fifesoft.com/rsyntaxtextarea + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +package org.fife.ui.autocomplete; + + +/** + * A straightforward completion implementation. This implementation can be + * used if you have a relatively short number of static completions with no + * (or short) summaries. + * + * @author Robert Futrell + * @version 1.0 + */ +public class BasicCompletion extends AbstractCompletion { + + private String replacementText; + private String shortDesc; + private String summary; + + + /** + * Constructor. + * + * @param provider The parent completion provider. + * @param replacementText The text to replace. + */ + public BasicCompletion(CompletionProvider provider, String replacementText){ + this(provider, replacementText, null, null); + } + + + /** + * Constructor. + * + * @param provider The parent completion provider. + * @param replacementText The text to replace. + * @param shortDesc A short description of the completion. This will be + * 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 BasicCompletion(CompletionProvider provider, String replacementText, + String shortDesc, String summary) { + super(provider); + this.replacementText = replacementText; + this.shortDesc = shortDesc; + this.summary = summary; + } + + + /** + * {@inheritDoc} + */ + public String getReplacementText() { + return replacementText; + } + + + /** + * {@inheritDoc} + */ + public String getSummary() { + return summary; + } + + + /** + * Returns a string representation of this completion. If the short + * description is not <code>null</code>, this method will return: + * + * <code>getReplacementText() + " - " + shortDesc</code> + * + * otherwise, it will return <tt>getReplacementText()</tt>. + * + * @return A string representation of this completion. + */ + public String toString() { + if (shortDesc==null) { + return getReplacementText(); + } + else { + return getReplacementText() + " - " + shortDesc; + } + } + + +} \ No newline at end of file diff --git a/src/org/fife/ui/autocomplete/FunctionCompletion.java b/src/org/fife/ui/autocomplete/FunctionCompletion.java index 74352f7..785557e 100644 --- a/src/org/fife/ui/autocomplete/FunctionCompletion.java +++ b/src/org/fife/ui/autocomplete/FunctionCompletion.java @@ -58,8 +58,9 @@ public class FunctionCompletion extends VariableCompletion { sb.append("<html><b>"); // Add the return type if applicable (C macros like NULL have no type). - if (getType()!=null) { - sb.append(getType()); + String type = getType(); + if (type!=null) { + appendPossibleDataType(sb, type); sb.append(' '); } @@ -70,7 +71,12 @@ public class FunctionCompletion extends VariableCompletion { sb.append('('); for (int i=0; i<getParamCount(); i++) { Parameter param = getParam(i); - sb.append(param.toString()); + type = param.getType(); + if (type!=null) { + appendPossibleDataType(sb, type); + sb.append(' '); + } + sb.append(param.getName()); if (i<params.size()-1) { sb.append(", "); } diff --git a/src/org/fife/ui/autocomplete/LanguageAwareCompletionProvider.java b/src/org/fife/ui/autocomplete/LanguageAwareCompletionProvider.java new file mode 100644 index 0000000..5aca9b8 --- /dev/null +++ b/src/org/fife/ui/autocomplete/LanguageAwareCompletionProvider.java @@ -0,0 +1,182 @@ +/* + * 01/03/2009 + * + * LanguageAwareCompletionProvider.java - A completion provider that is aware + * of the language it is working with. + * Copyright (C) 2009 Robert Futrell + * robert_futrell at users.sourceforge.net + * http://fifesoft.com/rsyntaxtextarea + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +package org.fife.ui.autocomplete; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import javax.swing.text.JTextComponent; + +import org.fife.ui.rsyntaxtextarea.RSyntaxDocument; +import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; +import org.fife.ui.rsyntaxtextarea.RSyntaxUtilities; +import org.fife.ui.rsyntaxtextarea.Token; + + +/** + * A completion provider that is aware of the programming language it is + * providing auto-completion for. + * + * @author Robert Futrell + * @version 1.0 + */ +public class LanguageAwareCompletionProvider extends AbstractCompletionProvider{ + + /** + * The provider to use when no provider is assigned to a particular token + * type. + */ + private CompletionProvider defaultProvider; + + /** + * The provider to use when completing a string. + */ + private CompletionProvider stringCompletionProvider; + + + /** + * Constructor. + * + * @param defaultProvider The provider to use when no provider is assigned + * to a particular token type. This cannot be <code>null</code>. + */ + public LanguageAwareCompletionProvider(CompletionProvider defaultProvider) { + setDefaultCompletionProvider(defaultProvider); + completions = new java.util.ArrayList(0); // TODO: Remove me. + } + + + public String getAlreadyEnteredText(JTextComponent comp) { + if (!(comp instanceof RSyntaxTextArea)) { + return EMPTY_STRING; + } + CompletionProvider provider = getProviderFor(comp); + return provider.getAlreadyEnteredText(comp); + } + + + /** + * 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 (!(comp instanceof RSyntaxTextArea)) { + return new ArrayList(0); + } + CompletionProvider provider = getProviderFor(comp); + return provider.getCompletions(comp); + } + + + /** + * Returns the completion provider used when one isn't defined for a + * particular token type. + * + * @return The completion provider to use. + * @see #setDefaultCompletionProvider(CompletionProvider) + */ + public CompletionProvider getDefaultCompletionProvider() { + return defaultProvider; + } + + + private CompletionProvider getProviderFor(JTextComponent comp) { + + RSyntaxTextArea rsta = (RSyntaxTextArea)comp; + RSyntaxDocument doc = (RSyntaxDocument)rsta.getDocument(); + Token t = doc.getTokenListForLine(rsta.getCaretLineNumber()); + if (t==null) { + return getDefaultCompletionProvider(); + } + + int dot = rsta.getCaretPosition(); + Token curToken = RSyntaxUtilities.getTokenAtOffset(t, dot); + int type = 0; + if (curToken==null) { // At end of the line + Token temp = t.getLastPaintableToken(); + if (temp==null) { + return getDefaultCompletionProvider(); + } + type = temp.type; + } + else { + type = curToken.type; + } + + switch (type) { + case Token.LITERAL_STRING_DOUBLE_QUOTE: + case Token.ERROR_STRING_DOUBLE: + return getStringCompletionProvider(); + default: + return getDefaultCompletionProvider(); + } + + } + + + /** + * Returns the completion provider to use for strings. This may be the + * default provider if one isn't explicitly set for strings. + * + * @return The completion provider to use. + * @see #setStringCompletionProvider(CompletionProvider) + */ + public CompletionProvider getStringCompletionProvider() { + return stringCompletionProvider==null ? defaultProvider : + stringCompletionProvider; + } + + + /** + * Sets the default completion provider. + * + * @param provider The provider to use when no provider is assigned to a + * particular token type. This cannot be <code>null</code>. + * @see #getDefaultCompletionProvider() + */ + public void setDefaultCompletionProvider(CompletionProvider provider) { + if (provider==null) { + throw new IllegalArgumentException("provider cannot be null"); + } + this.defaultProvider = provider; + } + + + /** + * Sets the completion provider to use while in a string. + * + * @param provider The provider to use. If this is <code>null</code>, the + * default completion provider will be used. + * @see #getStringCompletionProvider() + */ + public void setStringCompletionProvider(CompletionProvider provider) { + stringCompletionProvider = provider; + } + + +} \ No newline at end of file diff --git a/src/org/fife/ui/autocomplete/ProceduralLanguageCellRenderer.java b/src/org/fife/ui/autocomplete/ProceduralLanguageCellRenderer.java index 23f8479..6e1d4ee 100644 --- a/src/org/fife/ui/autocomplete/ProceduralLanguageCellRenderer.java +++ b/src/org/fife/ui/autocomplete/ProceduralLanguageCellRenderer.java @@ -114,13 +114,11 @@ public class ProceduralLanguageCellRenderer extends DefaultListCellRenderer { if (!selected) { sb.append("</font>"); } + sb.append(' '); } String name = param.getName(); if (name!=null) { - if (type!=null) { - sb.append(' '); - sb.append(name); - } + sb.append(name); } if (i<paramCount-1) { sb.append(", "); diff --git a/src/org/fife/ui/autocomplete/ProceduralLanguageCompletionProvider.java b/src/org/fife/ui/autocomplete/ProceduralLanguageCompletionProvider.java index b9194f6..127b5d8 100644 --- a/src/org/fife/ui/autocomplete/ProceduralLanguageCompletionProvider.java +++ b/src/org/fife/ui/autocomplete/ProceduralLanguageCompletionProvider.java @@ -24,6 +24,7 @@ package org.fife.ui.autocomplete; import java.awt.Color; +import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -33,17 +34,16 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; -import javax.imageio.ImageIO; -import javax.swing.DefaultListCellRenderer; -import javax.swing.ImageIcon; 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; +import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; +import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; @@ -74,17 +74,18 @@ public class ProceduralLanguageCompletionProvider private boolean colorizeHeader; - public ProceduralLanguageCompletionProvider(String fileName) { - - completions = new ArrayList(); - seg = new Segment(); + public ProceduralLanguageCompletionProvider(InputStream in) { + try { + this.completions = loadXMLFromStream(in); + Collections.sort(this.completions); + } catch (IOException ioe) { + ioe.printStackTrace(); + } + init(); + } - setColorizeHeader(false); - long start = System.currentTimeMillis(); - - SAXParserFactory factory = SAXParserFactory.newInstance(); - XMLParser handler = new XMLParser(); + public ProceduralLanguageCompletionProvider(String fileName) { try { InputStream in = null; File file = new File(fileName); @@ -95,23 +96,12 @@ public class ProceduralLanguageCompletionProvider ClassLoader cl = getClass().getClassLoader(); in = cl.getResourceAsStream(fileName); } - try { - SAXParser saxParser = factory.newSAXParser(); - saxParser.parse(in, handler); - this.completions = handler.getCompletions(); - Collections.sort(this.completions); - } finally { - in.close(); - } - } catch (Throwable err) { - err.printStackTrace (); + this.completions = loadXMLFromStream(in); + Collections.sort(this.completions); + } catch (IOException ioe) { + ioe.printStackTrace(); } - - long time = System.currentTimeMillis() - start; - System.out.println("XML loaded in: " + time + "ms"); - - setListCellRenderer(new ProceduralLanguageCellRenderer()); - + init(); } @@ -148,12 +138,6 @@ public class ProceduralLanguageCompletionProvider } - private String getColorFor(String text) { - int index = dataTypes==null ? -1 : Arrays.binarySearch(dataTypes, text); - return index>=0 ? dataTypeFG : null; - } - - /** * Returns whether the description area should have its header information * syntax highlighted. @@ -167,6 +151,46 @@ public class ProceduralLanguageCompletionProvider /** + * Does initialization common to various constructors. + */ + private void init() { + seg = new Segment(); + setColorizeHeader(false); + setListCellRenderer(new ProceduralLanguageCellRenderer()); + } + + + public String isDataType(String str) { + return Arrays.binarySearch(dataTypes, str)>=0 ? + dataTypeFG : null; + } + + + private List loadXMLFromStream(InputStream in) throws IOException { + + long start = System.currentTimeMillis(); + + SAXParserFactory factory = SAXParserFactory.newInstance(); + XMLParser handler = new XMLParser(); + BufferedInputStream bin = new BufferedInputStream(in); + try { + SAXParser saxParser = factory.newSAXParser(); + saxParser.parse(bin, handler); + return handler.getCompletions(); + } catch (SAXException se) { + throw new IOException(se.toString()); + } catch (ParserConfigurationException pce) { + throw new IOException(pce.toString()); + } finally { + long time = System.currentTimeMillis() - start; + System.out.println("XML loaded in: " + time + "ms"); + bin.close(); + } + + } + + + /** * Sets whether the header text of the description area should be * syntax highlighted. * @@ -239,23 +263,32 @@ public class ProceduralLanguageCompletionProvider private String type; private String returnType; private StringBuffer desc; + private String paramName; + private String paramType; + private StringBuffer paramDesc; private List params; private String definedIn; private boolean doingKeywords; private boolean inKeyword; private boolean gettingDesc; private boolean gettingParams; + private boolean inParam; + private boolean gettingParamDesc; public XMLParser() { completions = new ArrayList(); params = new ArrayList(1); desc = new StringBuffer(); + paramDesc = new StringBuffer(); } public void characters(char[] ch, int start, int length) { if (gettingDesc) { desc.append(ch, start, length); } + else if (gettingParamDesc) { + paramDesc.append(ch, start, length); + } } public void endElement(String uri, String localName, String qName) { @@ -271,7 +304,10 @@ public class ProceduralLanguageCompletionProvider if ("function".equals(type)) { FunctionCompletion fc = new FunctionCompletion( ProceduralLanguageCompletionProvider.this, name, returnType); - fc.setDescription(desc.toString()); + if (desc.length()>0) { + fc.setDescription(desc.toString()); + desc.setLength(0); + } fc.setParams(params); fc.setDefinedIn(definedIn); c = fc; @@ -279,7 +315,10 @@ public class ProceduralLanguageCompletionProvider else if ("constant".equals(type)) { VariableCompletion vc = new VariableCompletion( ProceduralLanguageCompletionProvider.this, name, returnType); - vc.setDescription(desc.toString()); + if (desc.length()>0) { + vc.setDescription(desc.toString()); + desc.setLength(0); + } vc.setDefinedIn(definedIn); c = vc; } @@ -293,8 +332,26 @@ public class ProceduralLanguageCompletionProvider if ("desc".equals(qName)) { gettingDesc = false; } - else if ("params".equals(qName)) { - gettingParams = false; + else if (gettingParams) { + if ("params".equals(qName)) { + gettingParams = false; + } + else if ("param".equals(qName)) { + FunctionCompletion.Parameter param = + new FunctionCompletion.Parameter(paramType, + paramName); + if (paramDesc.length()>0) { + param.setDescription(paramDesc.toString()); + paramDesc.setLength(0); + } + params.add(param); + inParam = false; + } + else if (inParam) { + if ("desc".equals(qName)) { + gettingParamDesc = false; + } + } } } @@ -320,22 +377,23 @@ public class ProceduralLanguageCompletionProvider inKeyword = true; } else if (inKeyword) { - if ("desc".equals(qName)) { - gettingDesc = true; - desc.setLength(0); - } - else if ("params".equals(qName)) { + if ("params".equals(qName)) { gettingParams = true; } else if (gettingParams) { if ("param".equals(qName)) { - String name = attrs.getValue("name"); - String type = attrs.getValue("type"); - FunctionCompletion.Parameter param = - new FunctionCompletion.Parameter(type, name); - // TODO: Get desc. - params.add(param); + paramName = attrs.getValue("name"); + paramType = attrs.getValue("type"); + inParam = true; } + if (inParam) { + if ("desc".equals(qName)) { + gettingParamDesc = true; + } + } + } + else if ("desc".equals(qName)) { + gettingDesc = true; } } } diff --git a/src/org/fife/ui/autocomplete/VariableCompletion.java b/src/org/fife/ui/autocomplete/VariableCompletion.java index 68e7d92..64fa0d5 100644 --- a/src/org/fife/ui/autocomplete/VariableCompletion.java +++ b/src/org/fife/ui/autocomplete/VariableCompletion.java @@ -59,7 +59,7 @@ public class VariableCompletion extends AbstractCompletion { // Add the return type if applicable (C macros like NULL have no type). if (type!=null) { - sb.append(type); + appendPossibleDataType(sb, type); sb.append(' '); } @@ -71,6 +71,22 @@ public class VariableCompletion extends AbstractCompletion { } + protected void appendPossibleDataType(StringBuffer sb, String type) { + if (type!=null) { + ProceduralLanguageCompletionProvider p = + (ProceduralLanguageCompletionProvider)getProvider(); + String dataTypeFG = p.isDataType(type); + if (dataTypeFG!=null) { + sb.append("<font color=\"").append(dataTypeFG).append("\">"); + } + sb.append(type); + if (dataTypeFG!=null) { + sb.append("</font>"); + } + } + } + + /** * Returns where this variable is defined. * -- 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

