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

Reply via email to