mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
137 lines
3.3 KiB
JavaScript
137 lines
3.3 KiB
JavaScript
/**
|
|
* @preserve jLayout Border Layout - JavaScript Layout Algorithms v0.4
|
|
*
|
|
* Licensed under the new BSD License.
|
|
* Copyright 2008-2009, Bram Stein
|
|
* All rights reserved.
|
|
*/
|
|
/*global jLayout:true */
|
|
(function () {
|
|
jLayout = (typeof jLayout === 'undefined') ? {} : jLayout;
|
|
|
|
jLayout.border = function (spec) {
|
|
var my = {},
|
|
that = {},
|
|
east = spec.east,
|
|
west = spec.west,
|
|
north = spec.north,
|
|
south = spec.south,
|
|
center = spec.center;
|
|
|
|
my.hgap = spec.hgap || 0;
|
|
my.vgap = spec.vgap || 0;
|
|
|
|
that.items = function () {
|
|
var items = [];
|
|
if (east) {
|
|
items.push(east);
|
|
}
|
|
|
|
if (west) {
|
|
items.push(west);
|
|
}
|
|
|
|
if (north) {
|
|
items.push(north);
|
|
}
|
|
|
|
if (south) {
|
|
items.push(south);
|
|
}
|
|
|
|
if (center) {
|
|
items.push(center);
|
|
}
|
|
return items;
|
|
};
|
|
|
|
that.layout = function (container) {
|
|
var size = container.bounds(),
|
|
insets = container.insets(),
|
|
top = insets.top,
|
|
bottom = size.height - insets.bottom,
|
|
left = insets.left,
|
|
right = size.width - insets.right,
|
|
tmp;
|
|
|
|
if (north && north.isVisible()) {
|
|
tmp = north.preferredSize();
|
|
north.bounds({'x': left, 'y': top, 'width': right - left, 'height': tmp.height});
|
|
north.doLayout();
|
|
|
|
top += tmp.height + my.vgap;
|
|
}
|
|
if (south && south.isVisible()) {
|
|
tmp = south.preferredSize();
|
|
south.bounds({'x': left, 'y': bottom - tmp.height, 'width': right - left, 'height': tmp.height});
|
|
south.doLayout();
|
|
|
|
bottom -= tmp.height + my.vgap;
|
|
}
|
|
if (east && east.isVisible()) {
|
|
tmp = east.preferredSize();
|
|
east.bounds({'x': right - tmp.width, 'y': top, 'width': tmp.width, 'height': bottom - top});
|
|
east.doLayout();
|
|
|
|
right -= tmp.width + my.hgap;
|
|
}
|
|
if (west && west.isVisible()) {
|
|
tmp = west.preferredSize();
|
|
west.bounds({'x': left, 'y': top, 'width': tmp.width, 'height': bottom - top});
|
|
west.doLayout();
|
|
|
|
left += tmp.width + my.hgap;
|
|
}
|
|
if (center && center.isVisible()) {
|
|
center.bounds({'x': left, 'y': top, 'width': right - left, 'height': bottom - top});
|
|
center.doLayout();
|
|
}
|
|
return container;
|
|
};
|
|
|
|
function typeLayout(type) {
|
|
return function (container) {
|
|
var insets = container.insets(),
|
|
width = 0,
|
|
height = 0,
|
|
type_size;
|
|
|
|
if (east && east.isVisible()) {
|
|
type_size = east[type + 'Size']();
|
|
width += type_size.width + my.hgap;
|
|
height = type_size.height;
|
|
}
|
|
if (west && west.isVisible()) {
|
|
type_size = west[type + 'Size']();
|
|
width += type_size.width + my.hgap;
|
|
height = Math.max(type_size.height, height);
|
|
}
|
|
if (center && center.isVisible()) {
|
|
type_size = center[type + 'Size']();
|
|
width += type_size.width;
|
|
height = Math.max(type_size.height, height);
|
|
}
|
|
if (north && north.isVisible()) {
|
|
type_size = north[type + 'Size']();
|
|
width = Math.max(type_size.width, width);
|
|
height += type_size.height + my.vgap;
|
|
}
|
|
if (south && south.isVisible()) {
|
|
type_size = south[type + 'Size']();
|
|
width = Math.max(type_size.width, width);
|
|
height += type_size.height + my.vgap;
|
|
}
|
|
|
|
return {
|
|
'width': width + insets.left + insets.right,
|
|
'height': height + insets.top + insets.bottom
|
|
};
|
|
};
|
|
}
|
|
that.preferred = typeLayout('preferred');
|
|
that.minimum = typeLayout('minimum');
|
|
that.maximum = typeLayout('maximum');
|
|
return that;
|
|
};
|
|
}());
|