Upgrade TinyMCE to v3.4.5
[citadel.git] / webcit / tiny_mce / plugins / noneditable / editor_plugin_src.js
old mode 100755 (executable)
new mode 100644 (file)
index df3000c..916dce2
 /**\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