This is an automated email from the git hooks/post-receive script. ben pushed a commit to branch master in repository autocomplete.
commit 60bb8d718dc20858f800323c2a10f59c89965254 Author: bobbylight <[email protected]> Date: Sat May 12 04:20:46 2012 +0000 JavaLanguageSupport: Better support for links in Javadoc. Still a little work to do. --- .../ui/autocomplete/AutoCompleteDescWindow.java | 178 +++++++++++++++----- .../fife/ui/autocomplete/DescWindowCallback.java | 35 ++++ .../fife/ui/autocomplete/ExternalURLHandler.java | 17 +- 3 files changed, 185 insertions(+), 45 deletions(-) diff --git a/src/org/fife/ui/autocomplete/AutoCompleteDescWindow.java b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow.java index 2c3fed0..0fac65e 100644 --- a/src/org/fife/ui/autocomplete/AutoCompleteDescWindow.java +++ b/src/org/fife/ui/autocomplete/AutoCompleteDescWindow.java @@ -16,14 +16,12 @@ import java.awt.Graphics; import java.awt.Insets; import java.awt.Window; import java.awt.event.ActionEvent; -import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.ResourceBundle; -import javax.imageio.ImageIO; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.BorderFactory; @@ -53,7 +51,8 @@ import org.fife.ui.rsyntaxtextarea.PopupWindowDecorator; * @author Robert Futrell * @version 1.0 */ -class AutoCompleteDescWindow extends JWindow implements HyperlinkListener { +class AutoCompleteDescWindow extends JWindow implements HyperlinkListener, + DescWindowCallback { /** * The parent AutoCompletion instance. @@ -208,10 +207,10 @@ class AutoCompleteDescWindow extends JWindow implements HyperlinkListener { /** * Sets the currently displayed description and updates the history. * - * @param html The new description. + * @param historyItem The item to add to the history. */ - private void addToHistory(String html) { - history.add(++historyPos, html); + private void addToHistory(HistoryEntry historyItem) { + history.add(++historyPos, historyItem); clearHistoryAfterCurrentPos(); setActionStates(); } @@ -280,14 +279,20 @@ class AutoCompleteDescWindow extends JWindow implements HyperlinkListener { HyperlinkEvent.EventType type = e.getEventType(); if (type.equals(HyperlinkEvent.EventType.ACTIVATED)) { + + // Custom hyperlink handler for this completion type + ExternalURLHandler handler = ac.getExternalURLHandler(); + if (handler!=null) { + HistoryEntry current = (HistoryEntry)history. + get(historyPos); + handler.urlClicked(e, current.completion, this); + return; + } + + // No custom handler... URL url = e.getURL(); if (url!=null) { - ExternalURLHandler handler = ac.getExternalURLHandler(); - if (handler!=null) { - handler.urlClicked(url); - return; - } - // No handler - try loading in external browser (Java 6+ only). + // Try loading in external browser (Java 6+ only). try { Util.browse(new URI(url.toString())); } catch (/*IO*/URISyntaxException ioe) { @@ -315,6 +320,7 @@ class AutoCompleteDescWindow extends JWindow implements HyperlinkListener { } } } + } } @@ -324,8 +330,25 @@ class AutoCompleteDescWindow extends JWindow implements HyperlinkListener { * Enables or disables the back and forward actions as appropriate. */ private void setActionStates() { - backAction.setEnabled(historyPos>0); - forwardAction.setEnabled(historyPos>-1 && historyPos<history.size()-1); + // TODO: Localize this text! + String desc = null; + if (historyPos>0) { + backAction.setEnabled(true); + desc = "Back to " + history.get(historyPos-1); + } + else { + backAction.setEnabled(false); + } + backAction.putValue(Action.SHORT_DESCRIPTION, desc); + if (historyPos>-1 && historyPos<history.size()-1) { + forwardAction.setEnabled(true); + desc = "Forward to " + history.get(historyPos+1); + } + else { + forwardAction.setEnabled(false); + desc = null; + } + forwardAction.putValue(Action.SHORT_DESCRIPTION, desc); } @@ -348,26 +371,51 @@ class AutoCompleteDescWindow extends JWindow implements HyperlinkListener { * (as opposed to clearing it and starting anew). */ protected void setDescriptionFor(Completion item, boolean addToHistory) { + setDescriptionFor(item, null, addToHistory); + } + + + /** + * Sets the description displayed in this window. + * + * @param item The item whose description you want to display. + * @parma anchor The anchor to jump to, or <code>null</code> if none. + * @param addToHistory Whether to add this page to the page history + * (as opposed to clearing it and starting anew). + */ + protected void setDescriptionFor(Completion item, String anchor, + boolean addToHistory) { timer.stop(); - timerAction.setCompletion(item, addToHistory); + timerAction.setCompletion(item, anchor, addToHistory); timer.start(); } - private void setDisplayedDesc(String desc, boolean addToHistory) { + private void setDisplayedDesc(Completion completion, final String anchor, + boolean addToHistory) { + String desc = completion==null ? null : completion.getSummary(); if (desc==null) { desc = "<html><em>" + getString("NoDescAvailable") + "</em>"; } descArea.setText(desc); - descArea.setCaretPosition(0); // In case of scrolling + if (anchor!=null) { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + descArea.scrollToReference(anchor); + } + }); + } + else { + descArea.setCaretPosition(0); // In case of scrolling + } if (!addToHistory) { // Remove everything first if this is going to be the only // thing in history. clearHistory(); } - addToHistory(desc); + addToHistory(new HistoryEntry(completion, desc, null)); } @@ -382,6 +430,19 @@ class AutoCompleteDescWindow extends JWindow implements HyperlinkListener { super.setVisible(visible); } + + /** + * Callback for custom <code>ExternalURLHandler</code>s. + * + * @param completion The completion to display. + * @param anchor The anchor in the HTML to jump to, or <code>null</code> + * if none. + */ + public void showSummaryFor(Completion completion, String anchor) { + setDescriptionFor(completion, anchor, true); + } + + /** * Called by the parent completion popup window the LookAndFeel is updated. */ @@ -396,23 +457,54 @@ class AutoCompleteDescWindow extends JWindow implements HyperlinkListener { /** + * A completion and its cached summary text. + */ + private static class HistoryEntry { + + public Completion completion; + public String summary; + public String anchor; + + public HistoryEntry(Completion completion, String summary, + String anchor) { + this.completion = completion; + this.summary = summary; + this.anchor = anchor; + } + + /** + * Overridden to display a short name for the completion, since it's + * used in the tool tips for the "back" and "forward" buttons. + * + * @return A string representation of this history entry. + */ + public String toString() { + return completion.getInputText(); + } + + } + + + /** * Action that actually updates the summary text displayed. */ private class TimerAction extends AbstractAction { private Completion completion; + private String anchor; private boolean addToHistory; /** * Called when the timer is fired. */ public void actionPerformed(ActionEvent e) { - String desc = completion==null ? null : completion.getSummary(); - setDisplayedDesc(desc, addToHistory); + setDisplayedDesc(completion, anchor, addToHistory); } - public void setCompletion(Completion c, boolean addToHistory) { + public void setCompletion(Completion c, String anchor, + boolean addToHistory) { this.completion = c; + this.anchor = anchor; this.addToHistory = addToHistory; } @@ -428,20 +520,22 @@ class AutoCompleteDescWindow extends JWindow implements HyperlinkListener { String img = "org/fife/ui/autocomplete/arrow_" + (ltr ? "left.png" : "right.png"); ClassLoader cl = getClass().getClassLoader(); - URL url = cl.getResource(img); - try { - Icon icon = new ImageIcon(ImageIO.read(url)); - putValue(Action.SMALL_ICON, icon); - } catch (IOException ioe) { // Never happens - ioe.printStackTrace(); - putValue(Action.SHORT_DESCRIPTION, "Back"); - } + Icon icon = new ImageIcon(cl.getResource(img)); + putValue(Action.SMALL_ICON, icon); } public void actionPerformed(ActionEvent e) { if (historyPos>0) { - descArea.setText((String)history.get(--historyPos)); - descArea.setCaretPosition(0); + HistoryEntry pair = (HistoryEntry)history. + get(--historyPos); + descArea.setText(pair.summary); + if (pair.anchor!=null) { + System.out.println("Scrolling to: " + pair.anchor); + descArea.scrollToReference(pair.anchor); + } + else { + descArea.setCaretPosition(0); + } setActionStates(); } } @@ -458,20 +552,22 @@ class AutoCompleteDescWindow extends JWindow implements HyperlinkListener { String img = "org/fife/ui/autocomplete/arrow_" + (ltr ? "right.png" : "left.png"); ClassLoader cl = getClass().getClassLoader(); - URL url = cl.getResource(img); - try { - Icon icon = new ImageIcon(ImageIO.read(url)); - putValue(Action.SMALL_ICON, icon); - } catch (IOException ioe) { // Never happens - ioe.printStackTrace(); - putValue(Action.SHORT_DESCRIPTION, "Forward"); - } + Icon icon = new ImageIcon(cl.getResource(img)); + putValue(Action.SMALL_ICON, icon); } public void actionPerformed(ActionEvent e) { if (history!=null && historyPos<history.size()-1) { - descArea.setText((String)history.get(++historyPos)); - descArea.setCaretPosition(0); + HistoryEntry pair = (HistoryEntry)history. + get(++historyPos); + descArea.setText(pair.summary); + if (pair.anchor!=null) { + System.out.println("Scrolling to: " + pair.anchor); + descArea.scrollToReference(pair.anchor); + } + else { + descArea.setCaretPosition(0); + } setActionStates(); } } diff --git a/src/org/fife/ui/autocomplete/DescWindowCallback.java b/src/org/fife/ui/autocomplete/DescWindowCallback.java new file mode 100644 index 0000000..37334ca --- /dev/null +++ b/src/org/fife/ui/autocomplete/DescWindowCallback.java @@ -0,0 +1,35 @@ +/* + * 05/11/2012 + * + * Copyright (C) 2012 Robert Futrell + * robert_futrell at users.sourceforge.net + * http://fifesoft.com/rsyntaxtextarea + * + * This library is distributed under a modified BSD license. See the included + * RSTALanguageSupport.License.txt file for details. + */ +package org.fife.ui.autocomplete; + + +/** + * Passed to {@link ExternalURLHandler}s as a way for them to display a summary + * for a new completion in response to a link event. + * + * @author Robert Futrell + * @version 1.0 + * @see ExternalURLHandler + */ +public interface DescWindowCallback { + + + /** + * Callback allowing a new code completion's description to be displayed + * in the description window. + * + * @param completion The new completion. + * @param anchor The anchor to scroll to, or <code>null</code> if none. + */ + public void showSummaryFor(Completion completion, String anchor); + + +} \ No newline at end of file diff --git a/src/org/fife/ui/autocomplete/ExternalURLHandler.java b/src/org/fife/ui/autocomplete/ExternalURLHandler.java index b7c8622..08d4a50 100644 --- a/src/org/fife/ui/autocomplete/ExternalURLHandler.java +++ b/src/org/fife/ui/autocomplete/ExternalURLHandler.java @@ -9,7 +9,7 @@ */ package org.fife.ui.autocomplete; -import java.net.URL; +import javax.swing.event.HyperlinkEvent; /** @@ -17,7 +17,12 @@ import java.net.URL; * If no handler is installed, and if running in Java 6, the system default * web browser is used to open the URL. If not running Java 6, nothing will * happen. If you want browser support for pre-Java 6 JRE's, you will need - * to register one of these callbacks on your {@link AutoCompletion}. + * to register one of these callbacks on your {@link AutoCompletion}, and + * open the URL in a web browser yourself.<p> + * + * Alternatively, folks implementing robust code completion support for a + * language might install an <code>ExternalURLHandler</code> to handle + * navigating through linked documentation of objects, functions, etc. * * @author Robert Futrell * @version 1.0 @@ -29,9 +34,13 @@ public interface ExternalURLHandler { /** * Called when an external URL is clicked in the description window. * - * @param url The URL. + * @param e The event containing the hyperlink clicked. + * @param c The completion currently being displayed. + * @param callback Allows you to display new content in the description + * window. */ - public void urlClicked(URL url); + public void urlClicked(HyperlinkEvent e, Completion c, + DescWindowCallback callback); } \ 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

