3
* Copyright(c) 2006-2010 Ext JS, Inc.
5
* http://www.extjs.com/license
8
* @class Ext.form.HtmlEditor
9
* @extends Ext.form.Field
10
* Provides a lightweight HTML Editor component. Some toolbar features are not supported by Safari and will be
11
* automatically hidden when needed. These are noted in the config options where appropriate.
12
* <br><br>The editor's toolbar buttons have tooltips defined in the {@link #buttonTips} property, but they are not
13
* enabled by default unless the global {@link Ext.QuickTips} singleton is {@link Ext.QuickTips#init initialized}.
14
* <br><br><b>Note: The focus/blur and validation marking functionality inherited from Ext.form.Field is NOT
15
* supported by this editor.</b>
16
* <br><br>An Editor is a sensitive component that can't be used in all spots standard fields can be used. Putting an Editor within
17
* any element that has display set to 'none' can cause problems in Safari and Firefox due to their default iframe reloading bugs.
18
* <br><br>Example usage:
20
// Simple example rendered with default options:
21
Ext.QuickTips.init(); // enable tooltips
22
new Ext.form.HtmlEditor({
23
renderTo: Ext.getBody(),
28
// Passed via xtype into a container and with custom options:
29
Ext.QuickTips.init(); // enable tooltips
32
renderTo: Ext.getBody(),
40
enableAlignments: false
45
* Create a new HtmlEditor
46
* @param {Object} config
50
Ext.form.HtmlEditor = Ext.extend(Ext.form.Field, {
52
* @cfg {Boolean} enableFormat Enable the bold, italic and underline buttons (defaults to true)
56
* @cfg {Boolean} enableFontSize Enable the increase/decrease font size buttons (defaults to true)
58
enableFontSize : true,
60
* @cfg {Boolean} enableColors Enable the fore/highlight color buttons (defaults to true)
64
* @cfg {Boolean} enableAlignments Enable the left, center, right alignment buttons (defaults to true)
66
enableAlignments : true,
68
* @cfg {Boolean} enableLists Enable the bullet and numbered list buttons. Not available in Safari. (defaults to true)
72
* @cfg {Boolean} enableSourceEdit Enable the switch to source edit button. Not available in Safari. (defaults to true)
74
enableSourceEdit : true,
76
* @cfg {Boolean} enableLinks Enable the create link button. Not available in Safari. (defaults to true)
80
* @cfg {Boolean} enableFont Enable font selection. Not available in Safari. (defaults to true)
84
* @cfg {String} createLinkText The default text for the create link prompt
86
createLinkText : 'Please enter the URL for the link:',
88
* @cfg {String} defaultLinkValue The default value for the create link prompt (defaults to http:/ /)
90
defaultLinkValue : 'http:/'+'/',
92
* @cfg {Array} fontFamilies An array of available font families
101
defaultFont: 'tahoma',
103
* @cfg {String} defaultValue A default value to be put into the editor to resolve focus issues (defaults to   (Non-breaking space) in Opera and IE6, ​ (Zero-width space) in all other browsers).
105
defaultValue: (Ext.isOpera || Ext.isIE6) ? ' ' : '​',
107
// private properties
109
validationEvent : false,
113
sourceEditMode : false,
114
onFocus : Ext.emptyFn,
117
defaultAutoCreate : {
119
style:"width:500px;height:300px;",
124
initComponent : function(){
128
* Fires when the editor is fully initialized (including the iframe)
129
* @param {HtmlEditor} this
134
* Fires when the editor is first receives the focus. Any insertion must wait
135
* until after this event.
136
* @param {HtmlEditor} this
141
* Fires before the textarea is updated with content from the editor iframe. Return false
142
* to cancel the sync.
143
* @param {HtmlEditor} this
144
* @param {String} html
149
* Fires before the iframe editor is updated with content from the textarea. Return false
150
* to cancel the push.
151
* @param {HtmlEditor} this
152
* @param {String} html
157
* Fires when the textarea is updated with content from the editor iframe.
158
* @param {HtmlEditor} this
159
* @param {String} html
164
* Fires when the iframe editor is updated with content from the textarea.
165
* @param {HtmlEditor} this
166
* @param {String} html
170
* @event editmodechange
171
* Fires when the editor switches edit modes
172
* @param {HtmlEditor} this
173
* @param {Boolean} sourceEdit True if source edit, false if standard editing.
180
createFontOptions : function(){
181
var buf = [], fs = this.fontFamilies, ff, lc;
182
for(var i = 0, len = fs.length; i< len; i++){
184
lc = ff.toLowerCase();
186
'<option value="',lc,'" style="font-family:',ff,';"',
187
(this.defaultFont == lc ? ' selected="true">' : '>'),
196
* Protected method that will not generally be called directly. It
197
* is called when the editor creates its toolbar. Override this method if you need to
198
* add custom toolbar buttons.
199
* @param {HtmlEditor} editor
201
createToolbar : function(editor){
203
var tipsEnabled = Ext.QuickTips && Ext.QuickTips.isEnabled();
206
function btn(id, toggle, handler){
210
iconCls: 'x-edit-'+id,
211
enableToggle:toggle !== false,
213
handler:handler||editor.relayBtnCmd,
214
clickEvent:'mousedown',
215
tooltip: tipsEnabled ? editor.buttonTips[id] || undefined : undefined,
216
overflowText: editor.buttonTips[id].title || undefined,
222
if(this.enableFont && !Ext.isSafari2){
223
var fontSelectItem = new Ext.Toolbar.Item({
227
html: this.createFontOptions()
237
if(this.enableFormat){
245
if(this.enableFontSize){
248
btn('increasefontsize', false, this.adjustFont),
249
btn('decreasefontsize', false, this.adjustFont)
253
if(this.enableColors){
258
iconCls: 'x-edit-forecolor',
259
clickEvent:'mousedown',
260
tooltip: tipsEnabled ? editor.buttonTips.forecolor || undefined : undefined,
262
menu : new Ext.menu.ColorMenu({
269
select: function(cp, color){
270
this.execCmd('forecolor', Ext.isWebKit || Ext.isIE ? '#'+color : color);
274
clickEvent:'mousedown'
279
iconCls: 'x-edit-backcolor',
280
clickEvent:'mousedown',
281
tooltip: tipsEnabled ? editor.buttonTips.backcolor || undefined : undefined,
283
menu : new Ext.menu.ColorMenu({
290
select: function(cp, color){
292
this.execCmd('useCSS', false);
293
this.execCmd('hilitecolor', color);
294
this.execCmd('useCSS', true);
297
this.execCmd(Ext.isOpera ? 'hilitecolor' : 'backcolor', Ext.isWebKit || Ext.isIE ? '#'+color : color);
302
clickEvent:'mousedown'
308
if(this.enableAlignments){
312
btn('justifycenter'),
318
if(this.enableLinks){
321
btn('createlink', false, this.createLink)
325
if(this.enableLists){
328
btn('insertorderedlist'),
329
btn('insertunorderedlist')
332
if(this.enableSourceEdit){
335
btn('sourceedit', true, function(btn){
336
this.toggleSourceEdit(!this.sourceEditMode);
343
var tb = new Ext.Toolbar({
344
renderTo: this.wrap.dom.firstChild,
348
if (fontSelectItem) {
349
this.fontSelect = fontSelectItem.el;
351
this.mon(this.fontSelect, 'change', function(){
352
var font = this.fontSelect.dom.value;
353
this.relayCmd('fontname', font);
359
this.mon(tb.el, 'click', function(e){
367
onDisable: function(){
369
Ext.form.HtmlEditor.superclass.onDisable.call(this);
372
onEnable: function(){
374
Ext.form.HtmlEditor.superclass.onEnable.call(this);
377
setReadOnly: function(readOnly){
379
Ext.form.HtmlEditor.superclass.setReadOnly.call(this, readOnly);
380
if(this.initialized){
382
this.getEditorBody().contentEditable = !readOnly;
384
this.setDesignMode(!readOnly);
386
var bd = this.getEditorBody();
388
bd.style.cursor = this.readOnly ? 'default' : 'text';
390
this.disableItems(readOnly);
395
* Protected method that will not generally be called directly. It
396
* is called when the editor initializes the iframe with HTML contents. Override this method if you
397
* want to change the initialization markup of the iframe (e.g. to add stylesheets).
399
* Note: IE8-Standards has unwanted scroller behavior, so the default meta tag forces IE7 compatibility
401
getDocMarkup : function(){
402
var h = Ext.fly(this.iframe).getHeight() - this.iframePad * 2;
403
return String.format('<html><head><style type="text/css">body{border: 0; margin: 0; padding: {0}px; height: {1}px; cursor: text}</style></head><body></body></html>', this.iframePad, h);
407
getEditorBody : function(){
408
var doc = this.getDoc();
409
return doc.body || doc.documentElement;
414
return Ext.isIE ? this.getWin().document : (this.iframe.contentDocument || this.getWin().document);
419
return Ext.isIE ? this.iframe.contentWindow : window.frames[this.iframe.name];
423
onRender : function(ct, position){
424
Ext.form.HtmlEditor.superclass.onRender.call(this, ct, position);
425
this.el.dom.style.border = '0 none';
426
this.el.dom.setAttribute('tabIndex', -1);
427
this.el.addClass('x-hidden');
428
if(Ext.isIE){ // fix IE 1px bogus margin
429
this.el.applyStyles('margin-top:-1px;margin-bottom:-1px;');
431
this.wrap = this.el.wrap({
432
cls:'x-html-editor-wrap', cn:{cls:'x-html-editor-tb'}
435
this.createToolbar(this);
437
this.disableItems(true);
444
var sz = this.el.getSize();
445
this.setSize(sz.width, this.height || sz.height);
447
this.resizeEl = this.positionEl = this.wrap;
450
createIFrame: function(){
451
var iframe = document.createElement('iframe');
452
iframe.name = Ext.id();
453
iframe.frameBorder = '0';
454
iframe.style.overflow = 'auto';
456
this.wrap.dom.appendChild(iframe);
457
this.iframe = iframe;
459
this.monitorTask = Ext.TaskMgr.start({
460
run: this.checkDesignMode,
466
initFrame : function(){
467
Ext.TaskMgr.stop(this.monitorTask);
468
var doc = this.getDoc();
469
this.win = this.getWin();
472
doc.write(this.getDocMarkup());
475
var task = { // must defer to wait for browser to be ready
477
var doc = this.getDoc();
478
if(doc.body || doc.readyState == 'complete'){
479
Ext.TaskMgr.stop(task);
480
this.setDesignMode(true);
481
this.initEditor.defer(10, this);
488
Ext.TaskMgr.start(task);
492
checkDesignMode : function(){
493
if(this.wrap && this.wrap.dom.offsetWidth){
494
var doc = this.getDoc();
498
if(!doc.editorInitialized || this.getDesignMode() != 'on'){
505
* set current design mode. To enable, mode can be true or 'on', off otherwise
507
setDesignMode : function(mode){
509
if(doc = this.getDoc()){
513
doc.designMode = (/on|true/i).test(String(mode).toLowerCase()) ?'on':'off';
519
getDesignMode : function(){
520
var doc = this.getDoc();
521
if(!doc){ return ''; }
522
return String(doc.designMode).toLowerCase();
526
disableItems: function(disabled){
528
this.fontSelect.dom.disabled = disabled;
530
this.tb.items.each(function(item){
531
if(item.getItemId() != 'sourceedit'){
532
item.setDisabled(disabled);
538
onResize : function(w, h){
539
Ext.form.HtmlEditor.superclass.onResize.apply(this, arguments);
540
if(this.el && this.iframe){
542
var aw = w - this.wrap.getFrameWidth('lr');
543
this.el.setWidth(aw);
544
this.tb.setWidth(aw);
545
this.iframe.style.width = Math.max(aw, 0) + 'px';
548
var ah = h - this.wrap.getFrameWidth('tb') - this.tb.el.getHeight();
549
this.el.setHeight(ah);
550
this.iframe.style.height = Math.max(ah, 0) + 'px';
551
var bd = this.getEditorBody();
553
bd.style.height = Math.max((ah - (this.iframePad*2)), 0) + 'px';
560
* Toggles the editor between standard and source edit mode.
561
* @param {Boolean} sourceEdit (optional) True for source edit, false for standard
563
toggleSourceEdit : function(sourceEditMode){
568
if (sourceEditMode === undefined) {
569
sourceEditMode = !this.sourceEditMode;
571
this.sourceEditMode = sourceEditMode === true;
572
var btn = this.tb.getComponent('sourceedit');
574
if (btn.pressed !== this.sourceEditMode) {
575
btn.toggle(this.sourceEditMode);
576
if (!btn.xtbHidden) {
580
if (this.sourceEditMode) {
581
// grab the height of the containing panel before we hide the iframe
584
iframeHeight = Ext.get(this.iframe).getHeight();
586
this.disableItems(true);
588
this.iframe.className = 'x-hidden';
589
this.el.removeClass('x-hidden');
590
this.el.dom.removeAttribute('tabIndex');
592
this.el.dom.style.height = iframeHeight + 'px';
595
elHeight = parseInt(this.el.dom.style.height, 10);
596
if (this.initialized) {
597
this.disableItems(this.readOnly);
600
this.iframe.className = '';
601
this.el.addClass('x-hidden');
602
this.el.dom.setAttribute('tabIndex', -1);
606
this.iframe.style.height = elHeight + 'px';
608
this.fireEvent('editmodechange', this, this.sourceEditMode);
611
// private used internally
612
createLink : function() {
613
var url = prompt(this.createLinkText, this.defaultLinkValue);
614
if(url && url != 'http:/'+'/'){
615
this.relayCmd('createlink', url);
620
initEvents : function(){
621
this.originalValue = this.getValue();
625
* Overridden and disabled. The editor element does not support standard valid/invalid marking. @hide
628
markInvalid : Ext.emptyFn,
631
* Overridden and disabled. The editor element does not support standard valid/invalid marking. @hide
634
clearInvalid : Ext.emptyFn,
636
// docs inherit from Field
637
setValue : function(v){
638
Ext.form.HtmlEditor.superclass.setValue.call(this, v);
644
* Protected method that will not generally be called directly. If you need/want
645
* custom HTML cleanup, this is the method you should override.
646
* @param {String} html The HTML to be cleaned
647
* @return {String} The cleaned HTML
649
cleanHtml: function(html) {
651
if(Ext.isWebKit){ // strip safari nonsense
652
html = html.replace(/\sclass="(?:Apple-style-span|khtml-block-placeholder)"/gi, '');
656
* Neat little hack. Strips out all the non-digit characters from the default
657
* value and compares it to the character code of the first character in the string
658
* because it can cause encoding issues when posted to the server.
660
if(html.charCodeAt(0) == this.defaultValue.replace(/\D/g, '')){
661
html = html.substring(1);
667
* Protected method that will not generally be called directly. Syncs the contents
668
* of the editor iframe with the textarea.
670
syncValue : function(){
671
if(this.initialized){
672
var bd = this.getEditorBody();
673
var html = bd.innerHTML;
675
var bs = bd.getAttribute('style'); // Safari puts text-align styles on the body element!
676
var m = bs.match(/text-align:(.*?);/i);
678
html = '<div style="'+m[0]+'">' + html + '</div>';
681
html = this.cleanHtml(html);
682
if(this.fireEvent('beforesync', this, html) !== false){
683
this.el.dom.value = html;
684
this.fireEvent('sync', this, html);
689
//docs inherit from Field
690
getValue : function() {
691
this[this.sourceEditMode ? 'pushValue' : 'syncValue']();
692
return Ext.form.HtmlEditor.superclass.getValue.call(this);
696
* Protected method that will not generally be called directly. Pushes the value of the textarea
697
* into the iframe editor.
699
pushValue : function(){
700
if(this.initialized){
701
var v = this.el.dom.value;
702
if(!this.activated && v.length < 1){
703
v = this.defaultValue;
705
if(this.fireEvent('beforepush', this, v) !== false){
706
this.getEditorBody().innerHTML = v;
708
// Gecko hack, see: https://bugzilla.mozilla.org/show_bug.cgi?id=232791#c8
709
this.setDesignMode(false); //toggle off first
710
this.setDesignMode(true);
712
this.fireEvent('push', this, v);
719
deferFocus : function(){
720
this.focus.defer(10, this);
723
// docs inherit from Field
725
if(this.win && !this.sourceEditMode){
733
initEditor : function(){
734
//Destroying the component during/before initEditor can cause issues.
736
var dbody = this.getEditorBody(),
737
ss = this.el.getStyles('font-size', 'font-family', 'background-image', 'background-repeat', 'background-color', 'color'),
741
ss['background-attachment'] = 'fixed'; // w3c
742
dbody.bgProperties = 'fixed'; // ie
744
Ext.DomHelper.applyStyles(dbody, ss);
750
Ext.EventManager.removeAll(doc);
755
* We need to use createDelegate here, because when using buffer, the delayed task is added
756
* as a property to the function. When the listener is removed, the task is deleted from the function.
757
* Since onEditorEvent is shared on the prototype, if we have multiple html editors, the first time one of the editors
758
* is destroyed, it causes the fn to be deleted from the prototype, which causes errors. Essentially, we're just anonymizing the function.
760
fn = this.onEditorEvent.createDelegate(this);
761
Ext.EventManager.on(doc, {
770
Ext.EventManager.on(doc, 'keypress', this.applyCommand, this);
772
if(Ext.isIE || Ext.isWebKit || Ext.isOpera){
773
Ext.EventManager.on(doc, 'keydown', this.fixKeys, this);
775
doc.editorInitialized = true;
776
this.initialized = true;
778
this.setReadOnly(this.readOnly);
779
this.fireEvent('initialize', this);
784
onDestroy : function(){
785
if(this.monitorTask){
786
Ext.TaskMgr.stop(this.monitorTask);
789
Ext.destroy(this.tb);
790
var doc = this.getDoc();
793
Ext.EventManager.removeAll(doc);
794
for (var prop in doc){
800
this.wrap.dom.innerHTML = '';
806
this.el.removeAllListeners();
809
this.purgeListeners();
813
onFirstFocus : function(){
814
this.activated = true;
815
this.disableItems(this.readOnly);
816
if(Ext.isGecko){ // prevent silly gecko errors
818
var s = this.win.getSelection();
819
if(!s.focusNode || s.focusNode.nodeType != 3){
820
var r = s.getRangeAt(0);
821
r.selectNodeContents(this.getEditorBody());
826
this.execCmd('useCSS', true);
827
this.execCmd('styleWithCSS', false);
830
this.fireEvent('activate', this);
834
adjustFont: function(btn){
835
var adjust = btn.getItemId() == 'increasefontsize' ? 1 : -1,
837
v = parseInt(doc.queryCommandValue('FontSize') || 2, 10);
838
if((Ext.isSafari && !Ext.isSafari2) || Ext.isChrome || Ext.isAir){
840
// 1 = 10px, 2 = 13px, 3 = 16px, 4 = 18px, 5 = 24px, 6 = 32px
854
v = v.constrain(1, 6);
856
if(Ext.isSafari){ // safari
859
v = Math.max(1, v+adjust) + (Ext.isSafari ? 'px' : 0);
861
this.execCmd('FontSize', v);
865
onEditorEvent : function(e){
866
this.updateToolbar();
871
* Protected method that will not generally be called directly. It triggers
872
* a toolbar update by reading the markup state of the current selection in the editor.
874
updateToolbar: function(){
885
var btns = this.tb.items.map,
888
if(this.enableFont && !Ext.isSafari2){
889
var name = (doc.queryCommandValue('FontName')||this.defaultFont).toLowerCase();
890
if(name != this.fontSelect.dom.value){
891
this.fontSelect.dom.value = name;
894
if(this.enableFormat){
895
btns.bold.toggle(doc.queryCommandState('bold'));
896
btns.italic.toggle(doc.queryCommandState('italic'));
897
btns.underline.toggle(doc.queryCommandState('underline'));
899
if(this.enableAlignments){
900
btns.justifyleft.toggle(doc.queryCommandState('justifyleft'));
901
btns.justifycenter.toggle(doc.queryCommandState('justifycenter'));
902
btns.justifyright.toggle(doc.queryCommandState('justifyright'));
904
if(!Ext.isSafari2 && this.enableLists){
905
btns.insertorderedlist.toggle(doc.queryCommandState('insertorderedlist'));
906
btns.insertunorderedlist.toggle(doc.queryCommandState('insertunorderedlist'));
909
Ext.menu.MenuMgr.hideAll();
915
relayBtnCmd : function(btn){
916
this.relayCmd(btn.getItemId());
920
* Executes a Midas editor command on the editor document and performs necessary focus and
921
* toolbar updates. <b>This should only be called after the editor is initialized.</b>
922
* @param {String} cmd The Midas command
923
* @param {String/Boolean} value (optional) The value to pass to the command (defaults to null)
925
relayCmd : function(cmd, value){
928
this.execCmd(cmd, value);
929
this.updateToolbar();
934
* Executes a Midas editor command directly on the editor document.
935
* For visual commands, you should use {@link #relayCmd} instead.
936
* <b>This should only be called after the editor is initialized.</b>
937
* @param {String} cmd The Midas command
938
* @param {String/Boolean} value (optional) The value to pass to the command (defaults to null)
940
execCmd : function(cmd, value){
941
var doc = this.getDoc();
942
doc.execCommand(cmd, false, value === undefined ? null : value);
947
applyCommand : function(e){
949
var c = e.getCharCode(), cmd;
951
c = String.fromCharCode(c);
974
* Inserts the passed text at the current cursor position. Note: the editor must be initialized and activated
976
* @param {String} text
978
insertAtCursor : function(text){
984
var doc = this.getDoc(),
985
r = doc.selection.createRange();
993
this.execCmd('InsertHTML', text);
999
fixKeys : function(){ // load time branching for fastest keydown performance
1003
doc = this.getDoc(),
1007
r = doc.selection.createRange();
1010
r.pasteHTML(' ');
1013
}else if(k == e.ENTER){
1014
r = doc.selection.createRange();
1016
var target = r.parentElement();
1017
if(!target || target.tagName.toLowerCase() != 'li'){
1019
r.pasteHTML('<br />');
1026
}else if(Ext.isOpera){
1032
this.execCmd('InsertHTML',' ');
1036
}else if(Ext.isWebKit){
1041
this.execCmd('InsertText','\t');
1043
}else if(k == e.ENTER){
1045
this.execCmd('InsertHtml','<br /><br />');
1053
* Returns the editor's toolbar. <b>This is only available after the editor has been rendered.</b>
1054
* @return {Ext.Toolbar}
1056
getToolbar : function(){
1061
* Object collection of toolbar tooltips for the buttons in the editor. The key
1062
* is the command id associated with that button and the value is a valid QuickTips object.
1067
title: 'Bold (Ctrl+B)',
1068
text: 'Make the selected text bold.',
1069
cls: 'x-html-editor-tip'
1072
title: 'Italic (Ctrl+I)',
1073
text: 'Make the selected text italic.',
1074
cls: 'x-html-editor-tip'
1082
title: 'Bold (Ctrl+B)',
1083
text: 'Make the selected text bold.',
1084
cls: 'x-html-editor-tip'
1087
title: 'Italic (Ctrl+I)',
1088
text: 'Make the selected text italic.',
1089
cls: 'x-html-editor-tip'
1092
title: 'Underline (Ctrl+U)',
1093
text: 'Underline the selected text.',
1094
cls: 'x-html-editor-tip'
1096
increasefontsize : {
1098
text: 'Increase the font size.',
1099
cls: 'x-html-editor-tip'
1101
decreasefontsize : {
1102
title: 'Shrink Text',
1103
text: 'Decrease the font size.',
1104
cls: 'x-html-editor-tip'
1107
title: 'Text Highlight Color',
1108
text: 'Change the background color of the selected text.',
1109
cls: 'x-html-editor-tip'
1112
title: 'Font Color',
1113
text: 'Change the color of the selected text.',
1114
cls: 'x-html-editor-tip'
1117
title: 'Align Text Left',
1118
text: 'Align text to the left.',
1119
cls: 'x-html-editor-tip'
1122
title: 'Center Text',
1123
text: 'Center text in the editor.',
1124
cls: 'x-html-editor-tip'
1127
title: 'Align Text Right',
1128
text: 'Align text to the right.',
1129
cls: 'x-html-editor-tip'
1131
insertunorderedlist : {
1132
title: 'Bullet List',
1133
text: 'Start a bulleted list.',
1134
cls: 'x-html-editor-tip'
1136
insertorderedlist : {
1137
title: 'Numbered List',
1138
text: 'Start a numbered list.',
1139
cls: 'x-html-editor-tip'
1143
text: 'Make the selected text a hyperlink.',
1144
cls: 'x-html-editor-tip'
1147
title: 'Source Edit',
1148
text: 'Switch to source editing mode.',
1149
cls: 'x-html-editor-tip'
1153
// hide stuff that is not compatible
1171
* @cfg {String} fieldClass @hide
1174
* @cfg {String} focusClass @hide
1177
* @cfg {String} autoCreate @hide
1180
* @cfg {String} inputType @hide
1183
* @cfg {String} invalidClass @hide
1186
* @cfg {String} invalidText @hide
1189
* @cfg {String} msgFx @hide
1192
* @cfg {String} validateOnBlur @hide
1195
* @cfg {Boolean} allowDomMove @hide
1198
* @cfg {String} applyTo @hide
1201
* @cfg {String} autoHeight @hide
1204
* @cfg {String} autoWidth @hide
1207
* @cfg {String} cls @hide
1210
* @cfg {String} disabled @hide
1213
* @cfg {String} disabledClass @hide
1216
* @cfg {String} msgTarget @hide
1219
* @cfg {String} readOnly @hide
1222
* @cfg {String} style @hide
1225
* @cfg {String} validationDelay @hide
1228
* @cfg {String} validationEvent @hide
1231
* @cfg {String} tabIndex @hide
1234
* @property disabled
1238
* @method applyToMarkup
1258
* @method setDisabled
1266
Ext.reg('htmleditor', Ext.form.HtmlEditor);