dockview-core
Version:
Zero dependency layout manager supporting tabs, grids and splitviews
997 lines (996 loc) • 44.8 kB
JavaScript
"use strict";
/*---------------------------------------------------------------------------------------------
* Accreditation: This file is largly based upon the MIT licenced VSCode sourcecode found at:
* https://github.com/microsoft/vscode/tree/main/src/vs/base/browser/ui/splitview
*--------------------------------------------------------------------------------------------*/
var __values = (this && this.__values) || function(o) {
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
if (m) return m.call(o);
if (o && typeof o.length === "number") return {
next: function () {
if (o && i >= o.length) o = void 0;
return { value: o && o[i++], done: !o };
}
};
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
var __read = (this && this.__read) || function (o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
}
catch (error) { e = { error: error }; }
finally {
try {
if (r && !r.done && (m = i["return"])) m.call(i);
}
finally { if (e) throw e.error; }
}
return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Splitview = exports.Sizing = exports.LayoutPriority = exports.SashState = exports.Orientation = void 0;
var dom_1 = require("../dom");
var events_1 = require("../events");
var array_1 = require("../array");
var math_1 = require("../math");
var viewItem_1 = require("./viewItem");
var Orientation;
(function (Orientation) {
Orientation["HORIZONTAL"] = "HORIZONTAL";
Orientation["VERTICAL"] = "VERTICAL";
})(Orientation || (exports.Orientation = Orientation = {}));
var SashState;
(function (SashState) {
SashState[SashState["MAXIMUM"] = 0] = "MAXIMUM";
SashState[SashState["MINIMUM"] = 1] = "MINIMUM";
SashState[SashState["DISABLED"] = 2] = "DISABLED";
SashState[SashState["ENABLED"] = 3] = "ENABLED";
})(SashState || (exports.SashState = SashState = {}));
var LayoutPriority;
(function (LayoutPriority) {
LayoutPriority["Low"] = "low";
LayoutPriority["High"] = "high";
LayoutPriority["Normal"] = "normal";
})(LayoutPriority || (exports.LayoutPriority = LayoutPriority = {}));
var Sizing;
(function (Sizing) {
Sizing.Distribute = { type: 'distribute' };
function Split(index) {
return { type: 'split', index: index };
}
Sizing.Split = Split;
function Invisible(cachedVisibleSize) {
return { type: 'invisible', cachedVisibleSize: cachedVisibleSize };
}
Sizing.Invisible = Invisible;
})(Sizing || (exports.Sizing = Sizing = {}));
var Splitview = /** @class */ (function () {
function Splitview(container, options) {
var _this = this;
var _a, _b;
this.container = container;
this.viewItems = [];
this.sashes = [];
this._size = 0;
this._orthogonalSize = 0;
this._contentSize = 0;
this._proportions = undefined;
this._startSnappingEnabled = true;
this._endSnappingEnabled = true;
this._disabled = false;
this._margin = 0;
this._onDidSashEnd = new events_1.Emitter();
this.onDidSashEnd = this._onDidSashEnd.event;
this._onDidAddView = new events_1.Emitter();
this.onDidAddView = this._onDidAddView.event;
this._onDidRemoveView = new events_1.Emitter();
this.onDidRemoveView = this._onDidRemoveView.event;
this.resize = function (index, delta, sizes, lowPriorityIndexes, highPriorityIndexes, overloadMinDelta, overloadMaxDelta, snapBefore, snapAfter) {
var e_1, _a, e_2, _b;
if (sizes === void 0) { sizes = _this.viewItems.map(function (x) { return x.size; }); }
if (overloadMinDelta === void 0) { overloadMinDelta = Number.NEGATIVE_INFINITY; }
if (overloadMaxDelta === void 0) { overloadMaxDelta = Number.POSITIVE_INFINITY; }
if (index < 0 || index > _this.viewItems.length) {
return 0;
}
var upIndexes = (0, math_1.range)(index, -1);
var downIndexes = (0, math_1.range)(index + 1, _this.viewItems.length);
//
if (highPriorityIndexes) {
try {
for (var highPriorityIndexes_1 = __values(highPriorityIndexes), highPriorityIndexes_1_1 = highPriorityIndexes_1.next(); !highPriorityIndexes_1_1.done; highPriorityIndexes_1_1 = highPriorityIndexes_1.next()) {
var i = highPriorityIndexes_1_1.value;
(0, array_1.pushToStart)(upIndexes, i);
(0, array_1.pushToStart)(downIndexes, i);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (highPriorityIndexes_1_1 && !highPriorityIndexes_1_1.done && (_a = highPriorityIndexes_1.return)) _a.call(highPriorityIndexes_1);
}
finally { if (e_1) throw e_1.error; }
}
}
if (lowPriorityIndexes) {
try {
for (var lowPriorityIndexes_1 = __values(lowPriorityIndexes), lowPriorityIndexes_1_1 = lowPriorityIndexes_1.next(); !lowPriorityIndexes_1_1.done; lowPriorityIndexes_1_1 = lowPriorityIndexes_1.next()) {
var i = lowPriorityIndexes_1_1.value;
(0, array_1.pushToEnd)(upIndexes, i);
(0, array_1.pushToEnd)(downIndexes, i);
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (lowPriorityIndexes_1_1 && !lowPriorityIndexes_1_1.done && (_b = lowPriorityIndexes_1.return)) _b.call(lowPriorityIndexes_1);
}
finally { if (e_2) throw e_2.error; }
}
}
//
var upItems = upIndexes.map(function (i) { return _this.viewItems[i]; });
var upSizes = upIndexes.map(function (i) { return sizes[i]; });
//
var downItems = downIndexes.map(function (i) { return _this.viewItems[i]; });
var downSizes = downIndexes.map(function (i) { return sizes[i]; });
//
var minDeltaUp = upIndexes.reduce(function (_, i) { return _ + _this.viewItems[i].minimumSize - sizes[i]; }, 0);
var maxDeltaUp = upIndexes.reduce(function (_, i) { return _ + _this.viewItems[i].maximumSize - sizes[i]; }, 0);
//
var maxDeltaDown = downIndexes.length === 0
? Number.POSITIVE_INFINITY
: downIndexes.reduce(function (_, i) { return _ + sizes[i] - _this.viewItems[i].minimumSize; }, 0);
var minDeltaDown = downIndexes.length === 0
? Number.NEGATIVE_INFINITY
: downIndexes.reduce(function (_, i) { return _ + sizes[i] - _this.viewItems[i].maximumSize; }, 0);
//
var minDelta = Math.max(minDeltaUp, minDeltaDown);
var maxDelta = Math.min(maxDeltaDown, maxDeltaUp);
//
var snapped = false;
if (snapBefore) {
var snapView = _this.viewItems[snapBefore.index];
var visible = delta >= snapBefore.limitDelta;
snapped = visible !== snapView.visible;
snapView.setVisible(visible, snapBefore.size);
}
if (!snapped && snapAfter) {
var snapView = _this.viewItems[snapAfter.index];
var visible = delta < snapAfter.limitDelta;
snapped = visible !== snapView.visible;
snapView.setVisible(visible, snapAfter.size);
}
if (snapped) {
return _this.resize(index, delta, sizes, lowPriorityIndexes, highPriorityIndexes, overloadMinDelta, overloadMaxDelta);
}
//
var tentativeDelta = (0, math_1.clamp)(delta, minDelta, maxDelta);
var actualDelta = 0;
//
var deltaUp = tentativeDelta;
for (var i = 0; i < upItems.length; i++) {
var item = upItems[i];
var size = (0, math_1.clamp)(upSizes[i] + deltaUp, item.minimumSize, item.maximumSize);
var viewDelta = size - upSizes[i];
actualDelta += viewDelta;
deltaUp -= viewDelta;
item.size = size;
}
//
var deltaDown = actualDelta;
for (var i = 0; i < downItems.length; i++) {
var item = downItems[i];
var size = (0, math_1.clamp)(downSizes[i] - deltaDown, item.minimumSize, item.maximumSize);
var viewDelta = size - downSizes[i];
deltaDown += viewDelta;
item.size = size;
}
//
return delta;
};
this._orientation = (_a = options.orientation) !== null && _a !== void 0 ? _a : Orientation.VERTICAL;
this.element = this.createContainer();
this.margin = (_b = options.margin) !== null && _b !== void 0 ? _b : 0;
this.proportionalLayout =
options.proportionalLayout === undefined
? true
: !!options.proportionalLayout;
this.viewContainer = this.createViewContainer();
this.sashContainer = this.createSashContainer();
this.element.appendChild(this.sashContainer);
this.element.appendChild(this.viewContainer);
this.container.appendChild(this.element);
this.style(options.styles);
// We have an existing set of view, add them now
if (options.descriptor) {
this._size = options.descriptor.size;
options.descriptor.views.forEach(function (viewDescriptor, index) {
var sizing = viewDescriptor.visible === undefined ||
viewDescriptor.visible
? viewDescriptor.size
: {
type: 'invisible',
cachedVisibleSize: viewDescriptor.size,
};
var view = viewDescriptor.view;
_this.addView(view, sizing, index, true
// true skip layout
);
});
// Initialize content size and proportions for first layout
this._contentSize = this.viewItems.reduce(function (r, i) { return r + i.size; }, 0);
this.saveProportions();
}
}
Object.defineProperty(Splitview.prototype, "contentSize", {
get: function () {
return this._contentSize;
},
enumerable: false,
configurable: true
});
Object.defineProperty(Splitview.prototype, "size", {
get: function () {
return this._size;
},
set: function (value) {
this._size = value;
},
enumerable: false,
configurable: true
});
Object.defineProperty(Splitview.prototype, "orthogonalSize", {
get: function () {
return this._orthogonalSize;
},
set: function (value) {
this._orthogonalSize = value;
},
enumerable: false,
configurable: true
});
Object.defineProperty(Splitview.prototype, "length", {
get: function () {
return this.viewItems.length;
},
enumerable: false,
configurable: true
});
Object.defineProperty(Splitview.prototype, "proportions", {
get: function () {
return this._proportions ? __spreadArray([], __read(this._proportions), false) : undefined;
},
enumerable: false,
configurable: true
});
Object.defineProperty(Splitview.prototype, "orientation", {
get: function () {
return this._orientation;
},
set: function (value) {
this._orientation = value;
var tmp = this.size;
this.size = this.orthogonalSize;
this.orthogonalSize = tmp;
(0, dom_1.removeClasses)(this.element, 'dv-horizontal', 'dv-vertical');
this.element.classList.add(this.orientation == Orientation.HORIZONTAL
? 'dv-horizontal'
: 'dv-vertical');
},
enumerable: false,
configurable: true
});
Object.defineProperty(Splitview.prototype, "minimumSize", {
get: function () {
return this.viewItems.reduce(function (r, item) { return r + item.minimumSize; }, 0);
},
enumerable: false,
configurable: true
});
Object.defineProperty(Splitview.prototype, "maximumSize", {
get: function () {
return this.length === 0
? Number.POSITIVE_INFINITY
: this.viewItems.reduce(function (r, item) { return r + item.maximumSize; }, 0);
},
enumerable: false,
configurable: true
});
Object.defineProperty(Splitview.prototype, "startSnappingEnabled", {
get: function () {
return this._startSnappingEnabled;
},
set: function (startSnappingEnabled) {
if (this._startSnappingEnabled === startSnappingEnabled) {
return;
}
this._startSnappingEnabled = startSnappingEnabled;
this.updateSashEnablement();
},
enumerable: false,
configurable: true
});
Object.defineProperty(Splitview.prototype, "endSnappingEnabled", {
get: function () {
return this._endSnappingEnabled;
},
set: function (endSnappingEnabled) {
if (this._endSnappingEnabled === endSnappingEnabled) {
return;
}
this._endSnappingEnabled = endSnappingEnabled;
this.updateSashEnablement();
},
enumerable: false,
configurable: true
});
Object.defineProperty(Splitview.prototype, "disabled", {
get: function () {
return this._disabled;
},
set: function (value) {
this._disabled = value;
(0, dom_1.toggleClass)(this.element, 'dv-splitview-disabled', value);
},
enumerable: false,
configurable: true
});
Object.defineProperty(Splitview.prototype, "margin", {
get: function () {
return this._margin;
},
set: function (value) {
this._margin = value;
(0, dom_1.toggleClass)(this.element, 'dv-splitview-has-margin', value !== 0);
},
enumerable: false,
configurable: true
});
Splitview.prototype.style = function (styles) {
if ((styles === null || styles === void 0 ? void 0 : styles.separatorBorder) === 'transparent') {
(0, dom_1.removeClasses)(this.element, 'dv-separator-border');
this.element.style.removeProperty('--dv-separator-border');
}
else {
(0, dom_1.addClasses)(this.element, 'dv-separator-border');
if (styles === null || styles === void 0 ? void 0 : styles.separatorBorder) {
this.element.style.setProperty('--dv-separator-border', styles.separatorBorder);
}
}
};
Splitview.prototype.isViewVisible = function (index) {
if (index < 0 || index >= this.viewItems.length) {
throw new Error('Index out of bounds');
}
var viewItem = this.viewItems[index];
return viewItem.visible;
};
Splitview.prototype.setViewVisible = function (index, visible) {
if (index < 0 || index >= this.viewItems.length) {
throw new Error('Index out of bounds');
}
var viewItem = this.viewItems[index];
viewItem.setVisible(visible, viewItem.size);
this.distributeEmptySpace(index);
this.layoutViews();
this.saveProportions();
};
Splitview.prototype.getViewSize = function (index) {
if (index < 0 || index >= this.viewItems.length) {
return -1;
}
return this.viewItems[index].size;
};
Splitview.prototype.resizeView = function (index, size) {
var _this = this;
if (index < 0 || index >= this.viewItems.length) {
return;
}
var indexes = (0, math_1.range)(this.viewItems.length).filter(function (i) { return i !== index; });
var lowPriorityIndexes = __spreadArray(__spreadArray([], __read(indexes.filter(function (i) { return _this.viewItems[i].priority === LayoutPriority.Low; })), false), [
index,
], false);
var highPriorityIndexes = indexes.filter(function (i) { return _this.viewItems[i].priority === LayoutPriority.High; });
var item = this.viewItems[index];
size = Math.round(size);
size = (0, math_1.clamp)(size, item.minimumSize, Math.min(item.maximumSize, this._size));
item.size = size;
this.relayout(lowPriorityIndexes, highPriorityIndexes);
};
Splitview.prototype.getViews = function () {
return this.viewItems.map(function (x) { return x.view; });
};
Splitview.prototype.onDidChange = function (item, size) {
var _this = this;
var index = this.viewItems.indexOf(item);
if (index < 0 || index >= this.viewItems.length) {
return;
}
size = typeof size === 'number' ? size : item.size;
size = (0, math_1.clamp)(size, item.minimumSize, item.maximumSize);
item.size = size;
var indexes = (0, math_1.range)(this.viewItems.length).filter(function (i) { return i !== index; });
var lowPriorityIndexes = __spreadArray(__spreadArray([], __read(indexes.filter(function (i) { return _this.viewItems[i].priority === LayoutPriority.Low; })), false), [
index,
], false);
var highPriorityIndexes = indexes.filter(function (i) { return _this.viewItems[i].priority === LayoutPriority.High; });
/**
* add this view we are changing to the low-index list since we have determined the size
* here and don't want it changed
*/
this.relayout(__spreadArray(__spreadArray([], __read(lowPriorityIndexes), false), [index], false), highPriorityIndexes);
};
Splitview.prototype.addView = function (view, size, index, skipLayout) {
var _this = this;
if (size === void 0) { size = { type: 'distribute' }; }
if (index === void 0) { index = this.viewItems.length; }
var container = document.createElement('div');
container.className = 'dv-view';
container.appendChild(view.element);
var viewSize;
if (typeof size === 'number') {
viewSize = size;
}
else if (size.type === 'split') {
viewSize = this.getViewSize(size.index) / 2;
}
else if (size.type === 'invisible') {
viewSize = { cachedVisibleSize: size.cachedVisibleSize };
}
else {
viewSize = view.minimumSize;
}
var disposable = view.onDidChange(function (newSize) {
return _this.onDidChange(viewItem, newSize.size);
});
var viewItem = new viewItem_1.ViewItem(container, view, viewSize, {
dispose: function () {
disposable.dispose();
_this.viewContainer.removeChild(container);
},
});
if (index === this.viewItems.length) {
this.viewContainer.appendChild(container);
}
else {
this.viewContainer.insertBefore(container, this.viewContainer.children.item(index));
}
this.viewItems.splice(index, 0, viewItem);
if (this.viewItems.length > 1) {
//add sash
var sash_1 = document.createElement('div');
sash_1.className = 'dv-sash';
var onPointerStart_1 = function (event) {
var e_3, _a;
try {
for (var _b = __values(_this.viewItems), _c = _b.next(); !_c.done; _c = _b.next()) {
var item = _c.value;
item.enabled = false;
}
}
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_3) throw e_3.error; }
}
var iframes = (0, dom_1.disableIframePointEvents)();
var start = _this._orientation === Orientation.HORIZONTAL
? event.clientX
: event.clientY;
var sashIndex = (0, array_1.firstIndex)(_this.sashes, function (s) { return s.container === sash_1; });
//
var sizes = _this.viewItems.map(function (x) { return x.size; });
//
var snapBefore;
var snapAfter;
var upIndexes = (0, math_1.range)(sashIndex, -1);
var downIndexes = (0, math_1.range)(sashIndex + 1, _this.viewItems.length);
var minDeltaUp = upIndexes.reduce(function (r, i) { return r + (_this.viewItems[i].minimumSize - sizes[i]); }, 0);
var maxDeltaUp = upIndexes.reduce(function (r, i) {
return r + (_this.viewItems[i].viewMaximumSize - sizes[i]);
}, 0);
var maxDeltaDown = downIndexes.length === 0
? Number.POSITIVE_INFINITY
: downIndexes.reduce(function (r, i) {
return r +
(sizes[i] - _this.viewItems[i].minimumSize);
}, 0);
var minDeltaDown = downIndexes.length === 0
? Number.NEGATIVE_INFINITY
: downIndexes.reduce(function (r, i) {
return r +
(sizes[i] -
_this.viewItems[i].viewMaximumSize);
}, 0);
var minDelta = Math.max(minDeltaUp, minDeltaDown);
var maxDelta = Math.min(maxDeltaDown, maxDeltaUp);
var snapBeforeIndex = _this.findFirstSnapIndex(upIndexes);
var snapAfterIndex = _this.findFirstSnapIndex(downIndexes);
if (typeof snapBeforeIndex === 'number') {
var snappedViewItem = _this.viewItems[snapBeforeIndex];
var halfSize = Math.floor(snappedViewItem.viewMinimumSize / 2);
snapBefore = {
index: snapBeforeIndex,
limitDelta: snappedViewItem.visible
? minDelta - halfSize
: minDelta + halfSize,
size: snappedViewItem.size,
};
}
if (typeof snapAfterIndex === 'number') {
var snappedViewItem = _this.viewItems[snapAfterIndex];
var halfSize = Math.floor(snappedViewItem.viewMinimumSize / 2);
snapAfter = {
index: snapAfterIndex,
limitDelta: snappedViewItem.visible
? maxDelta + halfSize
: maxDelta - halfSize,
size: snappedViewItem.size,
};
}
var onPointerMove = function (event) {
var current = _this._orientation === Orientation.HORIZONTAL
? event.clientX
: event.clientY;
var delta = current - start;
_this.resize(sashIndex, delta, sizes, undefined, undefined, minDelta, maxDelta, snapBefore, snapAfter);
_this.distributeEmptySpace();
_this.layoutViews();
};
var end = function () {
var e_4, _a;
try {
for (var _b = __values(_this.viewItems), _c = _b.next(); !_c.done; _c = _b.next()) {
var item = _c.value;
item.enabled = true;
}
}
catch (e_4_1) { e_4 = { error: e_4_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_4) throw e_4.error; }
}
iframes.release();
_this.saveProportions();
document.removeEventListener('pointermove', onPointerMove);
document.removeEventListener('pointerup', end);
document.removeEventListener('pointercancel', end);
_this._onDidSashEnd.fire(undefined);
};
document.addEventListener('pointermove', onPointerMove);
document.addEventListener('pointerup', end);
document.addEventListener('pointercancel', end);
};
sash_1.addEventListener('pointerdown', onPointerStart_1);
var sashItem = {
container: sash_1,
disposable: function () {
sash_1.removeEventListener('pointerdown', onPointerStart_1);
_this.sashContainer.removeChild(sash_1);
},
};
this.sashContainer.appendChild(sash_1);
this.sashes.push(sashItem);
}
if (!skipLayout) {
this.relayout([index]);
}
if (!skipLayout &&
typeof size !== 'number' &&
size.type === 'distribute') {
this.distributeViewSizes();
}
this._onDidAddView.fire(view);
};
Splitview.prototype.distributeViewSizes = function () {
var e_5, _a, e_6, _b;
var _this = this;
var flexibleViewItems = [];
var flexibleSize = 0;
try {
for (var _c = __values(this.viewItems), _d = _c.next(); !_d.done; _d = _c.next()) {
var item = _d.value;
if (item.maximumSize - item.minimumSize > 0) {
flexibleViewItems.push(item);
flexibleSize += item.size;
}
}
}
catch (e_5_1) { e_5 = { error: e_5_1 }; }
finally {
try {
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
}
finally { if (e_5) throw e_5.error; }
}
var size = Math.floor(flexibleSize / flexibleViewItems.length);
try {
for (var flexibleViewItems_1 = __values(flexibleViewItems), flexibleViewItems_1_1 = flexibleViewItems_1.next(); !flexibleViewItems_1_1.done; flexibleViewItems_1_1 = flexibleViewItems_1.next()) {
var item = flexibleViewItems_1_1.value;
item.size = (0, math_1.clamp)(size, item.minimumSize, item.maximumSize);
}
}
catch (e_6_1) { e_6 = { error: e_6_1 }; }
finally {
try {
if (flexibleViewItems_1_1 && !flexibleViewItems_1_1.done && (_b = flexibleViewItems_1.return)) _b.call(flexibleViewItems_1);
}
finally { if (e_6) throw e_6.error; }
}
var indexes = (0, math_1.range)(this.viewItems.length);
var lowPriorityIndexes = indexes.filter(function (i) { return _this.viewItems[i].priority === LayoutPriority.Low; });
var highPriorityIndexes = indexes.filter(function (i) { return _this.viewItems[i].priority === LayoutPriority.High; });
this.relayout(lowPriorityIndexes, highPriorityIndexes);
};
Splitview.prototype.removeView = function (index, sizing, skipLayout) {
if (skipLayout === void 0) { skipLayout = false; }
// Remove view
var viewItem = this.viewItems.splice(index, 1)[0];
viewItem.dispose();
// Remove sash
if (this.viewItems.length >= 1) {
var sashIndex = Math.max(index - 1, 0);
var sashItem = this.sashes.splice(sashIndex, 1)[0];
sashItem.disposable();
}
if (!skipLayout) {
this.relayout();
}
if (sizing && sizing.type === 'distribute') {
this.distributeViewSizes();
}
this._onDidRemoveView.fire(viewItem.view);
return viewItem.view;
};
Splitview.prototype.getViewCachedVisibleSize = function (index) {
if (index < 0 || index >= this.viewItems.length) {
throw new Error('Index out of bounds');
}
var viewItem = this.viewItems[index];
return viewItem.cachedVisibleSize;
};
Splitview.prototype.moveView = function (from, to) {
var cachedVisibleSize = this.getViewCachedVisibleSize(from);
var sizing = typeof cachedVisibleSize === 'undefined'
? this.getViewSize(from)
: Sizing.Invisible(cachedVisibleSize);
var view = this.removeView(from, undefined, true);
this.addView(view, sizing, to);
};
Splitview.prototype.layout = function (size, orthogonalSize) {
var _this = this;
var previousSize = Math.max(this.size, this._contentSize);
this.size = size;
this.orthogonalSize = orthogonalSize;
if (!this.proportions) {
var indexes = (0, math_1.range)(this.viewItems.length);
var lowPriorityIndexes = indexes.filter(function (i) { return _this.viewItems[i].priority === LayoutPriority.Low; });
var highPriorityIndexes = indexes.filter(function (i) { return _this.viewItems[i].priority === LayoutPriority.High; });
this.resize(this.viewItems.length - 1, size - previousSize, undefined, lowPriorityIndexes, highPriorityIndexes);
}
else {
var total = 0;
for (var i = 0; i < this.viewItems.length; i++) {
var item = this.viewItems[i];
var proportion = this.proportions[i];
if (typeof proportion === 'number') {
total += proportion;
}
else {
size -= item.size;
}
}
for (var i = 0; i < this.viewItems.length; i++) {
var item = this.viewItems[i];
var proportion = this.proportions[i];
if (typeof proportion === 'number' && total > 0) {
item.size = (0, math_1.clamp)(Math.round((proportion * size) / total), item.minimumSize, item.maximumSize);
}
}
}
this.distributeEmptySpace();
this.layoutViews();
};
Splitview.prototype.relayout = function (lowPriorityIndexes, highPriorityIndexes) {
var contentSize = this.viewItems.reduce(function (r, i) { return r + i.size; }, 0);
this.resize(this.viewItems.length - 1, this._size - contentSize, undefined, lowPriorityIndexes, highPriorityIndexes);
this.distributeEmptySpace();
this.layoutViews();
this.saveProportions();
};
Splitview.prototype.distributeEmptySpace = function (lowPriorityIndex) {
var e_7, _a, e_8, _b;
var _this = this;
var contentSize = this.viewItems.reduce(function (r, i) { return r + i.size; }, 0);
var emptyDelta = this.size - contentSize;
var indexes = (0, math_1.range)(this.viewItems.length - 1, -1);
var lowPriorityIndexes = indexes.filter(function (i) { return _this.viewItems[i].priority === LayoutPriority.Low; });
var highPriorityIndexes = indexes.filter(function (i) { return _this.viewItems[i].priority === LayoutPriority.High; });
try {
for (var highPriorityIndexes_2 = __values(highPriorityIndexes), highPriorityIndexes_2_1 = highPriorityIndexes_2.next(); !highPriorityIndexes_2_1.done; highPriorityIndexes_2_1 = highPriorityIndexes_2.next()) {
var index = highPriorityIndexes_2_1.value;
(0, array_1.pushToStart)(indexes, index);
}
}
catch (e_7_1) { e_7 = { error: e_7_1 }; }
finally {
try {
if (highPriorityIndexes_2_1 && !highPriorityIndexes_2_1.done && (_a = highPriorityIndexes_2.return)) _a.call(highPriorityIndexes_2);
}
finally { if (e_7) throw e_7.error; }
}
try {
for (var lowPriorityIndexes_2 = __values(lowPriorityIndexes), lowPriorityIndexes_2_1 = lowPriorityIndexes_2.next(); !lowPriorityIndexes_2_1.done; lowPriorityIndexes_2_1 = lowPriorityIndexes_2.next()) {
var index = lowPriorityIndexes_2_1.value;
(0, array_1.pushToEnd)(indexes, index);
}
}
catch (e_8_1) { e_8 = { error: e_8_1 }; }
finally {
try {
if (lowPriorityIndexes_2_1 && !lowPriorityIndexes_2_1.done && (_b = lowPriorityIndexes_2.return)) _b.call(lowPriorityIndexes_2);
}
finally { if (e_8) throw e_8.error; }
}
if (typeof lowPriorityIndex === 'number') {
(0, array_1.pushToEnd)(indexes, lowPriorityIndex);
}
for (var i = 0; emptyDelta !== 0 && i < indexes.length; i++) {
var item = this.viewItems[indexes[i]];
var size = (0, math_1.clamp)(item.size + emptyDelta, item.minimumSize, item.maximumSize);
var viewDelta = size - item.size;
emptyDelta -= viewDelta;
item.size = size;
}
};
Splitview.prototype.saveProportions = function () {
var _this = this;
if (this.proportionalLayout && this._contentSize > 0) {
this._proportions = this.viewItems.map(function (i) {
return i.visible ? i.size / _this._contentSize : undefined;
});
}
};
/**
* Margin explain:
*
* For `n` views in a splitview there will be `n-1` margins `m`.
*
* To fit the margins each view must reduce in size by `(m * (n - 1)) / n`.
*
* For each view `i` the offet must be adjusted by `m * i/(n - 1)`.
*/
Splitview.prototype.layoutViews = function () {
var _this = this;
this._contentSize = this.viewItems.reduce(function (r, i) { return r + i.size; }, 0);
this.updateSashEnablement();
if (this.viewItems.length === 0) {
return;
}
var visibleViewItems = this.viewItems.filter(function (i) { return i.visible; });
var sashCount = Math.max(0, visibleViewItems.length - 1);
var marginReducedSize = (this.margin * sashCount) / Math.max(1, visibleViewItems.length);
var totalLeftOffset = 0;
var viewLeftOffsets = [];
var sashWidth = 4; // hardcoded in css
var runningVisiblePanelCount = this.viewItems.reduce(function (arr, viewItem, i) {
var flag = viewItem.visible ? 1 : 0;
if (i === 0) {
arr.push(flag);
}
else {
arr.push(arr[i - 1] + flag);
}
return arr;
}, []);
// calculate both view and cash positions
this.viewItems.forEach(function (view, i) {
totalLeftOffset += _this.viewItems[i].size;
viewLeftOffsets.push(totalLeftOffset);
var size = view.visible ? view.size - marginReducedSize : 0;
var visiblePanelsBeforeThisView = Math.max(0, runningVisiblePanelCount[i] - 1);
var offset = i === 0 || visiblePanelsBeforeThisView === 0
? 0
: viewLeftOffsets[i - 1] +
(visiblePanelsBeforeThisView / sashCount) *
marginReducedSize;
if (i < _this.viewItems.length - 1) {
// calculate sash position
var newSize = view.visible
? offset + size - sashWidth / 2 + _this.margin / 2
: offset;
if (_this._orientation === Orientation.HORIZONTAL) {
_this.sashes[i].container.style.left = "".concat(newSize, "px");
_this.sashes[i].container.style.top = "0px";
}
if (_this._orientation === Orientation.VERTICAL) {
_this.sashes[i].container.style.left = "0px";
_this.sashes[i].container.style.top = "".concat(newSize, "px");
}
}
// calculate view position
if (_this._orientation === Orientation.HORIZONTAL) {
view.container.style.width = "".concat(size, "px");
view.container.style.left = "".concat(offset, "px");
view.container.style.top = '';
view.container.style.height = '';
}
if (_this._orientation === Orientation.VERTICAL) {
view.container.style.height = "".concat(size, "px");
view.container.style.top = "".concat(offset, "px");
view.container.style.width = '';
view.container.style.left = '';
}
view.view.layout(view.size - marginReducedSize, _this._orthogonalSize);
});
};
Splitview.prototype.findFirstSnapIndex = function (indexes) {
var e_9, _a, e_10, _b;
try {
// visible views first
for (var indexes_1 = __values(indexes), indexes_1_1 = indexes_1.next(); !indexes_1_1.done; indexes_1_1 = indexes_1.next()) {
var index = indexes_1_1.value;
var viewItem = this.viewItems[index];
if (!viewItem.visible) {
continue;
}
if (viewItem.snap) {
return index;
}
}
}
catch (e_9_1) { e_9 = { error: e_9_1 }; }
finally {
try {
if (indexes_1_1 && !indexes_1_1.done && (_a = indexes_1.return)) _a.call(indexes_1);
}
finally { if (e_9) throw e_9.error; }
}
try {
// then, hidden views
for (var indexes_2 = __values(indexes), indexes_2_1 = indexes_2.next(); !indexes_2_1.done; indexes_2_1 = indexes_2.next()) {
var index = indexes_2_1.value;
var viewItem = this.viewItems[index];
if (viewItem.visible &&
viewItem.maximumSize - viewItem.minimumSize > 0) {
return undefined;
}
if (!viewItem.visible && viewItem.snap) {
return index;
}
}
}
catch (e_10_1) { e_10 = { error: e_10_1 }; }
finally {
try {
if (indexes_2_1 && !indexes_2_1.done && (_b = indexes_2.return)) _b.call(indexes_2);
}
finally { if (e_10) throw e_10.error; }
}
return undefined;
};
Splitview.prototype.updateSashEnablement = function () {
var previous = false;
var collapsesDown = this.viewItems.map(function (i) { return (previous = i.size - i.minimumSize > 0 || previous); });
previous = false;
var expandsDown = this.viewItems.map(function (i) { return (previous = i.maximumSize - i.size > 0 || previous); });
var reverseViews = __spreadArray([], __read(this.viewItems), false).reverse();
previous = false;
var collapsesUp = reverseViews
.map(function (i) { return (previous = i.size - i.minimumSize > 0 || previous); })
.reverse();
previous = false;
var expandsUp = reverseViews
.map(function (i) { return (previous = i.maximumSize - i.size > 0 || previous); })
.reverse();
var position = 0;
for (var index = 0; index < this.sashes.length; index++) {
var sash = this.sashes[index];
var viewItem = this.viewItems[index];
position += viewItem.size;
var min = !(collapsesDown[index] && expandsUp[index + 1]);
var max = !(expandsDown[index] && collapsesUp[index + 1]);
if (min && max) {
var upIndexes = (0, math_1.range)(index, -1);
var downIndexes = (0, math_1.range)(index + 1, this.viewItems.length);
var snapBeforeIndex = this.findFirstSnapIndex(upIndexes);
var snapAfterIndex = this.findFirstSnapIndex(downIndexes);
var snappedBefore = typeof snapBeforeIndex === 'number' &&
!this.viewItems[snapBeforeIndex].visible;
var snappedAfter = typeof snapAfterIndex === 'number' &&
!this.viewItems[snapAfterIndex].visible;
if (snappedBefore &&
collapsesUp[index] &&
(position > 0 || this.startSnappingEnabled)) {
this.updateSash(sash, SashState.MINIMUM);
}
else if (snappedAfter &&
collapsesDown[index] &&
(position < this._contentSize || this.endSnappingEnabled)) {
this.updateSash(sash, SashState.MAXIMUM);
}
else {
this.updateSash(sash, SashState.DISABLED);
}
}
else if (min && !max) {
this.updateSash(sash, SashState.MINIMUM);
}
else if (!min && max) {
this.updateSash(sash, SashState.MAXIMUM);
}
else {
this.updateSash(sash, SashState.ENABLED);
}
}
};
Splitview.prototype.updateSash = function (sash, state) {
(0, dom_1.toggleClass)(sash.container, 'dv-disabled', state === SashState.DISABLED);
(0, dom_1.toggleClass)(sash.container, 'dv-enabled', state === SashState.ENABLED);
(0, dom_1.toggleClass)(sash.container, 'dv-maximum', state === SashState.MAXIMUM);
(0, dom_1.toggleClass)(sash.container, 'dv-minimum', state === SashState.MINIMUM);
};
Splitview.prototype.createViewContainer = function () {
var element = document.createElement('div');
element.className = 'dv-view-container';
return element;
};
Splitview.prototype.createSashContainer = function () {
var element = document.createElement('div');
element.className = 'dv-sash-container';
return element;
};
Splitview.prototype.createContainer = function () {
var element = document.createElement('div');
var orientationClassname = this._orientation === Orientation.HORIZONTAL
? 'dv-horizontal'
: 'dv-vertical';
element.className = "dv-split-view-container ".concat(orientationClassname);
return element;
};
Splitview.prototype.dispose = function () {
var e_11, _a;
this._onDidSashEnd.dispose();
this._onDidAddView.dispose();
this._onDidRemoveView.dispose();
for (var i = 0; i < this.element.children.length; i++) {
if (this.element.children.item(i) === this.element) {
this.element.removeChild(this.element);
break;
}
}
try {
for (var _b = __values(this.viewItems), _c = _b.next(); !_c.done; _c = _b.next()) {
var viewItem = _c.value;
viewItem.dispose();
}
}
catch (e_11_1) { e_11 = { error: e_11_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_11) throw e_11.error; }
}
this.element.remove();
};
return Splitview;
}());
exports.Splitview = Splitview;