diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonTooltipRendererProvider.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonTooltipRendererProvider.java index 09fb830abf38..694c0006cf2d 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonTooltipRendererProvider.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonTooltipRendererProvider.java @@ -111,8 +111,8 @@ public class DaemonTooltipRendererProvider implements ErrorStripTooltipRendererP } @Override - public TrafficTooltipRenderer createTrafficTooltipRenderer(Runnable onHide) { - return new TrafficTooltipRendererImpl(onHide); + public TrafficTooltipRenderer createTrafficTooltipRenderer(Runnable onHide, Editor editor) { + return new TrafficTooltipRendererImpl(onHide, editor); } private static class MyRenderer extends LineTooltipRenderer { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/TrafficTooltipRendererImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/TrafficTooltipRendererImpl.java index 255fec49dda0..432fca6692e2 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/TrafficTooltipRendererImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/TrafficTooltipRendererImpl.java @@ -24,18 +24,20 @@ import com.intellij.openapi.editor.impl.EditorMarkupModelImpl; import com.intellij.openapi.editor.impl.TrafficTooltipRenderer; import com.intellij.ui.HintHint; import com.intellij.ui.LightweightHint; +import com.intellij.util.ui.update.ComparableObject; import java.awt.*; /** * User: cdr */ -public class TrafficTooltipRendererImpl implements TrafficTooltipRenderer { +public class TrafficTooltipRendererImpl extends ComparableObject.Impl implements TrafficTooltipRenderer { private TrafficProgressPanel myPanel; private final Runnable onHide; private TrafficLightRenderer myTrafficLightRenderer; - public TrafficTooltipRendererImpl(Runnable onHide) { + public TrafficTooltipRendererImpl(Runnable onHide, Editor editor) { + super(editor); this.onHide = onHide; } @@ -69,9 +71,4 @@ public class TrafficTooltipRendererImpl implements TrafficTooltipRenderer { repaintTooltipWindow(); return hint; } - - @Override - public boolean equals(Object obj) { - return obj.getClass() == getClass() && myTrafficLightRenderer == ((TrafficTooltipRendererImpl)obj).myTrafficLightRenderer; - } } diff --git a/platform/platform-impl/src/com/intellij/codeInsight/hint/TooltipController.java b/platform/platform-impl/src/com/intellij/codeInsight/hint/TooltipController.java index 68ce15a0570b..48d49751d2de 100644 --- a/platform/platform-impl/src/com/intellij/codeInsight/hint/TooltipController.java +++ b/platform/platform-impl/src/com/intellij/codeInsight/hint/TooltipController.java @@ -26,7 +26,6 @@ import com.intellij.ui.LightweightHint; import com.intellij.ui.awt.RelativePoint; import org.jetbrains.annotations.NotNull; -import javax.swing.*; import java.awt.*; import java.awt.event.MouseEvent; @@ -57,7 +56,13 @@ public class TooltipController { final boolean alignToRight, @NotNull final TooltipGroup group, final HintHint hintHint) { if (myCurrentTooltip == null || !myCurrentTooltip.isVisible()) { - myCurrentTooltipObject = null; + if (myCurrentTooltip != null) { + if (!IdeTooltipManager.getInstance().isQueuedToShow(myCurrentTooltip.getCurrentIdeTooltip())) { + myCurrentTooltipObject = null; + } + } else { + myCurrentTooltipObject = null; + } } if (Comparing.equal(tooltipObject, myCurrentTooltipObject)) { diff --git a/platform/platform-impl/src/com/intellij/ide/IdeTooltip.java b/platform/platform-impl/src/com/intellij/ide/IdeTooltip.java index d525f5752494..79a9a3a04fe9 100644 --- a/platform/platform-impl/src/com/intellij/ide/IdeTooltip.java +++ b/platform/platform-impl/src/com/intellij/ide/IdeTooltip.java @@ -17,11 +17,12 @@ package com.intellij.ide; import com.intellij.openapi.ui.popup.Balloon; import com.intellij.openapi.util.registry.Registry; +import com.intellij.util.ui.update.ComparableObject; import javax.swing.*; import java.awt.*; -public class IdeTooltip { +public class IdeTooltip extends ComparableObject.Impl { private Component myComponent; private Point myPoint; @@ -34,7 +35,8 @@ public class IdeTooltip { private boolean myToCenterIfSmall = true; private boolean myHighlighter; - public IdeTooltip(Component component, Point point, JComponent tipComponent) { + public IdeTooltip(Component component, Point point, JComponent tipComponent, Object... identity) { + super(identity); myComponent = component; myPoint = point; myTipComponent = tipComponent; diff --git a/platform/platform-impl/src/com/intellij/ide/IdeTooltipManager.java b/platform/platform-impl/src/com/intellij/ide/IdeTooltipManager.java index c61301e90869..0414db008536 100644 --- a/platform/platform-impl/src/com/intellij/ide/IdeTooltipManager.java +++ b/platform/platform-impl/src/com/intellij/ide/IdeTooltipManager.java @@ -20,6 +20,7 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.ApplicationComponent; import com.intellij.openapi.ui.popup.BalloonBuilder; import com.intellij.openapi.ui.popup.JBPopupFactory; +import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.registry.Registry; @@ -31,7 +32,9 @@ import com.intellij.ui.HintHint; import com.intellij.ui.awt.RelativePoint; import com.intellij.util.Alarm; import com.intellij.util.IJSwingUtilities; +import com.intellij.util.containers.ComparatorUtil; import com.intellij.util.ui.UIUtil; +import com.intellij.util.ui.update.ComparableObjectCheck; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -72,7 +75,7 @@ public class IdeTooltipManager implements ApplicationComponent, AWTEventListener private IdeTooltip myCurrentTooltip; private Runnable myShowRequest; - + private IdeTooltip myQueuedTooltip; public IdeTooltipManager(JBPopupFactory popupFactory) { @@ -151,7 +154,7 @@ public class IdeTooltipManager implements ApplicationComponent, AWTEventListener } private void queueShow(final JComponent c, final MouseEvent me, final boolean toCenter) { - final IdeTooltip tooltip = new IdeTooltip(c, me.getPoint(), null) { + final IdeTooltip tooltip = new IdeTooltip(c, me.getPoint(), null, new Object()) { @Override protected boolean beforeShow() { myCurrentEvent = me; @@ -179,6 +182,7 @@ public class IdeTooltipManager implements ApplicationComponent, AWTEventListener hideCurrent(null); myQueuedComponent = tooltip.getComponent(); + myQueuedTooltip = tooltip; myShowRequest = new Runnable() { @Override @@ -265,6 +269,7 @@ public class IdeTooltipManager implements ApplicationComponent, AWTEventListener myCurrentTooltip = tooltip; myShowRequest = null; myQueuedComponent = null; + myQueuedTooltip = null; myCurrentTipUi.show(new RelativePoint(tooltip.getComponent(), effectivePoint), tooltip.getPreferredPosition()); myAlarm.addRequest(new Runnable() { @@ -328,6 +333,7 @@ public class IdeTooltipManager implements ApplicationComponent, AWTEventListener private boolean hideCurrent(@Nullable MouseEvent me) { myShowRequest = null; myQueuedComponent = null; + myQueuedTooltip = null; if (myCurrentTooltip == null) return true; @@ -378,6 +384,7 @@ public class IdeTooltipManager implements ApplicationComponent, AWTEventListener myCurrentTipUi = null; myCurrentComponent = null; myQueuedComponent = null; + myQueuedTooltip = null; myCurrentEvent = null; myCurrentTipIsCentered = false; myX = -1; @@ -538,4 +545,8 @@ public class IdeTooltipManager implements ApplicationComponent, AWTEventListener public String getComponentName() { return "IDE Tooltip Manager"; } + + public boolean isQueuedToShow(IdeTooltip tooltip) { + return Comparing.equal(myQueuedTooltip, tooltip); + } } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/ex/ErrorStripTooltipRendererProvider.java b/platform/platform-impl/src/com/intellij/openapi/editor/ex/ErrorStripTooltipRendererProvider.java index 97a8b1086c33..195fe6ffcd35 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/ex/ErrorStripTooltipRendererProvider.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/ex/ErrorStripTooltipRendererProvider.java @@ -20,6 +20,7 @@ package com.intellij.openapi.editor.ex; import com.intellij.codeInsight.hint.TooltipRenderer; +import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.impl.TrafficTooltipRenderer; import com.intellij.openapi.editor.markup.RangeHighlighter; import org.jetbrains.annotations.NotNull; @@ -33,5 +34,5 @@ public interface ErrorStripTooltipRendererProvider { TooltipRenderer calcTooltipRenderer(@NotNull String text); TooltipRenderer calcTooltipRenderer(@NotNull String text, int width); - TrafficTooltipRenderer createTrafficTooltipRenderer(Runnable onHide); + TrafficTooltipRenderer createTrafficTooltipRenderer(Runnable onHide, Editor editor); } \ No newline at end of file diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java index 2defd4243717..3c09eaa8d853 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java @@ -608,17 +608,15 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark private TrafficTooltipRenderer myTrafficTooltipRenderer; private void showTrafficLightTooltip(MouseEvent e) { - //final String tooltipMessage = myErrorStripeRenderer.getTooltipMessage(); - //if (tooltipMessage == null) return; if (myTrafficTooltipRenderer == null) { myTrafficTooltipRenderer = myTooltipRendererProvider.createTrafficTooltipRenderer(new Runnable() { @Override public void run() { myTrafficTooltipRenderer = null; } - }); + }, myEditor); } - showTooltip(e, myTrafficTooltipRenderer, new HintHint(e).setAwtTooltip(true).setPreferredPosition(Balloon.Position.atLeft)); + showTooltip(e, myTrafficTooltipRenderer, new HintHint(e).setAwtTooltip(true).setMayCenterPosition(true).setContentActive(false).setPreferredPosition(Balloon.Position.atLeft)); } private void repaintTrafficTooltip() { @@ -655,6 +653,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark scrollbar.addMouseListener(handler); myErrorStripeButton.addMouseListener(myHandler); } + } private void showTooltip(MouseEvent e, final TooltipRenderer tooltipObject, HintHint hintHint) { @@ -737,7 +736,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark } @Override - public TrafficTooltipRenderer createTrafficTooltipRenderer(final Runnable onHide) { + public TrafficTooltipRenderer createTrafficTooltipRenderer(final Runnable onHide, Editor editor) { return new TrafficTooltipRenderer() { @Override public void repaintTooltipWindow() { diff --git a/platform/platform-impl/src/com/intellij/ui/HintHint.java b/platform/platform-impl/src/com/intellij/ui/HintHint.java index d77a098c98aa..113d2f3a7202 100644 --- a/platform/platform-impl/src/com/intellij/ui/HintHint.java +++ b/platform/platform-impl/src/com/intellij/ui/HintHint.java @@ -36,6 +36,7 @@ public class HintHint { private boolean myContentActive = true; private boolean myQuickHint = false; + private boolean myMayCenterTooltip = false; public HintHint(MouseEvent e) { this(e.getComponent(), e.getPoint()); @@ -55,6 +56,15 @@ public class HintHint { return this; } + public HintHint setMayCenterPosition(boolean mayCenter) { + myMayCenterTooltip = mayCenter; + return this; + } + + public boolean isMayCenterTooltip() { + return myMayCenterTooltip; + } + public HintHint setPreferredPosition(Balloon.Position position) { myPreferredPosition = position; return this; diff --git a/platform/platform-impl/src/com/intellij/ui/LightweightHint.java b/platform/platform-impl/src/com/intellij/ui/LightweightHint.java index 095e2ae36159..f1253b6e205f 100644 --- a/platform/platform-impl/src/com/intellij/ui/LightweightHint.java +++ b/platform/platform-impl/src/com/intellij/ui/LightweightHint.java @@ -127,7 +127,7 @@ public class LightweightHint extends UserDataHolderBase implements Hint { if (hintHint.isAwtTooltip()) { - IdeTooltip tooltip = new IdeTooltip(hintHint.getOriginalComponent(), hintHint.getOriginalPoint(), myComponent) { + IdeTooltip tooltip = new IdeTooltip(hintHint.getOriginalComponent(), hintHint.getOriginalPoint(), myComponent, hintHint, myComponent) { @Override protected boolean canAutohideOn(TooltipEvent event) { if (event.getInputEvent() instanceof MouseEvent) { @@ -147,7 +147,7 @@ public class LightweightHint extends UserDataHolderBase implements Hint { public boolean canBeDismissedOnTimeout() { return false; } - }.setToCenterIfSmall(false).setPreferredPosition(hintHint.getPreferredPosition()).setHighlighterType(hintHint.isHightlighterType()); + }.setToCenterIfSmall(hintHint.isMayCenterTooltip()).setPreferredPosition(hintHint.getPreferredPosition()).setHighlighterType(hintHint.isHightlighterType()); myComponent.validate(); myCurrentIdeTooltip = IdeTooltipManager.getInstance().show(tooltip, false); @@ -352,4 +352,8 @@ public class LightweightHint extends UserDataHolderBase implements Hint { public boolean canControlAutoHide() { return myCurrentIdeTooltip != null && myCurrentIdeTooltip.getTipComponent().isShowing() ; } + + public IdeTooltip getCurrentIdeTooltip() { + return myCurrentIdeTooltip; + } }