in modules/frontend/app/services/FormUtils.service.js [145:250]
function compactByMaxPixels(names, nameLength, nameWidth) {
if (nameWidth <= 0)
return names;
const fitted = [];
const widthByName = [];
const len = names.length;
let divideTo = len;
for (let nameIx = 0; nameIx < len; nameIx++) {
fitted[nameIx] = false;
widthByName[nameIx] = nameWidth;
}
// Try to distribute space from short class names to long class names.
let remains = 0;
do {
for (let nameIx = 0; nameIx < len; nameIx++) {
if (!fitted[nameIx]) {
const curNameWidth = measureText(names[nameIx]);
if (widthByName[nameIx] > curNameWidth) {
fitted[nameIx] = true;
remains += widthByName[nameIx] - curNameWidth;
divideTo -= 1;
widthByName[nameIx] = curNameWidth;
}
}
}
const remainsByName = remains / divideTo;
for (let nameIx = 0; nameIx < len; nameIx++) {
if (!fitted[nameIx])
widthByName[nameIx] += remainsByName;
}
}
while (remains > 0);
// Compact class names to available for each space.
for (let nameIx = 0; nameIx < len; nameIx++) {
const s = names[nameIx];
if (s.length > (nameLength / 2 | 0)) {
let totalWidth = measureText(s);
if (totalWidth > widthByName[nameIx]) {
const packages = s.split('.');
const packageCnt = packages.length - 1;
for (let i = 0; i < packageCnt && totalWidth > widthByName[nameIx]; i++) {
if (packages[i].length > 1) {
totalWidth -= measureText(packages[i].substring(1, packages[i].length));
packages[i] = packages[i][0];
}
}
let shortPackage = '';
for (let i = 0; i < packageCnt; i++)
shortPackage += packages[i] + '.';
const className = packages[packageCnt];
const classLen = className.length;
let minLen = Math.min(classLen, 3);
totalWidth = measureText(shortPackage + className);
// Compact class name if shorten package path is very long.
if (totalWidth > widthByName[nameIx]) {
let maxLen = classLen;
let middleLen = (minLen + (maxLen - minLen) / 2 ) | 0;
while (middleLen !== minLen && middleLen !== maxLen) {
const middleLenPx = measureText(shortPackage + className.substr(0, middleLen) + '...');
if (middleLenPx > widthByName[nameIx])
maxLen = middleLen;
else
minLen = middleLen;
middleLen = (minLen + (maxLen - minLen) / 2 ) | 0;
}
names[nameIx] = shortPackage + className.substring(0, middleLen) + '...';
}
else
names[nameIx] = shortPackage + className;
}
}
}
return names;
}