/**
* @ignore
* contextmenu for kissy editor
* @author yiminghe@gmail.com
*/
KISSY.add("editor/plugin/contextmenu", function (S, Editor, Menu, focusFix) {
Editor.prototype.addContextMenu = function (id, filter, cfg) {
var self = this;
cfg = cfg || {};
var event = cfg.event;
if (event) {
delete cfg.event;
}
cfg.prefixCls = self.get('prefixCls') + "editor-";
cfg.editor = self;
cfg.focusable = 1;
cfg.zIndex = Editor.baseZIndex(Editor.ZIndexManager.POPUP_MENU);
var menu = new Menu.PopupMenu(cfg);
focusFix.init(menu);
menu.on("afterRenderUI", function () {
menu.get("el").on("keydown", function (e) {
if (e.keyCode == S.Event.KeyCode.ESC) {
menu.hide();
}
});
});
self.docReady(function () {
var doc = self.get("document");
// 编辑器获得焦点,不会触发 menu el blur?
doc.on("mousedown", function (e) {
if (e.which == 1) {
menu.hide();
}
});
doc.delegate("contextmenu", filter, function (ev) {
ev.halt();
showNow(ev);
});
});
function showNow(ev) {
var t = S.all(ev.target);
// ie 右键作用中,不会发生焦点转移,光标移动
// 只能右键作用完后才能,才会发生光标移动,range变化
// 异步右键操作
// qc #3764,#3767
var x = ev.pageX,
y = ev.pageY;
if (!x) {
return;
} else {
var translate = Editor.Utils.getXY({
left: x,
top: y
}, self);
x = translate.left;
y = translate.top;
}
setTimeout(function () {
menu.set("editorSelectedEl", t, {
silent: 1
});
menu.move(x, y);
self.fire("contextmenu", {
contextmenu: menu
});
menu.show();
window.focus();
document.body.focus();
// 防止焦点一直在 el,focus 无效
menu.focus();
}, 30);
}
if (event) {
showNow(event);
}
self.addControl(id + "/contextmenu", menu);
return menu;
};
}, {
requires: ['editor', 'menu', './focus-fix']
});