/** * @author Shea Frederick - http://www.vinylfox.com * @class Ext.ux.form.HtmlEditor.MidasCommand * @extends Ext.util.Observable *

A base plugin for extending to create standard Midas command buttons.

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