1 /**
  2  * 多实例的管理,主要是焦点控制,主要是为了
  3  * 1.firefox 焦点失去 bug,记录当前状态
  4  * 2.窗口隐藏后能够恢复焦点
  5  * @author yiminghe@gmail.com
  6  */
  7 KISSY.add("editor/core/focusManager", function (S) {
  8     var Editor = S.Editor,
  9         DOM = S.DOM,
 10         Event = S.Event,
 11         INSTANCES = {},
 12         timer,
 13     //当前焦点所在处
 14         currentInstance,
 15         focusManager = {
 16             /**
 17              * 刷新全部实例
 18              */
 19             refreshAll:function () {
 20                 for (var i in INSTANCES) {
 21                     if (INSTANCES.hasOwnProperty(i)) {
 22                         var e = INSTANCES[i], doc = e.get("document")[0];
 23                         doc.designMode = "off";
 24                         doc.designMode = "on";
 25                     }
 26                 }
 27             },
 28             /**
 29              * 得到当前获得焦点的实例
 30              */
 31             currentInstance:function () {
 32                 return currentInstance;
 33             },
 34             /**
 35              *
 36              * @param id {string}
 37              */
 38             getInstance:function (id) {
 39                 return INSTANCES[id];
 40             },
 41             add:function (editor) {
 42                 var win = DOM._getWin(editor.get("document")[0]);
 43                 Event.on(win, "focus", focus, editor);
 44                 Event.on(win, "blur", blur, editor);
 45             },
 46             register:function (editor) {
 47                 INSTANCES[editor._UUID] = editor;
 48             },
 49             remove:function (editor) {
 50                 delete INSTANCES[editor._UUID];
 51                 var win = DOM._getWin(editor.get("document")[0]);
 52                 Event.remove(win, "focus", focus, editor);
 53                 Event.remove(win, "blur", blur, editor);
 54             }
 55         },
 56         TRUE = true,
 57         FALSE = false,
 58         NULL = null;
 59 
 60     function focus() {
 61         var editor = this;
 62         editor.__iframeFocus = TRUE;
 63         currentInstance = editor;
 64         if (timer) {
 65             clearTimeout(timer);
 66         }
 67         timer = setTimeout(function () {
 68             editor.fire("focus");
 69         }, 100);
 70     }
 71 
 72     function blur() {
 73         var editor = this;
 74         editor.__iframeFocus = FALSE;
 75         currentInstance = NULL;
 76         if (timer) {
 77             clearTimeout(timer);
 78         }
 79         /*
 80          Note that this functions acts asynchronously with a delay of 100ms to
 81          avoid subsequent blur/focus effects.
 82          */
 83         timer = setTimeout(function () {
 84             editor.fire("blur");
 85         }, 100);
 86     }
 87 
 88     focusManager['refreshAll'] = focusManager.refreshAll;
 89     Editor.focusManager = focusManager;
 90     Editor.getInstances = function () {
 91         return INSTANCES;
 92     };
 93 
 94     return focusManager;
 95 }, {
 96     requires:['./base', './dom']
 97 });
 98