1 /**
  2  * contextmenu for kissy editor
  3  * @author yiminghe@gmail.com
  4  */
  5 KISSY.add("editor/plugin/contextmenu/index", function (S, Editor, Menu, focusFix) {
  6 
  7     Editor.prototype.addContextMenu = function (id, filter, cfg) {
  8 
  9         var self = this;
 10 
 11         cfg = cfg || {};
 12 
 13         cfg.prefixCls = self.get("prefixCls") + "editor-";
 14         cfg.editor = self;
 15         cfg.focusable = 1;
 16         cfg.zIndex = Editor.baseZIndex(Editor.zIndexManager.POPUP_MENU);
 17         cfg.elAttrs = {
 18             hideFocus:'hideFocus'
 19         };
 20 
 21         if (cfg.children) {
 22             S.each(cfg.children, function (c) {
 23                 c.xclass = 'menuitem';
 24             });
 25         }
 26 
 27         var menu = new Menu.PopupMenu(cfg);
 28 
 29         focusFix.init(menu);
 30 
 31         self.docReady(function () {
 32             var doc = self.get("document");
 33             // 编辑器获得焦点,不会触发 menu el blur?
 34             doc.on("mousedown", function (e) {
 35                 if (e.which == 1) {
 36                     menu.hide();
 37                 }
 38             });
 39             doc.delegate("contextmenu", filter, function (ev) {
 40                 var t = S.all(ev.target);
 41                 ev.halt();
 42                 // ie 右键作用中,不会发生焦点转移,光标移动
 43                 // 只能右键作用完后才能,才会发生光标移动,range变化
 44                 // 异步右键操作
 45                 // qc #3764,#3767
 46                 var x = ev.pageX,
 47                     y = ev.pageY;
 48                 if (!x) {
 49                     var xy = t.offset(document);
 50                     x = xy.left;
 51                     y = xy.top;
 52                 } else {
 53                     var translate = Editor.Utils.getXY(x, y, doc[0], document);
 54                     x = translate.left;
 55                     y = translate.top;
 56                 }
 57                 setTimeout(function () {
 58                     menu.set("editorSelectedEl", t, {
 59                         silent:1
 60                     });
 61                     menu.set("xy", [x, y]);
 62                     menu.show();
 63                     self.fire("contextmenu", {
 64                         contextmenu:menu
 65                     });
 66                     window.focus();
 67                     document.body.focus();
 68                     // 防止焦点一直在 el,focus 无效
 69                     menu.get("el")[0].focus();
 70                 }, 30);
 71             });
 72         });
 73 
 74         self.addControl(id + "/contextmenu", menu);
 75 
 76         return menu;
 77     };
 78 }, {
 79     requires:['editor', 'menu', '../focusFix/']
 80 });
 81