devexpress-reporting
Version:
DevExpress Reporting provides the capability to develop a reporting application to create and customize reports.
90 lines (89 loc) • 4.63 kB
JavaScript
/**
* DevExpress HTML/JS Reporting (designer\actions\_spaceCommandHandler.js)
* Version: 24.2.6
* Build date: Mar 18, 2025
* Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED
* License: https://www.devexpress.com/Support/EULAs/universal.xml
*/
export class SpaceCommandHandler {
constructor(selectionProvider, surfaceContext) {
this._selectionProvider = selectionProvider;
this._surfaceContext = surfaceContext;
}
_comparer(propertyName) {
return (a, b) => {
return a.rect()[propertyName] - b.rect()[propertyName];
};
}
_spaceIncrease(sign, isHoriz) {
const sortedSelectedItems = this._selectionProvider.selectedItems.filter((item) => { return !item.locked; }), axisProperty = isHoriz ? 'left' : 'top', lengthProperty = isHoriz ? 'width' : 'height', margin = isHoriz ? this._surfaceContext().margins.left() : 0, snapGridSize = this._surfaceContext().snapGridSize(), focusedParent = this._selectionProvider.focused().getControlModel().parentModel(), focusedItem = this._selectionProvider.focused();
sortedSelectedItems.sort(this._comparer(axisProperty));
const focusedItemIndex = sortedSelectedItems.indexOf(this._selectionProvider.focused());
this._selectionProvider.selectedItems.filter((item) => { return !item.locked; }).filter((item) => { return item !== focusedItem && item.getControlModel().parentModel() === focusedParent; }).forEach((item) => {
const itemIndex = sortedSelectedItems.indexOf(item), spaceOffset = Math.abs(itemIndex - focusedItemIndex) * snapGridSize * sign, itemAxisProperty = item.rect()[axisProperty], itemLengthProperty = item.rect()[lengthProperty], parentLengthProperty = item.parent.rect()[lengthProperty] - margin;
let newValue;
if (itemIndex < focusedItemIndex) {
newValue = itemAxisProperty - spaceOffset;
if (newValue < 0) {
newValue = 0;
}
}
else {
newValue = itemAxisProperty + spaceOffset;
if ((newValue + itemLengthProperty) > parentLengthProperty) {
newValue = parentLengthProperty - itemLengthProperty;
}
}
const val = {};
val[axisProperty] = newValue;
item.rect(val);
});
}
_spaceMakeEqual(isHoriz) {
this._concatenateWithSpace(isHoriz, (sortedSelectedItems, axisProperty, lengthProperty) => {
let averageSpace = 0;
for (let i = 0; i < sortedSelectedItems.length - 1; i++) {
const currentValue = sortedSelectedItems[i + 1].rect()[axisProperty] - (sortedSelectedItems[i].rect()[axisProperty] + sortedSelectedItems[i].rect()[lengthProperty]);
averageSpace = (averageSpace * i + currentValue) / (i + 1);
}
return averageSpace;
});
}
_concatenateWithSpace(isHoriz, getSpaceSize) {
const sortedSelectedItems = this._selectionProvider.selectedItems.filter((item) => { return !item.locked; }), axisProperty = isHoriz ? 'left' : 'top', lengthProperty = isHoriz ? 'width' : 'height', focusedParent = this._selectionProvider.focused().getControlModel().parentModel();
sortedSelectedItems.sort(this._comparer(axisProperty));
const spaceSize = getSpaceSize(sortedSelectedItems, axisProperty, lengthProperty);
this._selectionProvider.selectedItems.filter((item) => { return !item.locked; }).filter((item) => { return focusedParent === item.getControlModel().parentModel(); }).forEach((item) => {
const itemIndex = sortedSelectedItems.indexOf(item);
if (itemIndex > 0) {
const prevControl = sortedSelectedItems[itemIndex - 1], val = {};
val[axisProperty] = prevControl.rect()[axisProperty] + prevControl.rect()[lengthProperty] + spaceSize;
item.rect(val);
}
});
}
horizSpaceConcatenate() {
this._concatenateWithSpace(true, () => { return 0; });
}
vertSpaceConcatenate() {
this._concatenateWithSpace(false, () => { return 0; });
}
horizSpaceMakeEqual() {
this._spaceMakeEqual(true);
}
vertSpaceMakeEqual() {
this._spaceMakeEqual(false);
}
horizSpaceDecrease() {
this._spaceIncrease(-1, true);
}
horizSpaceIncrease() {
this._spaceIncrease(1, true);
}
vertSpaceDecrease() {
this._spaceIncrease(-1, false);
}
vertSpaceIncrease() {
this._spaceIncrease(1, false);
}
}