This is an automated email from the git hooks/post-receive script. ben pushed a commit to branch master in repository autocomplete.
commit ec8217df07b8c30144b8c9f53ded5a3b6f60ffb8 Author: bobbylight <[email protected]> Date: Thu Jan 8 04:10:37 2009 +0000 Enhanced the demo, the CompletionCellRenderer, and added the beginnings of a JarCompletionProvider for Java. --- .classpath | 1 - img/localVar.png | Bin 1026 -> 0 bytes img/method.png | Bin 1024 -> 0 bytes .../ui/autocomplete/AutoCompletePopupWindow.java | 7 +- src/org/fife/ui/autocomplete/AutoCompletion.java | 11 + .../ui/autocomplete/CompletionCellRenderer.java | 45 ++-- .../ui/autocomplete/JarCompletionProvider.java | 274 ++++++++++++++++++++ 7 files changed, 313 insertions(+), 25 deletions(-) diff --git a/.classpath b/.classpath index 3e0eb1d..1208b06 100644 --- a/.classpath +++ b/.classpath @@ -2,7 +2,6 @@ <classpath> <classpathentry kind="src" path="src"/> <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"/> diff --git a/img/localVar.png b/img/localVar.png deleted file mode 100644 index a8e1cf1..0000000 Binary files a/img/localVar.png and /dev/null differ diff --git a/img/method.png b/img/method.png deleted file mode 100644 index 3308b72..0000000 Binary files a/img/method.png and /dev/null differ diff --git a/src/org/fife/ui/autocomplete/AutoCompletePopupWindow.java b/src/org/fife/ui/autocomplete/AutoCompletePopupWindow.java index c232153..6b04b18 100644 --- a/src/org/fife/ui/autocomplete/AutoCompletePopupWindow.java +++ b/src/org/fife/ui/autocomplete/AutoCompletePopupWindow.java @@ -459,8 +459,11 @@ lastLine = -1; unregisterActions(); } super.setVisible(visible); - if (descWindow!=null && ac.getShowDescWindow()) { - descWindow.setVisible(visible); + // Must set descWindow's visibility one way or the other each time, + // because of the way child JWindows' visibility is handled - in + // some ways it's dependent on the parent, in other ways it's not. + if (descWindow!=null) { + descWindow.setVisible(visible && ac.getShowDescWindow()); } } } diff --git a/src/org/fife/ui/autocomplete/AutoCompletion.java b/src/org/fife/ui/autocomplete/AutoCompletion.java index ffa6d37..e2f3677 100644 --- a/src/org/fife/ui/autocomplete/AutoCompletion.java +++ b/src/org/fife/ui/autocomplete/AutoCompletion.java @@ -161,6 +161,16 @@ public class AutoCompletion implements HierarchyListener { /** + * Returns the completion provider. + * + * @return The completion provider. + */ + public CompletionProvider getCompletionProvider() { + return provider; + } + + + /** * Returns the default autocomplete "trigger key" for this OS. For * Windows, for example, it is Ctrl+Space. * @@ -540,6 +550,7 @@ try { * @see #getShowDescWindow() */ public void setShowDescWindow(boolean show) { + hidePopupWindow(); // Needed to force it to take effect showDescWindow = show; } diff --git a/src/org/fife/ui/autocomplete/CompletionCellRenderer.java b/src/org/fife/ui/autocomplete/CompletionCellRenderer.java index 527f546..92401bf 100644 --- a/src/org/fife/ui/autocomplete/CompletionCellRenderer.java +++ b/src/org/fife/ui/autocomplete/CompletionCellRenderer.java @@ -120,7 +120,7 @@ public class CompletionCellRenderer extends DefaultListCellRenderer { } else { Completion c = (Completion)value; - prepareForCompletion(list, c, index, selected, hasFocus); + prepareForOtherCompletion(list, c, index, selected, hasFocus); } if (!selected && (index&1)==0 && altBG!=null) { @@ -133,27 +133,6 @@ public class CompletionCellRenderer extends DefaultListCellRenderer { /** - * Prepares this renderer to display a shorthand completion. - * - * @param list The list of choices being rendered. - * @param c The completion to render. - * @param index The index into <code>list</code> being rendered. - * @param selected Whether the item is selected. - * @param hasFocus Whether the item has focus. - */ - protected void prepareForCompletion(JList list, - Completion c, int index, boolean selected, boolean hasFocus) { - - StringBuffer sb = new StringBuffer("<html><b><em>"); - sb.append(c.getInputText()); - sb.append("</em></b>"); - - setText(sb.toString()); - - } - - - /** * Prepares this renderer to display a function completion. * * @param list The list of choices being rendered. @@ -230,6 +209,28 @@ public class CompletionCellRenderer extends DefaultListCellRenderer { /** + * Prepares this renderer to display a completion not specifically handled + * elsewhere. + * + * @param list The list of choices being rendered. + * @param c The completion to render. + * @param index The index into <code>list</code> being rendered. + * @param selected Whether the item is selected. + * @param hasFocus Whether the item has focus. + */ + protected void prepareForOtherCompletion(JList list, + Completion c, int index, boolean selected, boolean hasFocus) { + + StringBuffer sb = new StringBuffer("<html><b><em>"); + sb.append(c.getInputText()); + sb.append("</em></b>"); + + setText(sb.toString()); + + } + + + /** * Prepares this renderer to display a variable completion. * * @param list The list of choices being rendered. diff --git a/src/org/fife/ui/autocomplete/JarCompletionProvider.java b/src/org/fife/ui/autocomplete/JarCompletionProvider.java new file mode 100644 index 0000000..92a6dfd --- /dev/null +++ b/src/org/fife/ui/autocomplete/JarCompletionProvider.java @@ -0,0 +1,274 @@ +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; + + } + + + /** + * 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 -- 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

