blob: 55981a5d5fa4fcae67fff93d1efbb49e37a4b9b8 [file] [log] [blame]
Controller.open(function(_) {
_.focusBlurEvents = function() {
var ctrlr = this, root = ctrlr.root, cursor = ctrlr.cursor;
var blurTimeout;
ctrlr.textarea.focus(function() {
ctrlr.blurred = false;
clearTimeout(blurTimeout);
ctrlr.container.addClass('mq-focused');
if (!cursor.parent)
cursor.insAtRightEnd(root);
if (cursor.selection) {
cursor.selection.jQ.removeClass('mq-blur');
ctrlr.selectionChanged(); //re-select textarea contents after tabbing away and back
}
else
cursor.show();
}).blur(function() {
ctrlr.blurred = true;
blurTimeout = setTimeout(function() { // wait for blur on window; if
root.postOrder('intentionalBlur'); // none, intentional blur: #264
cursor.clearSelection().endSelection();
blur();
});
$(window).on('blur', windowBlur);
});
function windowBlur() { // blur event also fired on window, just switching
clearTimeout(blurTimeout); // tabs/windows, not intentional blur
if (cursor.selection) cursor.selection.jQ.addClass('mq-blur');
blur();
}
function blur() { // not directly in the textarea blur handler so as to be
cursor.hide().parent.blur(); // synchronous with/in the same frame as
ctrlr.container.removeClass('mq-focused'); // clearing/blurring selection
$(window).off('blur', windowBlur);
}
ctrlr.blurred = true;
cursor.hide().parent.blur();
};
});
/**
* TODO: I wanted to move MathBlock::focus and blur here, it would clean
* up lots of stuff like, TextBlock::focus is set to MathBlock::focus
* and TextBlock::blur calls MathBlock::blur, when instead they could
* use inheritance and super_.
*
* Problem is, there's lots of calls to .focus()/.blur() on nodes
* outside Controller::focusBlurEvents(), such as .postOrder('blur') on
* insertion, which if MathBlock::blur becomes Node::blur, would add the
* 'blur' CSS class to all Symbol's (because .isEmpty() is true for all
* of them).
*
* I'm not even sure there aren't other troublesome calls to .focus() or
* .blur(), so this is TODO for now.
*/