fixed incorrect drag image offset (visible for example when dragging a breakpoint)

This commit is contained in:
Egor.Ushakov
2015-12-09 15:07:37 +03:00
parent dfa88bf159
commit 7d6db4e5f5
@@ -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<DnDActionInfo, DnDImage>() {
@Override
public DnDImage fun(DnDActionInfo info) {
return new DnDImage(IconUtil.toImage(scaleIcon(getGutterRenderer(info.getPoint()).getIcon())));
Point dndPoint = info.getPoint();
Pair<GutterMark, Point> 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<GutterMark, Point> findGutterRendererAndPoint(final Point p) {
int line = convertPointToLineNumber(p);
if (line == -1) return null;
List<GutterMark> renderers = myLineToGutterRenderers.get(line);
@@ -1720,20 +1723,28 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
return null;
}
final GutterMark[] result = {null};
final Ref<Pair<GutterMark, Point>> result = new Ref<Pair<GutterMark, Point>>();
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<GutterMark, Point> info = findGutterRendererAndPoint(p);
return info != null ? info.first : null;
}
@Nullable