| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| (function (tinymce) { |
| var reported; |
|
|
| function noop() { |
| } |
|
|
| function log(apiCall) { |
| if (!reported && window && window.console) { |
| reported = true; |
| console.log("Deprecated TinyMCE API call: " + apiCall); |
| } |
| } |
|
|
| function Dispatcher(target, newEventName, argsMap, defaultScope) { |
| target = target || this; |
| var cbs = []; |
|
|
| if (!newEventName) { |
| this.add = this.addToTop = this.remove = this.dispatch = noop; |
| return; |
| } |
|
|
| this.add = function (callback, scope, prepend) { |
| log('<target>.on' + newEventName + ".add(..)"); |
|
|
| |
| function patchedEventCallback(e) { |
| var callbackArgs = []; |
|
|
| if (typeof argsMap == "string") { |
| argsMap = argsMap.split(" "); |
| } |
|
|
| if (argsMap && typeof argsMap !== "function") { |
| for (var i = 0; i < argsMap.length; i++) { |
| callbackArgs.push(e[argsMap[i]]); |
| } |
| } |
|
|
| if (typeof argsMap == "function") { |
| callbackArgs = argsMap(newEventName, e, target); |
| if (!callbackArgs) { |
| return; |
| } |
| } |
|
|
| if (!argsMap) { |
| callbackArgs = [e]; |
| } |
|
|
| callbackArgs.unshift(defaultScope || target); |
|
|
| if (callback.apply(scope || defaultScope || target, callbackArgs) === false) { |
| e.stopImmediatePropagation(); |
| } |
| } |
|
|
| target.on(newEventName, patchedEventCallback, prepend); |
|
|
| var handlers = { |
| original: callback, |
| patched: patchedEventCallback |
| }; |
|
|
| cbs.push(handlers); |
| return patchedEventCallback; |
| }; |
|
|
| this.addToTop = function (callback, scope) { |
| this.add(callback, scope, true); |
| }; |
|
|
| this.remove = function (callback) { |
| cbs.forEach(function (item, i) { |
| if (item.original === callback) { |
| cbs.splice(i, 1); |
| return target.off(newEventName, item.patched); |
| } |
| }); |
|
|
| return target.off(newEventName, callback); |
| }; |
|
|
| this.dispatch = function () { |
| target.fire(newEventName); |
| return true; |
| }; |
| } |
|
|
| tinymce.util.Dispatcher = Dispatcher; |
| tinymce.onBeforeUnload = new Dispatcher(tinymce, "BeforeUnload"); |
| tinymce.onAddEditor = new Dispatcher(tinymce, "AddEditor", "editor"); |
| tinymce.onRemoveEditor = new Dispatcher(tinymce, "RemoveEditor", "editor"); |
|
|
| tinymce.util.Cookie = { |
| get: noop, getHash: noop, remove: noop, set: noop, setHash: noop |
| }; |
|
|
| function patchEditor(editor) { |
|
|
| function translate(str) { |
| var prefix = editor.settings.language || "en"; |
| var prefixedStr = [prefix, str].join('.'); |
| var translatedStr = tinymce.i18n.translate(prefixedStr); |
|
|
| return prefixedStr !== translatedStr ? translatedStr : tinymce.i18n.translate(str); |
| } |
|
|
| function patchEditorEvents(oldEventNames, argsMap) { |
| tinymce.each(oldEventNames.split(" "), function (oldName) { |
| editor["on" + oldName] = new Dispatcher(editor, oldName, argsMap); |
| }); |
| } |
|
|
| function convertUndoEventArgs(type, event, target) { |
| return [ |
| event.level, |
| target |
| ]; |
| } |
|
|
| function filterSelectionEvents(needsSelection) { |
| return function (type, e) { |
| if ((!e.selection && !needsSelection) || e.selection == needsSelection) { |
| return [e]; |
| } |
| }; |
| } |
|
|
| if (editor.controlManager) { |
| return; |
| } |
|
|
| function cmNoop() { |
| var obj = {}, methods = 'add addMenu addSeparator collapse createMenu destroy displayColor expand focus ' + |
| 'getLength hasMenus hideMenu isActive isCollapsed isDisabled isRendered isSelected mark ' + |
| 'postRender remove removeAll renderHTML renderMenu renderNode renderTo select selectByIndex ' + |
| 'setActive setAriaProperty setColor setDisabled setSelected setState showMenu update'; |
|
|
| log('editor.controlManager.*'); |
|
|
| function _noop() { |
| return cmNoop(); |
| } |
|
|
| tinymce.each(methods.split(' '), function (method) { |
| obj[method] = _noop; |
| }); |
|
|
| return obj; |
| } |
|
|
| editor.controlManager = { |
| buttons: {}, |
|
|
| setDisabled: function (name, state) { |
| log("controlManager.setDisabled(..)"); |
|
|
| if (this.buttons[name]) { |
| this.buttons[name].disabled(state); |
| } |
| }, |
|
|
| setActive: function (name, state) { |
| log("controlManager.setActive(..)"); |
|
|
| if (this.buttons[name]) { |
| this.buttons[name].active(state); |
| } |
| }, |
|
|
| onAdd: new Dispatcher(), |
| onPostRender: new Dispatcher(), |
|
|
| add: function (obj) { |
| return obj; |
| }, |
| createButton: cmNoop, |
| createColorSplitButton: cmNoop, |
| createControl: cmNoop, |
| createDropMenu: cmNoop, |
| createListBox: cmNoop, |
| createMenuButton: cmNoop, |
| createSeparator: cmNoop, |
| createSplitButton: cmNoop, |
| createToolbar: cmNoop, |
| createToolbarGroup: cmNoop, |
| destroy: noop, |
| get: noop, |
| setControlType: cmNoop |
| }; |
|
|
| patchEditorEvents("PreInit BeforeRenderUI PostRender Load Init Remove Activate Deactivate", "editor"); |
| patchEditorEvents("Click MouseUp MouseDown DblClick KeyDown KeyUp KeyPress ContextMenu Paste Submit Reset"); |
| patchEditorEvents("BeforeExecCommand ExecCommand", "command ui value args"); |
| patchEditorEvents("PreProcess PostProcess LoadContent SaveContent Change"); |
| patchEditorEvents("BeforeSetContent BeforeGetContent SetContent GetContent", filterSelectionEvents(false)); |
| patchEditorEvents("SetProgressState", "state time"); |
| patchEditorEvents("VisualAid", "element hasVisual"); |
| patchEditorEvents("Undo Redo", convertUndoEventArgs); |
|
|
| patchEditorEvents("NodeChange", function (type, e) { |
| return [ |
| editor.controlManager, |
| e.element, |
| editor.selection.isCollapsed(), |
| e |
| ]; |
| }); |
|
|
| var originalAddButton = editor.addButton; |
| editor.addButton = function (name, settings) { |
| var originalOnPostRender; |
|
|
| function patchedPostRender() { |
| editor.controlManager.buttons[name] = this; |
|
|
| if (originalOnPostRender) { |
| return originalOnPostRender.apply(this, arguments); |
| } |
| } |
|
|
| for (var key in settings) { |
| if (key.toLowerCase() === "onpostrender") { |
| originalOnPostRender = settings[key]; |
| settings.onPostRender = patchedPostRender; |
| } |
| } |
|
|
| if (!originalOnPostRender) { |
| settings.onPostRender = patchedPostRender; |
| } |
|
|
| if (settings.title) { |
| settings.title = translate(settings.title); |
| } |
|
|
| return originalAddButton.call(this, name, settings); |
| }; |
|
|
| editor.on('init', function () { |
| var undoManager = editor.undoManager, selection = editor.selection; |
|
|
| undoManager.onUndo = new Dispatcher(editor, "Undo", convertUndoEventArgs, null, undoManager); |
| undoManager.onRedo = new Dispatcher(editor, "Redo", convertUndoEventArgs, null, undoManager); |
| undoManager.onBeforeAdd = new Dispatcher(editor, "BeforeAddUndo", null, undoManager); |
| undoManager.onAdd = new Dispatcher(editor, "AddUndo", null, undoManager); |
|
|
| selection.onBeforeGetContent = new Dispatcher(editor, "BeforeGetContent", filterSelectionEvents(true), selection); |
| selection.onGetContent = new Dispatcher(editor, "GetContent", filterSelectionEvents(true), selection); |
| selection.onBeforeSetContent = new Dispatcher(editor, "BeforeSetContent", filterSelectionEvents(true), selection); |
| selection.onSetContent = new Dispatcher(editor, "SetContent", filterSelectionEvents(true), selection); |
| }); |
|
|
| editor.on('BeforeRenderUI', function () { |
| var windowManager = editor.windowManager; |
|
|
| windowManager.onOpen = new Dispatcher(); |
| windowManager.onClose = new Dispatcher(); |
| windowManager.createInstance = function (className, a, b, c, d, e) { |
| log("windowManager.createInstance(..)"); |
|
|
| var constr = tinymce.resolve(className); |
| return new constr(a, b, c, d, e); |
| }; |
| }); |
| } |
|
|
| tinymce.on('SetupEditor', function (e) { |
| patchEditor(e.editor); |
| }); |
|
|
| tinymce.PluginManager.add("compat3x", patchEditor); |
|
|
| tinymce.addI18n = function (prefix, o) { |
| var I18n = tinymce.util.I18n, each = tinymce.each; |
|
|
| if (typeof prefix == "string" && prefix.indexOf('.') === -1) { |
| I18n.add(prefix, o); |
| return; |
| } |
|
|
| if (!tinymce.is(prefix, 'string')) { |
| each(prefix, function (o, lc) { |
| each(o, function (o, g) { |
| each(o, function (o, k) { |
| if (g === 'common') { |
| I18n.data[lc + '.' + k] = o; |
| } else { |
| I18n.data[lc + '.' + g + '.' + k] = o; |
| } |
| }); |
| }); |
| }); |
| } else { |
| each(o, function (o, k) { |
| I18n.data[prefix + '.' + k] = o; |
| }); |
| } |
| }; |
| })(tinymce); |
|
|