Outline.prototype.registerEvents = function()

in lib/@uncharted/strippets/src/strippets.outline.js [425:488]


Outline.prototype.registerEvents = function() {
    var s = this;

    s.subscribe();

    s.$outline.on('click', s, function(event) {
        var outlineContext = event.data;
        if ($(event.target).hasClass(s.classes.reader.closeButton)) {
            $(event.target).css('visibility', 'hidden');
            s.mediator.publish(outlineContext.events.outline.Minimize, outlineContext._id);
            return outlineContext.transitionState('minimal');
        }

        if (s.Settings.onClicked) {
            s.Settings.onClicked(s.data);
        }

        if (outlineContext.getCurrentState() === 'hidden') {
            return undefined;
        } else if (outlineContext.getCurrentState() === 'expanded') {
            return outlineContext.transitionState('readingmode');
        } else if (outlineContext.getCurrentState() === 'readingmode') {
            // do nothing.
            return undefined;
        }

        var retVal = outlineContext.transitionState('readingmode');
        if (!event.shiftKey) {
            s.mediator.publish(outlineContext.events.outline.Minimize, outlineContext._id);
        }
        return retVal;
    });

    // Register a delegated event for the entities' position-aware tooltips
    var entityClass = '.' + s.classes.entity.outlineentity;
    s.$outline.on('mouseenter', entityClass, function() {
        var $entity = $(this); // eslint-disable-line
        var tooltip = $entity.attr('data-entities');
        if (tooltip) {
            $tooltip.html(tooltip);
            $entity.append($tooltip);

            // compute the effective scale factor by sizing the tooltip and comparing to the actual result
            var scale = util.getParentScale($tooltip);
            var $viewport = $('.viewport');
            var viewportBounds = $viewport[0].getBoundingClientRect();
            var entityBounds = $entity[0].getBoundingClientRect();
            var spaceRight = (viewportBounds.right - entityBounds.right); // space to the right of the entity
            var spaceLeft = (entityBounds.left - viewportBounds.left); // space to the left of the entity
            $tooltip.css('max-width', scale * spaceLeft); // force it to resize to fit the text, if needed, before we measure
            var tooltipWidth = $tooltip[0].getBoundingClientRect().width;
            var isRightAligned = tooltipWidth > spaceRight && (spaceLeft > tooltipWidth || spaceLeft > spaceRight);
            $tooltip.toggleClass('tooltip-left', !isRightAligned);
            $tooltip.toggleClass('tooltip-right', isRightAligned);
            var maxWidth = isRightAligned ? spaceLeft : spaceRight;
            if (maxWidth !== spaceLeft) {
                $tooltip.css('max-width', scale * maxWidth);
            }
            $tooltip.css('word-wrap', maxWidth < tooltipWidth ? 'normal' : 'no-wrap');
        }
    }).on('mouseleave', entityClass, function() {
        $tooltip.toggleClass('tooltip-left tooltip-right', false);
    });
};