annotate static/js/tiny_mce/plugins/contextmenu/editor_plugin_src.js @ 631:f36d1a168be7

For issue 27, disable login dialog button during POST. This seems to prevent multiple logins most of the time. You can still bang on the enter key and sometimes get more through.
author Brian Neal <bgneal@gmail.com>
date Wed, 14 Nov 2012 20:57:05 -0600
parents 6c182ceb7147
children
rev   line source
bgneal@312 1 /**
bgneal@312 2 * editor_plugin_src.js
bgneal@312 3 *
bgneal@312 4 * Copyright 2009, Moxiecode Systems AB
bgneal@312 5 * Released under LGPL License.
bgneal@312 6 *
bgneal@312 7 * License: http://tinymce.moxiecode.com/license
bgneal@312 8 * Contributing: http://tinymce.moxiecode.com/contributing
bgneal@312 9 */
bgneal@312 10
bgneal@312 11 (function() {
bgneal@312 12 var Event = tinymce.dom.Event, each = tinymce.each, DOM = tinymce.DOM;
bgneal@312 13
bgneal@312 14 /**
bgneal@312 15 * This plugin a context menu to TinyMCE editor instances.
bgneal@312 16 *
bgneal@312 17 * @class tinymce.plugins.ContextMenu
bgneal@312 18 */
bgneal@312 19 tinymce.create('tinymce.plugins.ContextMenu', {
bgneal@312 20 /**
bgneal@312 21 * Initializes the plugin, this will be executed after the plugin has been created.
bgneal@312 22 * This call is done before the editor instance has finished it's initialization so use the onInit event
bgneal@312 23 * of the editor instance to intercept that event.
bgneal@312 24 *
bgneal@312 25 * @method init
bgneal@312 26 * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in.
bgneal@312 27 * @param {string} url Absolute URL to where the plugin is located.
bgneal@312 28 */
bgneal@312 29 init : function(ed) {
bgneal@442 30 var t = this, showMenu, contextmenuNeverUseNative, realCtrlKey;
bgneal@312 31
bgneal@312 32 t.editor = ed;
bgneal@312 33
bgneal@442 34 contextmenuNeverUseNative = ed.settings.contextmenu_never_use_native;
bgneal@442 35
bgneal@312 36 /**
bgneal@312 37 * This event gets fired when the context menu is shown.
bgneal@312 38 *
bgneal@312 39 * @event onContextMenu
bgneal@312 40 * @param {tinymce.plugins.ContextMenu} sender Plugin instance sending the event.
bgneal@312 41 * @param {tinymce.ui.DropMenu} menu Drop down menu to fill with more items if needed.
bgneal@312 42 */
bgneal@312 43 t.onContextMenu = new tinymce.util.Dispatcher(this);
bgneal@312 44
bgneal@442 45 showMenu = ed.onContextMenu.add(function(ed, e) {
bgneal@442 46 // Block TinyMCE menu on ctrlKey and work around Safari issue
bgneal@442 47 if ((realCtrlKey !== 0 ? realCtrlKey : e.ctrlKey) && !contextmenuNeverUseNative)
bgneal@442 48 return;
bgneal@312 49
bgneal@442 50 Event.cancel(e);
bgneal@442 51
bgneal@442 52 // Select the image if it's clicked. WebKit would other wise expand the selection
bgneal@442 53 if (e.target.nodeName == 'IMG')
bgneal@442 54 ed.selection.select(e.target);
bgneal@442 55
bgneal@442 56 t._getMenu(ed).showMenu(e.clientX || e.pageX, e.clientY || e.pageX);
bgneal@442 57 Event.add(ed.getDoc(), 'click', function(e) {
bgneal@442 58 hide(ed, e);
bgneal@442 59 });
bgneal@442 60
bgneal@442 61 ed.nodeChanged();
bgneal@312 62 });
bgneal@312 63
bgneal@312 64 ed.onRemove.add(function() {
bgneal@312 65 if (t._menu)
bgneal@312 66 t._menu.removeAll();
bgneal@312 67 });
bgneal@312 68
bgneal@312 69 function hide(ed, e) {
bgneal@442 70 realCtrlKey = 0;
bgneal@312 71
bgneal@312 72 // Since the contextmenu event moves
bgneal@312 73 // the selection we need to store it away
bgneal@312 74 if (e && e.button == 2) {
bgneal@442 75 realCtrlKey = e.ctrlKey;
bgneal@312 76 return;
bgneal@312 77 }
bgneal@312 78
bgneal@312 79 if (t._menu) {
bgneal@312 80 t._menu.removeAll();
bgneal@312 81 t._menu.destroy();
bgneal@312 82 Event.remove(ed.getDoc(), 'click', hide);
bgneal@312 83 }
bgneal@312 84 };
bgneal@312 85
bgneal@312 86 ed.onMouseDown.add(hide);
bgneal@312 87 ed.onKeyDown.add(hide);
bgneal@442 88 ed.onKeyDown.add(function(ed, e) {
bgneal@442 89 if (e.shiftKey && !e.ctrlKey && !e.altKey && e.keyCode === 121) {
bgneal@442 90 Event.cancel(e);
bgneal@442 91 showMenu(ed, e);
bgneal@442 92 }
bgneal@442 93 });
bgneal@312 94 },
bgneal@312 95
bgneal@312 96 /**
bgneal@312 97 * Returns information about the plugin as a name/value array.
bgneal@312 98 * The current keys are longname, author, authorurl, infourl and version.
bgneal@312 99 *
bgneal@312 100 * @method getInfo
bgneal@312 101 * @return {Object} Name/value array containing information about the plugin.
bgneal@312 102 */
bgneal@312 103 getInfo : function() {
bgneal@312 104 return {
bgneal@312 105 longname : 'Contextmenu',
bgneal@312 106 author : 'Moxiecode Systems AB',
bgneal@312 107 authorurl : 'http://tinymce.moxiecode.com',
bgneal@312 108 infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/contextmenu',
bgneal@312 109 version : tinymce.majorVersion + "." + tinymce.minorVersion
bgneal@312 110 };
bgneal@312 111 },
bgneal@312 112
bgneal@312 113 _getMenu : function(ed) {
bgneal@312 114 var t = this, m = t._menu, se = ed.selection, col = se.isCollapsed(), el = se.getNode() || ed.getBody(), am, p1, p2;
bgneal@312 115
bgneal@312 116 if (m) {
bgneal@312 117 m.removeAll();
bgneal@312 118 m.destroy();
bgneal@312 119 }
bgneal@312 120
bgneal@312 121 p1 = DOM.getPos(ed.getContentAreaContainer());
bgneal@312 122 p2 = DOM.getPos(ed.getContainer());
bgneal@312 123
bgneal@312 124 m = ed.controlManager.createDropMenu('contextmenu', {
bgneal@312 125 offset_x : p1.x + ed.getParam('contextmenu_offset_x', 0),
bgneal@312 126 offset_y : p1.y + ed.getParam('contextmenu_offset_y', 0),
bgneal@442 127 constrain : 1,
bgneal@442 128 keyboard_focus: true
bgneal@312 129 });
bgneal@312 130
bgneal@312 131 t._menu = m;
bgneal@312 132
bgneal@312 133 m.add({title : 'advanced.cut_desc', icon : 'cut', cmd : 'Cut'}).setDisabled(col);
bgneal@312 134 m.add({title : 'advanced.copy_desc', icon : 'copy', cmd : 'Copy'}).setDisabled(col);
bgneal@312 135 m.add({title : 'advanced.paste_desc', icon : 'paste', cmd : 'Paste'});
bgneal@312 136
bgneal@312 137 if ((el.nodeName == 'A' && !ed.dom.getAttrib(el, 'name')) || !col) {
bgneal@312 138 m.addSeparator();
bgneal@312 139 m.add({title : 'advanced.link_desc', icon : 'link', cmd : ed.plugins.advlink ? 'mceAdvLink' : 'mceLink', ui : true});
bgneal@312 140 m.add({title : 'advanced.unlink_desc', icon : 'unlink', cmd : 'UnLink'});
bgneal@312 141 }
bgneal@312 142
bgneal@312 143 m.addSeparator();
bgneal@312 144 m.add({title : 'advanced.image_desc', icon : 'image', cmd : ed.plugins.advimage ? 'mceAdvImage' : 'mceImage', ui : true});
bgneal@312 145
bgneal@312 146 m.addSeparator();
bgneal@312 147 am = m.addMenu({title : 'contextmenu.align'});
bgneal@312 148 am.add({title : 'contextmenu.left', icon : 'justifyleft', cmd : 'JustifyLeft'});
bgneal@312 149 am.add({title : 'contextmenu.center', icon : 'justifycenter', cmd : 'JustifyCenter'});
bgneal@312 150 am.add({title : 'contextmenu.right', icon : 'justifyright', cmd : 'JustifyRight'});
bgneal@312 151 am.add({title : 'contextmenu.full', icon : 'justifyfull', cmd : 'JustifyFull'});
bgneal@312 152
bgneal@312 153 t.onContextMenu.dispatch(t, m, el, col);
bgneal@312 154
bgneal@312 155 return m;
bgneal@312 156 }
bgneal@312 157 });
bgneal@312 158
bgneal@312 159 // Register plugin
bgneal@312 160 tinymce.PluginManager.add('contextmenu', tinymce.plugins.ContextMenu);
bgneal@442 161 })();