--- /dev/null
+/**\r
+ * @author Shea Frederick - http://www.vinylfox.com\r
+ * @class Ext.ux.form.HtmlEditor.MidasCommand\r
+ * @extends Ext.util.Observable\r
+ * <p>A base plugin for extending to create standard Midas command buttons.</p>\r
+ * http://msdn.microsoft.com/en-us/library/ms533049%28v=VS.85%29.aspx\r
+ * http://www.mozilla.org/editor/midas-spec.html\r
+ */\r
+Ext.ns('Ext.ux.form.HtmlEditor');\r
+\r
+if (!Ext.isObject) {\r
+ Ext.isObject = function(v){\r
+ return v && typeof v == "object";\r
+ };\r
+}\r
+\r
+Ext.override(Ext.form.HtmlEditor, {\r
+ getSelectedText: function(clip){\r
+ var doc = this.getDoc(), selDocFrag;\r
+ var txt = '', hasHTML = false, selNodes = [], ret, html = '';\r
+ if (this.win.getSelection || doc.getSelection) {\r
+ // FF, Chrome, Safari\r
+ var sel = this.win.getSelection();\r
+ if (!sel) {\r
+ sel = doc.getSelection();\r
+ }\r
+ if (clip) {\r
+ selDocFrag = sel.getRangeAt(0).extractContents();\r
+ } else {\r
+ selDocFrag = this.win.getSelection().getRangeAt(0).cloneContents();\r
+ }\r
+ Ext.each(selDocFrag.childNodes, function(n){\r
+ if (n.nodeType !== 3) {\r
+ hasHTML = true;\r
+ }\r
+ });\r
+ if (hasHTML) {\r
+ var div = document.createElement('div');\r
+ div.appendChild(selDocFrag);\r
+ html = div.innerHTML;\r
+ txt = this.win.getSelection() + '';\r
+ } else {\r
+ html = txt = selDocFrag.textContent;\r
+ }\r
+ ret = {\r
+ textContent: txt,\r
+ hasHTML: hasHTML,\r
+ html: html\r
+ };\r
+ } else if (doc.selection) {\r
+ // IE\r
+ this.win.focus();\r
+ txt = doc.selection.createRange();\r
+ if (txt.text !== txt.htmlText) {\r
+ hasHTML = true;\r
+ }\r
+ ret = {\r
+ textContent: txt.text,\r
+ hasHTML: hasHTML,\r
+ html: txt.htmlText\r
+ };\r
+ } else {\r
+ return {\r
+ textContent: ''\r
+ };\r
+ }\r
+ \r
+ return ret;\r
+ }\r
+});\r
+\r
+Ext.ux.form.HtmlEditor.MidasCommand = Ext.extend(Ext.util.Observable, {\r
+ // private\r
+ init: function(cmp){\r
+ this.cmp = cmp;\r
+ this.btns = [];\r
+ this.cmp.on('render', this.onRender, this);\r
+ this.cmp.on('initialize', this.onInit, this, {\r
+ delay: 100,\r
+ single: true\r
+ });\r
+ },\r
+ // private\r
+ onInit: function(){\r
+ Ext.EventManager.on(this.cmp.getDoc(), {\r
+ 'mousedown': this.onEditorEvent,\r
+ 'dblclick': this.onEditorEvent,\r
+ 'click': this.onEditorEvent,\r
+ 'keyup': this.onEditorEvent,\r
+ buffer: 100,\r
+ scope: this\r
+ });\r
+ },\r
+ // private\r
+ onRender: function(){\r
+ var midasCmdButton, tb = this.cmp.getToolbar(), btn, iconCls;\r
+ Ext.each(this.midasBtns, function(b){\r
+ if (Ext.isObject(b)) {\r
+ iconCls = (b.iconCls) ? b.iconCls : 'x-edit-' + b.cmd;\r
+ if (b.value) { iconCls = iconCls+'-'+b.value.replace(/[<>\/]/g,''); }\r
+ midasCmdButton = {\r
+ iconCls: iconCls,\r
+ handler: function(){\r
+ this.cmp.relayCmd(b.cmd, b.value);\r
+ },\r
+ scope: this,\r
+ tooltip: b.tooltip ||\r
+ {\r
+ title: b.title\r
+ },\r
+ overflowText: b.overflowText || b.title\r
+ };\r
+ } else {\r
+ midasCmdButton = new Ext.Toolbar.Separator();\r
+ }\r
+ btn = tb.addButton(midasCmdButton);\r
+ if (b.enableOnSelection) {\r
+ btn.disable();\r
+ }\r
+ this.btns.push(btn);\r
+ }, this);\r
+ },\r
+ // private\r
+ onEditorEvent: function(){\r
+ var doc = this.cmp.getDoc();\r
+ Ext.each(this.btns, function(b, i){\r
+ if (this.midasBtns[i].enableOnSelection || this.midasBtns[i].disableOnSelection) {\r
+ if (doc.getSelection) {\r
+ if ((this.midasBtns[i].enableOnSelection && doc.getSelection() !== '') || (this.midasBtns[i].disableOnSelection && doc.getSelection() === '')) {\r
+ b.enable();\r
+ } else {\r
+ b.disable();\r
+ }\r
+ } else if (doc.selection) {\r
+ if ((this.midasBtns[i].enableOnSelection && doc.selection.createRange().text !== '') || (this.midasBtns[i].disableOnSelection && doc.selection.createRange().text === '')) {\r
+ b.enable();\r
+ } else {\r
+ b.disable();\r
+ }\r
+ }\r
+ }\r
+ if (this.midasBtns[i].monitorCmdState) {\r
+ b.toggle(doc.queryCommandState(this.midasBtns[i].cmd));\r
+ }\r
+ }, this);\r
+ }\r
+});\r