Have the drag event contain a good target

This commit is contained in:
Alex Dima 2017-02-23 17:49:43 +01:00
parent f8309e4ecb
commit 669ab8b0a4
3 changed files with 21 additions and 35 deletions

View file

@ -12,7 +12,7 @@ import { Position } from 'vs/editor/common/core/position';
import { Selection } from 'vs/editor/common/core/selection';
import * as editorCommon from 'vs/editor/common/editorCommon';
import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler';
import { MouseTargetFactory } from 'vs/editor/browser/controller/mouseTarget';
import { MouseTarget, MouseTargetFactory } from 'vs/editor/browser/controller/mouseTarget';
import * as editorBrowser from 'vs/editor/browser/editorBrowser';
import { TimeoutTimer, RunOnceScheduler } from 'vs/base/common/async';
import { ViewContext } from 'vs/editor/common/view/viewContext';
@ -78,16 +78,6 @@ class EventGateKeeper<T> extends Disposable {
}
}
class MousePosition {
public position: Position;
public mouseColumn: number;
constructor(position: Position, mouseColumn: number) {
this.position = position;
this.mouseColumn = mouseColumn;
}
}
export interface IPointerHandlerHelper {
viewDomNode: HTMLElement;
linesContentDomNode: HTMLElement;
@ -403,21 +393,9 @@ class MouseDownOperation extends Disposable {
}
if (this._mouseState.isDragAndDrop) {
let target = this._createMouseTarget(e, true);
if (!target.position) {
target = {
element: target.element,
type: target.type,
position: position.position,
mouseColumn: target.mouseColumn,
range: target.range,
detail: target.detail
};
}
this._viewController.emitMouseDrag({
event: e,
target: target
target: position
});
} else {
this._dispatchMouse(position, true);
@ -513,35 +491,35 @@ class MouseDownOperation extends Disposable {
this._currentSelection = e.selection;
}
private _getPositionOutsideEditor(e: EditorMouseEvent): MousePosition {
private _getPositionOutsideEditor(e: EditorMouseEvent): MouseTarget {
const editorContent = e.editorPos;
let mouseColumn = this._getMouseColumn(e);
if (e.posy < editorContent.y) {
let aboveLineNumber = this._viewHelper.getLineNumberAtVerticalOffset(Math.max(this._viewHelper.getScrollTop() - (editorContent.y - e.posy), 0));
return new MousePosition(new Position(aboveLineNumber, 1), mouseColumn);
return new MouseTarget(null, editorCommon.MouseTargetType.OUTSIDE_EDITOR, mouseColumn, new Position(aboveLineNumber, 1));
}
if (e.posy > editorContent.y + editorContent.height) {
let belowLineNumber = this._viewHelper.getLineNumberAtVerticalOffset(this._viewHelper.getScrollTop() + (e.posy - editorContent.y));
return new MousePosition(new Position(belowLineNumber, this._context.model.getLineMaxColumn(belowLineNumber)), mouseColumn);
return new MouseTarget(null, editorCommon.MouseTargetType.OUTSIDE_EDITOR, mouseColumn, new Position(belowLineNumber, this._context.model.getLineMaxColumn(belowLineNumber)));
}
let possibleLineNumber = this._viewHelper.getLineNumberAtVerticalOffset(this._viewHelper.getScrollTop() + (e.posy - editorContent.y));
if (e.posx < editorContent.x) {
return new MousePosition(new Position(possibleLineNumber, 1), mouseColumn);
return new MouseTarget(null, editorCommon.MouseTargetType.OUTSIDE_EDITOR, mouseColumn, new Position(possibleLineNumber, 1));
}
if (e.posx > editorContent.x + editorContent.width) {
return new MousePosition(new Position(possibleLineNumber, this._context.model.getLineMaxColumn(possibleLineNumber)), mouseColumn);
return new MouseTarget(null, editorCommon.MouseTargetType.OUTSIDE_EDITOR, mouseColumn, new Position(possibleLineNumber, this._context.model.getLineMaxColumn(possibleLineNumber)));
}
return null;
}
private _findMousePosition(e: EditorMouseEvent, testEventTarget: boolean): MousePosition {
private _findMousePosition(e: EditorMouseEvent, testEventTarget: boolean): MouseTarget {
let positionOutsideEditor = this._getPositionOutsideEditor(e);
if (positionOutsideEditor) {
return positionOutsideEditor;
@ -562,17 +540,17 @@ class MouseDownOperation extends Disposable {
if (positionBefore && positionAfter) {
if (positionBefore.isBefore(selectionStart)) {
return new MousePosition(positionBefore, t.mouseColumn);
return new MouseTarget(t.element, t.type, t.mouseColumn, positionBefore, null, t.detail);
} else {
return new MousePosition(positionAfter, t.mouseColumn);
return new MouseTarget(t.element, t.type, t.mouseColumn, positionAfter, null, t.detail);
}
}
}
return new MousePosition(hintedPosition, t.mouseColumn);
return t;
}
private _dispatchMouse(position: MousePosition, inSelectionMode: boolean): void {
private _dispatchMouse(position: MouseTarget, inSelectionMode: boolean): void {
this._viewController.dispatchMouse({
position: position.position,
mouseColumn: position.mouseColumn,

View file

@ -3102,7 +3102,11 @@ export enum MouseTargetType {
/**
* Mouse is on top of an overlay widget.
*/
OVERLAY_WIDGET
OVERLAY_WIDGET,
/**
* Mouse is outside of the editor.
*/
OUTSIDE_EDITOR,
}
/**

4
src/vs/monaco.d.ts vendored
View file

@ -2791,6 +2791,10 @@ declare module monaco.editor {
* Mouse is on top of an overlay widget.
*/
OVERLAY_WIDGET = 12,
/**
* Mouse is outside of the editor.
*/
OUTSIDE_EDITOR = 13,
}
/**