From 7d6db4e5f5c222ecf76c6eaba31dfd47c5258524 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Wed, 9 Dec 2015 15:06:38 +0300 Subject: [PATCH] fixed incorrect drag image offset (visible for example when dragging a breakpoint) --- .../impl/EditorGutterComponentImpl.java | 39 ++++++++++++------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorGutterComponentImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorGutterComponentImpl.java index 184e52b4d3a3..4772b67c9974 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorGutterComponentImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorGutterComponentImpl.java @@ -47,17 +47,17 @@ import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.popup.Balloon; -import com.intellij.openapi.util.Comparing; -import com.intellij.openapi.util.Ref; -import com.intellij.openapi.util.ScalableIcon; -import com.intellij.openapi.util.SystemInfo; +import com.intellij.openapi.util.*; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.wm.impl.IdeBackgroundUtil; import com.intellij.openapi.wm.impl.IdeGlassPaneImpl; import com.intellij.ui.HintHint; import com.intellij.ui.JBColor; import com.intellij.ui.awt.RelativePoint; -import com.intellij.util.*; +import com.intellij.util.Function; +import com.intellij.util.IconUtil; +import com.intellij.util.NullableFunction; +import com.intellij.util.SmartList; import com.intellij.util.containers.HashMap; import com.intellij.util.ui.JBUI; import com.intellij.util.ui.UIUtil; @@ -198,7 +198,10 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse .setImageProvider(new NullableFunction() { @Override public DnDImage fun(DnDActionInfo info) { - return new DnDImage(IconUtil.toImage(scaleIcon(getGutterRenderer(info.getPoint()).getIcon()))); + Point dndPoint = info.getPoint(); + Pair res = findGutterRendererAndPoint(dndPoint); + return new DnDImage(IconUtil.toImage(scaleIcon(res.first.getIcon())), + new Point(dndPoint.x - res.second.x, dndPoint.y - res.second.y)); } }) .install(); @@ -1712,7 +1715,7 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse } @Nullable - private GutterMark getGutterRenderer(final Point p) { + private Pair findGutterRendererAndPoint(final Point p) { int line = convertPointToLineNumber(p); if (line == -1) return null; List renderers = myLineToGutterRenderers.get(line); @@ -1720,20 +1723,28 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse return null; } - final GutterMark[] result = {null}; + final Ref> result = new Ref>(); processIconsRow(line, renderers, new LineGutterIconRendererProcessor() { @Override public void process(int x, int y, GutterMark renderer) { - final int ex = convertX((int)p.getX()); - Icon icon = scaleIcon(renderer.getIcon()); - // Do not check y to extend the area where users could click - if (x <= ex && ex <= x + icon.getIconWidth()) { - result[0] = renderer; + if (result.isNull()) { + int ex = convertX((int)p.getX()); + Icon icon = scaleIcon(renderer.getIcon()); + // Do not check y to extend the area where users could click + if (x <= ex && ex <= x + icon.getIconWidth()) { + result.set(Pair.create(renderer, new Point(x, y))); + } } } }); - return result[0]; + return result.get(); + } + + @Nullable + private GutterMark getGutterRenderer(Point p) { + Pair info = findGutterRendererAndPoint(p); + return info != null ? info.first : null; } @Nullable