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

A plugin that creates a button on the HtmlEditor for inserting a horizontal rule.

*/ Ext.ux.form.HtmlEditor.HR = Ext.extend(Ext.util.Observable, { // HR language text langTitle : 'Horizontal Rule', langHelp : 'Enter the width of the Rule in percentage
followed by the % sign at the end, or to
set a fixed width ommit the % symbol.', langInsert : 'Insert', langCancel : 'Cancel', langWidth : 'Width', // defaults defaultHRWidth: '100%', // private cmd: 'hr', // private init: function(cmp){ this.cmp = cmp; this.cmp.on('render', this.onRender, this); }, // private onRender: function(){ var cmp = this.cmp; var btn = this.cmp.getToolbar().addButton({ iconCls: 'x-edit-hr', handler: function(){ if (!this.hrWindow) { this.hrWindow = new Ext.Window({ title: this.langTitle, width: 240, closeAction: 'hide', items: [{ itemId: 'insert-hr', xtype: 'form', border: false, plain: true, bodyStyle: 'padding: 10px;', labelWidth: 60, labelAlign: 'right', items: [{ xtype: 'label', html: this.langHelp + '
 ' }, { xtype: 'textfield', maskRe: /[0-9]|%/, regex: /^[1-9][0-9%]{1,3}/, fieldLabel: this.langWidth, name: 'hrwidth', width: 60, value: this.defaultHRWidth, listeners: { specialkey: function(f, e){ if ((e.getKey() == e.ENTER || e.getKey() == e.RETURN) && f.isValid()) { this.doInsertHR(); } }, scope: this } }] }], buttons: [{ text: this.langInsert, handler: function(){ var frm = this.hrWindow.getComponent('insert-hr').getForm(); if (frm.isValid()) { this.doInsertHR(); } else { frm.findField('hrwidth').getEl().frame(); } }, scope: this }, { text: this.langCancel, handler: function(){ this.hrWindow.hide(); }, scope: this }], listeners: { render: (Ext.isGecko) ? this.focusHRLong : this.focusHR, show: this.focusHR, move: this.focusHR, scope: this } }); } else { this.hrWindow.getEl().frame(); } this.hrWindow.show(); }, scope: this, tooltip: { title: this.langInsert + ' ' + this.langTitle }, overflowText: this.langTitle }); }, // private focusHRLong: function(w){ this.focus(w, 600); }, // private focusHR: function(w){ this.focus(w, 100); }, /** * This method is just for focusing the text field use for entering the width of the HR. * It's extra messy because Firefox seems to take a while longer to render the window than other browsers, * particularly when Firbug is enabled, which is all the time if your like me. * Had to crank up the delay for focusing on render to 600ms for Firefox, and 100ms for all other focusing. * Other browsers seem to work fine in all cases with as little as 50ms delay. Compromise bleh! * @param {Object} win the window to focus * @param {Integer} delay the delay in milliseconds before focusing */ focus: function(win, delay){ win.getComponent('insert-hr').getForm().findField('hrwidth').focus(true, delay); }, // private doInsertHR: function(){ var frm = this.hrWindow.getComponent('insert-hr').getForm(); if (frm.isValid()) { var hrwidth = frm.findField('hrwidth').getValue(); if (hrwidth) { this.insertHR(hrwidth); } else { this.insertHR(this.defaultHRWidth); } frm.reset(); this.hrWindow.hide(); } }, /** * Insert a horizontal rule into the document. * @param w String The width of the horizontal rule as the width attribute of the HR tag expects. ie: '100%' or '400' (pixels). */ insertHR: function(w){ this.cmp.insertAtCursor('
'); } });