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

ben pushed a commit to branch master
in repository autocomplete.

commit a9fd193f3808b1f94aa0432318c6ec239e6d2173
Author: bobbylight <[email protected]>
Date:   Wed Apr 28 13:19:13 2010 +0000

    Adding ActionScript syntax highlighting.
    Improved performance of auto-completion list cell renderer for huge 
completion lists.
    RSTALanguageSupport demo now allows switching of LAF's at runtime.
---
 .../ui/autocomplete/AutoCompletePopupWindow.java   |    9 +-
 src/org/fife/ui/autocomplete/AutoCompletion.java   |   16 +-
 .../ui/autocomplete/CompletionCellRenderer.java    |   38 ++--
 src/org/fife/ui/autocomplete/FastListUI.java       |  200 ++++++++++++++++++++
 4 files changed, 245 insertions(+), 18 deletions(-)

diff --git a/src/org/fife/ui/autocomplete/AutoCompletePopupWindow.java 
b/src/org/fife/ui/autocomplete/AutoCompletePopupWindow.java
index a758582..4150edb 100644
--- a/src/org/fife/ui/autocomplete/AutoCompletePopupWindow.java
+++ b/src/org/fife/ui/autocomplete/AutoCompletePopupWindow.java
@@ -49,6 +49,7 @@ import javax.swing.event.CaretEvent;
 import javax.swing.event.CaretListener;
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
+import javax.swing.plaf.ListUI;
 import javax.swing.text.Caret;
 import javax.swing.text.JTextComponent;
 
@@ -140,7 +141,13 @@ class AutoCompletePopupWindow extends JWindow implements 
CaretListener,
 
                this.ac = ac;
                model = new CompletionListModel();
-               list = new JList(model);
+               list = new JList(model) {
+                       public void setUI(ListUI ui) {
+                               // Keep our special UI, no matter what
+                               super.setUI(new FastListUI());
+                       }
+               };
+
                list.setCellRenderer(new DelegatingCellRenderer());
                list.addListSelectionListener(this);
                list.addMouseListener(this);
diff --git a/src/org/fife/ui/autocomplete/AutoCompletion.java 
b/src/org/fife/ui/autocomplete/AutoCompletion.java
index 5a3663c..dd8ae14 100644
--- a/src/org/fife/ui/autocomplete/AutoCompletion.java
+++ b/src/org/fife/ui/autocomplete/AutoCompletion.java
@@ -24,6 +24,8 @@ package org.fife.ui.autocomplete;
 
 import java.awt.*;
 import java.awt.event.*;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
 import java.util.List;
 import javax.swing.*;
 import javax.swing.text.*;
