/** * plugin.js * * Released under LGPL License. * Copyright (c) 1999-2015 Ephox Corp. All rights reserved * * License: http://www.tinymce.com/license * Contributing: http://www.tinymce.com/contributing */ /*global tinymce:true */ tinymce.PluginManager.add('contextmenu', function(editor) { var menu, contextmenuNeverUseNative = editor.settings.contextmenu_never_use_native; editor.on('contextmenu', function(e) { var contextmenu, doc = editor.getDoc(); // Block TinyMCE menu on ctrlKey if (e.ctrlKey && !contextmenuNeverUseNative) { return; } e.preventDefault(); /** * WebKit/Blink on Mac has the odd behavior of selecting the target word or line this causes * issues when for example inserting images see: #7022 */ if (tinymce.Env.mac && tinymce.Env.webkit) { if (e.button == 2 && doc.caretRangeFromPoint) { editor.selection.setRng(doc.caretRangeFromPoint(e.x, e.y)); } } contextmenu = editor.settings.contextmenu || 'link image inserttable | cell row column deletetable'; // Render menu if (!menu) { var items = []; tinymce.each(contextmenu.split(/[ ,]/), function(name) { var item = editor.menuItems[name]; if (name == '|') { item = {text: name}; } if (item) { item.shortcut = ''; // Hide shortcuts items.push(item); } }); for (var i = 0; i < items.length; i++) { if (items[i].text == '|') { if (i === 0 || i == items.length - 1) { items.splice(i, 1); } } } menu = new tinymce.ui.Menu({ items: items, context: 'contextmenu', classes: 'contextmenu' }).renderTo(); editor.on('remove', function() { menu.remove(); menu = null; }); } else { menu.show(); } // Position menu var pos = {x: e.pageX, y: e.pageY}; if (!editor.inline) { pos = tinymce.DOM.getPos(editor.getContentAreaContainer()); pos.x += e.clientX; pos.y += e.clientY; } menu.moveTo(pos.x, pos.y); }); });