@difizen/mana-core
Version:
758 lines (756 loc) • 34.1 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.VSContextKeyService = exports.OverlayContextKeyService = exports.Context = exports.AbstractContextKeyService = void 0;
var _manaCommon = require("@difizen/mana-common");
var _manaObservable = require("@difizen/mana-observable");
var _manaSyringe = require("@difizen/mana-syringe");
var _utils = require("../../utils");
var _map = require("../../utils/map");
var _configuration = require("./configuration/configuration");
var _contextkey = require("./contextkey");
var _dec, _class, _descriptor, _NullContext, _dec2, _class2, _dec3, _class3;
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function _get() { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get.bind(); } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return _get.apply(this, arguments); }
function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'transform-class-properties is enabled and runs after the decorators transform.'); }
var KEYBINDING_CONTEXT_ATTR = 'data-mana-keybinding-context';
var Context = exports.Context = (_dec = (0, _manaObservable.prop)(), (_class = /*#__PURE__*/function () {
function Context(id, parent) {
_classCallCheck(this, Context);
_initializerDefineProperty(this, "_value", _descriptor, this);
this._id = id;
this._parent = parent;
this._value = Object.create(null);
this._value['_contextId'] = id;
}
_createClass(Context, [{
key: "setValue",
value: function setValue(key, value) {
if (this._value[key] !== value) {
this._value[key] = value;
return true;
}
return false;
}
}, {
key: "removeValue",
value: function removeValue(key) {
if (key in this._value) {
delete this._value[key];
return true;
}
return false;
}
}, {
key: "getValue",
value: function getValue(key) {
var ret = this._value[key];
if (typeof ret === 'undefined' && this._parent) {
return this._parent.getValue(key);
}
return ret;
}
}, {
key: "updateParent",
value: function updateParent(parent) {
this._parent = parent;
}
}, {
key: "collectAllValues",
value: function collectAllValues() {
var result = this._parent ? this._parent.collectAllValues() : Object.create(null);
result = _objectSpread(_objectSpread({}, result), this._value);
delete result._contextId;
return result;
}
}]);
return Context;
}(), (_descriptor = _applyDecoratedDescriptor(_class.prototype, "_value", [_dec], {
configurable: true,
enumerable: true,
writable: true,
initializer: null
})), _class));
var NullContext = /*#__PURE__*/function (_Context2) {
_inherits(NullContext, _Context2);
var _super = _createSuper(NullContext);
function NullContext() {
_classCallCheck(this, NullContext);
return _super.call(this, -1, null);
}
_createClass(NullContext, [{
key: "setValue",
value: function setValue(_key, _value) {
return false;
}
}, {
key: "removeValue",
value: function removeValue(_key) {
return false;
}
}, {
key: "getValue",
value: function getValue(_key) {
return undefined;
}
}, {
key: "collectAllValues",
value: function collectAllValues() {
return Object.create(null);
}
}]);
return NullContext;
}(Context);
_NullContext = NullContext;
NullContext.INSTANCE = new _NullContext();
var ConfigAwareContextValuesContainer = /*#__PURE__*/function (_Context3) {
_inherits(ConfigAwareContextValuesContainer, _Context3);
var _super2 = _createSuper(ConfigAwareContextValuesContainer);
function ConfigAwareContextValuesContainer(id, _configurationService, emitter) {
var _this;
_classCallCheck(this, ConfigAwareContextValuesContainer);
_this = _super2.call(this, id, null);
_this._values = _map.TernarySearchTree.forConfigKeys();
_this._configurationService = _configurationService;
_this._listener = _this._configurationService.onDidChangeConfiguration(function (event) {
if (event.source === _configuration.ConfigurationTarget.DEFAULT) {
// new setting, reset everything
var allKeys = Array.from(_manaCommon.Iterable.map(_this._values, function (_ref) {
var _ref2 = _slicedToArray(_ref, 1),
k = _ref2[0];
return k;
}));
_this._values.clear();
emitter.fire(new ArrayContextKeyChangeEvent(allKeys));
} else {
var changedKeys = [];
var _iterator = _createForOfIteratorHelper(event.affectedKeys),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var configKey = _step.value;
var contextKey = "config.".concat(configKey);
var cachedItems = _this._values.findSuperstr(contextKey);
if (cachedItems !== undefined) {
changedKeys.push.apply(changedKeys, _toConsumableArray(_manaCommon.Iterable.map(cachedItems, function (_ref3) {
var _ref4 = _slicedToArray(_ref3, 1),
key = _ref4[0];
return key;
})));
_this._values.deleteSuperstr(contextKey);
}
if (_this._values.has(contextKey)) {
changedKeys.push(contextKey);
_this._values.delete(contextKey);
}
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
emitter.fire(new ArrayContextKeyChangeEvent(changedKeys));
}
});
return _this;
}
_createClass(ConfigAwareContextValuesContainer, [{
key: "dispose",
value: function dispose() {
this._listener.dispose();
}
}, {
key: "getValue",
value: function getValue(key) {
if (key.indexOf(ConfigAwareContextValuesContainer._keyPrefix) !== 0) {
return _get(_getPrototypeOf(ConfigAwareContextValuesContainer.prototype), "getValue", this).call(this, key);
}
if (this._values.has(key)) {
return this._values.get(key);
}
var configKey = key.substr(ConfigAwareContextValuesContainer._keyPrefix.length);
var configValue = this._configurationService.getValue(configKey);
var value;
switch (_typeof(configValue)) {
case 'number':
case 'boolean':
case 'string':
value = configValue;
break;
default:
if (Array.isArray(configValue)) {
value = JSON.stringify(configValue);
} else {
value = configValue;
}
}
this._values.set(key, value);
return value;
}
}, {
key: "setValue",
value: function setValue(key, value) {
return _get(_getPrototypeOf(ConfigAwareContextValuesContainer.prototype), "setValue", this).call(this, key, value);
}
}, {
key: "removeValue",
value: function removeValue(key) {
return _get(_getPrototypeOf(ConfigAwareContextValuesContainer.prototype), "removeValue", this).call(this, key);
}
}, {
key: "collectAllValues",
value: function collectAllValues() {
var result = Object.create(null);
this._values.forEach(function (value, index) {
return result[index] = value;
});
return _objectSpread(_objectSpread({}, result), _get(_getPrototypeOf(ConfigAwareContextValuesContainer.prototype), "collectAllValues", this).call(this));
}
}]);
return ConfigAwareContextValuesContainer;
}(Context);
ConfigAwareContextValuesContainer._keyPrefix = 'config.';
var ContextKey = /*#__PURE__*/function () {
function ContextKey(service, key, defaultValue) {
_classCallCheck(this, ContextKey);
this._service = service;
this._key = key;
this._defaultValue = defaultValue;
this.reset();
}
_createClass(ContextKey, [{
key: "set",
value: function set(value) {
this._service.setContext(this._key, value);
}
}, {
key: "reset",
value: function reset() {
if (typeof this._defaultValue === 'undefined') {
this._service.removeContext(this._key);
} else {
this._service.setContext(this._key, this._defaultValue);
}
}
}, {
key: "get",
value: function get() {
return this._service.getContextKeyValue(this._key);
}
}]);
return ContextKey;
}();
var SimpleContextKeyChangeEvent = /*#__PURE__*/function () {
function SimpleContextKeyChangeEvent(key) {
_classCallCheck(this, SimpleContextKeyChangeEvent);
this.key = key;
}
_createClass(SimpleContextKeyChangeEvent, [{
key: "affectsSome",
value: function affectsSome(keys) {
return keys.has(this.key);
}
}]);
return SimpleContextKeyChangeEvent;
}();
var ArrayContextKeyChangeEvent = /*#__PURE__*/function () {
function ArrayContextKeyChangeEvent(keys) {
_classCallCheck(this, ArrayContextKeyChangeEvent);
this.keys = keys;
}
_createClass(ArrayContextKeyChangeEvent, [{
key: "affectsSome",
value: function affectsSome(keys) {
var _iterator2 = _createForOfIteratorHelper(this.keys),
_step2;
try {
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
var key = _step2.value;
if (keys.has(key)) {
return true;
}
}
} catch (err) {
_iterator2.e(err);
} finally {
_iterator2.f();
}
return false;
}
}]);
return ArrayContextKeyChangeEvent;
}();
var CompositeContextKeyChangeEvent = /*#__PURE__*/function () {
function CompositeContextKeyChangeEvent(events) {
_classCallCheck(this, CompositeContextKeyChangeEvent);
this.events = events;
}
_createClass(CompositeContextKeyChangeEvent, [{
key: "affectsSome",
value: function affectsSome(keys) {
var _iterator3 = _createForOfIteratorHelper(this.events),
_step3;
try {
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
var e = _step3.value;
if (e.affectsSome(keys)) {
return true;
}
}
} catch (err) {
_iterator3.e(err);
} finally {
_iterator3.f();
}
return false;
}
}]);
return CompositeContextKeyChangeEvent;
}();
var AbstractContextKeyService = exports.AbstractContextKeyService = (_dec2 = (0, _manaSyringe.injectable)(), _dec2(_class2 = /*#__PURE__*/function () {
function AbstractContextKeyService(myContextId) {
_classCallCheck(this, AbstractContextKeyService);
this._onDidChangeContext = new _manaCommon.PauseableEmitter({
merge: function merge(input) {
return new CompositeContextKeyChangeEvent(input);
}
});
this.onDidChangeContext = this._onDidChangeContext.event;
this._isDisposed = false;
this._myContextId = myContextId;
}
_createClass(AbstractContextKeyService, [{
key: "contextId",
get: function get() {
return this._myContextId;
}
}, {
key: "createKey",
value: function createKey(key, defaultValue) {
if (this._isDisposed) {
throw new Error("AbstractContextKeyService has been disposed");
}
return new ContextKey(this, key, defaultValue);
}
}, {
key: "bufferChangeEvents",
value: function bufferChangeEvents(callback) {
this._onDidChangeContext.pause();
try {
callback();
} finally {
this._onDidChangeContext.resume();
}
}
}, {
key: "createScoped",
value: function createScoped(domNode) {
if (this._isDisposed) {
throw new Error("AbstractContextKeyService has been disposed");
}
return new ScopedContextKeyService(this, domNode);
}
}, {
key: "createOverlay",
value: function createOverlay() {
var overlay = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _manaCommon.Iterable.empty();
if (this._isDisposed) {
throw new Error("AbstractContextKeyService has been disposed");
}
return new OverlayContextKeyService(this, overlay);
}
}, {
key: "contextMatchesRules",
value: function contextMatchesRules(rules) {
if (this._isDisposed) {
throw new Error("AbstractContextKeyService has been disposed");
}
var context = this.getContextValuesContainer(this._myContextId);
if (!rules) {
return true;
}
return rules.evaluate(context);
// console.group(rules.serialize() + ' -> ' + result);
// rules.keys().forEach(key => { console.log(key, ctx[key]); });
// console.groupEnd();
// return result;
}
}, {
key: "getContextKeyValue",
value: function getContextKeyValue(key) {
if (this._isDisposed) {
return undefined;
}
return this.getContextValuesContainer(this._myContextId).getValue(key);
}
}, {
key: "setContext",
value: function setContext(key, value) {
if (this._isDisposed) {
return;
}
var myContext = this.getContextValuesContainer(this._myContextId);
if (!myContext) {
return;
}
if (myContext.setValue(key, value)) {
this._onDidChangeContext.fire(new SimpleContextKeyChangeEvent(key));
}
}
}, {
key: "removeContext",
value: function removeContext(key) {
if (this._isDisposed) {
return;
}
if (this.getContextValuesContainer(this._myContextId).removeValue(key)) {
this._onDidChangeContext.fire(new SimpleContextKeyChangeEvent(key));
}
}
}, {
key: "getContext",
value: function getContext(target) {
if (this._isDisposed) {
return NullContext.INSTANCE;
}
return this.getContextValuesContainer(findContextAttr(target));
}
}]);
return AbstractContextKeyService;
}()) || _class2);
var VSContextKeyService = exports.VSContextKeyService = (_dec3 = (0, _manaSyringe.singleton)({
contrib: _contextkey.IContextKeyService
}), _dec3(_class3 = /*#__PURE__*/function (_AbstractContextKeySe) {
_inherits(VSContextKeyService, _AbstractContextKeySe);
var _super3 = _createSuper(VSContextKeyService);
function VSContextKeyService(configurationService) {
var _this2;
_classCallCheck(this, VSContextKeyService);
_this2 = _super3.call(this, 0);
_this2._contexts = new Map();
_this2._toDispose = new _utils.DisposableStore();
_this2.configurationService = configurationService;
_this2._lastContextId = 0;
var myContext = new ConfigAwareContextValuesContainer(_this2._myContextId, configurationService, _this2._onDidChangeContext);
_this2._contexts.set(_this2._myContextId, myContext);
_this2._toDispose.add(myContext);
// Uncomment this to see the contexts continuously logged
// let lastLoggedValue: string | null = null;
// setInterval(() => {
// let values = Object.keys(this._contexts).map((key) => this._contexts[key]);
// let logValue = values.map(v => JSON.stringify(v._value, null, '\t')).join('\n');
// if (lastLoggedValue !== logValue) {
// lastLoggedValue = logValue;
// console.log(lastLoggedValue);
// }
// }, 2000);
return _this2;
}
VSContextKeyService = (0, _manaSyringe.inject)(_configuration.IConfigurationService)(VSContextKeyService, undefined, 0) || VSContextKeyService;
_createClass(VSContextKeyService, [{
key: "registerCommands",
value: function registerCommands(commands) {
var _this3 = this;
commands.registerCommand({
id: _contextkey.SET_CONTEXT_COMMAND_ID
}, {
execute: function execute(contextKey, contextValue) {
_this3.createKey(String(contextKey), contextValue);
}
});
commands.registerCommand({
id: 'getContextKeyInfo',
label: 'getContextKeyInfo, A command that returns information about context keys'
}, {
execute: function execute() {
return _toConsumableArray(_contextkey.RawContextKey.all()).sort(function (a, b) {
return a.key.localeCompare(b.key);
});
}
});
commands.registerCommand({
id: '_generateContextKeyInfo'
}, {
execute: function execute() {
var result = [];
var seen = new Set();
var _iterator4 = _createForOfIteratorHelper(_contextkey.RawContextKey.all()),
_step4;
try {
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
var info = _step4.value;
if (!seen.has(info.key)) {
seen.add(info.key);
result.push(info);
}
}
} catch (err) {
_iterator4.e(err);
} finally {
_iterator4.f();
}
result.sort(function (a, b) {
return a.key.localeCompare(b.key);
});
}
});
}
}, {
key: "dispose",
value: function dispose() {
this._onDidChangeContext.dispose();
this._isDisposed = true;
this._toDispose.dispose();
}
}, {
key: "getContextValuesContainer",
value: function getContextValuesContainer(contextId) {
if (this._isDisposed) {
return NullContext.INSTANCE;
}
return this._contexts.get(contextId) || NullContext.INSTANCE;
}
}, {
key: "createChildContext",
value: function createChildContext() {
var parentContextId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this._myContextId;
if (this._isDisposed) {
throw new Error("ContextKeyService has been disposed");
}
var id = ++this._lastContextId;
this._contexts.set(id, new Context(id, this.getContextValuesContainer(parentContextId)));
return id;
}
}, {
key: "disposeContext",
value: function disposeContext(contextId) {
if (!this._isDisposed) {
this._contexts.delete(contextId);
}
}
}, {
key: "updateParent",
value: function updateParent(_parentContextKeyService) {
throw new Error('Cannot update parent of root ContextKeyService');
}
}]);
return VSContextKeyService;
}(AbstractContextKeyService)) || _class3);
var ScopedContextKeyService = /*#__PURE__*/function (_AbstractContextKeySe2) {
_inherits(ScopedContextKeyService, _AbstractContextKeySe2);
var _super4 = _createSuper(ScopedContextKeyService);
function ScopedContextKeyService(parent, domNode) {
var _this4;
_classCallCheck(this, ScopedContextKeyService);
_this4 = _super4.call(this, parent.createChildContext());
_this4._parentChangeListener = new _utils.MutableDisposable();
_this4._parent = parent;
_this4._updateParentChangeListener();
_this4._domNode = domNode;
if (_this4._domNode.hasAttribute(KEYBINDING_CONTEXT_ATTR)) {
var extraInfo = '';
if (_this4._domNode.classList) {
extraInfo = Array.from(_this4._domNode.classList.values()).join(', ');
}
console.error("Element already has context attribute".concat(extraInfo ? ": ".concat(extraInfo) : ''));
}
_this4._domNode.setAttribute(KEYBINDING_CONTEXT_ATTR, String(_this4._myContextId));
return _this4;
}
_createClass(ScopedContextKeyService, [{
key: "_updateParentChangeListener",
value: function _updateParentChangeListener() {
// Forward parent events to this listener. Parent will change.
this._parentChangeListener.value = this._parent.onDidChangeContext(this._onDidChangeContext.fire, this._onDidChangeContext);
}
}, {
key: "dispose",
value: function dispose() {
if (this._isDisposed) {
return;
}
this._onDidChangeContext.dispose();
this._parent.disposeContext(this._myContextId);
this._parentChangeListener.dispose();
this._domNode.removeAttribute(KEYBINDING_CONTEXT_ATTR);
this._isDisposed = true;
}
}, {
key: "getContextValuesContainer",
value: function getContextValuesContainer(contextId) {
if (this._isDisposed) {
return NullContext.INSTANCE;
}
return this._parent.getContextValuesContainer(contextId);
}
}, {
key: "createChildContext",
value: function createChildContext() {
var parentContextId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this._myContextId;
if (this._isDisposed) {
throw new Error("ScopedContextKeyService has been disposed");
}
return this._parent.createChildContext(parentContextId);
}
}, {
key: "disposeContext",
value: function disposeContext(contextId) {
if (this._isDisposed) {
return;
}
this._parent.disposeContext(contextId);
}
}, {
key: "updateParent",
value: function updateParent(parentContextKeyService) {
var thisContainer = this._parent.getContextValuesContainer(this._myContextId);
var oldAllValues = thisContainer.collectAllValues();
this._parent = parentContextKeyService;
this._updateParentChangeListener();
var newParentContainer = this._parent.getContextValuesContainer(this._parent.contextId);
thisContainer.updateParent(newParentContainer);
var newAllValues = thisContainer.collectAllValues();
var allValuesDiff = _objectSpread(_objectSpread({}, _manaCommon.objects.distinct(oldAllValues, newAllValues)), _manaCommon.objects.distinct(newAllValues, oldAllValues));
var changedKeys = Object.keys(allValuesDiff);
this._onDidChangeContext.fire(new ArrayContextKeyChangeEvent(changedKeys));
}
}]);
return ScopedContextKeyService;
}(AbstractContextKeyService);
var OverlayContext = /*#__PURE__*/function () {
function OverlayContext(parent, overlay) {
_classCallCheck(this, OverlayContext);
this.parent = parent;
this.overlay = overlay;
}
_createClass(OverlayContext, [{
key: "getValue",
value: function getValue(key) {
return this.overlay.has(key) ? this.overlay.get(key) : this.parent.getValue(key);
}
}]);
return OverlayContext;
}();
var OverlayContextKeyService = exports.OverlayContextKeyService = /*#__PURE__*/function () {
function OverlayContextKeyService(parent, overlay) {
_classCallCheck(this, OverlayContextKeyService);
this.parent = parent;
this.overlay = new Map(overlay);
}
_createClass(OverlayContextKeyService, [{
key: "contextId",
get: function get() {
return this.parent.contextId;
}
}, {
key: "onDidChangeContext",
get: function get() {
return this.parent.onDidChangeContext;
}
}, {
key: "bufferChangeEvents",
value: function bufferChangeEvents(callback) {
this.parent.bufferChangeEvents(callback);
}
}, {
key: "createKey",
value: function createKey() {
throw new Error('Not supported.');
}
}, {
key: "getContext",
value: function getContext(target) {
return new OverlayContext(this.parent.getContext(target), this.overlay);
}
}, {
key: "getContextValuesContainer",
value: function getContextValuesContainer(contextId) {
var parentContext = this.parent.getContextValuesContainer(contextId);
return new OverlayContext(parentContext, this.overlay);
}
}, {
key: "contextMatchesRules",
value: function contextMatchesRules(rules) {
var context = this.getContextValuesContainer(this.contextId);
if (!rules) {
return true;
}
return rules.evaluate(context);
// return result;
}
}, {
key: "getContextKeyValue",
value: function getContextKeyValue(key) {
return this.overlay.has(key) ? this.overlay.get(key) : this.parent.getContextKeyValue(key);
}
}, {
key: "createScoped",
value: function createScoped() {
throw new Error('Not supported.');
}
}, {
key: "createOverlay",
value: function createOverlay() {
var overlay = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _manaCommon.Iterable.empty();
return new OverlayContextKeyService(this, overlay);
}
}, {
key: "updateParent",
value: function updateParent() {
throw new Error('Not supported.');
}
}, {
key: "dispose",
value: function dispose() {
// noop
}
}]);
return OverlayContextKeyService;
}();
function findContextAttr(domNode) {
while (domNode) {
if (domNode.hasAttribute(KEYBINDING_CONTEXT_ATTR)) {
var attr = domNode.getAttribute(KEYBINDING_CONTEXT_ATTR);
if (attr) {
return parseInt(attr, 10);
}
return NaN;
}
domNode = domNode.parentElement;
}
return 0;
}