-function TinyMCE_noneditable_getInfo() {\r
- return {\r
- longname : 'Non editable elements',\r
- author : 'Moxiecode Systems',\r
- authorurl : 'http://tinymce.moxiecode.com',\r
- infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_noneditable.html',\r
- version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
- };\r
-};\r
-\r
-function TinyMCE_noneditable_initInstance(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
- if (tinyMCE.isGecko) {\r
- tinyMCE.addEvent(inst.getDoc(), "keyup", TinyMCE_noneditable_fixKeyUp);\r
-// tinyMCE.addEvent(inst.getDoc(), "keypress", TinyMCE_noneditable_selectAll);\r
-// tinyMCE.addEvent(inst.getDoc(), "mouseup", TinyMCE_noneditable_selectAll);\r
- }\r
-}\r
-\r
-function TinyMCE_noneditable_fixKeyUp(e) {\r
- var inst = tinyMCE.selectedInstance;\r
- var sel = inst.getSel();\r
- var rng = inst.getRng();\r
- var an = sel.anchorNode;\r
-\r
- // Move cursor outside non editable fields\r
- if ((e.keyCode == 38 || e.keyCode == 37 || e.keyCode == 40 || e.keyCode == 39) && (elm = TinyMCE_noneditable_isNonEditable(an)) != null) {\r
- rng = inst.getDoc().createRange();\r
- rng.selectNode(elm);\r
- rng.collapse(true);\r
- sel.removeAllRanges();\r
- sel.addRange(rng);\r
- tinyMCE.cancelEvent(e);\r
- }\r
-}\r
-\r
-function TinyMCE_noneditable_selectAll(e) {\r
- var inst = tinyMCE.selectedInstance;\r
- var sel = inst.getSel();\r
- var doc = inst.getDoc();\r
-\r
- if ((elm = TinyMCE_noneditable_isNonEditable(sel.focusNode)) != null) {\r
- inst.selectNode(elm, false);\r
- tinyMCE.cancelEvent(e);\r
- return;\r
- }\r
-\r
- if ((elm = TinyMCE_noneditable_isNonEditable(sel.anchorNode)) != null) {\r
- inst.selectNode(elm, false);\r
- tinyMCE.cancelEvent(e);\r
- return;\r
- }\r
-}\r
-\r
-function TinyMCE_noneditable_isNonEditable(elm) {\r
- var editClass = tinyMCE.getParam("noneditable_editable_class", "mceItemEditable");\r
- var nonEditClass = tinyMCE.getParam("noneditable_noneditable_class", "mceItemNonEditable");\r
-\r
- if (!elm)\r
- return;\r
-\r
- do {\r
- var className = elm.className ? elm.className : "";\r
-\r
- if (className.indexOf(editClass) != -1)\r
- return null;\r
-\r
- if (className.indexOf(nonEditClass) != -1)\r
- return elm;\r
- } while (elm = elm.parentNode);\r
-\r
- return null;\r
-}\r
-\r
-function TinyMCE_noneditable_cleanup(type, content, inst) {\r
- switch (type) {\r
- case "insert_to_editor_dom":\r
- var nodes = tinyMCE.getNodeTree(content, new Array(), 1);\r
- var editClass = tinyMCE.getParam("noneditable_editable_class", "mceItemEditable");\r
- var nonEditClass = tinyMCE.getParam("noneditable_noneditable_class", "mceItemNonEditable");\r
-\r
- for (var i=0; i<nodes.length; i++) {\r
- var elm = nodes[i];\r
-\r
- // Convert contenteditable to classes\r
- var editable = tinyMCE.getAttrib(elm, "contenteditable");\r
- if (new RegExp("true|false","gi").test(editable))\r
- TinyMCE_noneditable_setEditable(elm, editable == "true");\r
-\r
- if (tinyMCE.isMSIE) {\r
- var className = elm.className ? elm.className : "";\r
-\r
- if (className.indexOf(editClass) != -1)\r
- elm.contentEditable = true;\r
-\r
- if (className.indexOf(nonEditClass) != -1)\r
- elm.contentEditable = false;\r
+/**\r
+ * editor_plugin_src.js\r
+ *\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
+(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
+ },\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
-\r
- break;\r
-\r
- case "insert_to_editor":\r
- if (tinyMCE.isMSIE) {\r
- var editClass = tinyMCE.getParam("noneditable_editable_class", "mceItemEditable");\r
- var nonEditClass = tinyMCE.getParam("noneditable_noneditable_class", "mceItemNonEditable");\r
-\r
- content = content.replace(new RegExp("<(.*?)class=\"(.*?)(" + editClass + ")(.*?)\"(.*?)>", "gi"), '<$1class="$2$3$4" contenteditable="true"$5>');\r
- content = content.replace(new RegExp("<(.*?)class=\"(.*?)(" + nonEditClass + ")(.*?)\"(.*?)>", "gi"), '<$1class="$2$3$4" contenteditable="false"$5>');\r
- }\r
-\r
- break;\r
-\r
- case "get_from_editor_dom":\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
+ t.disabled = s;\r
}\r
+ }\r
+ });\r
\r
- break;\r
- }\r
-\r
- return content;\r
-}\r
-\r
-function TinyMCE_noneditable_setEditable(elm, state) {\r
- var editClass = tinyMCE.getParam("noneditable_editable_class", "mceItemEditable");\r
- var nonEditClass = tinyMCE.getParam("noneditable_noneditable_class", "mceItemNonEditable");\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
+ // Register plugin\r
+ tinymce.PluginManager.add('noneditable', tinymce.plugins.NonEditablePlugin);\r
+})();
\ No newline at end of file