adding code

This commit is contained in:
Aiday Marlen Kyzy 2024-06-28 14:44:54 +02:00
parent 1036dcc39c
commit 20bd081661
No known key found for this signature in database
GPG Key ID: 24A8B53DBD26FF4E
5 changed files with 53 additions and 57 deletions

View File

@ -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') {

View File

@ -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');

View File

@ -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));
}
}

View File

@ -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 {

View File

@ -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 {