mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
109 lines
2.8 KiB
JavaScript
109 lines
2.8 KiB
JavaScript
|
/**
|
||
|
* @preserve jLayout Flex Grid Layout - JavaScript Layout Algorithms v0.4
|
||
|
* Based on: http://www.javaworld.com/javaworld/javatips/jw-javatip121.html
|
||
|
*
|
||
|
* Licensed under the new BSD License.
|
||
|
* Copyright 2008-2009, Bram Stein
|
||
|
* All rights reserved.
|
||
|
*/
|
||
|
/*global jLayout:true */
|
||
|
(function () {
|
||
|
jLayout = (typeof jLayout === 'undefined') ? {} : jLayout;
|
||
|
|
||
|
// The flex grid has a dependency on the grid layout, so please make
|
||
|
// sure you include the grid layout manager before the flex grid
|
||
|
// layout manager.
|
||
|
if (typeof jLayout.grid !== 'undefined') {
|
||
|
jLayout.flexGrid = function (spec) {
|
||
|
var my = {},
|
||
|
that = this.grid(spec, my);
|
||
|
|
||
|
function zeroArray(a, l) {
|
||
|
var i = 0;
|
||
|
for (; i < l; i += 1) {
|
||
|
a[i] = 0;
|
||
|
}
|
||
|
return a;
|
||
|
}
|
||
|
|
||
|
function typeLayout(type) {
|
||
|
return function (container) {
|
||
|
var i = 0, r = 0, c = 0, nw = 0, nh = 0,
|
||
|
w = zeroArray([], my.columns),
|
||
|
h = zeroArray([], my.rows),
|
||
|
type_size,
|
||
|
insets = container.insets();
|
||
|
|
||
|
for (i = 0; i < my.items.length; i += 1) {
|
||
|
r = Math.floor(i / my.columns);
|
||
|
c = i % my.columns;
|
||
|
type_size = my.items[i][type + 'Size']();
|
||
|
if (w[c] < type_size.width) {
|
||
|
w[c] = type_size.width;
|
||
|
}
|
||
|
if (h[r] < type_size.height) {
|
||
|
h[r] = type_size.height;
|
||
|
}
|
||
|
}
|
||
|
for (i = 0; i < my.columns; i += 1) {
|
||
|
nw += w[i];
|
||
|
}
|
||
|
for (i = 0; i < my.rows; i += 1) {
|
||
|
nh += h[i];
|
||
|
}
|
||
|
return {
|
||
|
width: insets.left + insets.right + nw + (my.columns - 1) * my.hgap,
|
||
|
height: insets.top + insets.bottom + nh + (my.rows - 1) * my.vgap
|
||
|
};
|
||
|
};
|
||
|
}
|
||
|
|
||
|
that.preferred = typeLayout('preferred');
|
||
|
that.minimum = typeLayout('minimum');
|
||
|
that.maximum = typeLayout('maximum');
|
||
|
|
||
|
that.layout = function (container) {
|
||
|
var i = 0, c = 0, r = 0,
|
||
|
pd = that.preferred(container),
|
||
|
sw = container.bounds().width / pd.width,
|
||
|
sh = container.bounds().height / pd.height,
|
||
|
w = zeroArray([], my.columns),
|
||
|
h = zeroArray([], my.rows),
|
||
|
insets = container.insets(),
|
||
|
x = insets.left,
|
||
|
y = insets.top,
|
||
|
d;
|
||
|
|
||
|
for (i = 0; i < my.items.length; i += 1) {
|
||
|
r = Math.floor(i / my.columns);
|
||
|
c = i % my.columns;
|
||
|
d = my.items[i].preferredSize();
|
||
|
d.width = sw * d.width;
|
||
|
d.height = sh * d.height;
|
||
|
|
||
|
if (w[c] < d.width) {
|
||
|
w[c] = d.width;
|
||
|
}
|
||
|
if (h[r] < d.height) {
|
||
|
h[r] = d.height;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for (c = 0; c < my.columns; c += 1) {
|
||
|
for (r = 0, y = insets.top; r < my.rows; r += 1) {
|
||
|
i = r * my.columns + c;
|
||
|
if (i < my.items.length) {
|
||
|
my.items[i].bounds({'x': x, 'y': y, 'width': w[c], 'height': h[r]});
|
||
|
my.items[i].doLayout();
|
||
|
}
|
||
|
y += h[r] + my.vgap;
|
||
|
}
|
||
|
x += w[c] + my.hgap;
|
||
|
}
|
||
|
return container;
|
||
|
};
|
||
|
return that;
|
||
|
};
|
||
|
}
|
||
|
}());
|