1 | "use strict";
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 | Object.defineProperty(exports, "__esModule", { value: true });
|
22 | exports.measureTextHeight = exports.measureTextWidth = exports.preventNavigation = exports.parseCssTime = exports.parseCssMagnitude = exports.animationFrame = exports.isBasicWasmSupported = exports.isNative = exports.isIPad = exports.isSafari = exports.isChrome = exports.isWebKit = exports.isFirefox = exports.isOpera = exports.isEdgeOrIE = exports.isEdge = exports.isIE = void 0;
|
23 | const common_1 = require("../common");
|
24 | const userAgent = typeof navigator !== 'undefined' ? navigator.userAgent : '';
|
25 | exports.isIE = (userAgent.indexOf('Trident') >= 0);
|
26 | exports.isEdge = (userAgent.indexOf('Edge/') >= 0);
|
27 | exports.isEdgeOrIE = exports.isIE || exports.isEdge;
|
28 | exports.isOpera = (userAgent.indexOf('Opera') >= 0);
|
29 | exports.isFirefox = (userAgent.indexOf('Firefox') >= 0);
|
30 | exports.isWebKit = (userAgent.indexOf('AppleWebKit') >= 0);
|
31 | exports.isChrome = (userAgent.indexOf('Chrome') >= 0);
|
32 | exports.isSafari = (userAgent.indexOf('Chrome') === -1) && (userAgent.indexOf('Safari') >= 0);
|
33 | exports.isIPad = (userAgent.indexOf('iPad') >= 0);
|
34 |
|
35 |
|
36 |
|
37 |
|
38 | exports.isNative = common_1.environment.electron.is();
|
39 |
|
40 | exports.isBasicWasmSupported = typeof window.WebAssembly !== 'undefined';
|
41 |
|
42 |
|
43 |
|
44 |
|
45 | function animationFrame(n = 1) {
|
46 | return new Promise(resolve => {
|
47 | function frameFunc() {
|
48 | if (n <= 0) {
|
49 | resolve();
|
50 | }
|
51 | else {
|
52 | n--;
|
53 | requestAnimationFrame(frameFunc);
|
54 | }
|
55 | }
|
56 | frameFunc();
|
57 | });
|
58 | }
|
59 | exports.animationFrame = animationFrame;
|
60 | function parseCssMagnitude(value, defaultValue) {
|
61 | if (value) {
|
62 | let parsed;
|
63 | if (value.endsWith('px')) {
|
64 | parsed = parseFloat(value.substring(0, value.length - 2));
|
65 | }
|
66 | else {
|
67 | parsed = parseFloat(value);
|
68 | }
|
69 | if (!isNaN(parsed)) {
|
70 | return parsed;
|
71 | }
|
72 | }
|
73 | return defaultValue;
|
74 | }
|
75 | exports.parseCssMagnitude = parseCssMagnitude;
|
76 | function parseCssTime(time, defaultValue) {
|
77 | if (time) {
|
78 | let parsed;
|
79 | if (time.endsWith('ms')) {
|
80 | parsed = parseFloat(time.substring(0, time.length - 2));
|
81 | }
|
82 | else if (time.endsWith('s')) {
|
83 | parsed = parseFloat(time.substring(0, time.length - 1)) * 1000;
|
84 | }
|
85 | else {
|
86 | parsed = parseFloat(time);
|
87 | }
|
88 | if (!isNaN(parsed)) {
|
89 | return parsed;
|
90 | }
|
91 | }
|
92 | return defaultValue;
|
93 | }
|
94 | exports.parseCssTime = parseCssTime;
|
95 | function getMonacoEditorScroll(elem) {
|
96 | const linesContent = elem.querySelector('.lines-content');
|
97 | const viewLines = elem.querySelector('.view-lines');
|
98 |
|
99 | if (linesContent === null || viewLines === null) {
|
100 | return undefined;
|
101 | }
|
102 | const linesContentStyle = linesContent.style;
|
103 | const elemStyle = elem.style;
|
104 | const viewLinesStyle = viewLines.style;
|
105 | return {
|
106 | left: -parseCssMagnitude(linesContentStyle.left, 0),
|
107 | top: -parseCssMagnitude(linesContentStyle.top, 0),
|
108 | maxLeft: parseCssMagnitude(viewLinesStyle.width, 0) - parseCssMagnitude(elemStyle.width, 0),
|
109 | maxTop: parseCssMagnitude(viewLinesStyle.height, 0) - parseCssMagnitude(elemStyle.height, 0)
|
110 | };
|
111 | }
|
112 |
|
113 |
|
114 |
|
115 | function preventNavigation(event) {
|
116 | const { currentTarget, deltaX, deltaY } = event;
|
117 | const absDeltaX = Math.abs(deltaX);
|
118 | const absDeltaY = Math.abs(deltaY);
|
119 | let elem = event.target;
|
120 | while (elem && elem !== currentTarget) {
|
121 | let scroll;
|
122 | if (elem.classList.contains('monaco-scrollable-element')) {
|
123 | scroll = getMonacoEditorScroll(elem);
|
124 | }
|
125 | else {
|
126 | scroll = {
|
127 | left: elem.scrollLeft,
|
128 | top: elem.scrollTop,
|
129 | maxLeft: elem.scrollWidth - elem.clientWidth,
|
130 | maxTop: elem.scrollHeight - elem.clientHeight
|
131 | };
|
132 | }
|
133 | if (scroll) {
|
134 | const scrollH = scroll.maxLeft > 0 && (deltaX < 0 && scroll.left > 0 || deltaX > 0 && scroll.left < scroll.maxLeft);
|
135 | const scrollV = scroll.maxTop > 0 && (deltaY < 0 && scroll.top > 0 || deltaY > 0 && scroll.top < scroll.maxTop);
|
136 | if (scrollH && scrollV || scrollH && absDeltaX > absDeltaY || scrollV && absDeltaY > absDeltaX) {
|
137 |
|
138 | return;
|
139 | }
|
140 | }
|
141 | elem = elem.parentElement;
|
142 | }
|
143 | event.preventDefault();
|
144 | event.stopPropagation();
|
145 | }
|
146 | exports.preventNavigation = preventNavigation;
|
147 | function measureTextWidth(text, style) {
|
148 | const measureElement = getMeasurementElement(style);
|
149 | text = Array.isArray(text) ? text : [text];
|
150 | let width = 0;
|
151 | for (const item of text) {
|
152 | measureElement.textContent = item;
|
153 | width = Math.max(measureElement.getBoundingClientRect().width, width);
|
154 | }
|
155 | return width;
|
156 | }
|
157 | exports.measureTextWidth = measureTextWidth;
|
158 | function measureTextHeight(text, style) {
|
159 | const measureElement = getMeasurementElement(style);
|
160 | text = Array.isArray(text) ? text : [text];
|
161 | let height = 0;
|
162 | for (const item of text) {
|
163 | measureElement.textContent = item;
|
164 | height = Math.max(measureElement.getBoundingClientRect().height, height);
|
165 | }
|
166 | return height;
|
167 | }
|
168 | exports.measureTextHeight = measureTextHeight;
|
169 | const defaultStyle = document.createElement('div').style;
|
170 | defaultStyle.fontFamily = 'var(--theia-ui-font-family)';
|
171 | defaultStyle.fontSize = 'var(--theia-ui-font-size1)';
|
172 | defaultStyle.visibility = 'hidden';
|
173 | function getMeasurementElement(style) {
|
174 | let measureElement = document.getElementById('measure');
|
175 | if (!measureElement) {
|
176 | measureElement = document.createElement('span');
|
177 | measureElement.id = 'measure';
|
178 | measureElement.style.fontFamily = defaultStyle.fontFamily;
|
179 | measureElement.style.fontSize = defaultStyle.fontSize;
|
180 | measureElement.style.visibility = defaultStyle.visibility;
|
181 | document.body.appendChild(measureElement);
|
182 | }
|
183 | const measureStyle = measureElement.style;
|
184 |
|
185 | for (let i = 0; i < measureStyle.length; i++) {
|
186 | const property = measureStyle[i];
|
187 | measureStyle.setProperty(property, defaultStyle.getPropertyValue(property));
|
188 | }
|
189 |
|
190 | if (style) {
|
191 | for (const [key, value] of Object.entries(style)) {
|
192 | measureStyle.setProperty(key, value);
|
193 | }
|
194 | }
|
195 | return measureElement;
|
196 | }
|
197 |
|
\ | No newline at end of file |