function compactByMaxPixels()

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;
    }