This is an automated email from the git hooks/post-receive script. ben pushed a commit to branch master in repository autocomplete.
commit beb4751a625aa7ea9dd314aa32ae097f39a9da73 Author: bobbylight <[email protected]> Date: Thu Dec 16 23:51:02 2010 +0000 Improvements to parameter completion choices. Keyboard shortcuts (escape, enter, tab) should now mimic Eclipse when param completion suggestion window is visible. --- .../ParameterizedCompletionChoicesWindow.java | 41 +++++-- .../ParameterizedCompletionDescriptionToolTip.java | 129 +++++++++++++++----- 2 files changed, 127 insertions(+), 43 deletions(-) diff --git a/src/org/fife/ui/autocomplete/ParameterizedCompletionChoicesWindow.java b/src/org/fife/ui/autocomplete/ParameterizedCompletionChoicesWindow.java index 6914879..c1f7783 100644 --- a/src/org/fife/ui/autocomplete/ParameterizedCompletionChoicesWindow.java +++ b/src/org/fife/ui/autocomplete/ParameterizedCompletionChoicesWindow.java @@ -99,6 +99,17 @@ public class ParameterizedCompletionChoicesWindow extends JWindow { /** + * Returns the selected value. + * + * @return The selected value, or <code>null</code> if nothing is + * selected. + */ + public String getSelectedChoice() { + return (String)list.getSelectedValue(); + } + + + /** * Changes the selected index. * * @param amount The amount by which to change the selected index. @@ -187,9 +198,10 @@ public class ParameterizedCompletionChoicesWindow extends JWindow { * @param param The index of the parameter the caret is currently in. * This may be <code>-1</code> if not in a parameter (i.e., on * the comma between parameters). - * @param alreadyEntered Text in the parameter before the dot. + * @param prefix Text in the parameter before the dot. This may + * be <code>null</code> to represent the empty string. */ - public void setParameter(int param, String alreadyEntered) { + public void setParameter(int param, String prefix) { model.clear(); @@ -198,7 +210,8 @@ public class ParameterizedCompletionChoicesWindow extends JWindow { List choices = (List)choicesListList.get(param); for (Iterator i=choices.iterator(); i.hasNext(); ) { String choice = (String)i.next(); - if (Util.startsWithIgnoreCase(choice, alreadyEntered)) { + if (prefix==null || + Util.startsWithIgnoreCase(choice, prefix)) { model.addElement(choice); } } @@ -206,7 +219,17 @@ public class ParameterizedCompletionChoicesWindow extends JWindow { int visibleRowCount = Math.min(model.size(), 10); list.setVisibleRowCount(visibleRowCount); - pack(); + // Toggle visibility, if necessary. + if (visibleRowCount==0 && isVisible()) { + setVisible(false); + } + else if (visibleRowCount>0) { + pack(); + list.setSelectedIndex(0); + if (!isVisible()) { + setVisible(true); + } + } } @@ -219,17 +242,13 @@ public class ParameterizedCompletionChoicesWindow extends JWindow { * @param visible Whether this window should be visible. */ public void setVisible(boolean visible) { - if (visible!=isVisible()) { - - if (visible) { - + // i.e. if no possibilities matched what's been typed + if (visible && list.getVisibleRowCount()==0) { + return; } - super.setVisible(visible); - } - } diff --git a/src/org/fife/ui/autocomplete/ParameterizedCompletionDescriptionToolTip.java b/src/org/fife/ui/autocomplete/ParameterizedCompletionDescriptionToolTip.java index c03d698..e73353f 100644 --- a/src/org/fife/ui/autocomplete/ParameterizedCompletionDescriptionToolTip.java +++ b/src/org/fife/ui/autocomplete/ParameterizedCompletionDescriptionToolTip.java @@ -120,7 +120,7 @@ class ParameterizedCompletionDescriptionToolTip { * {@link #paramChoicesWindow} is non-<code>null</code>, this is used to * determine what parameter choices to actually show. */ - private String paramAlreadyEntered; + private String paramPrefix; /** * The currently "selected" parameter in the displayed text. @@ -201,12 +201,13 @@ class ParameterizedCompletionDescriptionToolTip { /** - * Returns the starting offset of the current parameter. + * Returns the highlight of the current parameter. * - * @return The current parameter's starting offset, or <code>-1</code> if + * @return The current parameter's highlight, or <code>null</code> if * the caret is not in a parameter's bounds. + * @see #getCurrentParameterStartOffset() */ - private int getCurrentParameterStartOffset() { + private Highlight getCurrentParameterHighlight() { JTextComponent tc = ac.getTextComponent(); int dot = tc.getCaretPosition(); @@ -218,15 +219,28 @@ class ParameterizedCompletionDescriptionToolTip { for (int i=0; i<paramHighlights.size(); i++) { Highlight h = (Highlight)paramHighlights.get(i); if (dot>=h.getStartOffset() && dot<h.getEndOffset()) { - return h.getStartOffset() + 1; + return h; } } - return -1; + return null; } + /** + * Returns the starting offset of the current parameter. + * + * @return The current parameter's starting offset, or <code>-1</code> if + * the caret is not in a parameter's bounds. + * @see #getCurrentParameterHighlight() + */ + private int getCurrentParameterStartOffset() { + Highlight h = getCurrentParameterHighlight(); + return h!=null ? h.getStartOffset()+1 : -1; + } + + private List getParameterHighlights() { List paramHighlights = new ArrayList(1); JTextComponent tc = ac.getTextComponent(); @@ -367,21 +381,28 @@ class ParameterizedCompletionDescriptionToolTip { int selStart = tc.getSelectionStart()-1; // Workaround for Java Highlight issues. Highlight currentPrev = null; int pos = 0; - Highlighter h = tc.getHighlighter(); - Highlight[] highlights = h.getHighlights(); - for (int i=0; i<highlights.length; i++) { - Highlight hl = highlights[i]; - if (hl.getPainter()==p) { // Only way to identify our own highlights - if (currentPrev==null || currentPrev.getStartOffset()>=dot || - (hl.getStartOffset()<selStart && - hl.getStartOffset()>currentPrev.getStartOffset())) { - currentPrev = hl; - pos = i; - } + List highlights = getParameterHighlights(); + + for (int i=0; i<highlights.size(); i++) { + Highlight h = (Highlight)highlights.get(i); + if (currentPrev==null || currentPrev.getStartOffset()>=dot || + (h.getStartOffset()<selStart && + h.getStartOffset()>currentPrev.getStartOffset())) { + currentPrev = h; + pos = i; } } - if (currentPrev!=null && dot>currentPrev.getStartOffset()) { + // Loop back from param 0 to last param. + if (pos==0 && lastSelectedParam==0 && highlights.size()>1) { + pos = highlights.size() - 1; + currentPrev = (Highlight)highlights.get(pos); + // "+1" is a workaround for Java Highlight issues. + tc.setSelectionStart(currentPrev.getStartOffset()+1); + tc.setSelectionEnd(currentPrev.getEndOffset()); + updateText(pos); + } + else if (currentPrev!=null && dot>currentPrev.getStartOffset()) { // "+1" is a workaround for Java Highlight issues. tc.setSelectionStart(currentPrev.getStartOffset()+1); tc.setSelectionEnd(currentPrev.getEndOffset()); @@ -400,12 +421,12 @@ class ParameterizedCompletionDescriptionToolTip { */ private void prepareParamChoicesWindow() { + // If this window was set to null, the user pressed Escape to hide it if (paramChoicesWindow!=null) { int offs = getCurrentParameterStartOffset(); if (offs==-1) { paramChoicesWindow.setVisible(false); - paramChoicesWindow = null; return; } @@ -422,9 +443,8 @@ class ParameterizedCompletionDescriptionToolTip { ble.printStackTrace(); } - paramChoicesWindow.setParameter(lastSelectedParam, - paramAlreadyEntered); - paramChoicesWindow.setVisible(true); + // Toggles visibility, if necessary. + paramChoicesWindow.setParameter(lastSelectedParam, paramPrefix); } @@ -497,6 +517,10 @@ class ParameterizedCompletionDescriptionToolTip { if (visible) { listener.install(tc, addParamListStart); + // First time through, we'll need to create this window. + if (paramChoicesWindow==null) { + paramChoicesWindow = createParamChoicesWindow(); + } prepareParamChoicesWindow(); } else { @@ -505,6 +529,7 @@ class ParameterizedCompletionDescriptionToolTip { tooltip.setVisible(visible); if (paramChoicesWindow!=null) { + // Only really needed to hide the window (i.e. visible==false) paramChoicesWindow.setVisible(visible); } @@ -571,23 +596,29 @@ class ParameterizedCompletionDescriptionToolTip { private boolean updateText() { JTextComponent tc = ac.getTextComponent(); - int dot = tc.getCaretPosition(); - if (dot>0) { - dot--; // Workaround for Java Highlight issues - } + int dot = tc.getSelectionStart(); + int mark = tc.getSelectionEnd(); int index = -1; + paramPrefix = null; List paramHighlights = getParameterHighlights(); for (int i=0; i<paramHighlights.size(); i++) { Highlight h = (Highlight)paramHighlights.get(i); // "+1" because of param hack - see OutlineHighlightPainter int start = h.getStartOffset()+1; - if (dot>=start && dot<h.getEndOffset()) { + if (dot>=start && dot<=h.getEndOffset()) { try { - paramAlreadyEntered = tc.getText(start, dot-start); + // All text selected => offer all suggestions + if (dot==start && mark==h.getEndOffset()) { + paramPrefix = null; + } + // Not everything selected => use prefix before selection + else { + paramPrefix = tc.getText(start, dot-start); + } } catch (BadLocationException ble) { ble.printStackTrace(); - paramAlreadyEntered = null; + paramPrefix = null; } index = i; break; @@ -669,9 +700,33 @@ class ParameterizedCompletionDescriptionToolTip { private class GotoEndAction extends AbstractAction { public void actionPerformed(ActionEvent e) { + + // If the param choices window is visible and something is chosen, + // replace the parameter with it and move to the next one. + if (paramChoicesWindow!=null && paramChoicesWindow.isVisible()) { + String choice = paramChoicesWindow.getSelectedChoice(); + if (choice!=null) { + JTextComponent tc = ac.getTextComponent(); + Highlight h = getCurrentParameterHighlight(); + if (h!=null) { + // "+1" is a workaround for Java Highlight issues. + tc.setSelectionStart(h.getStartOffset()+1); + tc.setSelectionEnd(h.getEndOffset()); + tc.replaceSelection(choice); + moveToNextParam(); + } + else { + UIManager.getLookAndFeel().provideErrorFeedback(tc); + } + return; + } + } + + // Otherwise, just move to the end. JTextComponent tc = ac.getTextComponent(); tc.setCaretPosition(maxPos.getOffset()); setVisible(false, false); + } } @@ -774,7 +829,17 @@ class ParameterizedCompletionDescriptionToolTip { private class HideAction extends AbstractAction { public void actionPerformed(ActionEvent e) { - setVisible(false, false); + // On first escape press, if the param choices window is visible, + // just remove it, but keep ability to tab through params. If + // param choices window isn't visible, or second escape press, + // exit tabbing through params entirely. + if (paramChoicesWindow!=null && paramChoicesWindow.isVisible()) { + paramChoicesWindow.setVisible(false); + paramChoicesWindow = null; + } + else { + setVisible(false, false); + } } } @@ -804,8 +869,8 @@ class ParameterizedCompletionDescriptionToolTip { setVisible(false, false); return; } - boolean updated = updateText(); - if (updated) { + /*boolean updated = */updateText(); + if (tooltip.isVisible()) { prepareParamChoicesWindow(); } } -- 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

