@platformos/pos-cli
Version:
Manage your platformOS application
167 lines (127 loc) • 4.19 kB
JavaScript
"use strict";
var _codemirror = _interopRequireDefault(require("codemirror"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Copyright (c) 2019 GraphQL Contributors
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
_codemirror.default.defineOption('jump', false, (cm, options, old) => {
if (old && old !== _codemirror.default.Init) {
const oldOnMouseOver = cm.state.jump.onMouseOver;
_codemirror.default.off(cm.getWrapperElement(), 'mouseover', oldOnMouseOver);
const oldOnMouseOut = cm.state.jump.onMouseOut;
_codemirror.default.off(cm.getWrapperElement(), 'mouseout', oldOnMouseOut);
_codemirror.default.off(document, 'keydown', cm.state.jump.onKeyDown);
delete cm.state.jump;
}
if (options) {
const state = cm.state.jump = {
options,
onMouseOver: onMouseOver.bind(null, cm),
onMouseOut: onMouseOut.bind(null, cm),
onKeyDown: onKeyDown.bind(null, cm)
};
_codemirror.default.on(cm.getWrapperElement(), 'mouseover', state.onMouseOver);
_codemirror.default.on(cm.getWrapperElement(), 'mouseout', state.onMouseOut);
_codemirror.default.on(document, 'keydown', state.onKeyDown);
}
});
function onMouseOver(cm, event) {
const target = event.target || event.srcElement;
if (target.nodeName !== 'SPAN') {
return;
}
const box = target.getBoundingClientRect();
const cursor = {
left: (box.left + box.right) / 2,
top: (box.top + box.bottom) / 2
};
cm.state.jump.cursor = cursor;
if (cm.state.jump.isHoldingModifier) {
enableJumpMode(cm);
}
}
function onMouseOut(cm) {
if (!cm.state.jump.isHoldingModifier && cm.state.jump.cursor) {
cm.state.jump.cursor = null;
return;
}
if (cm.state.jump.isHoldingModifier && cm.state.jump.marker) {
disableJumpMode(cm);
}
}
function onKeyDown(cm, event) {
if (cm.state.jump.isHoldingModifier || !isJumpModifier(event.key)) {
return;
}
cm.state.jump.isHoldingModifier = true;
if (cm.state.jump.cursor) {
enableJumpMode(cm);
}
const onKeyUp = upEvent => {
if (upEvent.code !== event.code) {
return;
}
cm.state.jump.isHoldingModifier = false;
if (cm.state.jump.marker) {
disableJumpMode(cm);
}
_codemirror.default.off(document, 'keyup', onKeyUp);
_codemirror.default.off(document, 'click', onClick);
cm.off('mousedown', onMouseDown);
};
const onClick = clickEvent => {
const destination = cm.state.jump.destination;
if (destination) {
cm.state.jump.options.onClick(destination, clickEvent);
}
};
const onMouseDown = (_, downEvent) => {
if (cm.state.jump.destination) {
downEvent.codemirrorIgnore = true;
}
};
_codemirror.default.on(document, 'keyup', onKeyUp);
_codemirror.default.on(document, 'click', onClick);
cm.on('mousedown', onMouseDown);
}
const isMac = typeof navigator !== 'undefined' && navigator && navigator.appVersion.indexOf('Mac') !== -1;
function isJumpModifier(key) {
return key === (isMac ? 'Meta' : 'Control');
}
function enableJumpMode(cm) {
if (cm.state.jump.marker) {
return;
}
const cursor = cm.state.jump.cursor;
const pos = cm.coordsChar(cursor);
const token = cm.getTokenAt(pos, true);
const options = cm.state.jump.options;
const getDestination = options.getDestination || cm.getHelper(pos, 'jump');
if (getDestination) {
const destination = getDestination(token, options, cm);
if (destination) {
const marker = cm.markText({
line: pos.line,
ch: token.start
}, {
line: pos.line,
ch: token.end
}, {
className: 'CodeMirror-jump-token'
});
cm.state.jump.marker = marker;
cm.state.jump.destination = destination;
}
}
}
function disableJumpMode(cm) {
const marker = cm.state.jump.marker;
cm.state.jump.marker = null;
cm.state.jump.destination = null;
marker.clear();
}