@@ -193,12 +195,24 @@ public class AutoCompletion implements HierarchyListener {
         *        <code>null</code>.
         */
        public AutoCompletion(CompletionProvider provider) {
+
                setCompletionProvider(provider);
                setTriggerKey(getDefaultTriggerKey());
                setAutoCompleteEnabled(true);
                setAutoCompleteSingleChoices(true);
                setShowDescWindow(false);
                parentWindowListener = new Listener();
+
+               // Automatically update LAF of popup windows on LookAndFeel 
changes
+               UIManager.addPropertyChangeListener(new 
PropertyChangeListener() {
+                       public void propertyChange(PropertyChangeEvent e) {
+                               String name = e.getPropertyName();
+                               if (name.equals("lookAndFeel")) {
+                                       updateUI();
+                               }
+                       }
+               });
+
        }
 
 
@@ -913,7 +927,7 @@ try {
         * this method as appropriate if they support changing the LookAndFeel
         * at runtime.
         */
-       public void updateUI() {
+       private void updateUI() {
                if (popupWindow!=null) {
                        popupWindow.updateUI();
                }
diff --git a/src/org/fife/ui/autocomplete/CompletionCellRenderer.java 
b/src/org/fife/ui/autocomplete/CompletionCellRenderer.java
index dea8082..fa255f6 100644
--- a/src/org/fife/ui/autocomplete/CompletionCellRenderer.java
+++ b/src/org/fife/ui/autocomplete/CompletionCellRenderer.java
@@ -48,29 +48,37 @@ import javax.swing.JList;
 public class CompletionCellRenderer extends DefaultListCellRenderer {
 
        /**
-        * The alternating background color.
+        * The alternating background color, or <code>null</code> if alternating
+        * row colors should not be used.
         */
        private Color altBG;
 
        /**
-        * The font to use when rendering items.
+        * The font to use when rendering items, or <code>null</code> if the
+        * list's default font should be used.
         */
        private Font font;
 
+       /**
+        * Keeps the HTML descriptions from "wrapping" in the list, which cuts 
off
+        * words.
+        */
+       private static final String PREFIX = "<html><nobr>";
+
 
        /**
         * Constructor.
         */
        public CompletionCellRenderer() {
-               setDisplayFont(new Font("Monospaced", Font.PLAIN, 12));
-               setAlternateBackground(new Color(240,240,240));
+               //setDisplayFont(new Font("Monospaced", Font.PLAIN, 12));
+               //setAlternateBackground(new Color(0xf4f4f4));
        }
 
 
        /**
         * Returns the background color to use on alternating lines.
         *
-        * @return The altnernate background color.  If this is 
<code>null</code>,
+        * @return The alternate background color.  If this is 
<code>null</code>,
         *         alternating colors are not used.
         * @see #setAlternateBackground(Color)
         */
@@ -104,7 +112,9 @@ public class CompletionCellRenderer extends 
DefaultListCellRenderer {
                                                int index, boolean selected, 
boolean hasFocus) {
 
                
super.getListCellRendererComponent(list,value,index,selected,hasFocus);
-               setFont(font); // Overrides super's setFont(list.getFont()).
+               if (font!=null) {
+                       setFont(font); // Overrides super's 
setFont(list.getFont()).
+               }
 
                if (value instanceof FunctionCompletion) {
                        FunctionCompletion fc = (FunctionCompletion)value;
@@ -144,9 +154,8 @@ public class CompletionCellRenderer extends 
DefaultListCellRenderer {
        protected void prepareForFunctionCompletion(JList list,
                FunctionCompletion fc, int index, boolean selected, boolean 
hasFocus) {
 
-               StringBuffer sb = new StringBuffer("<html><b>");
+               StringBuffer sb = new StringBuffer(PREFIX);
                sb.append(fc.getName());
-               sb.append("</b>");
 
                sb.append(fc.getProvider().getParameterListStart());
                int paramCount = fc.getParamCount();
@@ -176,7 +185,7 @@ public class CompletionCellRenderer extends 
DefaultListCellRenderer {
                sb.append(fc.getProvider().getParameterListEnd());
                sb.append(" : ");
                if (!selected) {
-                       sb.append("<font color='#a0a0ff'>");
+                       sb.append("<font color='#808080'>");
                }
                sb.append(fc.getType());
                if (!selected) {
@@ -200,9 +209,8 @@ public class CompletionCellRenderer extends 
DefaultListCellRenderer {
        protected void prepareForMarkupTagCompletion(JList list,
                MarkupTagCompletion mc, int index, boolean selected, boolean 
hasFocus) {
 
-               StringBuffer sb = new StringBuffer("<html><b>");
+               StringBuffer sb = new StringBuffer(PREFIX);
                sb.append(mc.getName());
-               sb.append("</b>");
 
                setText(sb.toString());
 
@@ -222,9 +230,8 @@ public class CompletionCellRenderer extends 
DefaultListCellRenderer {
        protected void prepareForOtherCompletion(JList list,
                Completion c, int index, boolean selected, boolean hasFocus) {
 
-               StringBuffer sb = new StringBuffer("<html><b>");
+               StringBuffer sb = new StringBuffer(PREFIX);
                sb.append(c.getInputText());
-               sb.append("</b>");
 
                setText(sb.toString());
 
@@ -243,14 +250,13 @@ public class CompletionCellRenderer extends 
DefaultListCellRenderer {
        protected void prepareForVariableCompletion(JList list,
                VariableCompletion vc, int index, boolean selected, boolean 
hasFocus) {
 
-               StringBuffer sb = new StringBuffer("<html><b>");
+               StringBuffer sb = new StringBuffer(PREFIX);
                sb.append(vc.getName());
-               sb.append("</b>");
 
                if (vc.getType()!=null) {
                        sb.append(" : ");
                        if (!selected) {
-                               sb.append("<font color='#a0a0ff'>");
+                               sb.append("<font color='#808080'>");
                        }
                        sb.append(vc.getType());
                        if (!selected) {
diff --git a/src/org/fife/ui/autocomplete/FastListUI.java 
b/src/org/fife/ui/autocomplete/FastListUI.java
new file mode 100644
index 0000000..14d6a80
--- /dev/null
+++ b/src/org/fife/ui/autocomplete/FastListUI.java
@@ -0,0 +1,200 @@
+/*
+ * 04/26/2010
+ *
+ * FastListUI.java - A JList UI implementation that computes the preferred size
+ * of all cells really fast, to facilitate lists of possibly thousands of items
+ * rendered with HTML, which is slow with BasicListUI extensions.
+ * Copyright (C) 2010 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.awt.Color;
+import java.awt.Dimension;
+import java.awt.SystemColor;
+import javax.swing.JViewport;
+import javax.swing.ListCellRenderer;
+import javax.swing.ListModel;
+import javax.swing.UIManager;
+import javax.swing.plaf.basic.BasicListUI;
+
+
+/**
+ * A custom list UI, used by the completion choices list.  If the number of
+ * completion choices is "large," it does a fast estimate of the preferred
+ * width and height of list items.  This allows HTML renderers to be used (such
+ * as {@link CompletionCellRenderer}), with thousands of completion choices,
+ * with no performance penalty.  With standard BasicListUI subclasses, this can
+ * cause very poor performance <b>each time</b> the list is displayed, which
+ * is bad for lists that are repeatedly hidden and re-displayed, such as
+ * completion choices.  This is all becasue the calculation to get the
+ * preferred size of each list item, when it is displayed with HTML, is slow.
+ *
+ * @author Robert Futrell
+ * @version 1.0
+ */
+class FastListUI extends BasicListUI {
+
+       /**
+        * Whether the selection background was overridden (usually because of
+        * Nimbus) so we know to manually uninstall the color we installed.
+        */
+       private boolean overriddenBackground;
+
+       /**
+        * Whether the selection foreground was overridden (usually because of
+        * Nimbus) so we know to manually uninstall the color we installed.
+        */
+       private boolean overriddenForeground;
+
+       /**
+        * If there are more than this many completions in a single list, this
+        * UI will estimate the cell width and height needed for each item 
instead
+        * of computing it, for performance reasons.
+        */
+       private static final int ESTIMATION_THRESHOLD           = 200;
+
+
+       private Color determineSelectionBackground() {
+               Color c = UIManager.getColor("List.selectionBackground");
+               if (c==null) {
+                       c = UIManager.getColor("nimbusSelectionBackground");
+                       if (c==null) { // Not Nimbus, but still need a value - 
fallback
+                               c = UIManager.getColor("textHighlight");
+                               if (c==null) {
+                                       c = SystemColor.textHighlight;
+                               }
+                       }
+               }
+
+               // Nimbus unfortunately requires a Color, not a 
ColorUIResource, for
+               // the background override to work. This causes this color to 
"stick"
+               // even if the LAF is changed to something else later.  "c" 
here may
+               // actually be a ColorUIResource
+               return new Color(c.getRGB());//new ColorUIResource(c);
+
+       }
+
+
+       private Color determineSelectionForeground() {
+               Color c = UIManager.getColor("List.selectionForeground");
+               if (c==null) {
+                       c = UIManager.getColor("nimbusSelectedText");
+                       if (c==null) { // Not Nimbus, but still need a value - 
fallback
+                               c = UIManager.getColor("textHighlightText");
+                               if (c==null) {
+                                       c = SystemColor.textHighlightText;
+                               }
+                       }
+               }
+               // Nimbus unfortunately requires Color, not ColorUIResource, 
and "c"
+               // may actually be a ColorUIResource
+               return new Color(c.getRGB());
+       }
+
+
+       /**
+        * Overridden to ensure we have selection background/foreground colors
+        * defined, even if we're in some weirdo LAF such as Nimbus which 
doesn't
+        * define them.  Since FastListUI extends BasicListUI, we need these 
values
+        * to be defined.
+        */
+       protected void installDefaults() {
+
+               super.installDefaults();
+
+               if (list.getSelectionBackground()==null) {
+                       
list.setSelectionBackground(determineSelectionBackground());
+                       overriddenBackground = true;
+               }
+
+               if (list.getSelectionForeground()==null) {
+                       
list.setSelectionForeground(determineSelectionForeground());
+                       overriddenForeground = true;
+               }
+       }
+
+
+       /**
+        * Overridden to work around a Nimbus issue.
+        */
+       protected void uninstallDefaults() {
+
+               super.uninstallDefaults();
+
+               if (overriddenBackground) {
+                       list.setSelectionBackground(null);
+               }
+
+               if (overriddenForeground) {
+                       list.setSelectionForeground(null);
+               }
+
+       }
+
+
+       /**
+        * Recalculates the cell width and height of each cell in the list.  
This
+        * method is overridden to do a fast estimation if the completion list 
is
+        * too long, to improve performance for lists with huge amounts of
+        * completions.
+        */
+       protected void updateLayoutState() {
+
+               ListModel model = list.getModel();
+               int itemCount = model.getSize();
+
+               // If the item count is small enough to run fast on practically 
all
+               // machines, go ahead and use the super implementation to 
determine
+               // the optimal cell sizes.
+               if (itemCount<ESTIMATION_THRESHOLD) {
+                       super.updateLayoutState();
+                       return;
+               }
+
+               // Otherwise, assume all cells are the same height as the first 
cell,
+               // and estimate the necessary width.
+
+               ListCellRenderer renderer = list.getCellRenderer();
+
+               cellWidth = list.getWidth();
+               if (list.getParent() instanceof JViewport) { // Always true for 
us
+                       cellWidth = list.getParent().getWidth();
+               }
+               System.out.println(cellWidth);
+
+               // We're getting a fixed cell height for all cells
+               cellHeights = null;
+
+               if (renderer!=null && itemCount>0) {
+                       Object value = model.getElementAt(0);
+                       java.awt.Component c = 
renderer.getListCellRendererComponent(list,
+                                                                               
                value, 0, false, false);
+                       rendererPane.add(c);
+                       Dimension cellSize = c.getPreferredSize();
+                       cellHeight = cellSize.height;
+                       cellWidth = Math.max(cellWidth, cellSize.width);
+               }
+               else {
+                       cellHeight = 20; 
+               }
+
+       }
+
+
+}
\ 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