mirror of
https://github.com/Microsoft/vscode
synced 2024-06-30 23:04:56 +00:00
adding code
This commit is contained in:
parent
1036dcc39c
commit
20bd081661
|
@ -64,8 +64,9 @@ export class MouseHandler extends ViewEventHandler {
|
|||
private _mouseLeaveMonitor: IDisposable | null = null;
|
||||
private _mouseOnOverflowWidgetsDomNode: boolean = false;
|
||||
|
||||
constructor(context: ViewContext, viewController: ViewController, viewHelper: IPointerHandlerHelper, overflowWidgetsDomNode?: HTMLElement) {
|
||||
constructor(context: ViewContext, viewController: ViewController, viewHelper: IPointerHandlerHelper) {
|
||||
super();
|
||||
console.log('mouseHandler');
|
||||
|
||||
this._context = context;
|
||||
this.viewController = viewController;
|
||||
|
@ -77,7 +78,7 @@ export class MouseHandler extends ViewEventHandler {
|
|||
this.viewController,
|
||||
this.viewHelper,
|
||||
this.mouseTargetFactory,
|
||||
(e, testEventTarget) => this._createMouseTarget(e, testEventTarget),
|
||||
(e, testEventTarget) => this._createMouseTarget(e, testEventTarget, false),
|
||||
(e) => this._getMouseColumn(e)
|
||||
));
|
||||
|
||||
|
@ -89,7 +90,8 @@ export class MouseHandler extends ViewEventHandler {
|
|||
this._register(mouseEvents.onContextMenu(this.viewHelper.viewDomNode, (e) => this._onContextMenu(e, true)));
|
||||
|
||||
this._register(mouseEvents.onMouseMove(this.viewHelper.viewDomNode, (e) => {
|
||||
this._onMouseMove(e);
|
||||
console.log('onMouseMove of this.viewHelper.viewDomNode');
|
||||
this._onMouseMove(e, false);
|
||||
|
||||
// See https://github.com/microsoft/vscode/issues/138789
|
||||
// When moving the mouse really quickly, the browser sometimes forgets to
|
||||
|
@ -111,19 +113,18 @@ export class MouseHandler extends ViewEventHandler {
|
|||
}
|
||||
}));
|
||||
|
||||
console.log('mouseHandler');
|
||||
console.log('overflowWidgetsDomNode : ', overflowWidgetsDomNode);
|
||||
const overflowWidgetsDomNode = context.overflowWidgetsDomNode;
|
||||
if (overflowWidgetsDomNode) {
|
||||
this._register(mouseEvents.onMouseMove(overflowWidgetsDomNode, (e) => {
|
||||
this._mouseOnOverflowWidgetsDomNode = true;
|
||||
console.log('_onMouseMove of overflowWidgetsDomNode');
|
||||
console.log('onMouseMove of overflowWidgetsDomNode');
|
||||
console.log('this._mousOnOverflowWidgetsDomNode : ', this._mouseOnOverflowWidgetsDomNode);
|
||||
console.log('e : ', e);
|
||||
this._onMouseMove(e, overflowWidgetsDomNode);
|
||||
this._onMouseMove(e, true);
|
||||
}));
|
||||
this._register(mouseEvents.onMouseLeave(overflowWidgetsDomNode, (e) => {
|
||||
this._mouseOnOverflowWidgetsDomNode = false;
|
||||
console.log('_onMouseLeave of overflowWidgetsDomNode');
|
||||
console.log('onMouseLeave of overflowWidgetsDomNode');
|
||||
console.log('this._mousOnOverflowWidgetsDomNode : ', this._mouseOnOverflowWidgetsDomNode);
|
||||
|
||||
}));
|
||||
|
@ -132,7 +133,7 @@ export class MouseHandler extends ViewEventHandler {
|
|||
this._register(mouseEvents.onMouseUp(this.viewHelper.viewDomNode, (e) => this._onMouseUp(e)));
|
||||
|
||||
this._register(mouseEvents.onMouseLeave(this.viewHelper.viewDomNode, (e) => {
|
||||
console.log('_onMouseLeave of this.viewHelper.viewDomNode');
|
||||
console.log('onMouseLeave of this.viewHelper.viewDomNode');
|
||||
console.log('this._mousOnOverflowWidgetsDomNode before timeout : ', this._mouseOnOverflowWidgetsDomNode);
|
||||
setTimeout(() => {
|
||||
console.log('this._mousOnOverflowWidgetsDomNode after timeout : ', this._mouseOnOverflowWidgetsDomNode);
|
||||
|
@ -266,10 +267,10 @@ export class MouseHandler extends ViewEventHandler {
|
|||
}
|
||||
|
||||
const relativePos = createCoordinatesRelativeToEditor(this.viewHelper.viewDomNode, editorPos, pos);
|
||||
return this.mouseTargetFactory.createMouseTarget(this.viewHelper.getLastRenderData(), editorPos, pos, relativePos, null);
|
||||
return this.mouseTargetFactory.createMouseTarget(this.viewHelper.getLastRenderData(), editorPos, pos, relativePos, null, false);
|
||||
}
|
||||
|
||||
protected _createMouseTarget(e: EditorMouseEvent, testEventTarget: boolean, overflowWidgetsDomNode?: HTMLElement): IMouseTarget {
|
||||
protected _createMouseTarget(e: EditorMouseEvent, testEventTarget: boolean, overflowWidgetsDomNodeTarget: boolean): IMouseTarget {
|
||||
let target = e.target;
|
||||
if (!this.viewHelper.viewDomNode.contains(target)) {
|
||||
const shadowRoot = dom.getShadowRoot(this.viewHelper.viewDomNode);
|
||||
|
@ -280,9 +281,9 @@ export class MouseHandler extends ViewEventHandler {
|
|||
}
|
||||
}
|
||||
console.log('_createMouseTarget');
|
||||
console.log('e _createMouseTarget : ', e);
|
||||
console.log('target _createMouseTarget : ', target);
|
||||
return this.mouseTargetFactory.createMouseTarget(this.viewHelper.getLastRenderData(), e.editorPos, e.pos, e.relativePos, testEventTarget ? target : null, overflowWidgetsDomNode);
|
||||
console.log('_createMouseTarget e : ', e);
|
||||
console.log('_createMouseTarget target : ', target);
|
||||
return this.mouseTargetFactory.createMouseTarget(this.viewHelper.getLastRenderData(), e.editorPos, e.pos, e.relativePos, testEventTarget ? target : null, overflowWidgetsDomNodeTarget);
|
||||
}
|
||||
|
||||
private _getMouseColumn(e: EditorMouseEvent): number {
|
||||
|
@ -292,11 +293,11 @@ export class MouseHandler extends ViewEventHandler {
|
|||
protected _onContextMenu(e: EditorMouseEvent, testEventTarget: boolean): void {
|
||||
this.viewController.emitContextMenu({
|
||||
event: e,
|
||||
target: this._createMouseTarget(e, testEventTarget)
|
||||
target: this._createMouseTarget(e, testEventTarget, false)
|
||||
});
|
||||
}
|
||||
|
||||
protected _onMouseMove(e: EditorMouseEvent, overflowWidgetsDomNode?: HTMLElement): void {
|
||||
protected _onMouseMove(e: EditorMouseEvent, overflowWidgetsDomNodeTarget: boolean): void {
|
||||
console.log('_onMouseMove');
|
||||
const targetIsWidget = this.mouseTargetFactory.mouseTargetIsWidget(e);
|
||||
if (!targetIsWidget) {
|
||||
|
@ -315,14 +316,12 @@ export class MouseHandler extends ViewEventHandler {
|
|||
|
||||
this.viewController.emitMouseMove({
|
||||
event: e,
|
||||
target: this._createMouseTarget(e, true, overflowWidgetsDomNode)
|
||||
target: this._createMouseTarget(e, true, overflowWidgetsDomNodeTarget)
|
||||
});
|
||||
}
|
||||
|
||||
protected _onMouseLeave(e: EditorMouseEvent): void {
|
||||
console.log('_onMouseLeave');
|
||||
|
||||
// Need to send the correct mouse leave event, depending on if we are inside of the overflow widgets dom node or not
|
||||
if (this._mouseLeaveMonitor) {
|
||||
this._mouseLeaveMonitor.dispose();
|
||||
this._mouseLeaveMonitor = null;
|
||||
|
@ -337,12 +336,12 @@ export class MouseHandler extends ViewEventHandler {
|
|||
protected _onMouseUp(e: EditorMouseEvent): void {
|
||||
this.viewController.emitMouseUp({
|
||||
event: e,
|
||||
target: this._createMouseTarget(e, true)
|
||||
target: this._createMouseTarget(e, true, false)
|
||||
});
|
||||
}
|
||||
|
||||
protected _onMouseDown(e: EditorMouseEvent, pointerId: number): void {
|
||||
const t = this._createMouseTarget(e, true);
|
||||
const t = this._createMouseTarget(e, true, false);
|
||||
|
||||
const targetIsContent = (t.type === MouseTargetType.CONTENT_TEXT || t.type === MouseTargetType.CONTENT_EMPTY);
|
||||
const targetIsGutter = (t.type === MouseTargetType.GUTTER_GLYPH_MARGIN || t.type === MouseTargetType.GUTTER_LINE_NUMBERS || t.type === MouseTargetType.GUTTER_LINE_DECORATIONS);
|
||||
|
@ -781,7 +780,7 @@ class TopBottomDragScrollingOperation extends Disposable {
|
|||
const horizontalScrollbarHeight = this._context.configuration.options.get(EditorOption.layoutInfo).horizontalScrollbarHeight;
|
||||
const pos = new PageCoordinates(this._mouseEvent.pos.x, editorPos.y + editorPos.height - horizontalScrollbarHeight - 0.1);
|
||||
const relativePos = createCoordinatesRelativeToEditor(this._viewHelper.viewDomNode, editorPos, pos);
|
||||
mouseTarget = this._mouseTargetFactory.createMouseTarget(this._viewHelper.getLastRenderData(), editorPos, pos, relativePos, null);
|
||||
mouseTarget = this._mouseTargetFactory.createMouseTarget(this._viewHelper.getLastRenderData(), editorPos, pos, relativePos, null, false);
|
||||
}
|
||||
if (!mouseTarget.position || mouseTarget.position.lineNumber !== edgeLineNumber) {
|
||||
if (this._position.outsidePosition === 'above') {
|
||||
|
|
|
@ -379,6 +379,10 @@ export class HitTestContext {
|
|||
public getCurrentScrollLeft(): number {
|
||||
return this._context.viewLayout.getCurrentScrollLeft();
|
||||
}
|
||||
|
||||
public getOverflowWidgetsDomNode(): HTMLElement | undefined {
|
||||
return this._context.overflowWidgetsDomNode;
|
||||
}
|
||||
}
|
||||
|
||||
abstract class BareHitTestRequest {
|
||||
|
@ -413,7 +417,7 @@ class HitTestRequest extends BareHitTestRequest {
|
|||
private _useHitTestTarget: boolean;
|
||||
private _targetPathCacheElement: HTMLElement | null = null;
|
||||
private _targetPathCacheValue: Uint8Array = new Uint8Array(0);
|
||||
private _overflowWidgetsDomNode: HTMLElement | undefined = undefined;
|
||||
private _overflowWidgetsDomNodeTarget: boolean;
|
||||
|
||||
public get target(): HTMLElement | null {
|
||||
if (this._useHitTestTarget) {
|
||||
|
@ -423,13 +427,11 @@ class HitTestRequest extends BareHitTestRequest {
|
|||
}
|
||||
|
||||
public get targetPath(): Uint8Array {
|
||||
console.log('targetPath');
|
||||
if (this._targetPathCacheElement !== this.target) {
|
||||
this._targetPathCacheElement = this.target;
|
||||
console.log('this.target : ', this.target);
|
||||
console.log('this._overflowWidgetsDomNode : ', this._overflowWidgetsDomNode);
|
||||
if (this._overflowWidgetsDomNode) {
|
||||
this._targetPathCacheValue = PartFingerprints.collect(this.target, this._overflowWidgetsDomNode);
|
||||
const overflowWidgetsDomNode = this._ctx.getOverflowWidgetsDomNode();
|
||||
if (this._overflowWidgetsDomNodeTarget && overflowWidgetsDomNode) {
|
||||
this._targetPathCacheValue = PartFingerprints.collect(this.target, overflowWidgetsDomNode);
|
||||
} else {
|
||||
this._targetPathCacheValue = PartFingerprints.collect(this.target, this._ctx.viewDomNode);
|
||||
}
|
||||
|
@ -437,11 +439,11 @@ class HitTestRequest extends BareHitTestRequest {
|
|||
return this._targetPathCacheValue;
|
||||
}
|
||||
|
||||
constructor(ctx: HitTestContext, editorPos: EditorPagePosition, pos: PageCoordinates, relativePos: CoordinatesRelativeToEditor, eventTarget: HTMLElement | null, overflowWidgetsDomNode?: HTMLElement) {
|
||||
constructor(ctx: HitTestContext, editorPos: EditorPagePosition, pos: PageCoordinates, relativePos: CoordinatesRelativeToEditor, eventTarget: HTMLElement | null, overflowWidgetsDomNodeTarget: boolean) {
|
||||
super(ctx, editorPos, pos, relativePos);
|
||||
this._ctx = ctx;
|
||||
this._eventTarget = eventTarget;
|
||||
this._overflowWidgetsDomNode = overflowWidgetsDomNode;
|
||||
this._overflowWidgetsDomNodeTarget = overflowWidgetsDomNodeTarget;
|
||||
|
||||
// If no event target is passed in, we will use the hit test target
|
||||
const hasEventTarget = Boolean(this._eventTarget);
|
||||
|
@ -541,14 +543,14 @@ export class MouseTargetFactory {
|
|||
return false;
|
||||
}
|
||||
|
||||
public createMouseTarget(lastRenderData: PointerHandlerLastRenderData, editorPos: EditorPagePosition, pos: PageCoordinates, relativePos: CoordinatesRelativeToEditor, target: HTMLElement | null, overflowWidgetsDomNode?: HTMLElement): IMouseTarget {
|
||||
public createMouseTarget(lastRenderData: PointerHandlerLastRenderData, editorPos: EditorPagePosition, pos: PageCoordinates, relativePos: CoordinatesRelativeToEditor, target: HTMLElement | null, overflowWidgetsDomNodeTarget: boolean): IMouseTarget {
|
||||
const ctx = new HitTestContext(this._context, this._viewHelper, lastRenderData);
|
||||
const request = new HitTestRequest(ctx, editorPos, pos, relativePos, target, overflowWidgetsDomNode);
|
||||
const request = new HitTestRequest(ctx, editorPos, pos, relativePos, target, overflowWidgetsDomNodeTarget);
|
||||
console.log('createMouseTarget');
|
||||
console.log('target : ', target);
|
||||
console.log('overflowWidgetsDomNode : ', overflowWidgetsDomNode);
|
||||
console.log('ctx : ', ctx);
|
||||
console.log('overflowWidgetsDomNodeTarget : ', overflowWidgetsDomNodeTarget);
|
||||
console.log('request : ', request);
|
||||
console.log('target : ', target);
|
||||
console.log('ctx : ', ctx);
|
||||
try {
|
||||
const r = MouseTargetFactory._createMouseTarget(ctx, request);
|
||||
console.log('r : ', r);
|
||||
|
@ -608,10 +610,6 @@ export class MouseTargetFactory {
|
|||
private static _hitTestContentWidget(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {
|
||||
console.log('_hitTestContentWidget');
|
||||
console.log('request : ', request);
|
||||
console.log('request.target : ', request.target);
|
||||
console.log('request.targetPath : ', request.targetPath);
|
||||
console.log('ElementPath.isChildOfContentWidgets(request.targetPath) : ', ElementPath.isChildOfContentWidgets(request.targetPath));
|
||||
console.log('ElementPath.isChildOfOverflowingContentWidgets(request.targetPath) : ', ElementPath.isChildOfOverflowingContentWidgets(request.targetPath));
|
||||
// Is it a content widget?
|
||||
if (ElementPath.isChildOfContentWidgets(request.targetPath) || ElementPath.isChildOfOverflowingContentWidgets(request.targetPath)) {
|
||||
const widgetId = ctx.findAttribute(request.target, 'widgetId');
|
||||
|
@ -628,10 +626,6 @@ export class MouseTargetFactory {
|
|||
private static _hitTestOverlayWidget(ctx: HitTestContext, request: ResolvedHitTestRequest): IMouseTarget | null {
|
||||
console.log('_hitTestOverlayWidget');
|
||||
console.log('request : ', request);
|
||||
console.log('request.target : ', request.target);
|
||||
console.log('request.targetPath : ', request.targetPath);
|
||||
console.log('ElementPath.isChildOfOverlayWidgets(request.targetPath) : ', ElementPath.isChildOfOverlayWidgets(request.targetPath));
|
||||
console.log('ElementPath.isChildOfOverflowingOverlayWidgets(request.targetPath) : ', ElementPath.isChildOfOverflowingOverlayWidgets(request.targetPath));
|
||||
// Is it an overlay widget?
|
||||
if (ElementPath.isChildOfOverlayWidgets(request.targetPath) || ElementPath.isChildOfOverflowingOverlayWidgets(request.targetPath)) {
|
||||
const widgetId = ctx.findAttribute(request.target, 'widgetId');
|
||||
|
|
|
@ -22,8 +22,8 @@ import { ViewContext } from 'vs/editor/common/viewModel/viewContext';
|
|||
*/
|
||||
export class PointerEventHandler extends MouseHandler {
|
||||
private _lastPointerType: string;
|
||||
constructor(context: ViewContext, viewController: ViewController, viewHelper: IPointerHandlerHelper, overflowWidgetsDomNode?: HTMLElement) {
|
||||
super(context, viewController, viewHelper, overflowWidgetsDomNode);
|
||||
constructor(context: ViewContext, viewController: ViewController, viewHelper: IPointerHandlerHelper) {
|
||||
super(context, viewController, viewHelper);
|
||||
|
||||
this._register(Gesture.addTarget(this.viewHelper.linesContentDomNode));
|
||||
this._register(dom.addDisposableListener(this.viewHelper.linesContentDomNode, EventType.Tap, (e) => this.onTap(e)));
|
||||
|
@ -47,7 +47,7 @@ export class PointerEventHandler extends MouseHandler {
|
|||
// PonterEvents
|
||||
const pointerEvents = new EditorPointerEventFactory(this.viewHelper.viewDomNode);
|
||||
|
||||
this._register(pointerEvents.onPointerMove(this.viewHelper.viewDomNode, (e) => this._onMouseMove(e)));
|
||||
this._register(pointerEvents.onPointerMove(this.viewHelper.viewDomNode, (e) => this._onMouseMove(e, false)));
|
||||
this._register(pointerEvents.onPointerUp(this.viewHelper.viewDomNode, (e) => this._onMouseUp(e)));
|
||||
this._register(pointerEvents.onPointerLeave(this.viewHelper.viewDomNode, (e) => {
|
||||
console.log('_onMouseLeave of pointer leave');
|
||||
|
@ -76,7 +76,7 @@ export class PointerEventHandler extends MouseHandler {
|
|||
}
|
||||
|
||||
private _dispatchGesture(event: GestureEvent, inSelectionMode: boolean): void {
|
||||
const target = this._createMouseTarget(new EditorMouseEvent(event, false, this.viewHelper.viewDomNode), false);
|
||||
const target = this._createMouseTarget(new EditorMouseEvent(event, false, this.viewHelper.viewDomNode), false, false);
|
||||
if (target.position) {
|
||||
this.viewController.dispatchMouse({
|
||||
position: target.position,
|
||||
|
@ -107,8 +107,8 @@ export class PointerEventHandler extends MouseHandler {
|
|||
|
||||
class TouchHandler extends MouseHandler {
|
||||
|
||||
constructor(context: ViewContext, viewController: ViewController, viewHelper: IPointerHandlerHelper, overflowWidgetsDomNode?: HTMLElement) {
|
||||
super(context, viewController, viewHelper, overflowWidgetsDomNode);
|
||||
constructor(context: ViewContext, viewController: ViewController, viewHelper: IPointerHandlerHelper) {
|
||||
super(context, viewController, viewHelper);
|
||||
|
||||
this._register(Gesture.addTarget(this.viewHelper.linesContentDomNode));
|
||||
|
||||
|
@ -122,7 +122,7 @@ class TouchHandler extends MouseHandler {
|
|||
|
||||
this.viewHelper.focusTextArea();
|
||||
|
||||
const target = this._createMouseTarget(new EditorMouseEvent(event, false, this.viewHelper.viewDomNode), false);
|
||||
const target = this._createMouseTarget(new EditorMouseEvent(event, false, this.viewHelper.viewDomNode), false, false);
|
||||
|
||||
if (target.position) {
|
||||
// Send the tap event also to the <textarea> (for input purposes)
|
||||
|
@ -142,15 +142,15 @@ class TouchHandler extends MouseHandler {
|
|||
export class PointerHandler extends Disposable {
|
||||
private readonly handler: MouseHandler;
|
||||
|
||||
constructor(context: ViewContext, viewController: ViewController, viewHelper: IPointerHandlerHelper, overflowWidgetsDomNode?: HTMLElement) {
|
||||
constructor(context: ViewContext, viewController: ViewController, viewHelper: IPointerHandlerHelper) {
|
||||
super();
|
||||
const isPhone = platform.isIOS || (platform.isAndroid && platform.isMobile);
|
||||
if (isPhone && BrowserFeatures.pointerEvents) {
|
||||
this.handler = this._register(new PointerEventHandler(context, viewController, viewHelper, overflowWidgetsDomNode));
|
||||
this.handler = this._register(new PointerEventHandler(context, viewController, viewHelper));
|
||||
} else if (mainWindow.TouchEvent) {
|
||||
this.handler = this._register(new TouchHandler(context, viewController, viewHelper, overflowWidgetsDomNode));
|
||||
this.handler = this._register(new TouchHandler(context, viewController, viewHelper));
|
||||
} else {
|
||||
this.handler = this._register(new MouseHandler(context, viewController, viewHelper, overflowWidgetsDomNode));
|
||||
this.handler = this._register(new MouseHandler(context, viewController, viewHelper));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -117,7 +117,7 @@ export class View extends ViewEventHandler {
|
|||
const viewController = new ViewController(configuration, model, userInputEvents, commandDelegate);
|
||||
|
||||
// The view context is passed on to most classes (basically to reduce param. counts in ctors)
|
||||
this._context = new ViewContext(configuration, colorTheme, model);
|
||||
this._context = new ViewContext(configuration, colorTheme, model, overflowWidgetsDomNode);
|
||||
|
||||
// Ensure the view is the first event handler in order to update the layout
|
||||
this._context.addEventHandler(this);
|
||||
|
@ -239,7 +239,7 @@ export class View extends ViewEventHandler {
|
|||
this._applyLayout();
|
||||
|
||||
// Pointer handler
|
||||
this._pointerHandler = this._register(new PointerHandler(this._context, viewController, this._createPointerHandlerHelper(), overflowWidgetsDomNode));
|
||||
this._pointerHandler = this._register(new PointerHandler(this._context, viewController, this._createPointerHandlerHelper()));
|
||||
}
|
||||
|
||||
private _computeGlyphMarginLanes(): IGlyphMarginLanesModel {
|
||||
|
|
|
@ -15,16 +15,19 @@ export class ViewContext {
|
|||
public readonly viewModel: IViewModel;
|
||||
public readonly viewLayout: IViewLayout;
|
||||
public readonly theme: EditorTheme;
|
||||
public readonly overflowWidgetsDomNode: HTMLElement | undefined;
|
||||
|
||||
constructor(
|
||||
configuration: IEditorConfiguration,
|
||||
theme: IColorTheme,
|
||||
model: IViewModel
|
||||
model: IViewModel,
|
||||
overflowWidgetsDomNode?: HTMLElement
|
||||
) {
|
||||
this.configuration = configuration;
|
||||
this.theme = new EditorTheme(theme);
|
||||
this.viewModel = model;
|
||||
this.viewLayout = model.viewLayout;
|
||||
this.overflowWidgetsDomNode = overflowWidgetsDomNode;
|
||||
}
|
||||
|
||||
public addEventHandler(eventHandler: ViewEventHandler): void {
|
||||
|
|
Loading…
Reference in New Issue
Block a user