@deephaven/golden-layout 0.17.1-beta.2 → 0.17.1-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/dist/LayoutManager.js +1140 -0
  2. package/dist/LayoutManager.js.map +1 -0
  3. package/dist/base.js +16 -0
  4. package/dist/base.js.map +1 -0
  5. package/dist/config/ItemDefaultConfig.js +8 -0
  6. package/dist/config/ItemDefaultConfig.js.map +1 -0
  7. package/dist/config/defaultConfig.js +42 -0
  8. package/dist/config/defaultConfig.js.map +1 -0
  9. package/dist/config/index.js +7 -0
  10. package/dist/config/index.js.map +1 -0
  11. package/dist/container/ItemContainer.js +192 -0
  12. package/dist/container/ItemContainer.js.map +1 -0
  13. package/dist/container/index.js +5 -0
  14. package/dist/container/index.js.map +1 -0
  15. package/dist/controls/BrowserPopout.js +260 -0
  16. package/dist/controls/BrowserPopout.js.map +1 -0
  17. package/dist/controls/DragProxy.js +236 -0
  18. package/dist/controls/DragProxy.js.map +1 -0
  19. package/dist/controls/DragSource.js +60 -0
  20. package/dist/controls/DragSource.js.map +1 -0
  21. package/dist/controls/DragSourceFromEvent.js +75 -0
  22. package/dist/controls/DragSourceFromEvent.js.map +1 -0
  23. package/dist/controls/DropTargetIndicator.js +28 -0
  24. package/dist/controls/DropTargetIndicator.js.map +1 -0
  25. package/dist/controls/Header.js +698 -0
  26. package/dist/controls/Header.js.map +1 -0
  27. package/dist/controls/HeaderButton.js +23 -0
  28. package/dist/controls/HeaderButton.js.map +1 -0
  29. package/dist/controls/Splitter.js +45 -0
  30. package/dist/controls/Splitter.js.map +1 -0
  31. package/dist/controls/Tab.js +259 -0
  32. package/dist/controls/Tab.js.map +1 -0
  33. package/dist/controls/TransitionIndicator.js +64 -0
  34. package/dist/controls/TransitionIndicator.js.map +1 -0
  35. package/dist/controls/index.js +23 -0
  36. package/dist/controls/index.js.map +1 -0
  37. package/dist/errors/ConfigurationError.js +10 -0
  38. package/dist/errors/ConfigurationError.js.map +1 -0
  39. package/dist/errors/index.js +5 -0
  40. package/dist/errors/index.js.map +1 -0
  41. package/dist/index.js +3 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/items/AbstractContentItem.js +617 -0
  44. package/dist/items/AbstractContentItem.js.map +1 -0
  45. package/dist/items/Component.js +84 -0
  46. package/dist/items/Component.js.map +1 -0
  47. package/dist/items/Root.js +93 -0
  48. package/dist/items/Root.js.map +1 -0
  49. package/dist/items/RowOrColumn.js +550 -0
  50. package/dist/items/RowOrColumn.js.map +1 -0
  51. package/dist/items/Stack.js +498 -0
  52. package/dist/items/Stack.js.map +1 -0
  53. package/dist/items/index.js +13 -0
  54. package/dist/items/index.js.map +1 -0
  55. package/dist/utils/BubblingEvent.js +12 -0
  56. package/dist/utils/BubblingEvent.js.map +1 -0
  57. package/dist/utils/ConfigMinifier.js +160 -0
  58. package/dist/utils/ConfigMinifier.js.map +1 -0
  59. package/dist/utils/DragListener.js +128 -0
  60. package/dist/utils/DragListener.js.map +1 -0
  61. package/dist/utils/EventEmitter.js +133 -0
  62. package/dist/utils/EventEmitter.js.map +1 -0
  63. package/dist/utils/EventHub.js +147 -0
  64. package/dist/utils/EventHub.js.map +1 -0
  65. package/dist/utils/ReactComponentHandler.js +135 -0
  66. package/dist/utils/ReactComponentHandler.js.map +1 -0
  67. package/dist/utils/index.js +22 -0
  68. package/dist/utils/index.js.map +1 -0
  69. package/dist/utils/utils.js +195 -0
  70. package/dist/utils/utils.js.map +1 -0
  71. package/package.json +20 -47
  72. package/dist/goldenlayout.js +0 -6314
  73. package/dist/goldenlayout.min.js +0 -1
