提交 0e804ffa 编写于 作者: A Alex Dima

Extract mouse down code to MouseDownOperation

上级 02fc18ab
...@@ -96,25 +96,10 @@ export class MouseHandler extends ViewEventHandler implements IDisposable { ...@@ -96,25 +96,10 @@ export class MouseHandler extends ViewEventHandler implements IDisposable {
public listenersToRemove:IDisposable[]; public listenersToRemove:IDisposable[];
private toDispose:IDisposable[]; private toDispose:IDisposable[];
private hideTextAreaTimeout: number; private _mouseDownOperation: MouseDownOperation;
private mouseMoveMonitor:GlobalMouseMoveMonitor<IMouseEvent>;
private monitoringStartTargetType: editorCommon.MouseTargetType;
private currentSelection: editorCommon.IEditorSelection;
private lastMouseEvent: IMouseEvent;
private lastMouseDownPosition: editorCommon.IEditorPosition;
private lastMouseDownPositionEqualCount: number;
private lastMouseDownCount: number;
private lastSetMouseDownCountTime: number;
private onScrollTimeout: number;
private layoutWidth:number;
private layoutHeight:number;
private lastMouseLeaveTime:number; private lastMouseLeaveTime:number;
private _mouseMoveEventHandler: EventGateKeeper<IMouseEvent>; private _mouseMoveEventHandler: EventGateKeeper<IMouseEvent>;
private _mouseDownThenMoveEventHandler: EventGateKeeper<IMouseEvent>;
constructor(context:editorBrowser.IViewContext, viewController:editorBrowser.IViewController, viewHelper:editorBrowser.IPointerHandlerHelper) { constructor(context:editorBrowser.IViewContext, viewController:editorBrowser.IViewController, viewHelper:editorBrowser.IPointerHandlerHelper) {
super(); super();
...@@ -125,22 +110,9 @@ export class MouseHandler extends ViewEventHandler implements IDisposable { ...@@ -125,22 +110,9 @@ export class MouseHandler extends ViewEventHandler implements IDisposable {
this.mouseTargetFactory = new MouseTargetFactory(this.context, viewHelper); this.mouseTargetFactory = new MouseTargetFactory(this.context, viewHelper);
this.listenersToRemove = []; this.listenersToRemove = [];
this.hideTextAreaTimeout = -1; this._mouseDownOperation = new MouseDownOperation(this.context, this.viewController, this.viewHelper, (e, testEventTarget) => this._createMouseTarget(e, testEventTarget));
this.toDispose = []; this.toDispose = [];
this.mouseMoveMonitor = new GlobalMouseMoveMonitor<IMouseEvent>();
this.toDispose.push(this.mouseMoveMonitor);
this.lastMouseEvent = null;
this.lastMouseDownPosition = null;
this.currentSelection = Selection.createSelection(1, 1, 1, 1);
this.lastMouseDownPositionEqualCount = 0;
this.lastMouseDownCount = 0;
this.lastSetMouseDownCountTime = 0;
this.onScrollTimeout = -1;
this.layoutWidth = 0;
this.layoutHeight = 0;
this.lastMouseLeaveTime = -1; this.lastMouseLeaveTime = -1;
...@@ -153,9 +125,6 @@ export class MouseHandler extends ViewEventHandler implements IDisposable { ...@@ -153,9 +125,6 @@ export class MouseHandler extends ViewEventHandler implements IDisposable {
this._mouseMoveEventHandler.handler, this._mouseMoveEventHandler.handler,
createMouseMoveEventMerger(this.mouseTargetFactory), MouseHandler.MOUSE_MOVE_MINIMUM_TIME)); createMouseMoveEventMerger(this.mouseTargetFactory), MouseHandler.MOUSE_MOVE_MINIMUM_TIME));
this._mouseDownThenMoveEventHandler = new EventGateKeeper<IMouseEvent>((e) => this._onMouseDownThenMove(e), () => !this.viewHelper.isDirty());
this.toDispose.push(this._mouseDownThenMoveEventHandler);
this.listenersToRemove.push(dom.addDisposableListener(this.viewHelper.viewDomNode, 'mouseup', this.listenersToRemove.push(dom.addDisposableListener(this.viewHelper.viewDomNode, 'mouseup',
(e: MouseEvent) => this._onMouseUp(e))); (e: MouseEvent) => this._onMouseUp(e)));
...@@ -165,7 +134,6 @@ export class MouseHandler extends ViewEventHandler implements IDisposable { ...@@ -165,7 +134,6 @@ export class MouseHandler extends ViewEventHandler implements IDisposable {
this.listenersToRemove.push(dom.addDisposableListener(this.viewHelper.viewDomNode, 'mousedown', this.listenersToRemove.push(dom.addDisposableListener(this.viewHelper.viewDomNode, 'mousedown',
(e: MouseEvent) => this._onMouseDown(e))); (e: MouseEvent) => this._onMouseDown(e)));
this.context.addEventHandler(this); this.context.addEventHandler(this);
} }
...@@ -173,11 +141,7 @@ export class MouseHandler extends ViewEventHandler implements IDisposable { ...@@ -173,11 +141,7 @@ export class MouseHandler extends ViewEventHandler implements IDisposable {
this.context.removeEventHandler(this); this.context.removeEventHandler(this);
this.listenersToRemove = disposeAll(this.listenersToRemove); this.listenersToRemove = disposeAll(this.listenersToRemove);
this.toDispose = disposeAll(this.toDispose); this.toDispose = disposeAll(this.toDispose);
this._unhook(); this._mouseDownOperation.dispose();
if (this.hideTextAreaTimeout !== -1) {
window.clearTimeout(this.hideTextAreaTimeout);
this.hideTextAreaTimeout = -1;
}
} }
// --- begin event handlers // --- begin event handlers
...@@ -187,13 +151,11 @@ export class MouseHandler extends ViewEventHandler implements IDisposable { ...@@ -187,13 +151,11 @@ export class MouseHandler extends ViewEventHandler implements IDisposable {
return false; return false;
} }
public onScrollChanged(e:editorCommon.IScrollEvent): boolean { public onScrollChanged(e:editorCommon.IScrollEvent): boolean {
if (this.mouseMoveMonitor.isMonitoring()) { this._mouseDownOperation.onScrollChanged();
this._hookedOnScroll(e);
}
return false; return false;
} }
public onCursorSelectionChanged(e:editorCommon.IViewCursorSelectionChangedEvent): boolean { public onCursorSelectionChanged(e:editorCommon.IViewCursorSelectionChangedEvent): boolean {
this.currentSelection = e.selection; this._mouseDownOperation.onCursorSelectionChanged(e);
return false; return false;
} }
// --- end event handlers // --- end event handlers
...@@ -214,7 +176,7 @@ export class MouseHandler extends ViewEventHandler implements IDisposable { ...@@ -214,7 +176,7 @@ export class MouseHandler extends ViewEventHandler implements IDisposable {
} }
private _onMouseMove(e: IMouseEvent): void { private _onMouseMove(e: IMouseEvent): void {
if (this.mouseMoveMonitor.isMonitoring()) { if (this._mouseDownOperation.isActive()) {
// In selection/drag operation // In selection/drag operation
return; return;
} }
...@@ -283,8 +245,9 @@ export class MouseHandler extends ViewEventHandler implements IDisposable { ...@@ -283,8 +245,9 @@ export class MouseHandler extends ViewEventHandler implements IDisposable {
e.preventDefault(); e.preventDefault();
this.viewHelper.focusTextArea(); this.viewHelper.focusTextArea();
} }
this._updateMouse(t.type, e, e.shiftKey, e.detail);
this._hook(t.type); this._mouseDownOperation.start(t.type, e);
} else if (targetIsGutter) { } else if (targetIsGutter) {
// Do not steal focus // Do not steal focus
e.preventDefault(); e.preventDefault();
...@@ -301,44 +264,109 @@ export class MouseHandler extends ViewEventHandler implements IDisposable { ...@@ -301,44 +264,109 @@ export class MouseHandler extends ViewEventHandler implements IDisposable {
}; };
this.viewController.emitMouseDown(mouseEvent); this.viewController.emitMouseDown(mouseEvent);
} }
}
private _hookedOnScroll(rawEvent:editorCommon.IScrollEvent): void { class MouseDownOperation {
if (this.onScrollTimeout === -1) {
this.onScrollTimeout = window.setTimeout(() => {
this.onScrollTimeout = -1;
this._updateMouse(this.monitoringStartTargetType, null, true);
}, 10);
}
}
private _hook(startTargetType:editorCommon.MouseTargetType): void { private context:editorBrowser.IViewContext;
if (this.mouseMoveMonitor.isMonitoring()) { private viewController:editorBrowser.IViewController;
// Already monitoring private viewHelper:editorBrowser.IPointerHandlerHelper;
return; private _createMouseTarget:(e:IMouseEvent, testEventTarget:boolean)=>editorBrowser.IMouseTarget;
}
this.monitoringStartTargetType = startTargetType; private _mouseMoveMonitor:GlobalMouseMoveMonitor<IMouseEvent>;
private _mouseDownThenMoveEventHandler: EventGateKeeper<IMouseEvent>;
this.mouseMoveMonitor.startMonitoring( private currentSelection: editorCommon.IEditorSelection;
createMouseMoveEventMerger(null),
this._mouseDownThenMoveEventHandler.handler, private onScrollTimeout: number;
() => { private _isActive: boolean;
this._unhook();
} private _startTargetType:editorCommon.MouseTargetType;
); private lastMouseEvent: IMouseEvent;
private lastMouseDownPosition: editorCommon.IEditorPosition;
private lastMouseDownPositionEqualCount: number;
private lastMouseDownCount: number;
private lastSetMouseDownCountTime: number;
constructor(
context:editorBrowser.IViewContext,
viewController:editorBrowser.IViewController,
viewHelper:editorBrowser.IPointerHandlerHelper,
createMouseTarget:(e:IMouseEvent, testEventTarget:boolean)=>editorBrowser.IMouseTarget
) {
this.context = context;
this.viewController = viewController;
this.viewHelper = viewHelper;
this._createMouseTarget = createMouseTarget;
this.currentSelection = Selection.createSelection(1, 1, 1, 1);
this.onScrollTimeout = -1;
this._isActive = false;
this._startTargetType = editorCommon.MouseTargetType.UNKNOWN;
this.lastMouseEvent = null;
this.lastMouseDownPosition = null;
this.lastMouseDownPositionEqualCount = 0;
this.lastMouseDownCount = 0;
this.lastSetMouseDownCountTime = 0;
this._mouseMoveMonitor = new GlobalMouseMoveMonitor<IMouseEvent>();
this._mouseDownThenMoveEventHandler = new EventGateKeeper<IMouseEvent>((e) => this._onMouseDownThenMove(e), () => !this.viewHelper.isDirty());
}
public dispose(): void {
this._mouseMoveMonitor.dispose();
this._mouseDownThenMoveEventHandler.dispose();
this._stop();
}
public isActive(): boolean {
return this._isActive;
} }
private _onMouseDownThenMove(e:IMouseEvent): void { private _onMouseDownThenMove(e:IMouseEvent): void {
this._updateMouse(this.monitoringStartTargetType, e, true); this._updateMouse(this._startTargetType, e, true);
} }
private _unhook(): void { public start(targetType:editorCommon.MouseTargetType, e:IMouseEvent): void {
this._updateMouse(targetType, e, e.shiftKey, e.detail);
this._startTargetType = targetType;
if (!this._isActive) {
this._isActive = true;
this._mouseMoveMonitor.startMonitoring(
createMouseMoveEventMerger(null),
this._mouseDownThenMoveEventHandler.handler,
() => this._stop()
);
}
}
private _stop(): void {
this._isActive = false;
if (this.onScrollTimeout !== -1) { if (this.onScrollTimeout !== -1) {
window.clearTimeout(this.onScrollTimeout); window.clearTimeout(this.onScrollTimeout);
this.onScrollTimeout = -1; this.onScrollTimeout = -1;
} }
} }
public onScrollChanged(): void {
if (!this._isActive) {
return;
}
if (this.onScrollTimeout === -1) {
this.onScrollTimeout = window.setTimeout(() => {
this.onScrollTimeout = -1;
this._updateMouse(this._startTargetType, null, true);
}, 10);
}
}
public onCursorSelectionChanged(e:editorCommon.IViewCursorSelectionChangedEvent): void {
this.currentSelection = e.selection;
}
private _getPositionOutsideEditor(editorContent: IDomNodePosition, e: IMouseEvent): editorCommon.IPosition { private _getPositionOutsideEditor(editorContent: IDomNodePosition, e: IMouseEvent): editorCommon.IPosition {
var possibleLineNumber: number; var possibleLineNumber: number;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册