monaco-editor-core
Version:
A browser based code editor
90 lines (89 loc) • 4.26 kB
JavaScript
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { ResizableHTMLElement } from '../../../../base/browser/ui/resizable/resizable.js';
import { Disposable } from '../../../../base/common/lifecycle.js';
import { Position } from '../../../common/core/position.js';
import * as dom from '../../../../base/browser/dom.js';
const TOP_HEIGHT = 30;
const BOTTOM_HEIGHT = 24;
export class ResizableContentWidget extends Disposable {
constructor(_editor, minimumSize = new dom.Dimension(10, 10)) {
super();
this._editor = _editor;
this.allowEditorOverflow = true;
this.suppressMouseDown = false;
this._resizableNode = this._register(new ResizableHTMLElement());
this._contentPosition = null;
this._isResizing = false;
this._resizableNode.domNode.style.position = 'absolute';
this._resizableNode.minSize = dom.Dimension.lift(minimumSize);
this._resizableNode.layout(minimumSize.height, minimumSize.width);
this._resizableNode.enableSashes(true, true, true, true);
this._register(this._resizableNode.onDidResize(e => {
this._resize(new dom.Dimension(e.dimension.width, e.dimension.height));
if (e.done) {
this._isResizing = false;
}
}));
this._register(this._resizableNode.onDidWillResize(() => {
this._isResizing = true;
}));
}
get isResizing() {
return this._isResizing;
}
getDomNode() {
return this._resizableNode.domNode;
}
getPosition() {
return this._contentPosition;
}
get position() {
return this._contentPosition?.position ? Position.lift(this._contentPosition.position) : undefined;
}
_availableVerticalSpaceAbove(position) {
const editorDomNode = this._editor.getDomNode();
const mouseBox = this._editor.getScrolledVisiblePosition(position);
if (!editorDomNode || !mouseBox) {
return;
}
const editorBox = dom.getDomNodePagePosition(editorDomNode);
return editorBox.top + mouseBox.top - TOP_HEIGHT;
}
_availableVerticalSpaceBelow(position) {
const editorDomNode = this._editor.getDomNode();
const mouseBox = this._editor.getScrolledVisiblePosition(position);
if (!editorDomNode || !mouseBox) {
return;
}
const editorBox = dom.getDomNodePagePosition(editorDomNode);
const bodyBox = dom.getClientArea(editorDomNode.ownerDocument.body);
const mouseBottom = editorBox.top + mouseBox.top + mouseBox.height;
return bodyBox.height - mouseBottom - BOTTOM_HEIGHT;
}
_findPositionPreference(widgetHeight, showAtPosition) {
const maxHeightBelow = Math.min(this._availableVerticalSpaceBelow(showAtPosition) ?? Infinity, widgetHeight);
const maxHeightAbove = Math.min(this._availableVerticalSpaceAbove(showAtPosition) ?? Infinity, widgetHeight);
const maxHeight = Math.min(Math.max(maxHeightAbove, maxHeightBelow), widgetHeight);
const height = Math.min(widgetHeight, maxHeight);
let renderingAbove;
if (this._editor.getOption(60 /* EditorOption.hover */).above) {
renderingAbove = height <= maxHeightAbove ? 1 /* ContentWidgetPositionPreference.ABOVE */ : 2 /* ContentWidgetPositionPreference.BELOW */;
}
else {
renderingAbove = height <= maxHeightBelow ? 2 /* ContentWidgetPositionPreference.BELOW */ : 1 /* ContentWidgetPositionPreference.ABOVE */;
}
if (renderingAbove === 1 /* ContentWidgetPositionPreference.ABOVE */) {
this._resizableNode.enableSashes(true, true, false, false);
}
else {
this._resizableNode.enableSashes(false, true, true, false);
}
return renderingAbove;
}
_resize(dimension) {
this._resizableNode.layout(dimension.height, dimension.width);
}
}