@@ -0,0 +1,550 @@
1
+ import $ from 'jquery';
2
+ import AbstractContentItem from './AbstractContentItem.js';
3
+ import utils from '../utils/index.js';
4
+ import controls from '../controls/index.js';
5
+
6
+ var RowOrColumn = function RowOrColumn(isColumn, layoutManager, config, parent) {
7
+ AbstractContentItem.call(this, layoutManager, config, parent);
8
+ this.isRow = !isColumn;
9
+ this.isColumn = isColumn;
10
+ this.element = $('<div class="lm_item lm_' + (isColumn ? 'column' : 'row') + '"></div>');
11
+ this.childElementContainer = this.element;
12
+ this._splitterSize = layoutManager.config.dimensions.borderWidth;
13
+ this._splitterGrabSize = layoutManager.config.dimensions.borderGrabWidth;
14
+ this._isColumn = isColumn;
15
+ this._dimension = isColumn ? 'height' : 'width';
16
+ this._splitter = [];
17
+ this._splitterPosition = null;
18
+ this._splitterMinPosition = null;
19
+ this._splitterMaxPosition = null;
20
+ };
21
+
22
+ utils.extend(RowOrColumn, AbstractContentItem);
23
+ utils.copy(RowOrColumn.prototype, {
24
+ /**
25
+ * Add a new contentItem to the Row or Column
26
+ *
27
+ * @param {lm.item.AbstractContentItem} contentItem
28
+ * @param {[int]} index The position of the new item within the Row or Column.
29
+ * If no index is provided the item will be added to the end
30
+ * @param {[bool]} _$suspendResize If true the items won't be resized. This will leave the item in
31
+ * an inconsistent state and is only intended to be used if multiple
32
+ * children need to be added in one go and resize is called afterwards
33
+ *
34
+ * @returns {void}
35
+ */
36
+ addChild: function addChild(contentItem, index, _$suspendResize) {
37
+ var newItemSize, itemSize, i, splitterElement;
38
+ contentItem = this.layoutManager._$normalizeContentItem(contentItem, this);
39
+
40
+ if (index === undefined) {
41
+ index = this.contentItems.length;
42
+ }
43
+
44
+ if (this.contentItems.length > 0) {
45
+ splitterElement = this._createSplitter(Math.max(0, index - 1)).element;
46
+
47
+ if (index > 0) {
48
+ this.contentItems[index - 1].element.after(splitterElement);
49
+ splitterElement.after(contentItem.element);
50
+ } else {
51
+ this.contentItems[0].element.before(splitterElement);
52
+ splitterElement.before(contentItem.element);
53
+ }
54
+ } else {
55
+ this.childElementContainer.append(contentItem.element);
56
+ }
57
+
58
+ AbstractContentItem.prototype.addChild.call(this, contentItem, index);
59
+ newItemSize = 1 / this.contentItems.length * 100;
60
+
61
+ if (_$suspendResize === true) {
62
+ this.emitBubblingEvent('stateChanged');
63
+ return;
64
+ }
65
+
66
+ for (i = 0; i < this.contentItems.length; i++) {
67
+ if (this.contentItems[i] === contentItem) {
68
+ contentItem.config[this._dimension] = newItemSize;
69
+ } else {
70
+ itemSize = this.contentItems[i].config[this._dimension] *= (100 - newItemSize) / 100;
71
+ this.contentItems[i].config[this._dimension] = itemSize;
72
+ }
73
+ }
74
+
75
+ this.callDownwards('setSize');
76
+ this.emitBubblingEvent('stateChanged');
77
+ },
78
+
79
+ /**
80
+ * Removes a child of this element
81
+ *
82
+ * @param {lm.items.AbstractContentItem} contentItem
83
+ * @param {boolean} keepChild If true the child will be removed, but not destroyed
84
+ *
85
+ * @returns {void}
86
+ */
87
+ removeChild: function removeChild(contentItem, keepChild) {
88
+ var removedItemSize = contentItem.config[this._dimension],
89
+ index = utils.indexOf(contentItem, this.contentItems),
90
+ splitterIndex = Math.max(index - 1, 0),
91
+ i,
92
+ childItem;
93
+
94
+ if (index === -1) {
95
+ throw new Error("Can't remove child. ContentItem is not child of this Row or Column");
96
+ }
97
+ /**
98
+ * Remove the splitter before the item or after if the item happens
99
+ * to be the first in the row/column
100
+ */
101
+
102
+
103
+ if (this._splitter[splitterIndex]) {
104
+ this._splitter[splitterIndex]._$destroy();
105
+
106
+ this._splitter.splice(splitterIndex, 1);
107
+ }
108
+ /**
109
+ * Allocate the space that the removed item occupied to the remaining items
110
+ */
111
+
112
+
113
+ for (i = 0; i < this.contentItems.length; i++) {
114
+ if (this.contentItems[i] !== contentItem) {
115
+ this.contentItems[i].config[this._dimension] += removedItemSize / (this.contentItems.length - 1);
116
+ }
117
+ }
118
+
119
+ AbstractContentItem.prototype.removeChild.call(this, contentItem, keepChild);
120
+
121
+ if (this.contentItems.length === 1 && this.config.isClosable === true) {
122
+ childItem = this.contentItems[0];
123
+ this.contentItems = [];
124
+ this.parent.replaceChild(this, childItem, true);
125
+ } else {
126
+ this.callDownwards('setSize');
127
+ this.emitBubblingEvent('stateChanged');
128
+ }
129
+ },
130
+
131
+ /**
132
+ * Replaces a child of this Row or Column with another contentItem
133
+ *
134
+ * @param {lm.items.AbstractContentItem} oldChild
135
+ * @param {lm.items.AbstractContentItem} newChild
136
+ *
137
+ * @returns {void}
138
+ */
139
+ replaceChild: function replaceChild(oldChild, newChild) {
140
+ var size = oldChild.config[this._dimension];
141
+ AbstractContentItem.prototype.replaceChild.call(this, oldChild, newChild);
142
+ newChild.config[this._dimension] = size;
143
+ this.callDownwards('setSize');
144
+ this.emitBubblingEvent('stateChanged');
145
+ },
146
+
147
+ /**
148
+ * Called whenever the dimensions of this item or one of its parents change
149
+ *
150
+ * @returns {void}
151
+ */
152
+ setSize: function setSize() {
153
+ if (this.contentItems.length > 0) {
154
+ this._calculateRelativeSizes();
155
+
156
+ this._setAbsoluteSizes();
157
+ }
158
+
159
+ this.emitBubblingEvent('stateChanged');
160
+ this.emit('resize');
161
+ },
162
+
163
+ /**
164
+ * Invoked recursively by the layout manager. AbstractContentItem.init appends
165
+ * the contentItem's DOM elements to the container, RowOrColumn init adds splitters
166
+ * in between them
167
+ *
168
+ * @package private
169
+ * @override AbstractContentItem._$init
170
+ * @returns {void}
171
+ */
172
+ _$init: function _$init() {
173
+ if (this.isInitialised === true) return;
174
+ var i;
175
+
176
+ AbstractContentItem.prototype._$init.call(this);
177
+
178
+ for (i = 0; i < this.contentItems.length - 1; i++) {
179
+ this.contentItems[i].element.after(this._createSplitter(i).element);
180
+ }
181
+ },
182
+
183
+ /**
184
+ * Turns the relative sizes calculated by _calculateRelativeSizes into
185
+ * absolute pixel values and applies them to the children's DOM elements
186
+ *
187
+ * Assigns additional pixels to counteract Math.floor
188
+ *
189
+ * @private
190
+ * @returns {void}
191
+ */
192
+ _setAbsoluteSizes: function _setAbsoluteSizes() {
193
+ var i,
194
+ sizeData = this._calculateAbsoluteSizes();
195
+
196
+ for (i = 0; i < this.contentItems.length; i++) {
197
+ if (sizeData.additionalPixel - i > 0) {
198
+ sizeData.itemSizes[i]++;
199
+ }
200
+
201
+ if (this._isColumn) {
202
+ this.contentItems[i].element.width(sizeData.totalWidth);
203
+ this.contentItems[i].element.height(sizeData.itemSizes[i]);
204
+ } else {
205
+ this.contentItems[i].element.width(sizeData.itemSizes[i]);
206
+ this.contentItems[i].element.height(sizeData.totalHeight);
207
+ }
208
+ }
209
+ },
210
+
211
+ /**
212
+ * Calculates the absolute sizes of all of the children of this Item.
213
+ * @returns {object} - Set with absolute sizes and additional pixels.
214
+ */
215
+ _calculateAbsoluteSizes: function _calculateAbsoluteSizes() {
216
+ var i,
217
+ totalSplitterSize = (this.contentItems.length - 1) * this._splitterSize,
218
+ totalWidth = this.element.width(),
219
+ totalHeight = this.element.height(),
220
+ totalAssigned = 0,
221
+ additionalPixel,
222
+ itemSize,
223
+ itemSizes = [];
224
+
225
+ if (this._isColumn) {
226
+ totalHeight -= totalSplitterSize;
227
+ } else {
228
+ totalWidth -= totalSplitterSize;
229
+ }
230
+
231
+ for (i = 0; i < this.contentItems.length; i++) {
232
+ if (this._isColumn) {
233
+ itemSize = Math.floor(totalHeight * (this.contentItems[i].config.height / 100));
234
+ } else {
235
+ itemSize = Math.floor(totalWidth * (this.contentItems[i].config.width / 100));
236
+ }
237
+
238
+ totalAssigned += itemSize;
239
+ itemSizes.push(itemSize);
240
+ }
241
+
242
+ additionalPixel = Math.floor((this._isColumn ? totalHeight : totalWidth) - totalAssigned);
243
+ return {
244
+ itemSizes: itemSizes,
245
+ additionalPixel: additionalPixel,
246
+ totalWidth: totalWidth,
247
+ totalHeight: totalHeight
248
+ };
249
+ },
250
+
251
+ /**
252
+ * Calculates the relative sizes of all children of this Item. The logic
253
+ * is as follows:
254
+ *
255
+ * - Add up the total size of all items that have a configured size
256
+ *
257
+ * - If the total == 100 (check for floating point errors)
258
+ * Excellent, job done
259
+ *
260
+ * - If the total is > 100,
261
+ * set the size of items without set dimensions to 1/3 and add this to the total
262
+ * set the size off all items so that the total is hundred relative to their original size
263
+ *
264
+ * - If the total is < 100
265
+ * If there are items without set dimensions, distribute the remainder to 100 evenly between them
266
+ * If there are no items without set dimensions, increase all items sizes relative to
267
+ * their original size so that they add up to 100
268
+ *
269
+ * @private
270
+ * @returns {void}
271
+ */
272
+ _calculateRelativeSizes: function _calculateRelativeSizes() {
273
+ var i,
274
+ total = 0,
275
+ itemsWithoutSetDimension = [],
276
+ dimension = this._isColumn ? 'height' : 'width';
277
+
278
+ for (i = 0; i < this.contentItems.length; i++) {
279
+ if (this.contentItems[i].config[dimension] !== undefined) {
280
+ total += this.contentItems[i].config[dimension];
281
+ } else {
282
+ itemsWithoutSetDimension.push(this.contentItems[i]);
283
+ }
284
+ }
285
+ /**
286
+ * Everything adds up to hundred, all good :-)
287
+ */
288
+
289
+
290
+ if (Math.round(total) === 100) {
291
+ this._respectMinItemWidth();
292
+
293
+ return;
294
+ }
295
+ /**
296
+ * Allocate the remaining size to the items without a set dimension
297
+ */
298
+
299
+
300
+ if (Math.round(total) < 100 && itemsWithoutSetDimension.length > 0) {
301
+ for (i = 0; i < itemsWithoutSetDimension.length; i++) {
302
+ itemsWithoutSetDimension[i].config[dimension] = (100 - total) / itemsWithoutSetDimension.length;
303
+ }
304
+
305
+ this._respectMinItemWidth();
306
+
307
+ return;
308
+ }
309
+ /**
310
+ * If the total is > 100, but there are also items without a set dimension left, assing 50
311
+ * as their dimension and add it to the total
312
+ *
313
+ * This will be reset in the next step
314
+ */
315
+
316
+
317
+ if (Math.round(total) > 100) {
318
+ for (i = 0; i < itemsWithoutSetDimension.length; i++) {
319
+ itemsWithoutSetDimension[i].config[dimension] = 50;
320
+ total += 50;
321
+ }
322
+ }
323
+ /**
324
+ * Set every items size relative to 100 relative to its size to total
325
+ */
326
+
327
+
328
+ for (i = 0; i < this.contentItems.length; i++) {
329
+ this.contentItems[i].config[dimension] = this.contentItems[i].config[dimension] / total * 100;
330
+ }
331
+
332
+ this._respectMinItemWidth();
333
+ },
334
+
335
+ /**
336
+ * Adjusts the column widths to respect the dimensions minItemWidth if set.
337
+ * @returns {}
338
+ */
339
+ _respectMinItemWidth: function _respectMinItemWidth() {
340
+ var minItemWidth = this.layoutManager.config.dimensions ? this.layoutManager.config.dimensions.minItemWidth || 0 : 0,
341
+ sizeData = null,
342
+ entriesOverMin = [],
343
+ totalOverMin = 0,
344
+ totalUnderMin = 0,
345
+ remainingWidth = 0,
346
+ itemSize = 0,
347
+ contentItem = null,
348
+ reducePercent,
349
+ reducedWidth,
350
+ allEntries = [],
351
+ entry;
352
+
353
+ if (this._isColumn || !minItemWidth || this.contentItems.length <= 1) {
354
+ return;
355
+ }
356
+
357
+ sizeData = this._calculateAbsoluteSizes();
358
+ /**
359
+ * Figure out how much we are under the min item size total and how much room we have to use.
360
+ */
361
+
362
+ for (var i = 0; i < this.contentItems.length; i++) {
363
+ contentItem = this.contentItems[i];
364
+ itemSize = sizeData.itemSizes[i];
365
+
366
+ if (itemSize < minItemWidth) {
367
+ totalUnderMin += minItemWidth - itemSize;
368
+ entry = {
369
+ width: minItemWidth
370
+ };
371
+ } else {
372
+ totalOverMin += itemSize - minItemWidth;
373
+ entry = {
374
+ width: itemSize
375
+ };
376
+ entriesOverMin.push(entry);
377
+ }
378
+
379
+ allEntries.push(entry);
380
+ }
381
+ /**
382
+ * If there is nothing under min, or there is not enough over to make up the difference, do nothing.
383
+ */
384
+
385
+
386
+ if (totalUnderMin === 0 || totalUnderMin > totalOverMin) {
387
+ return;
388
+ }
389
+ /**
390
+ * Evenly reduce all columns that are over the min item width to make up the difference.
391
+ */
392
+
393
+
394
+ reducePercent = totalUnderMin / totalOverMin;
395
+ remainingWidth = totalUnderMin;
396
+
397
+ for (i = 0; i < entriesOverMin.length; i++) {
398
+ entry = entriesOverMin[i];
399
+ reducedWidth = Math.round((entry.width - minItemWidth) * reducePercent);
400
+ remainingWidth -= reducedWidth;
401
+ entry.width -= reducedWidth;
402
+ }
403
+ /**
404
+ * Take anything remaining from the last item.
405
+ */
406
+
407
+
408
+ if (remainingWidth !== 0) {
409
+ allEntries[allEntries.length - 1].width -= remainingWidth;
410
+ }
411
+ /**
412
+ * Set every items size relative to 100 relative to its size to total
413
+ */
414
+
415
+
416
+ for (i = 0; i < this.contentItems.length; i++) {
417
+ this.contentItems[i].config.width = allEntries[i].width / sizeData.totalWidth * 100;
418
+ }
419
+ },
420
+
421
+ /**
422
+ * Instantiates a new lm.controls.Splitter, binds events to it and adds
423
+ * it to the array of splitters at the position specified as the index argument
424
+ *
425
+ * What it doesn't do though is append the splitter to the DOM
426
+ *
427
+ * @param {Int} index The position of the splitter
428
+ *
429
+ * @returns {lm.controls.Splitter}
430
+ */
431
+ _createSplitter: function _createSplitter(index) {
432
+ var splitter;
433
+ splitter = new controls.Splitter(this._isColumn, this._splitterSize, this._splitterGrabSize);
434
+ splitter.on('drag', utils.fnBind(this._onSplitterDrag, this, [splitter]), this);
435
+ splitter.on('dragStop', utils.fnBind(this._onSplitterDragStop, this, [splitter]), this);
436
+ splitter.on('dragStart', utils.fnBind(this._onSplitterDragStart, this, [splitter]), this);
437
+
438
+ this._splitter.splice(index, 0, splitter);
439
+
440
+ return splitter;
441
+ },
442
+
443
+ /**
444
+ * Locates the instance of lm.controls.Splitter in the array of
445
+ * registered splitters and returns a map containing the contentItem
446
+ * before and after the splitters, both of which are affected if the
447
+ * splitter is moved
448
+ *
449
+ * @param {lm.controls.Splitter} splitter
450
+ *
451
+ * @returns {Object} A map of contentItems that the splitter affects
452
+ */
453
+ _getItemsForSplitter: function _getItemsForSplitter(splitter) {
454
+ var index = utils.indexOf(splitter, this._splitter);
455
+ return {
456
+ before: this.contentItems[index],
457
+ after: this.contentItems[index + 1]
458
+ };
459
+ },
460
+
461
+ /**
462
+ * Gets the minimum dimensions for the given item configuration array
463
+ * @param item
464
+ * @private
465
+ */
466
+ _getMinimumDimensions: function _getMinimumDimensions(arr) {
467
+ var minWidth = 0,
468
+ minHeight = 0;
469
+
470
+ for (var i = 0; i < arr.length; ++i) {
471
+ minWidth = Math.max(arr[i].minWidth || 0, minWidth);
472
+ minHeight = Math.max(arr[i].minHeight || 0, minHeight);
473
+ }
474
+
475
+ return {
476
+ horizontal: minWidth,
477
+ vertical: minHeight
478
+ };
479
+ },
480
+
481
+ /**
482
+ * Invoked when a splitter's dragListener fires dragStart. Calculates the splitters
483
+ * movement area once (so that it doesn't need calculating on every mousemove event)
484
+ *
485
+ * @param {lm.controls.Splitter} splitter
486
+ *
487
+ * @returns {void}
488
+ */
489
+ _onSplitterDragStart: function _onSplitterDragStart(splitter) {
490
+ var items = this._getItemsForSplitter(splitter),
491
+ minSize = this.layoutManager.config.dimensions[this._isColumn ? 'minItemHeight' : 'minItemWidth'];
492
+
493
+ var beforeMinDim = this._getMinimumDimensions(items.before.config.content);
494
+
495
+ var beforeMinSize = this._isColumn ? beforeMinDim.vertical : beforeMinDim.horizontal;
496
+
497
+ var afterMinDim = this._getMinimumDimensions(items.after.config.content);
498
+
499
+ var afterMinSize = this._isColumn ? afterMinDim.vertical : afterMinDim.horizontal;
500
+ this._splitterPosition = 0;
501
+ this._splitterMinPosition = -1 * (items.before.element[this._dimension]() - (beforeMinSize || minSize));
502
+ this._splitterMaxPosition = items.after.element[this._dimension]() - (afterMinSize || minSize);
503
+ },
504
+
505
+ /**
506
+ * Invoked when a splitter's DragListener fires drag. Updates the splitters DOM position,
507
+ * but not the sizes of the elements the splitter controls in order to minimize resize events
508
+ *
509
+ * @param {lm.controls.Splitter} splitter
510
+ * @param {Int} offsetX Relative pixel values to the splitters original position. Can be negative
511
+ * @param {Int} offsetY Relative pixel values to the splitters original position. Can be negative
512
+ *
513
+ * @returns {void}
514
+ */
515
+ _onSplitterDrag: function _onSplitterDrag(splitter, offsetX, offsetY) {
516
+ var offset = this._isColumn ? offsetY : offsetX;
517
+
518
+ if (offset > this._splitterMinPosition && offset < this._splitterMaxPosition) {
519
+ this._splitterPosition = offset;
520
+ splitter.element.css(this._isColumn ? 'top' : 'left', offset);
521
+ }
522
+ },
523
+
524
+ /**
525
+ * Invoked when a splitter's DragListener fires dragStop. Resets the splitters DOM position,
526
+ * and applies the new sizes to the elements before and after the splitter and their children
527
+ * on the next animation frame
528
+ *
529
+ * @param {lm.controls.Splitter} splitter
530
+ *
531
+ * @returns {void}
532
+ */
533
+ _onSplitterDragStop: function _onSplitterDragStop(splitter) {
534
+ var items = this._getItemsForSplitter(splitter),
535
+ sizeBefore = items.before.element[this._dimension](),
536
+ sizeAfter = items.after.element[this._dimension](),
537
+ splitterPositionInRange = (this._splitterPosition + sizeBefore) / (sizeBefore + sizeAfter),
538
+ totalRelativeSize = items.before.config[this._dimension] + items.after.config[this._dimension];
539
+
540
+ items.before.config[this._dimension] = splitterPositionInRange * totalRelativeSize;
541
+ items.after.config[this._dimension] = (1 - splitterPositionInRange) * totalRelativeSize;
542
+ splitter.element.css({
543
+ top: 0,
544
+ left: 0
545
+ });
546
+ utils.animFrame(utils.fnBind(this.callDownwards, this, ['setSize']));
547
+ }
548
+ });
549
+ export default RowOrColumn;
550
+ //# sourceMappingURL=RowOrColumn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RowOrColumn.js","names":["$","AbstractContentItem","utils","controls","RowOrColumn","isColumn","layoutManager","config","parent","call","isRow","element","childElementContainer","_splitterSize","dimensions","borderWidth","_splitterGrabSize","borderGrabWidth","_isColumn","_dimension","_splitter","_splitterPosition","_splitterMinPosition","_splitterMaxPosition","extend","copy","prototype","addChild","contentItem","index","_$suspendResize","newItemSize","itemSize","i","splitterElement","_$normalizeContentItem","undefined","contentItems","length","_createSplitter","Math","max","after","before","append","emitBubblingEvent","callDownwards","removeChild","keepChild","removedItemSize","indexOf","splitterIndex","childItem","Error","_$destroy","splice","isClosable","replaceChild","oldChild","newChild","size","setSize","_calculateRelativeSizes","_setAbsoluteSizes","emit","_$init","isInitialised","sizeData","_calculateAbsoluteSizes","additionalPixel","itemSizes","width","totalWidth","height","totalHeight","totalSplitterSize","totalAssigned","floor","push","total","itemsWithoutSetDimension","dimension","round","_respectMinItemWidth","minItemWidth","entriesOverMin","totalOverMin","totalUnderMin","remainingWidth","reducePercent","reducedWidth","allEntries","entry","splitter","Splitter","on","fnBind","_onSplitterDrag","_onSplitterDragStop","_onSplitterDragStart","_getItemsForSplitter","_getMinimumDimensions","arr","minWidth","minHeight","horizontal","vertical","items","minSize","beforeMinDim","content","beforeMinSize","afterMinDim","afterMinSize","offsetX","offsetY","offset","css","sizeBefore","sizeAfter","splitterPositionInRange","totalRelativeSize","top","left","animFrame"],"sources":["../../src/items/RowOrColumn.js"],"sourcesContent":["import $ from 'jquery';\nimport AbstractContentItem from './AbstractContentItem.js';\nimport utils from '../utils/index.js';\nimport controls from '../controls/index.js';\n\nconst RowOrColumn = function (isColumn, layoutManager, config, parent) {\n AbstractContentItem.call(this, layoutManager, config, parent);\n\n this.isRow = !isColumn;\n this.isColumn = isColumn;\n\n this.element = $(\n '<div class=\"lm_item lm_' + (isColumn ? 'column' : 'row') + '\"></div>'\n );\n this.childElementContainer = this.element;\n this._splitterSize = layoutManager.config.dimensions.borderWidth;\n this._splitterGrabSize = layoutManager.config.dimensions.borderGrabWidth;\n this._isColumn = isColumn;\n this._dimension = isColumn ? 'height' : 'width';\n this._splitter = [];\n this._splitterPosition = null;\n this._splitterMinPosition = null;\n this._splitterMaxPosition = null;\n};\n\nutils.extend(RowOrColumn, AbstractContentItem);\n\nutils.copy(RowOrColumn.prototype, {\n /**\n * Add a new contentItem to the Row or Column\n *\n * @param {lm.item.AbstractContentItem} contentItem\n * @param {[int]} index The position of the new item within the Row or Column.\n * If no index is provided the item will be added to the end\n * @param {[bool]} _$suspendResize If true the items won't be resized. This will leave the item in\n * an inconsistent state and is only intended to be used if multiple\n * children need to be added in one go and resize is called afterwards\n *\n * @returns {void}\n */\n addChild: function (contentItem, index, _$suspendResize) {\n var newItemSize, itemSize, i, splitterElement;\n\n contentItem = this.layoutManager._$normalizeContentItem(contentItem, this);\n\n if (index === undefined) {\n index = this.contentItems.length;\n }\n\n if (this.contentItems.length > 0) {\n splitterElement = this._createSplitter(Math.max(0, index - 1)).element;\n\n if (index > 0) {\n this.contentItems[index - 1].element.after(splitterElement);\n splitterElement.after(contentItem.element);\n } else {\n this.contentItems[0].element.before(splitterElement);\n splitterElement.before(contentItem.element);\n }\n } else {\n this.childElementContainer.append(contentItem.element);\n }\n\n AbstractContentItem.prototype.addChild.call(this, contentItem, index);\n\n newItemSize = (1 / this.contentItems.length) * 100;\n\n if (_$suspendResize === true) {\n this.emitBubblingEvent('stateChanged');\n return;\n }\n\n for (i = 0; i < this.contentItems.length; i++) {\n if (this.contentItems[i] === contentItem) {\n contentItem.config[this._dimension] = newItemSize;\n } else {\n itemSize = this.contentItems[i].config[this._dimension] *=\n (100 - newItemSize) / 100;\n this.contentItems[i].config[this._dimension] = itemSize;\n }\n }\n\n this.callDownwards('setSize');\n this.emitBubblingEvent('stateChanged');\n },\n\n /**\n * Removes a child of this element\n *\n * @param {lm.items.AbstractContentItem} contentItem\n * @param {boolean} keepChild If true the child will be removed, but not destroyed\n *\n * @returns {void}\n */\n removeChild: function (contentItem, keepChild) {\n var removedItemSize = contentItem.config[this._dimension],\n index = utils.indexOf(contentItem, this.contentItems),\n splitterIndex = Math.max(index - 1, 0),\n i,\n childItem;\n\n if (index === -1) {\n throw new Error(\n \"Can't remove child. ContentItem is not child of this Row or Column\"\n );\n }\n\n /**\n * Remove the splitter before the item or after if the item happens\n * to be the first in the row/column\n */\n if (this._splitter[splitterIndex]) {\n this._splitter[splitterIndex]._$destroy();\n this._splitter.splice(splitterIndex, 1);\n }\n\n /**\n * Allocate the space that the removed item occupied to the remaining items\n */\n for (i = 0; i < this.contentItems.length; i++) {\n if (this.contentItems[i] !== contentItem) {\n this.contentItems[i].config[this._dimension] +=\n removedItemSize / (this.contentItems.length - 1);\n }\n }\n\n AbstractContentItem.prototype.removeChild.call(\n this,\n contentItem,\n keepChild\n );\n\n if (this.contentItems.length === 1 && this.config.isClosable === true) {\n childItem = this.contentItems[0];\n this.contentItems = [];\n this.parent.replaceChild(this, childItem, true);\n } else {\n this.callDownwards('setSize');\n this.emitBubblingEvent('stateChanged');\n }\n },\n\n /**\n * Replaces a child of this Row or Column with another contentItem\n *\n * @param {lm.items.AbstractContentItem} oldChild\n * @param {lm.items.AbstractContentItem} newChild\n *\n * @returns {void}\n */\n replaceChild: function (oldChild, newChild) {\n var size = oldChild.config[this._dimension];\n AbstractContentItem.prototype.replaceChild.call(this, oldChild, newChild);\n newChild.config[this._dimension] = size;\n this.callDownwards('setSize');\n this.emitBubblingEvent('stateChanged');\n },\n\n /**\n * Called whenever the dimensions of this item or one of its parents change\n *\n * @returns {void}\n */\n setSize: function () {\n if (this.contentItems.length > 0) {\n this._calculateRelativeSizes();\n this._setAbsoluteSizes();\n }\n this.emitBubblingEvent('stateChanged');\n this.emit('resize');\n },\n\n /**\n * Invoked recursively by the layout manager. AbstractContentItem.init appends\n * the contentItem's DOM elements to the container, RowOrColumn init adds splitters\n * in between them\n *\n * @package private\n * @override AbstractContentItem._$init\n * @returns {void}\n */\n _$init: function () {\n if (this.isInitialised === true) return;\n\n var i;\n\n AbstractContentItem.prototype._$init.call(this);\n\n for (i = 0; i < this.contentItems.length - 1; i++) {\n this.contentItems[i].element.after(this._createSplitter(i).element);\n }\n },\n\n /**\n * Turns the relative sizes calculated by _calculateRelativeSizes into\n * absolute pixel values and applies them to the children's DOM elements\n *\n * Assigns additional pixels to counteract Math.floor\n *\n * @private\n * @returns {void}\n */\n _setAbsoluteSizes: function () {\n var i,\n sizeData = this._calculateAbsoluteSizes();\n\n for (i = 0; i < this.contentItems.length; i++) {\n if (sizeData.additionalPixel - i > 0) {\n sizeData.itemSizes[i]++;\n }\n\n if (this._isColumn) {\n this.contentItems[i].element.width(sizeData.totalWidth);\n this.contentItems[i].element.height(sizeData.itemSizes[i]);\n } else {\n this.contentItems[i].element.width(sizeData.itemSizes[i]);\n this.contentItems[i].element.height(sizeData.totalHeight);\n }\n }\n },\n\n /**\n * Calculates the absolute sizes of all of the children of this Item.\n * @returns {object} - Set with absolute sizes and additional pixels.\n */\n _calculateAbsoluteSizes: function () {\n var i,\n totalSplitterSize = (this.contentItems.length - 1) * this._splitterSize,\n totalWidth = this.element.width(),\n totalHeight = this.element.height(),\n totalAssigned = 0,\n additionalPixel,\n itemSize,\n itemSizes = [];\n\n if (this._isColumn) {\n totalHeight -= totalSplitterSize;\n } else {\n totalWidth -= totalSplitterSize;\n }\n\n for (i = 0; i < this.contentItems.length; i++) {\n if (this._isColumn) {\n itemSize = Math.floor(\n totalHeight * (this.contentItems[i].config.height / 100)\n );\n } else {\n itemSize = Math.floor(\n totalWidth * (this.contentItems[i].config.width / 100)\n );\n }\n\n totalAssigned += itemSize;\n itemSizes.push(itemSize);\n }\n\n additionalPixel = Math.floor(\n (this._isColumn ? totalHeight : totalWidth) - totalAssigned\n );\n\n return {\n itemSizes: itemSizes,\n additionalPixel: additionalPixel,\n totalWidth: totalWidth,\n totalHeight: totalHeight,\n };\n },\n\n /**\n * Calculates the relative sizes of all children of this Item. The logic\n * is as follows:\n *\n * - Add up the total size of all items that have a configured size\n *\n * - If the total == 100 (check for floating point errors)\n * Excellent, job done\n *\n * - If the total is > 100,\n * set the size of items without set dimensions to 1/3 and add this to the total\n * set the size off all items so that the total is hundred relative to their original size\n *\n * - If the total is < 100\n * If there are items without set dimensions, distribute the remainder to 100 evenly between them\n * If there are no items without set dimensions, increase all items sizes relative to\n * their original size so that they add up to 100\n *\n * @private\n * @returns {void}\n */\n _calculateRelativeSizes: function () {\n var i,\n total = 0,\n itemsWithoutSetDimension = [],\n dimension = this._isColumn ? 'height' : 'width';\n\n for (i = 0; i < this.contentItems.length; i++) {\n if (this.contentItems[i].config[dimension] !== undefined) {\n total += this.contentItems[i].config[dimension];\n } else {\n itemsWithoutSetDimension.push(this.contentItems[i]);\n }\n }\n\n /**\n * Everything adds up to hundred, all good :-)\n */\n if (Math.round(total) === 100) {\n this._respectMinItemWidth();\n return;\n }\n\n /**\n * Allocate the remaining size to the items without a set dimension\n */\n if (Math.round(total) < 100 && itemsWithoutSetDimension.length > 0) {\n for (i = 0; i < itemsWithoutSetDimension.length; i++) {\n itemsWithoutSetDimension[i].config[dimension] =\n (100 - total) / itemsWithoutSetDimension.length;\n }\n this._respectMinItemWidth();\n return;\n }\n\n /**\n * If the total is > 100, but there are also items without a set dimension left, assing 50\n * as their dimension and add it to the total\n *\n * This will be reset in the next step\n */\n if (Math.round(total) > 100) {\n for (i = 0; i < itemsWithoutSetDimension.length; i++) {\n itemsWithoutSetDimension[i].config[dimension] = 50;\n total += 50;\n }\n }\n\n /**\n * Set every items size relative to 100 relative to its size to total\n */\n for (i = 0; i < this.contentItems.length; i++) {\n this.contentItems[i].config[dimension] =\n (this.contentItems[i].config[dimension] / total) * 100;\n }\n\n this._respectMinItemWidth();\n },\n\n /**\n * Adjusts the column widths to respect the dimensions minItemWidth if set.\n * @returns {}\n */\n _respectMinItemWidth: function () {\n var minItemWidth = this.layoutManager.config.dimensions\n ? this.layoutManager.config.dimensions.minItemWidth || 0\n : 0,\n sizeData = null,\n entriesOverMin = [],\n totalOverMin = 0,\n totalUnderMin = 0,\n remainingWidth = 0,\n itemSize = 0,\n contentItem = null,\n reducePercent,\n reducedWidth,\n allEntries = [],\n entry;\n\n if (this._isColumn || !minItemWidth || this.contentItems.length <= 1) {\n return;\n }\n\n sizeData = this._calculateAbsoluteSizes();\n\n /**\n * Figure out how much we are under the min item size total and how much room we have to use.\n */\n for (var i = 0; i < this.contentItems.length; i++) {\n contentItem = this.contentItems[i];\n itemSize = sizeData.itemSizes[i];\n\n if (itemSize < minItemWidth) {\n totalUnderMin += minItemWidth - itemSize;\n entry = { width: minItemWidth };\n } else {\n totalOverMin += itemSize - minItemWidth;\n entry = { width: itemSize };\n entriesOverMin.push(entry);\n }\n\n allEntries.push(entry);\n }\n\n /**\n * If there is nothing under min, or there is not enough over to make up the difference, do nothing.\n */\n if (totalUnderMin === 0 || totalUnderMin > totalOverMin) {\n return;\n }\n\n /**\n * Evenly reduce all columns that are over the min item width to make up the difference.\n */\n reducePercent = totalUnderMin / totalOverMin;\n remainingWidth = totalUnderMin;\n for (i = 0; i < entriesOverMin.length; i++) {\n entry = entriesOverMin[i];\n reducedWidth = Math.round((entry.width - minItemWidth) * reducePercent);\n remainingWidth -= reducedWidth;\n entry.width -= reducedWidth;\n }\n\n /**\n * Take anything remaining from the last item.\n */\n if (remainingWidth !== 0) {\n allEntries[allEntries.length - 1].width -= remainingWidth;\n }\n\n /**\n * Set every items size relative to 100 relative to its size to total\n */\n for (i = 0; i < this.contentItems.length; i++) {\n this.contentItems[i].config.width =\n (allEntries[i].width / sizeData.totalWidth) * 100;\n }\n },\n\n /**\n * Instantiates a new lm.controls.Splitter, binds events to it and adds\n * it to the array of splitters at the position specified as the index argument\n *\n * What it doesn't do though is append the splitter to the DOM\n *\n * @param {Int} index The position of the splitter\n *\n * @returns {lm.controls.Splitter}\n */\n _createSplitter: function (index) {\n var splitter;\n splitter = new controls.Splitter(\n this._isColumn,\n this._splitterSize,\n this._splitterGrabSize\n );\n splitter.on(\n 'drag',\n utils.fnBind(this._onSplitterDrag, this, [splitter]),\n this\n );\n splitter.on(\n 'dragStop',\n utils.fnBind(this._onSplitterDragStop, this, [splitter]),\n this\n );\n splitter.on(\n 'dragStart',\n utils.fnBind(this._onSplitterDragStart, this, [splitter]),\n this\n );\n this._splitter.splice(index, 0, splitter);\n return splitter;\n },\n\n /**\n * Locates the instance of lm.controls.Splitter in the array of\n * registered splitters and returns a map containing the contentItem\n * before and after the splitters, both of which are affected if the\n * splitter is moved\n *\n * @param {lm.controls.Splitter} splitter\n *\n * @returns {Object} A map of contentItems that the splitter affects\n */\n _getItemsForSplitter: function (splitter) {\n var index = utils.indexOf(splitter, this._splitter);\n\n return {\n before: this.contentItems[index],\n after: this.contentItems[index + 1],\n };\n },\n\n /**\n * Gets the minimum dimensions for the given item configuration array\n * @param item\n * @private\n */\n _getMinimumDimensions: function (arr) {\n var minWidth = 0,\n minHeight = 0;\n\n for (var i = 0; i < arr.length; ++i) {\n minWidth = Math.max(arr[i].minWidth || 0, minWidth);\n minHeight = Math.max(arr[i].minHeight || 0, minHeight);\n }\n\n return { horizontal: minWidth, vertical: minHeight };\n },\n\n /**\n * Invoked when a splitter's dragListener fires dragStart. Calculates the splitters\n * movement area once (so that it doesn't need calculating on every mousemove event)\n *\n * @param {lm.controls.Splitter} splitter\n *\n * @returns {void}\n */\n _onSplitterDragStart: function (splitter) {\n var items = this._getItemsForSplitter(splitter),\n minSize = this.layoutManager.config.dimensions[\n this._isColumn ? 'minItemHeight' : 'minItemWidth'\n ];\n\n var beforeMinDim = this._getMinimumDimensions(items.before.config.content);\n var beforeMinSize = this._isColumn\n ? beforeMinDim.vertical\n : beforeMinDim.horizontal;\n\n var afterMinDim = this._getMinimumDimensions(items.after.config.content);\n var afterMinSize = this._isColumn\n ? afterMinDim.vertical\n : afterMinDim.horizontal;\n\n this._splitterPosition = 0;\n this._splitterMinPosition =\n -1 *\n (items.before.element[this._dimension]() - (beforeMinSize || minSize));\n this._splitterMaxPosition =\n items.after.element[this._dimension]() - (afterMinSize || minSize);\n },\n\n /**\n * Invoked when a splitter's DragListener fires drag. Updates the splitters DOM position,\n * but not the sizes of the elements the splitter controls in order to minimize resize events\n *\n * @param {lm.controls.Splitter} splitter\n * @param {Int} offsetX Relative pixel values to the splitters original position. Can be negative\n * @param {Int} offsetY Relative pixel values to the splitters original position. Can be negative\n *\n * @returns {void}\n */\n _onSplitterDrag: function (splitter, offsetX, offsetY) {\n var offset = this._isColumn ? offsetY : offsetX;\n\n if (\n offset > this._splitterMinPosition &&\n offset < this._splitterMaxPosition\n ) {\n this._splitterPosition = offset;\n splitter.element.css(this._isColumn ? 'top' : 'left', offset);\n }\n },\n\n /**\n * Invoked when a splitter's DragListener fires dragStop. Resets the splitters DOM position,\n * and applies the new sizes to the elements before and after the splitter and their children\n * on the next animation frame\n *\n * @param {lm.controls.Splitter} splitter\n *\n * @returns {void}\n */\n _onSplitterDragStop: function (splitter) {\n var items = this._getItemsForSplitter(splitter),\n sizeBefore = items.before.element[this._dimension](),\n sizeAfter = items.after.element[this._dimension](),\n splitterPositionInRange =\n (this._splitterPosition + sizeBefore) / (sizeBefore + sizeAfter),\n totalRelativeSize =\n items.before.config[this._dimension] +\n items.after.config[this._dimension];\n\n items.before.config[this._dimension] =\n splitterPositionInRange * totalRelativeSize;\n items.after.config[this._dimension] =\n (1 - splitterPositionInRange) * totalRelativeSize;\n\n splitter.element.css({\n top: 0,\n left: 0,\n });\n\n utils.animFrame(utils.fnBind(this.callDownwards, this, ['setSize']));\n },\n});\n\nexport default RowOrColumn;\n"],"mappings":"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"}