This is an automated email from the git hooks/post-receive script. ben pushed a commit to branch master in repository autocomplete.
commit 2b5c396b961e9c9a7cb3e3ab7d9d4f533033fc27 Author: bobbylight <[email protected]> Date: Fri Jul 30 02:07:29 2010 +0000 Fixed positioning of completion popup windows and parameter assistance windows in multi-monitor environments. --- .../ui/autocomplete/AutoCompletePopupWindow.java | 31 ++++-- .../ParameterizedCompletionDescriptionToolTip.java | 44 +++++---- src/org/fife/ui/autocomplete/Util.java | 103 +++++++++++++------- 3 files changed, 114 insertions(+), 64 deletions(-) diff --git a/src/org/fife/ui/autocomplete/AutoCompletePopupWindow.java b/src/org/fife/ui/autocomplete/AutoCompletePopupWindow.java index c777891..daa2a7c 100644 --- a/src/org/fife/ui/autocomplete/AutoCompletePopupWindow.java +++ b/src/org/fife/ui/autocomplete/AutoCompletePopupWindow.java @@ -26,6 +26,7 @@ package org.fife.ui.autocomplete; import java.awt.BorderLayout; import java.awt.ComponentOrientation; import java.awt.Dimension; +import java.awt.Point; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.Window; @@ -395,20 +396,25 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener, return; } - Dimension screenSize = getToolkit().getScreenSize(); + // Don't use getLocationOnScreen() as this throws an exception if + // window isn't visible yet, but getLocation() doesn't, and is in + // screen coordinates! + Point p = getLocation(); + Rectangle screenBounds = Util.getScreenBoundsForPoint(p.x, p.y); + //Dimension screenSize = getToolkit().getScreenSize(); //int totalH = Math.max(getHeight(), descWindow.getHeight()); // Try to position to the right first (LTR) int x; if (ac.getTextComponentOrientation().isLeftToRight()) { x = getX() + getWidth() + 5; - if (x+descWindow.getWidth()>screenSize.width) { // doesn't fit + if (x+descWindow.getWidth()>screenBounds.x+screenBounds.width) { // doesn't fit x = getX() - 5 - descWindow.getWidth(); } } else { // RTL x = getX() - 5 - descWindow.getWidth(); - if (x<0) { // Doesn't fit + if (x<screenBounds.x) { // Doesn't fit x = getX() + getWidth() + 5; } } @@ -612,8 +618,15 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener, */ public void setLocationRelativeTo(Rectangle r) { + // Multi-monitor support - make sure the completion window (and + // description window, if applicable) both fit in the same window in + // a multi-monitor environment. To do this, we decide which monitor + // the rectangle "r" is in, and use that one (just pick top-left corner + // as the defining point). + Rectangle screenBounds = Util.getScreenBoundsForPoint(r.x, r.y); + //Dimension screenSize = getToolkit().getScreenSize(); + boolean showDescWindow = descWindow!=null && ac.getShowDescWindow(); - Dimension screenSize = getToolkit().getScreenSize(); int totalH = getHeight(); if (showDescWindow) { totalH = Math.max(totalH, descWindow.getHeight()); @@ -623,7 +636,7 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener, // entire height of our stuff fits on the screen one way or the other. aboveCaret = false; int y = r.y + r.height + VERTICAL_SPACE; - if (y+totalH>screenSize.height) { + if (y+totalH>screenBounds.height) { y = r.y - VERTICAL_SPACE - getHeight(); aboveCaret = true; } @@ -634,11 +647,11 @@ class AutoCompletePopupWindow extends JWindow implements CaretListener, if (!ac.getTextComponentOrientation().isLeftToRight()) { x -= getWidth(); // RTL => align right edge } - if (x<0) { - x = 0; + if (x<screenBounds.x) { + x = screenBounds.x; } - else if (x+getWidth()>screenSize.width) { // completions don't fit - x = screenSize.width - getWidth(); + else if (x+getWidth()>screenBounds.x+screenBounds.width) { // completions don't fit + x = screenBounds.x + screenBounds.width - getWidth(); } setLocation(x, y); diff --git a/src/org/fife/ui/autocomplete/ParameterizedCompletionDescriptionToolTip.java b/src/org/fife/ui/autocomplete/ParameterizedCompletionDescriptionToolTip.java index c824181..d49f8ab 100644 --- a/src/org/fife/ui/autocomplete/ParameterizedCompletionDescriptionToolTip.java +++ b/src/org/fife/ui/autocomplete/ParameterizedCompletionDescriptionToolTip.java @@ -24,7 +24,6 @@ package org.fife.ui.autocomplete; import java.awt.Color; -import java.awt.Dimension; import java.awt.Point; import java.awt.Rectangle; import java.awt.Window; @@ -56,7 +55,7 @@ import javax.swing.text.Highlighter.Highlight; /** - * A "tooltip" that displays information on the function or method currently + * A "tool tip" that displays information on the function or method currently * being entered. * * @author Robert Futrell @@ -65,7 +64,7 @@ import javax.swing.text.Highlighter.Highlight; class ParameterizedCompletionDescriptionToolTip { /** - * The actual tooltip. + * The actual tool tip. */ private JWindow tooltip; @@ -95,19 +94,19 @@ class ParameterizedCompletionDescriptionToolTip { private ParameterizedCompletion pc; /** - * Listens for events in the text component while this window is vislble. + * Listens for events in the text component while this window is visible. */ private Listener listener; /** * The minimum offset into the document that the caret can move to - * before this tooltip disappears. + * before this tool tip disappears. */ private int minPos; /** * The maximum offset into the document that the caret can move to - * before this tooltip disappears. + * before this tool tip disappears. */ private Position maxPos; // Moves with text inserted. @@ -138,7 +137,7 @@ class ParameterizedCompletionDescriptionToolTip { * Constructor. * * @param owner The parent window. - * @param ac The parent autocompletion. + * @param ac The parent auto-completion. * @param pc The completion being described. */ public ParameterizedCompletionDescriptionToolTip(Window owner, @@ -335,13 +334,20 @@ class ParameterizedCompletionDescriptionToolTip { /** - * Sets the location of this tooltip relative to the given rectangle. + * Sets the location of this tool tip relative to the given rectangle. * * @param r The visual position of the caret (in screen coordinates). */ public void setLocationRelativeTo(Rectangle r) { - Dimension screenSize = tooltip.getToolkit().getScreenSize(); + // Multi-monitor support - make sure the completion window (and + // description window, if applicable) both fit in the same window in + // a multi-monitor environment. To do this, we decide which monitor + // the rectangle "r" is in, and use that one (just pick top-left corner + // as the defining point). + Rectangle screenBounds = Util.getScreenBoundsForPoint(r.x, r.y); +System.out.println(screenBounds); + //Dimension screenSize = tooltip.getToolkit().getScreenSize(); // Try putting our stuff "above" the caret first. int y = r.y - 5 - tooltip.getHeight(); @@ -352,11 +358,11 @@ class ParameterizedCompletionDescriptionToolTip { // Get x-coordinate of completions. Try to align left edge with the // caret first. int x = r.x; - if (x<0) { - x = 0; + if (x<screenBounds.x) { + x = screenBounds.x; } - else if (x+tooltip.getWidth()>screenSize.width) { // completions don't fit - x = screenSize.width - tooltip.getWidth(); + else if (x+tooltip.getWidth()>screenBounds.x+screenBounds.width) { // completions don't fit + x = screenBounds.x + screenBounds.width - tooltip.getWidth(); } tooltip.setLocation(x, y); @@ -365,9 +371,9 @@ class ParameterizedCompletionDescriptionToolTip { /** - * Toggles the visibility of this tooltip. + * Toggles the visibility of this tool tip. * - * @param visible Whether the tooltip should be visible. + * @param visible Whether the tool tip should be visible. * @param addParamListStart Whether or not * {@link CompletionProvider#getParameterListStart()} should be * added to the text component. If <code>visible</code> is @@ -428,8 +434,8 @@ class ParameterizedCompletionDescriptionToolTip { /** - * Updates the text in the tooltip to have the current parameter - * disiplayed in bold. The "current parameter" is determined from the + * Updates the text in the tool tip to have the current parameter + * displayed in bold. The "current parameter" is determined from the * current caret position. */ private void updateText() { @@ -456,7 +462,7 @@ class ParameterizedCompletionDescriptionToolTip { /** - * Updates the text in the tooltip to have the current parameter + * Updates the text in the tool tip to have the current parameter * displayed in bold. * * @param selectedParam The index of the selected parameter. @@ -631,7 +637,7 @@ class ParameterizedCompletionDescriptionToolTip { /** - * Listens for various events in the text component while this tooltip + * Listens for various events in the text component while this tool tip * is visible. * * @author Robert Futrell diff --git a/src/org/fife/ui/autocomplete/Util.java b/src/org/fife/ui/autocomplete/Util.java index 41c3506..92e2f3e 100644 --- a/src/org/fife/ui/autocomplete/Util.java +++ b/src/org/fife/ui/autocomplete/Util.java @@ -23,12 +23,16 @@ package org.fife.ui.autocomplete; import java.awt.Color; +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; +import java.awt.Rectangle; import java.lang.reflect.Method; import java.net.URI; /** - * Utility methods for the autocomplete framework. + * Utility methods for the auto-complete framework. * * @author Robert Futrell * @version 1.0 @@ -41,41 +45,6 @@ class Util { /** - * Returns a hex string for the specified color, suitable for HTML. - * - * @param c The color. - * @return The string representation, in the form "<code>#rrggbb</code>", - * or <code>null</code> if <code>c</code> is <code>null</code>. - */ - public static String getHexString(Color c) { - - if (c==null) { - return null; - } - - StringBuffer sb = new StringBuffer("#"); - int r = c.getRed(); - if (r<16) { - sb.append('0'); - } - sb.append(Integer.toHexString(r)); - int g = c.getGreen(); - if (g<16) { - sb.append('0'); - } - sb.append(Integer.toHexString(g)); - int b = c.getBlue(); - if (b<16) { - sb.append('0'); - } - sb.append(Integer.toHexString(b)); - - return sb.toString(); - - } - - - /** * Attempts to open a web browser to the specified URI. * * @param uri The URI to open. If this is <code>null</code>, nothing @@ -150,4 +119,66 @@ class Util { } + /** + * Returns a hex string for the specified color, suitable for HTML. + * + * @param c The color. + * @return The string representation, in the form "<code>#rrggbb</code>", + * or <code>null</code> if <code>c</code> is <code>null</code>. + */ + public static String getHexString(Color c) { + + if (c==null) { + return null; + } + + StringBuffer sb = new StringBuffer("#"); + int r = c.getRed(); + if (r<16) { + sb.append('0'); + } + sb.append(Integer.toHexString(r)); + int g = c.getGreen(); + if (g<16) { + sb.append('0'); + } + sb.append(Integer.toHexString(g)); + int b = c.getBlue(); + if (b<16) { + sb.append('0'); + } + sb.append(Integer.toHexString(b)); + + return sb.toString(); + + } + + + /** + * Returns the screen coordinates for the monitor that contains the + * specified point. This is useful for setups with multiple monitors, + * to ensure that popup windows are positioned properly. + * + * @param x The x-coordinate. + * @param y The y-coordinate. + * @return The bounds of the monitor that contains the specified point. + */ + public static Rectangle getScreenBoundsForPoint(int x, int y) { + GraphicsEnvironment env = GraphicsEnvironment. + getLocalGraphicsEnvironment(); + GraphicsDevice[] devices = env.getScreenDevices(); + for (int i=0; i<devices.length; i++) { + GraphicsConfiguration[] configs = devices[i].getConfigurations(); + for (int j=0; j<configs.length; j++) { + Rectangle gcBounds = configs[j].getBounds(); + if (gcBounds.contains(x, y)) { + return gcBounds; + } + } + } + // If point is outside all monitors, default to default monitor (?) + return env.getMaximumWindowBounds(); + } + + } \ 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

