/** * focus management * @ignore * @author yiminghe@gmail.com */ KISSY.add("editor/focusManager", function (S, Editor) { var INSTANCES = {}, timer, currentInstance, /** * focus management for all editor instances. * @class KISSY.Editor.focusManager * @singleton * @private */ focusManager = { /** * get current focused editor instance */ currentInstance: function () { return currentInstance; }, /** * get editor instance by editor id * @param id {string} */ getInstance: function (id) { return INSTANCES[id]; }, /** * register editor within focus manager * @param editor */ register: function (editor) { INSTANCES[editor.get('id')] = editor; }, /** * monitor editor focus and register editor * @param editor */ add: function (editor) { this.register(editor); editor.get("window").on("focus", focus, editor) .on("blur", blur, editor); }, /** * remove editor from focus manager * @param editor */ remove: function (editor) { delete INSTANCES[editor.get('id')]; editor.get("window").detach("focus", focus, editor) .detach("blur", blur, editor); } }, TRUE = true, FALSE = false, NULL = null; function focus() { var editor = this; editor.__iframeFocus = TRUE; currentInstance = editor; if (timer) { clearTimeout(timer); } timer = setTimeout(function () { editor.fire("focus"); }, 30); } function blur() { var editor = this; editor.__iframeFocus = FALSE; currentInstance = NULL; if (timer) { clearTimeout(timer); } /* Note that this functions acts asynchronously with a delay of 30ms to avoid subsequent blur/focus effects. */ timer = setTimeout(function () { editor.fire("blur"); }, 30); } Editor.focusManager = focusManager; Editor.getInstances = function () { return INSTANCES; }; return focusManager; }, { requires: ['./base', './dom'] });