/**\r
- * $Id: editor_plugin_src.js 205 2007-02-12 18:58:29Z spocke $\r
+ * editor_plugin_src.js\r
*\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
*/\r
\r
-var TinyMCE_NonEditablePlugin = {\r
- getInfo : function() {\r
- return {\r
- longname : 'Non editable elements',\r
- author : 'Moxiecode Systems AB',\r
- authorurl : 'http://tinymce.moxiecode.com',\r
- infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/noneditable',\r
- version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
- };\r
- },\r
-\r
- initInstance : function(inst) {\r
- tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/plugins/noneditable/css/noneditable.css");\r
-\r
- // Ugly hack\r
- if (tinyMCE.isMSIE5_0)\r
- tinyMCE.settings['plugins'] = tinyMCE.settings['plugins'].replace(/noneditable/gi, 'Noneditable');\r
- },\r
-\r
- handleEvent : function(e) {\r
- return this._moveSelection(e, tinyMCE.selectedInstance);\r
- },\r
-\r
- cleanup : function(type, content, inst) {\r
- switch (type) {\r
- case "insert_to_editor_dom":\r
- var nodes, i, editClass, nonEditClass, editable, elm;\r
-\r
- // Pass through Gecko\r
- if (tinyMCE.isGecko)\r
- return content;\r
-\r
- nodes = tinyMCE.getNodeTree(content, [], 1);\r
-\r
- editClass = tinyMCE.getParam("noneditable_editable_class", "mceEditable");\r
- nonEditClass = tinyMCE.getParam("noneditable_noneditable_class", "mceNonEditable");\r
-\r
- for (i=0; i<nodes.length; i++) {\r
- elm = nodes[i];\r
-\r
- // Convert contenteditable to classes\r
- editable = tinyMCE.getAttrib(elm, "contenteditable");\r
- if (new RegExp("true|false","gi").test(editable))\r
- TinyMCE_NonEditablePlugin._setEditable(elm, editable == "true");\r
-\r
- if (tinyMCE.isIE) {\r
- if (tinyMCE.hasCSSClass(elm, editClass))\r
- elm.contentEditable = true;\r
-\r
- if (tinyMCE.hasCSSClass(elm, nonEditClass))\r
- elm.contentEditable = false;\r
- }\r
- }\r
-\r
- break;\r
-\r
- case "insert_to_editor":\r
- var editClass = tinyMCE.getParam("noneditable_editable_class", "mceEditable");\r
- var nonEditClass = tinyMCE.getParam("noneditable_noneditable_class", "mceNonEditable");\r
-\r
- // Replace mceItem to new school\r
- content = content.replace(/mceItemEditable/g, editClass);\r
- content = content.replace(/mceItemNonEditable/g, nonEditClass);\r
-\r
- if (tinyMCE.isIE && (content.indexOf(editClass) != -1 || content.indexOf(nonEditClass) != -1)) {\r
- content = content.replace(new RegExp("class=\"(.+)(" + editClass + ")\"", "gi"), 'class="$1$2" contenteditable="true"');\r
- content = content.replace(new RegExp("class=\"(.+)(" + nonEditClass + ")\"", "gi"), 'class="$1$2" contenteditable="false"');\r
- content = content.replace(new RegExp("class=\"(" + editClass + ")([^\"]*)\"", "gi"), 'class="$1$2" contenteditable="true"');\r
- content = content.replace(new RegExp("class=\"(" + nonEditClass + ")([^\"]*)\"", "gi"), 'class="$1$2" contenteditable="false"');\r
- content = content.replace(new RegExp("class=\"(.+)(" + editClass + ")([^\"]*)\"", "gi"), 'class="$1$2$3" contenteditable="true"');\r
- content = content.replace(new RegExp("class=\"(.+)(" + nonEditClass + ")([^\"]*)\"", "gi"), 'class="$1$2$3" contenteditable="false"');\r
- }\r
-\r
- break;\r
-\r
- case "get_from_editor_dom":\r
- // Pass through Gecko\r
- if (tinyMCE.isGecko)\r
- return content;\r
-\r
- if (tinyMCE.getParam("noneditable_leave_contenteditable", false)) {\r
- var nodes = tinyMCE.getNodeTree(content, new Array(), 1);\r
-\r
- for (var i=0; i<nodes.length; i++)\r
- nodes[i].removeAttribute("contenteditable");\r
+(function() {\r
+ var Event = tinymce.dom.Event;\r
+\r
+ tinymce.create('tinymce.plugins.NonEditablePlugin', {\r
+ init : function(ed, url) {\r
+ var t = this, editClass, nonEditClass, state;\r
+\r
+ t.editor = ed;\r
+ editClass = ed.getParam("noneditable_editable_class", "mceEditable");\r
+ nonEditClass = ed.getParam("noneditable_noneditable_class", "mceNonEditable");\r
+\r
+ ed.onNodeChange.addToTop(function(ed, cm, n) {\r
+ var sc, ec;\r
+\r
+ // Block if start or end is inside a non editable element\r
+ sc = ed.dom.getParent(ed.selection.getStart(), function(n) {\r
+ return ed.dom.hasClass(n, nonEditClass);\r
+ });\r
+\r
+ ec = ed.dom.getParent(ed.selection.getEnd(), function(n) {\r
+ return ed.dom.hasClass(n, nonEditClass);\r
+ });\r
+\r
+ // Block or unblock\r
+ if (sc || ec) {\r
+ state = 1;\r
+ t._setDisabled(1);\r
+ return false;\r
+ } else if (state == 1) {\r
+ t._setDisabled(0);\r
+ state = 0;\r
}\r
-\r
- break;\r
- }\r
-\r
- return content;\r
- },\r
-\r
- _moveSelection : function(e, inst) {\r
- var s, r, sc, ec, el, c = tinyMCE.getParam('noneditable_editable_class', 'mceNonEditable');\r
-\r
- if (!inst)\r
- return true;\r
-\r
- // Always select whole element\r
- if (tinyMCE.isGecko) {\r
- s = inst.selection.getSel();\r
- r = s.getRangeAt(0);\r
- sc = tinyMCE.getParentNode(r.startContainer, function (n) {return tinyMCE.hasCSSClass(n, c);});\r
- ec = tinyMCE.getParentNode(r.endContainer, function (n) {return tinyMCE.hasCSSClass(n, c);});\r
-\r
- sc && r.setStartBefore(sc);\r
- ec && r.setEndAfter(ec);\r
-\r
- if (sc || ec) {\r
- if (e.type == 'keypress' && e.keyCode == 39) {\r
- el = sc || ec;\r
-\r
- // Try!!\r
+ });\r
+ },\r
+\r
+ getInfo : function() {\r
+ return {\r
+ longname : 'Non editable elements',\r
+ author : 'Moxiecode Systems AB',\r
+ authorurl : 'http://tinymce.moxiecode.com',\r
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/noneditable',\r
+ version : tinymce.majorVersion + "." + tinymce.minorVersion\r
+ };\r
+ },\r
+\r
+ _block : function(ed, e) {\r
+ var k = e.keyCode;\r
+\r
+ // Don't block arrow keys, pg up/down, and F1-F12\r
+ if ((k > 32 && k < 41) || (k > 111 && k < 124))\r
+ return;\r
+\r
+ return Event.cancel(e);\r
+ },\r
+\r
+ _setDisabled : function(s) {\r
+ var t = this, ed = t.editor;\r
+\r
+ tinymce.each(ed.controlManager.controls, function(c) {\r
+ c.setDisabled(s);\r
+ });\r
+\r
+ if (s !== t.disabled) {\r
+ if (s) {\r
+ ed.onKeyDown.addToTop(t._block);\r
+ ed.onKeyPress.addToTop(t._block);\r
+ ed.onKeyUp.addToTop(t._block);\r
+ ed.onPaste.addToTop(t._block);\r
+ ed.onContextMenu.addToTop(t._block);\r
+ } else {\r
+ ed.onKeyDown.remove(t._block);\r
+ ed.onKeyPress.remove(t._block);\r
+ ed.onKeyUp.remove(t._block);\r
+ ed.onPaste.remove(t._block);\r
+ ed.onContextMenu.remove(t._block);\r
}\r
\r
- s.removeAllRanges();\r
- s.addRange(r);\r
-\r
- return tinyMCE.cancelEvent(e);\r
+ t.disabled = s;\r
}\r
}\r
+ });\r
\r
- return true;\r
- },\r
-\r
- _setEditable : function(elm, state) {\r
- var editClass = tinyMCE.getParam("noneditable_editable_class", "mceEditable");\r
- var nonEditClass = tinyMCE.getParam("noneditable_noneditable_class", "mceNonEditable");\r
-\r
- var className = elm.className ? elm.className : "";\r
-\r
- if (className.indexOf(editClass) != -1 || className.indexOf(nonEditClass) != -1)\r
- return;\r
-\r
- if ((className = tinyMCE.getAttrib(elm, "class")) != "")\r
- className += " ";\r
-\r
- className += state ? editClass : nonEditClass;\r
-\r
- elm.setAttribute("class", className);\r
- elm.className = className;\r
- }\r
-};\r
-\r
-tinyMCE.addPlugin("noneditable", TinyMCE_NonEditablePlugin);\r
+ // Register plugin\r
+ tinymce.PluginManager.add('noneditable', tinymce.plugins.NonEditablePlugin);\r
+})();
\ No newline at end of file