/** * @class Ext.AbstractComponent * Shared Component class *

Base class for all Ext components. All subclasses of Component may participate in the automated * Ext component lifecycle of creation, rendering and destruction which is provided by the {@link Ext.Container Container} class. * Components may be added to a Container through the {@link Ext.Container#items items} config option at the time the Container is created, * or they may be added dynamically via the {@link Ext.Container#add add} method.

*

The Component base class has built-in support for basic hide/show and enable/disable behavior.

*

All Components are registered with the {@link Ext.ComponentMgr} on construction so that they can be referenced at any time via * {@link Ext#getCmp}, passing the {@link #id}.

*

All user-developed visual widgets that are required to participate in automated lifecycle and size management should subclass Component (or * {@link Ext.BoxComponent} if managed box model handling is required, ie height and width management).

*

See the Creating new UI controls tutorial for details on how * and to either extend or augment ExtJs base classes to create custom Components.

*

Every component has a specific xtype, which is its Ext-specific type name, along with methods for checking the * xtype like {@link #getXType} and {@link #isXType}. This is the list of all valid xtypes:

*
xtype            Class
-------------    ------------------
button           {@link Ext.Button}
buttongroup      {@link Ext.ButtonGroup}
colorpalette     {@link Ext.ColorPalette}
component        {@link Ext.Component}
container        {@link Ext.Container}
cycle            {@link Ext.CycleButton}
dataview         {@link Ext.DataView}
datepicker       {@link Ext.DatePicker}
editor           {@link Ext.Editor}
editorgrid       {@link Ext.grid.EditorGridPanel}
flash            {@link Ext.FlashComponent}
grid             {@link Ext.grid.GridPanel}
listview         {@link Ext.ListView}
multislider      {@link Ext.slider.MultiSlider}
panel            {@link Ext.Panel}
progress         {@link Ext.ProgressBar}
propertygrid     {@link Ext.grid.PropertyGrid}
slider           {@link Ext.slider.SingleSlider}
spacer           {@link Ext.Spacer}
splitbutton      {@link Ext.SplitButton}
tabpanel         {@link Ext.TabPanel}
treepanel        {@link Ext.tree.TreePanel}
viewport         {@link Ext.ViewPort}
window           {@link Ext.Window}

Toolbar components
---------------------------------------
paging           {@link Ext.PagingToolbar}
toolbar          {@link Ext.Toolbar}
tbbutton         {@link Ext.Toolbar.Button}        (deprecated; use button)
tbfill           {@link Ext.Toolbar.Fill}
tbitem           {@link Ext.Toolbar.Item}
tbseparator      {@link Ext.Toolbar.Separator}
tbspacer         {@link Ext.Toolbar.Spacer}
tbsplit          {@link Ext.Toolbar.SplitButton}   (deprecated; use splitbutton)
tbtext           {@link Ext.Toolbar.TextItem}

Menu components
---------------------------------------
menu             {@link Ext.menu.Menu}
colormenu        {@link Ext.menu.ColorMenu}
datemenu         {@link Ext.menu.DateMenu}
menubaseitem     {@link Ext.menu.BaseItem}
menucheckitem    {@link Ext.menu.CheckItem}
menuitem         {@link Ext.menu.Item}
menuseparator    {@link Ext.menu.Separator}
menutextitem     {@link Ext.menu.TextItem}

Form components
---------------------------------------
form             {@link Ext.form.FormPanel}
checkbox         {@link Ext.form.Checkbox}
checkboxgroup    {@link Ext.form.CheckboxGroup}
combo            {@link Ext.form.ComboBox}
compositefield   {@link Ext.form.CompositeField}
datefield        {@link Ext.form.DateField}
displayfield     {@link Ext.form.DisplayField}
field            {@link Ext.form.Field}
fieldset         {@link Ext.form.FieldSet}
hidden           {@link Ext.form.Hidden}
htmleditor       {@link Ext.form.HtmlEditor}
label            {@link Ext.form.Label}
numberfield      {@link Ext.form.NumberField}
radio            {@link Ext.form.Radio}
radiogroup       {@link Ext.form.RadioGroup}
textarea         {@link Ext.form.TextArea}
textfield        {@link Ext.form.TextField}
timefield        {@link Ext.form.TimeField}
trigger          {@link Ext.form.TriggerField}

Chart components
---------------------------------------
chart            {@link Ext.chart.Chart}
barchart         {@link Ext.chart.BarChart}
cartesianchart   {@link Ext.chart.CartesianChart}
columnchart      {@link Ext.chart.ColumnChart}
linechart        {@link Ext.chart.LineChart}
piechart         {@link Ext.chart.PieChart}

Store xtypes
---------------------------------------
arraystore       {@link Ext.data.ArrayStore}
directstore      {@link Ext.data.DirectStore}
groupingstore    {@link Ext.data.GroupingStore}
jsonstore        {@link Ext.data.JsonStore}
simplestore      {@link Ext.data.SimpleStore}      (deprecated; use arraystore)
store            {@link Ext.data.Store}
xmlstore         {@link Ext.data.XmlStore}
* @constructor * @param {Ext.Element/String/Object} config The configuration options may be specified as either: *
*/ Ext.define('Ext.AbstractComponent', { /* Begin Definitions */ mixins: { observable: 'Ext.util.Observable' }, requires: [ 'Ext.PluginMgr', 'Ext.ComponentMgr', 'Ext.core.Element', 'Ext.core.DomHelper', 'Ext.XTemplate', 'Ext.ComponentQuery', 'Ext.LoadMask', 'Ext.ComponentLoader', 'Ext.EventManager', 'Ext.layout.Manager', 'Ext.layout.component.Auto' ], // Please remember to add dependencies whenever you use it // I had to fix these many times already uses: [ 'Ext.ZIndexManager' ], statics: { AUTO_ID: 1000 }, /* End Definitions */ isComponent: true, getAutoId: function() { return ++Ext.AbstractComponent.AUTO_ID; },
/** * @cfg {String} id *

The unique id of this component instance (defaults to an {@link #getId auto-assigned id}).

*

It should not be necessary to use this configuration except for singleton objects in your application. * Components created with an id may be accessed globally using {@link Ext#getCmp Ext.getCmp}.

*

Instead of using assigned ids, use the {@link #itemId} config, and {@link Ext.ComponentQuery ComponentQuery} which * provides selector-based searching for Sencha Components analogous to DOM querying. The {@link Ext.container.Container Container} * class contains {@link Ext.container.Container#down shortcut methods} to query its descendant Components by selector.

*

Note that this id will also be used as the element id for the containing HTML element * that is rendered to the page for this component. This allows you to write id-based CSS * rules to style the specific instance of this component uniquely, and also to select * sub-elements using this component's id as the parent.

*

Note: to avoid complications imposed by a unique id also see {@link #itemId}.

*

Note: to access the container of a Component see {@link #ownerCt}.

*/
/** * @cfg {String} itemId *

An itemId can be used as an alternative way to get a reference to a component * when no object reference is available. Instead of using an {@link #id} with * {@link Ext}.{@link Ext#getCmp getCmp}, use itemId with * {@link Ext.Container}.{@link Ext.Container#getComponent getComponent} which will retrieve * itemId's or {@link #id}'s. Since itemId's are an index to the * container's internal MixedCollection, the itemId is scoped locally to the container -- * avoiding potential conflicts with {@link Ext.ComponentMgr} which requires a unique * {@link #id}.

*

var c = new Ext.Panel({ //
    {@link Ext.Component#height height}: 300,
    {@link #renderTo}: document.body,
    {@link Ext.container.Container#layout layout}: 'auto',
    {@link Ext.container.Container#items items}: [
        {
            itemId: 'p1',
            {@link Ext.panel.Panel#title title}: 'Panel 1',
            {@link Ext.Component#height height}: 150
        },
        {
            itemId: 'p2',
            {@link Ext.panel.Panel#title title}: 'Panel 2',
            {@link Ext.Component#height height}: 150
        }
    ]
})
p1 = c.{@link Ext.Container#getComponent getComponent}('p1'); // not the same as {@link Ext#getCmp Ext.getCmp()}
p2 = p1.{@link #ownerCt}.{@link Ext.Container#getComponent getComponent}('p2'); // reference via a sibling
     * 
*

Also see {@link #id} and {@link #ref}.

*

Note: to access the container of an item see {@link #ownerCt}.

*/
/** * This Component's owner {@link Ext.container.Container Container} (defaults to undefined, and is set automatically when * this Component is added to a Container). Read-only. *

Note: to access items within the Container see {@link #itemId}.

* @type Ext.Container * @property ownerCt */
/** * @cfg {Mixed} autoEl *

A tag name or {@link Ext.DomHelper DomHelper} spec used to create the {@link #getEl Element} which will * encapsulate this Component.

*

You do not normally need to specify this. For the base classes {@link Ext.Component} and {@link Ext.container.Container}, * this defaults to 'div'. The more complex Sencha classes use a more complex * DOM structure specified by their own {@link #renderTpl}s.

*

This is intended to allow the developer to create application-specific utility Components encapsulated by * different DOM elements. Example usage:


{
    xtype: 'component',
    autoEl: {
        tag: 'img',
        src: 'http://www.example.com/example.jpg'
    }
}, {
    xtype: 'component',
    autoEl: {
        tag: 'blockquote',
        html: 'autoEl is cool!'
    }
}, {
    xtype: 'container',
    autoEl: 'ul',
    cls: 'ux-unordered-list',
    items: {
        xtype: 'component',
        autoEl: 'li',
        html: 'First list item'
    }
}
*/
/** * @cfg {Mixed} renderTpl *

An {@link Ext.XTemplate XTemplate} used to create the internal structure inside this Component's * encapsulating {@link #getEl Element}.

*

You do not normally need to specify this. For the base classes {@link Ext.Component} * and {@link Ext.container.Container}, this defaults to null which means that they will be initially rendered * with no internal structure; they render their {@link #getEl Element} empty. The more specialized ExtJS and Touch classes * which use a more complex DOM structure, provide their own template definitions.

*

This is intended to allow the developer to create application-specific utility Components with customized * internal structure.

*

Upon rendering, any created child elements may be automatically imported into object properties using the * {@link #renderSelectors} option.

*/ renderTpl: null,
/** * @cfg {Object} renderSelectors. *

An object containing properties specifying {@link Ext.DomQuery DomQuery} selectors which identify child elements * created by the render process.

*

After the Component's internal structure is rendered according to the {@link renderTpl}, this object is iterated through, * and the found Elements are added as properties to the Component using the renderSelector property name.

*

For example, a Component which rendered an image, and description into its element might use the following properties * coded into its prototype:


renderTpl: '
{description}
', renderSelectors: { image: 'img.x-image-component-img', descEl: 'div.x-image-component-desc' }
*

After rendering, the Component would have a property image referencing its child img Element, * and a property descEl referencing the div Element which contains the description.

*/
/** * @cfg {Mixed} renderTo *

Specify the id of the element, a DOM element or an existing Element that this component * will be rendered into.

*

See {@link #render} also.

*/
/** * @cfg {Boolean} frame *

Specify as true to have the Component inject framing elements within the Component at render time to * provide a graphical rounded frame around the Component content.

*

This is only necessary when running on outdated, or non standard-compliant browsers such as Microsoft's Internet Explorer * prior to version 9 which do not support rounded corners natively.

*

The extra space taken up by this framing is available from the read only property {@link #frameSize}.

*/
/** *

Read-only property indicating the width of any framing elements which were added within the encapsulating element * to provide graphical, rounded borders. See the {@link #frame} config.

*

This is an object containing the frame width in pixels for all four sides of the Component containing * the following properties:

* @property frameSize * @type {Object} */
/** * @cfg {String/Object} componentLayout *

The sizing and positioning of a Component's internal Elements is the responsibility of * the Component's layout manager which sizes a Component's internal structure in response to the Component being sized.

*

Generally, developers will not use this configuration as all provided Components which need their internal * elements sizing (Such as {@link Ext.form.Field input fields}) come with their own componentLayout managers.

*

The {@link Ext.layout.AutoComponentLayout default layout manager} will be used on instances of the base Ext.Component class * which simply sizes the Component's encapsulating element to the height and width specified in the {@link setSize} method.

*/
/** * @cfg {Mixed} tpl * An {@link Ext.Template}, {@link Ext.XTemplate} * or an array of strings to form an Ext.XTemplate. * Used in conjunction with the {@link #data} and * {@link #tplWriteMode} configurations. */
/** * @cfg {Mixed} data * The initial set of data to apply to the {@link #tpl} to * update the content area of the Component. */
/** * @cfg {String} tplWriteMode The Ext.(X)Template method to use when * updating the content area of the Component. Defaults to 'overwrite' * (see {@link Ext.XTemplate#overwrite}). */ tplWriteMode: 'overwrite',
/** * @cfg {String} baseCls * The base CSS class to apply to this components's element. This will also be prepended to * elements within this component like Panel's body will get a class x-panel-body. This means * that if you create a subclass of Panel, and you want it to get all the Panels styling for the * element and the body, you leave the baseCls x-panel and use componentCls to add specific styling for this * component. */ baseCls: Ext.baseCSSPrefix + 'component',
/** * @cfg {String} componentCls * CSS Class to be added to a components root level element to give distinction to it * via styling. */
/** * @cfg {String} cls * An optional extra CSS class that will be added to this component's Element (defaults to ''). This can be * useful for adding customized styles to the component or any of its children using standard CSS rules. */
/** * @cfg {String} overCls * An optional extra CSS class that will be added to this component's Element when the mouse moves * over the Element, and removed when the mouse moves out. (defaults to ''). This can be * useful for adding customized 'active' or 'hover' styles to the component or any of its children using standard CSS rules. */
/** * @cfg {String} disabledCls * CSS class to add when the Component is disabled. Defaults to 'x-item-disabled'. */ disabledCls: Ext.baseCSSPrefix + 'item-disabled',
/** * @cfg {String} ui * A set of predefined ui styles for individual components. * * Most components support 'light' and 'dark'. * * Extra string added to the baseCls with an extra '-'. *

      new Ext.Panel({
          title: 'Some Title',
          baseCls: 'x-component'
          ui: 'green'
      });
       
*

The ui configuration in this example would add 'x-component-green' as an additional class.

*/
/** * @cfg {String} style * A custom style specification to be applied to this component's Element. Should be a valid argument to * {@link Ext.core.Element#applyStyles}. *

        new Ext.Panel({
            title: 'Some Title',
            renderTo: Ext.getBody(),
            width: 400, height: 300,
            layout: 'form',
            items: [{
                xtype: 'textarea',
                style: {
                    width: '95%',
                    marginBottom: '10px'
                }
            },
            new Ext.Button({
                text: 'Send',
                minWidth: '100',
                style: {
                    marginBottom: '10px'
                }
            })
            ]
        });
     
*/
/** * @cfg {Number} width * The width of this component in pixels. */
/** * @cfg {Number} height * The height of this component in pixels. */
/** * @cfg {Number/String} border * Specifies the border for this component. The border can be a single numeric value to apply to all sides or * it can be a CSS style specification for each style, for example: '10 5 3 10'. */
/** * @cfg {Number/String} padding * Specifies the padding for this component. The padding can be a single numeric value to apply to all sides or * it can be a CSS style specification for each style, for example: '10 5 3 10'. */
/** * @cfg {Number/String} margin * Specifies the margin for this component. The margin can be a single numeric value to apply to all sides or * it can be a CSS style specification for each style, for example: '10 5 3 10'. */
/** * @cfg {Boolean} hidden * Defaults to false. */ hidden: false,
/** * @cfg {Boolean} disabled * Defaults to false. */ disabled: false,
/** * @cfg {Boolean} draggable * Allows the component to be dragged via the touch event. */
/** * Read-only property indicating whether or not the component can be dragged * @property draggable * @type {Boolean} */ draggable: false,
/** * @cfg {Boolean} floating * Create the Component as a floating and use absolute positioning. * Defaults to false. */ floating: false,
/** * @cfg {String} hideMode * A String which specifies how this Component's encapsulating DOM element will be hidden. * Values may be
* Defaults to 'display'. */ hideMode: 'display',
/** * @cfg {String} contentEl *

Optional. Specify an existing HTML element, or the id of an existing HTML element to use as the content * for this component.

* */
/** * @cfg {String/Object} html * An HTML fragment, or a {@link Ext.core.DomHelper DomHelper} specification to use as the layout element * content (defaults to ''). The HTML content is added after the component is rendered, * so the document will not contain this HTML at the time the {@link #render} event is fired. * This content is inserted into the body before any configured {@link #contentEl} is appended. */
/** * @cfg {String} styleHtmlContent * True to automatically style the html inside the content target of this component (body for panels). * Defaults to false. */ styleHtmlContent: false,
/** * @cfg {String} styleHtmlCls * The class that is added to the content target when you set styleHtmlContent to true. * Defaults to 'x-html' */ styleHtmlCls: Ext.baseCSSPrefix + 'html',
/** * @cfg {Number} minHeight *

The minimum value in pixels which this Component will set its height to.

*

Warning: This will override any size management applied by layout managers.

*/
/** * @cfg {Number} minWidth *

The minimum value in pixels which this Component will set its width to.

*

Warning: This will override any size management applied by layout managers.

*/
/** * @cfg {Number} maxHeight *

The maximum value in pixels which this Component will set its height to.

*

Warning: This will override any size management applied by layout managers.

*/
/** * @cfg {Number} maxWidth *

The maximum value in pixels which this Component will set its width to.

*

Warning: This will override any size management applied by layout managers.

*/
/** * @cfg {Ext.ComponentLoader/Object} loader * A configuration object or an instance of a {@link Ext.ComponentLoader} to load remote * content for this Component. */ // @private allowDomMove: true, autoShow: false,
/** * @cfg {Mixed} autoRender *

This config is intended mainly for {@link #floating} Components which may or may not be shown. Instead * of using {@link #renderTo} in the configuration, and rendering upon construction, this allows a Component * to render itself upon first {@link #show}.

*

Specify as true to have this Component render to the document body upon first show.

*

Specify as an element, or the ID of an element to have this Component render to a specific element upon first show.

*

This defaults to true for the {@link Ext.window.Window Window} class.

*/ autoRender: false, needsLayout: false,
/** * @cfg {Object/Array} plugins * An object or array of objects that will provide custom functionality for this component. The only * requirement for a valid plugin is that it contain an init method that accepts a reference of type Ext.Component. * When a component is created, if any plugins are available, the component will call the init method on each * plugin, passing a reference to itself. Each plugin can then call methods or respond to events on the * component as needed to provide its functionality. */
/** * Read-only property indicating whether or not the component has been rendered. * @property rendered * @type {Boolean} */ rendered: false, constructor : function(config) { var me = this, i, len; config = config || {}; me.initialConfig = config; Ext.apply(me, config); me.addEvents(
/** * @event beforeactivate * Fires before a Component has been visually activated. * Returning false from an event listener can prevent the activate * from occurring. * @param {Ext.Component} this */ 'beforeactivate',
/** * @event activate * Fires after a Component has been visually activated. * @param {Ext.Component} this */ 'activate',
/** * @event beforedeactivate * Fires before a Component has been visually deactivated. * Returning false from an event listener can prevent the deactivate * from occurring. * @param {Ext.Component} this */ 'beforedeactivate',
/** * @event deactivate * Fires after a Component has been visually deactivated. * @param {Ext.Component} this */ 'deactivate',
/** * @event added * Fires after a Component had been added to a Container. * @param {Ext.Component} this * @param {Ext.container.Container} container Parent Container * @param {Number} pos position of Component */ 'added',
/** * @event disable * Fires after the component is disabled. * @param {Ext.Component} this */ 'disable',
/** * @event enable * Fires after the component is enabled. * @param {Ext.Component} this */ 'enable',
/** * @event beforeshow * Fires before the component is shown when calling the {@link #show} method. * Return false from an event handler to stop the show. * @param {Ext.Component} this */ 'beforeshow',
/** * @event show * Fires after the component is shown when calling the {@link #show} method. * @param {Ext.Component} this */ 'show',
/** * @event beforehide * Fires before the component is hidden when calling the {@link #hide} method. * Return false from an event handler to stop the hide. * @param {Ext.Component} this */ 'beforehide',
/** * @event hide * Fires after the component is hidden. * Fires after the component is hidden when calling the {@link #hide} method. * @param {Ext.Component} this */ 'hide',
/** * @event removed * Fires when a component is removed from an Ext.container.Container * @param {Ext.Component} this * @param {Ext.container.Container} ownerCt Container which holds the component */ 'removed',
/** * @event beforerender * Fires before the component is {@link #rendered}. Return false from an * event handler to stop the {@link #render}. * @param {Ext.Component} this */ 'beforerender',
/** * @event render * Fires after the component markup is {@link #rendered}. * @param {Ext.Component} this */ 'render',
/** * @event afterrender *

Fires after the component rendering is finished.

*

The afterrender event is fired after this Component has been {@link #rendered}, been postprocesed * by any afterRender method defined for the Component, and, if {@link #stateful}, after state * has been restored.

* @param {Ext.Component} this */ 'afterrender',
/** * @event beforedestroy * Fires before the component is {@link #destroy}ed. Return false from an event handler to stop the {@link #destroy}. * @param {Ext.Component} this */ 'beforedestroy',
/** * @event destroy * Fires after the component is {@link #destroy}ed. * @param {Ext.Component} this */ 'destroy',
/** * @event resize * Fires after the component is resized. * @param {Ext.Component} this * @param {Number} adjWidth The box-adjusted width that was set * @param {Number} adjHeight The box-adjusted height that was set */ 'resize',
/** * @event move * Fires after the component is moved. * @param {Ext.Component} this * @param {Number} x The new x position * @param {Number} y The new y position */ 'move', 'beforestaterestore', 'staterestore', 'beforestatesave', 'statesave' ); me.getId(); me.mons = []; me.additionalCls = []; me.renderData = me.renderData || {}; me.renderSelectors = me.renderSelectors || {}; if (me.plugins) { me.plugins = [].concat(me.plugins); for (i = 0, len = me.plugins.length; i < len; i++) { me.plugins[i] = me.constructPlugin(me.plugins[i]); } } me.initComponent(); // ititComponent gets a chance to change the id property before registering Ext.ComponentMgr.register(me); // Dont pass the config so that it is not applied to 'this' again me.mixins.observable.constructor.call(me); // Move this into Observable? if (me.plugins) { me.plugins = [].concat(me.plugins); for (i = 0, len = me.plugins.length; i < len; i++) { me.plugins[i] = me.initPlugin(me.plugins[i]); } } me.loader = me.getLoader(); // This won't work in Touch if (me.applyTo) { me.applyToMarkup(me.applyTo); delete me.applyTo; } else if (me.renderTo) { me.render(me.renderTo); } // if (Ext.isDefined(me.disabledClass)) { throw "Component: disabledClass has been deprecated. Please use disabledCls."; } // }, initComponent: Ext.emptyFn, applyToMarkup: Ext.emptyFn, show: Ext.emptyFn, onShow : function() { // Layout if needed var needsLayout = this.needsLayout; if (Ext.isObject(needsLayout)) { this.doComponentLayout(needsLayout.width, needsLayout.height, needsLayout.isSetSize, needsLayout.ownerCt); } }, constructPlugin: function(plugin) { if (plugin.ptype && typeof plugin.init != 'function') { plugin.cmp = this; plugin = Ext.PluginMgr.create(plugin); } else if (typeof plugin == 'string') { plugin = Ext.PluginMgr.create({ ptype: plugin, cmp: this }); } return plugin; }, // @private initPlugin : function(plugin) { plugin.init(this); return plugin; },
/** * Handles autoRender. * Floating Components may have an ownerCt. If they are asking to be constrained, constrain them within that * ownerCt, and have their z-index managed locally. Floating Components are always rendered to document.body */ doAutoRender: function() { var me = this; if (me.floating) { me.render(document.body); } else { me.render(Ext.isBoolean(me.autoRender) ? Ext.getBody() : me.autoRender); } }, /** * @private *

Finds the ancestor Container responsible for allocating zIndexes for the passed Component.

*

That will be the outermost Container (a Container which has no ownerCt).

*

If we have no ancestors, or we walk all the way up to the document body, there's no zIndexParent, * and the global Ext.WindowMgr will be used.

*/ getZIndexParent: function() { var p = this.ownerCt, c; if (p) { while (p) { c = p; p = p.ownerCt; } if (c.el.dom !== document.body) { return c; } } }, // @private render : function(container, position) { var me = this; if (!me.rendered && me.fireEvent('beforerender', me) !== false) { // If this.el is defined, we want to make sure we are dealing with // an Ext Element. if (me.el) { me.el = Ext.get(me.el); } // Floaters must register with a ZIndexManager at render time when the ownerCt chain is complete if (me.floating) { me.zIndexParent = me.getZIndexParent(); me.floatParent = me.ownerCt; delete me.ownerCt; // If a floating Component is configured to be constrained, but has no configured // constrainTo setting, set its constrainTo to be it's ownerCt before rendering. if ((me.constrain || me.constrainHeader) && !me.constrainTo) { me.constrainTo = me.floatParent ? me.floatParent.getTargetEl() : Ext.getBody(); } if (me.zIndexParent) { me.zIndexParent.registerFloatingItem(me); } else { Ext.WindowMgr.register(me); } } container = me.initContainer(container); me.onRender(container, position); // Tell the encapsulating element to hide itself in the way the Component is configured to hide // This means DISPLAY, VISIBILITY or OFFSETS. me.el.setVisibilityMode(Ext.core.Element[me.hideMode.toUpperCase()]); if(me.overCls){ me.el.addClsOnOver(me.overCls); } me.fireEvent('render', me); me.initContent(); me.afterRender(container); me.fireEvent('afterrender', me); me.initEvents(); if (me.autoShow) { me.show(); } if (me.hidden) { // call this so we don't fire initial hide events. me.onHide(false); // no animation after render } if (me.disabled) { // pass silent so the event doesn't fire the first time. me.disable(true); } } return me; }, // @private onRender : function(container, position) { var el = this.el, renderTpl, renderData; position = this.getInsertPosition(position); if (!el) { if (position) { el = Ext.core.DomHelper.insertBefore(position, this.getElConfig(), true); } else { el = Ext.core.DomHelper.append(container, this.getElConfig(), true); } } else if (this.allowDomMove !== false) { if (position) { container.dom.insertBefore(el.dom, position); } else { container.dom.appendChild(el.dom); } } el.addCls(this.initCls()); el.setStyle(this.initStyles()); // Here we check if the component has a height set through style or css. // If it does then we set the this.height to that value and it won't be // considered an auto height component // if (this.height === undefined) { // var height = el.getHeight(); // // This hopefully means that the panel has an explicit height set in style or css // if (height - el.getPadding('tb') - el.getBorderWidth('tb') > 0) { // this.height = height; // } // } this.el = el; if (!Ext.supports.CSS3BorderRadius) { this.initFrame(); } renderTpl = this.initRenderTpl(); if (renderTpl) { renderData = this.initRenderData(); renderTpl.append(this.getTargetEl(), renderData); } this.applyRenderSelectors(); this.rendered = true; }, // @private afterRender : function() { var me = this, pos, xy; me.getComponentLayout(); // Set the configured size. me.setSize(me.width, me.height); // For floaters, calculate x and y if they aren't defined by aligning // the sized element to the center of either the the container or the ownerCt if (me.floating && (me.x === undefined || me.y === undefined)) { if (me.floatParent) { xy = me.el.getAlignToXY(me.floatParent.getTargetEl(), 'c-c'); pos = me.floatParent.getTargetEl().translatePoints(xy[0], xy[1]); } else { xy = me.el.getAlignToXY(me.container, 'c-c'); pos = me.el.translatePoints(xy[0], xy[1]); } me.x = me.x === undefined ? pos.left: me.x; me.y = me.y === undefined ? pos.top: me.y; } if (me.x || me.y) { me.setPosition(me.x, me.y); } if (me.styleHtmlContent) { me.getTargetEl().addCls(me.styleHtmlCls); } }, frameCls: Ext.baseCSSPrefix + 'frame', frameTpl: [ '', '', '', '', '', '', '' ], frameTableTpl: [ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '' ], initFrame : function() { var frameBaseCls = this.baseCls + (this.ui ? '-' + this.ui : ''), info = this.el.getStyle('background-image'), frameWidth = 0, frameSize, frameRenderTarget, frameTpl, isTable, radius; // We actually pass a string in the form of 'type-internal-radius-framesize-tl-tr-br-bl' as // the background image of this.el from the css to indicate to IE that this component needs // framing. We parse it here and change the markup accordingly. if (info && info.indexOf('internal-radius-') != -1) { if (info.indexOf('table') != -1) { // If we are going to be using a table for framing, we are going to replace // this.el with a table. this.el.replaceWith({ tag: 'table', id: this.el.id, html: '' }); // We have to reapply the classes and styling to the table this.el.addCls(this.initCls()); this.el.setStyle(this.initStyles()); // The true makes sure we get the table framing frameTpl = this.getFrameTpl(true); // The render target for the frame now becomes the tbody instead of this.getTargetEl frameRenderTarget = this.el.down('tbody'); } else { frameTpl = this.getFrameTpl(); frameRenderTarget = this.getTargetEl(); } // Get and parse the different border radius sizes radius = info.match(/internal\-radius\-([0-9]{1,2})\-([0-9]{1,2})\-([0-9]{1,2})\-([0-9]{1,2})\-([0-9]{1,2})/); frameWidth = parseInt(radius[1], 10); frameSize = { top: Math.max(radius[2], radius[3]), right: Math.max(radius[3], radius[4]), bottom: Math.max(radius[4], radius[5]), left: Math.max(radius[5], radius[2]) }; // Just to be sure we set the background image of the el to none. this.el.setStyle('background-image', 'none'); } // This happens when you set frame: true explicitly without using the x-frame mixin in sass. // This way IE can't figure out what sizes to use and thus framing can't work. if (this.frame === true && !radius) { // throw new Error("[" + Ext.getClassName(this) + "#initFrame] You have set frame: true explicity on this component " + "while it doesnt have any framing in sass. This way IE can't figure out what sizes to use and thus framing" + "on this component will be disabled"); // } this.frame = this.frame || !!frameWidth; this.frameSize = frameSize || false; if (this.frame) { // if (!frameSize) { throw new Error("[" + Ext.getClassName(this) + "#initFrame] Unable to read background-image style " + "(got '" + info + "') of element: " + this.el.dom.outerHTML + " to handle framing."); } // // Here we render the frameTpl to this component. This inserts the 9point div or the table framing. frameTpl.append(frameRenderTarget, { frameCls: this.frameCls, baseCls: frameBaseCls, frameWidth: frameWidth, top: !!frameSize.top, left: !!frameSize.left, right: !!frameSize.right, bottom: !!frameSize.bottom, tl: (frameWidth * 2), tr: (frameWidth * 3), bl: (frameWidth * 4), br: (frameWidth * 5) }); // The frameBody is returned in getTargetEl, so that layouts render items to the correct target. this.frameBody = this.el.down('.' + frameBaseCls + '-mc'); } }, getFrameTpl : function(table) { var frameTpl = table ? this.frameTableTpl : this.frameTpl; if (Ext.isArray(frameTpl) || typeof frameTpl === "string") { frameTpl = new Ext.XTemplate(frameTpl); } return frameTpl; }, /** *

Creates an array of class names from the configurations to add to this Component's el on render.

*

Private, but (possibly) used by ComponentQuery for selection by class name if Component is not rendered.

* @return {Array} An array of class names with which the Component's element will be rendered. * @private */ initCls: function() { var cls = [ this.baseCls ]; // if (Ext.isDefined(this.cmpCls)) { throw "Ext.Component: cmpCls renamed to componentCls"; } // if (this.componentCls) { cls.push(this.componentCls); } else { this.componentCls = this.baseCls; } if (this.cls) { cls.push(this.cls); delete this.cls; } if (this.ui) { cls.push(this.componentCls + '-' + this.ui); } if (this.frame) { cls.push('x-framed ' + this.baseCls + '-' + (this.ui ? this.ui + '-' : '') + 'framed'); } return cls.concat(this.additionalCls); }, getElConfig : function() { var result = this.autoEl || {tag: 'div'}; result.id = this.id; return result; },
/** * This function takes the position argument passed to onRender and returns a * DOM element that you can use in the insertBefore. * @param {String/Number/Element/HTMLElement} position Index, element id or element you want * to put this component before. * @return {HTMLElement} DOM element that you can use in the insertBefore */ getInsertPosition: function(position) { // Convert the position to an element to insert before if (position !== undefined) { if (Ext.isNumber(position)) { position = this.container.dom.childNodes[position]; } else { position = Ext.getDom(position); } } return position; }, /** * Adds ctCls to container. * @return {Ext.core.Element} The initialized container * @private */ initContainer: function(container) { // If you render a component specifying the el, we get the container // of the el, and make sure we dont move the el around in the dom // during the render if (!container && this.el) { container = this.el.dom.parentNode; this.allowDomMove = false; } this.container = Ext.get(container); if (this.ctCls) { this.container.addCls(this.ctCls); } return this.container; }, /** * Initialized the renderData to be used when rendering the renderTpl. * @return {Object} Object with keys and values that are going to be applied to the renderTpl * @private */ initRenderData: function() { return Ext.applyIf(this.renderData, { ui: this.ui, baseCls: this.baseCls, componentCls: this.componentCls, frame: this.frame }); }, /** * Initializes the renderTpl. * @return {Ext.XTemplate} The renderTpl XTemplate instance. * @private */ initRenderTpl: function() { var renderTpl = this.renderTpl, prototype = Ext.AbstractComponent.prototype; if (renderTpl) { if (prototype.renderTpl !== renderTpl) { if (Ext.isArray(renderTpl) || typeof renderTpl === "string") { renderTpl = new Ext.XTemplate(renderTpl); } } else if (Ext.isArray(prototype.renderTpl)){ renderTpl = prototype.renderTpl = new Ext.XTemplate(renderTpl); } } return renderTpl; }, /** * Function description * @return {String} A CSS style string with style, padding, margin and border. * @private */ initStyles: function() { var style = {}, Element = Ext.core.Element, i, ln, split, prop; if (Ext.isString(this.style)) { split = this.style.split(';'); for (i = 0, ln = split.length; i < ln; i++) { if (!Ext.isEmpty(split[i])) { prop = split[i].split(':'); style[Ext.String.trim(prop[0])] = Ext.String.trim(prop[1]); } } } else { style = Ext.apply({}, this.style); } // Convert the padding, margin and border properties from a space seperated string // into a proper style string if (this.padding != undefined) { style.padding = Element.unitizeBox((this.padding === true) ? 5 : this.padding); } if (this.margin != undefined) { style.margin = Element.unitizeBox((this.margin === true) ? 5 : this.margin); } if (this.border != undefined) { style.borderWidth = Element.unitizeBox((this.border === true) ? 1 : this.border); } delete this.style; return style; }, /** * Initializes this components contents. It checks for the properties * html, contentEl and tpl/data. * @private */ initContent: function() { var target = this.getTargetEl(); if (this.html) { target.update(Ext.core.DomHelper.markup(this.html)); delete this.html; } if (this.contentEl) { var contentEl = Ext.get(this.contentEl), pre = Ext.baseCSSPrefix; contentEl.removeCls([pre + 'hidden', pre + 'hide-display', pre + 'hide-offsets', pre + 'hide-nosize']); target.appendChild(contentEl.dom); } if (this.tpl) { // Make sure this.tpl is an instantiated XTemplate if (!this.tpl.isTemplate) { this.tpl = new Ext.XTemplate(this.tpl); } if (this.data) { this.tpl[this.tplWriteMode](target, this.data); delete this.data; } } }, // @private initEvents : function() { var afterRenderEvents = this.afterRenderEvents, property, listeners; if (afterRenderEvents) { for (property in afterRenderEvents) { if (!afterRenderEvents.hasOwnProperty(property)) { continue; } listeners = afterRenderEvents[property]; if (this[property] && this[property].on) { this.mon(this[property], listeners); } } } }, /** * Sets references to elements inside the component. E.g body -> x-panel-body * @private */ applyRenderSelectors: function() { var selectors = this.renderSelectors || {}, el = this.el.dom, selector; for (selector in selectors) { if (!selectors.hasOwnProperty(selector) || !selectors[selector]) { continue; } this[selector] = Ext.get(Ext.DomQuery.selectNode(selectors[selector], el)); } }, is: function(selector) { return Ext.ComponentQuery.is(this, selector); },
/** *

Walks up the ownerCt axis looking for an ancestor Container which matches * the passed simple selector.

*

Example:


var owningTabContainer = grid.up('tabcontainer');
* @param {String} selector Optional. The simple selector to test. * @return {Ext.container.Container} The matching ancestor Container (or undefined if no match was found). */ up: function(selector) { var result = this.ownerCt; if (selector) { for (; result; result = result.ownerCt) { if (Ext.ComponentQuery.is(result, selector)) { return result; } } } return result; },
/** *

Returns the next sibling of this Component.

*

Optionally selects the next sibling which matches the passed {@link Ext.ComponentQuery ComponentQuery} selector.

*

May also be refered to as prev()

* @param selector Optional. A {@link Ext.ComponentQuery ComponentQuery} selector to filter the following items. * @returns The next sibling (or the next sibling which matches the selector). Returns null if there is no matching sibling. */ nextSibling: function(selector) { var o = this.ownerCt, it, last, idx, c; if (o) { it = o.items; idx = it.indexOf(this) + 1; if (idx) { if (selector) { for (last = it.getCount(); idx < last; idx++) { if ((c = it.getAt(idx)).is(selector)) { return c; } } } else { if (idx < it.getCount()) { return it.getAt(idx); } } } } return null; },
/** *

Returns the previous sibling of this Component.

*

Optionally selects the previous sibling which matches the passed {@link Ext.ComponentQuery ComponentQuery} selector.

*

May also be refered to as prev()

* @param selector Optional. A {@link Ext.ComponentQuery ComponentQuery} selector to filter the preceding items. * @returns The previous sibling (or the previous sibling which matches the selector). Returns null if there is no matching sibling. */ previousSibling: function(selector) { var o = this.ownerCt, it, idx, c; if (o) { it = o.items; idx = it.indexOf(this); if (idx != -1) { if (selector) { for (--idx; idx >= 0; idx--) { if ((c = it.getAt(idx)).is(selector)) { return c; } } } else { if (idx) { return it.getAt(--idx); } } } } return null; },
/** * Retrieves the id of this component. * Will autogenerate an id if one has not already been set. */ getId : function() { return this.id || (this.id = 'ext-comp-' + (this.getAutoId())); }, getItemId : function() { return this.itemId || this.id; },
/** * Retrieves the top level element representing this component. */ getEl : function() { return this.el; }, /** * This is used to determine where to insert the 'html', 'contentEl' and 'items' in this component. * @private */ getTargetEl: function() { return this.frameBody || this.el; },
/** *

Tests whether or not this Component is of a specific xtype. This can test whether this Component is descended * from the xtype (default) or whether it is directly of the xtype specified (shallow = true).

*

If using your own subclasses, be aware that a Component must register its own xtype * to participate in determination of inherited xtypes.

*

For a list of all available xtypes, see the {@link Ext.Component} header.

*

Example usage:

*

var t = new Ext.form.Text();
var isText = t.isXType('textfield');        // true
var isBoxSubclass = t.isXType('field');       // true, descended from Ext.form.Field
var isBoxInstance = t.isXType('field', true); // false, not a direct Ext.form.Field instance
* @param {String} xtype The xtype to check for this Component * @param {Boolean} shallow (optional) False to check whether this Component is descended from the xtype (this is * the default), or true to check whether this Component is directly of the specified xtype. * @return {Boolean} True if this component descends from the specified xtype, false otherwise. */ isXType: function(xtype, shallow) { //assume a string by default if (Ext.isFunction(xtype)) { xtype = xtype.xtype; //handle being passed the class, e.g. Ext.Component } else if (Ext.isObject(xtype)) { xtype = xtype.statics().xtype; //handle being passed an instance } return !shallow ? ('/' + this.getXTypes() + '/').indexOf('/' + xtype + '/') != -1: this.self.xtype == xtype; },
/** *

Returns this Component's xtype hierarchy as a slash-delimited string. For a list of all * available xtypes, see the {@link Ext.Component} header.

*

If using your own subclasses, be aware that a Component must register its own xtype * to participate in determination of inherited xtypes.

*

Example usage:

*

var t = new Ext.form.Text();
alert(t.getXTypes());  // alerts 'component/field/textfield'
* @return {String} The xtype hierarchy string */ getXTypes: function() { var self = this.self, xtypes = [], parentPrototype = this, xtype; if (!self.xtypes) { while (parentPrototype && Ext.getClass(parentPrototype)) { xtype = Ext.getClass(parentPrototype).xtype; if (xtype !== undefined) { xtypes.unshift(xtype); } parentPrototype = parentPrototype.superclass; } self.xtypeChain = xtypes; self.xtypes = xtypes.join('/'); } return self.xtypes; },
/** * Update the content area of a component. * @param {Mixed} htmlOrData * If this component has been configured with a template via the tpl config * then it will use this argument as data to populate the template. * If this component was not configured with a template, the components * content area will be updated via Ext.core.Element update * @param {Boolean} loadScripts * (optional) Only legitimate when using the html configuration. Defaults to false * @param {Function} callback * (optional) Only legitimate when using the html configuration. Callback to execute when scripts have finished loading */ update : function(htmlOrData, loadScripts, cb) { if (this.tpl && !Ext.isString(htmlOrData)) { this.data = htmlOrData; if (this.rendered) { this.tpl[this.tplWriteMode](this.getTargetEl(), htmlOrData || {}); } } else { this.html = Ext.isObject(htmlOrData) ? Ext.core.DomHelper.markup(htmlOrData) : htmlOrData; if (this.rendered) { this.getTargetEl().update(this.html, loadScripts, cb); } } if (this.rendered) { this.doComponentLayout(); } },
/** * Convenience function to hide or show this component by boolean. * @param {Boolean} visible True to show, false to hide * @return {Ext.Component} this */ setVisible : function(visible) { return this[visible ? 'show': 'hide'](); },
/** * Returns true if this component is visible. * @param {Boolean} deep.

Optional. Pass true to interrogate the visibility status of all * parent Containers to determine whether this Component is truly visible to the user.

*

Generally, to determine whether a Component is hidden, the no argument form is needed. For example * when creating dynamically laid out UIs in a hidden Container before showing them.

* @return {Boolean} True if this component is visible, false otherwise. */ isVisible: function(deep) { var me = this, child = me, visible = !me.hidden, ancestor = me.ownerCt; // Clear hiddenOwnerCt property me.hiddenAncestor = false; if (me.destroyed) { return false; } if (deep && visible && me.rendered && ancestor) { while (ancestor) { // If any ancestor is hidden, then this is hidden. // If an ancestor Panel (only Panels have a collapse method) is collapsed, // then its layoutTarget (body) is hidden, so this is hidden unless its within a // docked item; they are still visible when collapsed (Unless they themseves are hidden) if (ancestor.hidden || (ancestor.collapsed && !(ancestor.getDockedItems && Ext.Array.contains(ancestor.getDockedItems(), child)))) { // Store hiddenOwnerCt property if needed me.hiddenAncestor = ancestor; visible = false; break; } child = ancestor; ancestor = ancestor.ownerCt; } } return visible; },
/** * Enable the component * @param {Boolean} silent * Passing false will supress the 'enable' event from being fired. */ enable : function(silent) { if (this.rendered) { this.el.removeCls(this.disabledCls); this.el.dom.disabled = false; this.onEnable(); } this.disabled = false; if (silent !== true) { this.fireEvent('enable', this); } return this; },
/** * Disable the component. * @param {Boolean} silent * Passing true, will supress the 'disable' event from being fired. */ disable : function(silent) { if (this.rendered) { this.el.addCls(this.disabledCls); this.el.dom.disabled = true; this.onDisable(); } this.disabled = true; if (silent !== true) { this.fireEvent('disable', this); } return this; },
/** * Method to determine whether this Component is currently disabled. * @return {Boolean} the disabled state of this Component. */ isDisabled : function() { return this.disabled; },
/** * Enable or disable the component. * @param {Boolean} disabled */ setDisabled : function(disabled) { return this[disabled ? 'disable': 'enable'](); },
/** * Method to determine whether this Component is currently set to hidden. * @return {Boolean} the hidden state of this Component. */ isHidden : function() { return this.hidden; },
/** * Adds a CSS class to the top level element representing this component. * @returns {Ext.Component} Returns the Component to allow method chaining. */ addCls : function() { var me = this, args = Ext.Array.toArray(arguments); if (me.rendered) { me.el.addCls(args); } else { me.additionalCls = Ext.Array.unique(me.additionalCls.concat(args)); } return me; }, // addClass : function() { throw "Component: addClass has been deprecated. Please use addCls."; }, //
/** * Removes a CSS class from the top level element representing this component. * @returns {Ext.Component} Returns the Component to allow method chaining. */ removeCls : function() { var me = this, args = Ext.Array.toArray(arguments); if (me.rendered) { me.el.removeCls(args); } else if (me.additionalCls.length) { Ext.each(args, function(cls) { Ext.Array.remove(me.additionalCls, cls); }); } return me; }, // removeClass : function() { throw "Component: removeClass has been deprecated. Please use removeCls."; }, // addListener : function(element, listeners, scope, options) { if (Ext.isString(element) && (Ext.isObject(listeners) || options && options.element)) { if (options.element) { var fn = listeners, option; listeners = {}; listeners[element] = fn; element = options.element; if (scope) { listeners.scope = scope; } for (option in options) { if (!options.hasOwnProperty(option)) { continue; } if (this.eventOptionsRe.test(option)) { listeners[option] = options[option]; } } } // At this point we have a variable called element, // and a listeners object that can be passed to on if (this[element] && this[element].on) { this.mon(this[element], listeners); } else { this.afterRenderEvents = this.afterRenderEvents || {}; this.afterRenderEvents[element] = listeners; } } return this.mixins.observable.addListener.apply(this, arguments); }, // @TODO: implement removelistener to support the dom event stuff
/** * Provides the link for Observable's fireEvent method to bubble up the ownership hierarchy. * @return {Ext.container.Container} the Container which owns this Component. */ getBubbleTarget : function() { return this.ownerCt; },
/** * Method to determine whether this Component is floating. * @return {Boolean} the floating state of this component. */ isFloating : function() { return this.floating; },
/** * Method to determine whether this Component is draggable. * @return {Boolean} the draggable state of this component. */ isDraggable : function() { return !!this.draggable; },
/** * Method to determine whether this Component is droppable. * @return {Boolean} the droppable state of this component. */ isDroppable : function() { return !!this.droppable; }, /** * @private * Method to manage awareness of when components are added to their * respective Container, firing an added event. * References are established at add time rather than at render time. * @param {Ext.container.Container} container Container which holds the component * @param {number} pos Position at which the component was added */ onAdded : function(container, pos) { this.ownerCt = container; this.fireEvent('added', this, container, pos); }, /** * @private * Method to manage awareness of when components are removed from their * respective Container, firing an removed event. References are properly * cleaned up after removing a component from its owning container. */ onRemoved : function() { this.fireEvent('removed', this, this.ownerCt); delete this.ownerCt; }, // @private onEnable : Ext.emptyFn, // @private onDisable : Ext.emptyFn, // @private beforeDestroy : Ext.emptyFn, // @private // @private onResize : Ext.emptyFn,
/** * Sets the width and height of this Component. This method fires the {@link #resize} event. This method can accept * either width and height as separate arguments, or you can pass a size object like {width:10, height:20}. * @param {Mixed} width The new width to set. This may be one of:
* @param {Mixed} height The new height to set (not required if a size object is passed as the first arg). * This may be one of:
* @return {Ext.Component} this */ setSize : function(width, height) { // support for standard size objects if (Ext.isObject(width)) { height = width.height; width = width.width; } // Constrain within configured maxima if (Ext.isNumber(width)) { width = Ext.Number.constrain(width, this.minWidth, this.maxWidth); } if (Ext.isNumber(height)) { height = Ext.Number.constrain(height, this.minHeight, this.maxHeight); } if (!this.rendered || !this.isVisible()) { // If an ownerCt is hidden, add my reference onto the layoutOnShow stack. Set the needsLayout flag. if (this.hiddenAncestor) { var layoutCollection = this.hiddenAncestor.layoutOnShow; layoutCollection.remove(this); layoutCollection.add(this); } this.needsLayout = { width: width, height: height, isSetSize: true }; if (!this.rendered) { this.width = (width !== undefined) ? width : this.width; this.height = (height !== undefined) ? height : this.height; } return this; } this.doComponentLayout(width, height, true); return this; }, setCalculatedSize : function(width, height, ownerCt) { // support for standard size objects if (Ext.isObject(width)) { ownerCt = width.ownerCt; height = width.height; width = width.width; } // Constrain within configured maxima if (Ext.isNumber(width)) { width = Ext.Number.constrain(width, this.minWidth, this.maxWidth); } if (Ext.isNumber(height)) { height = Ext.Number.constrain(height, this.minHeight, this.maxHeight); } if (!this.rendered || !this.isVisible()) { // If an ownerCt is hidden, add my reference onto the layoutOnShow stack. Set the needsLayout flag. if (this.hiddenAncestor) { var layoutCollection = this.hiddenAncestor.layoutOnShow; layoutCollection.remove(this); layoutCollection.add(this); } this.needsLayout = { width: width, height: height, isSetSize: false, ownerCt: ownerCt }; return this; } this.doComponentLayout(width, height, false, ownerCt); return this; },
/** * This method needs to be called whenever you change something on this component that requires the components * layout to be recalculated. * @return {Ext.container.Container} this */ doComponentLayout : function(width, height, isSetSize, ownerCt) { var componentLayout = this.getComponentLayout(); // collapsed state is not relevant here, so no testing done. // Only Panels have a collapse method, and that just sets the width/height such that only // docked items parallel to the collapseTo side are visible, and the Panel body is hidden. if (this.rendered && componentLayout) { width = (width !== undefined) ? width : this.width; height = (height !== undefined) ? height : this.height; if (isSetSize) { this.width = width; this.height = height; } componentLayout.layout(width, height, isSetSize, ownerCt); } return this; }, // @private setComponentLayout : function(layout) { var currentLayout = this.componentLayout; if (currentLayout && currentLayout.isLayout && currentLayout != layout) { currentLayout.setOwner(null); } this.componentLayout = layout; layout.setOwner(this); }, getComponentLayout : function() { if (!this.componentLayout || !this.componentLayout.isLayout) { this.setComponentLayout(Ext.layout.Manager.create(this.componentLayout, 'autocomponent')); } return this.componentLayout; },
/** * @param {Ext.Component} this * @param {Number} adjWidth The box-adjusted width that was set * @param {Number} adjHeight The box-adjusted height that was set */ afterComponentLayout: function(width, height) { this.fireEvent('resize', this, width, height); },
/** * Sets the left and top of the component. To set the page XY position instead, use {@link #setPagePosition}. * This method fires the {@link #move} event. * @param {Number} left The new left * @param {Number} top The new top * @return {Ext.Component} this */ setPosition : function(x, y) { if (Ext.isObject(x)) { y = x.y; x = x.x; } if (!this.rendered) { return this; } if (x !== undefined || y !== undefined) { this.el.setBox(x, y); this.onPosition(x, y); this.fireEvent('move', this, x, y); } return this; }, /* @private * Called after the component is moved, this method is empty by default but can be implemented by any * subclass that needs to perform custom logic after a move occurs. * @param {Number} x The new x position * @param {Number} y The new y position */ onPosition: Ext.emptyFn,
/** * Sets the width of the component. This method fires the {@link #resize} event. * @param {Number} width The new width to setThis may be one of:
* @return {Ext.Component} this */ setWidth : function(width) { return this.setSize(width); },
/** * Sets the height of the component. This method fires the {@link #resize} event. * @param {Number} height The new height to set. This may be one of:
* @return {Ext.Component} this */ setHeight : function(height) { return this.setSize(undefined, height); },
/** * Gets the current size of the component's underlying element. * @return {Object} An object containing the element's size {width: (element width), height: (element height)} */ getSize : function() { return this.el.getSize(); },
/** * Gets the current width of the component's underlying element. * @return {Number} */ getWidth : function() { return this.el.getWidth(); },
/** * Gets the current height of the component's underlying element. * @return {Number} */ getHeight : function() { return this.el.getHeight(); },
/** * Gets the {@link Ext.ComponentLoader} for this Component. * @return {Ext.ComponentLoader} The loader instance, null if it doesn't exist. */ getLoader: function(){ var autoLoad = this.autoLoad ? (Ext.isObject(this.autoLoad) ? this.autoLoad : {url: this.autoLoad}) : null, loader = this.loader || autoLoad; if (loader) { if (!loader.isLoader) { this.loader = Ext.create('Ext.ComponentLoader', Ext.apply({ target: this, autoLoad: autoLoad }, loader)); } else { loader.setTarget(this); } return this.loader; } return null; },
/** * This method allows you to show or hide a LoadMask on top of this component. * @param {Boolean/Object} load True to show the default LoadMask or a config object * that will be passed to the LoadMask constructor. False to hide the current LoadMask. * @param {Boolean} targetEl True to mask the targetEl of this Component instead of the this.el. * For example, setting this to true on a Panel will cause only the body to be masked. (defaults to false) * @return {Ext.LoadMask} The LoadMask instance that has just been shown. */ setLoading : function(load, targetEl) { if (this.rendered) { if (load !== false) { this.loadMask = this.loadMask || new Ext.LoadMask(targetEl ? this.getTargetEl() : this.el, Ext.applyIf(Ext.isObject(load) ? load : {})); this.loadMask.show(); } else { Ext.destroy(this.loadMask); this.loadMask = null; } } return this.loadMask; },
/** * Sets the dock position of this component in its parent panel. Note that * this only has effect if this item is part of the dockedItems collection * of a parent that has a DockLayout (note that any Panel has a DockLayout * by default) * @return {Component} this */ setDocked : function(dock, layoutParent) { this.dock = dock; if (layoutParent && this.ownerCt && this.rendered) { this.ownerCt.doComponentLayout(); } return this; }, onDestroy : function() { if (this.monitorResize && Ext.EventManager.resizeEvent) { Ext.EventManager.resizeEvent.removeListener(this.setSize, this); } Ext.destroy(this.componentLayout, this.loadMask); },
/** * Destroys the Component. */ destroy : function() { if (!this.isDestroyed) { if (this.fireEvent('beforedestroy', this) !== false) { this.destroying = true; this.beforeDestroy(); if (this.ownerCt && this.ownerCt.remove) { this.ownerCt.remove(this, false); } if (this.rendered) { this.el.remove(); } this.onDestroy(); Ext.ComponentMgr.unregister(this); this.fireEvent('destroy', this); this.clearListeners(); this.destroying = false; this.isDestroyed = true; } } },
/** * Retrieves a plugin by its pluginId which has been bound to this * component. * @returns {Ext.AbstractPlugin} pluginInstance */ getPlugin: function(pluginId) { var i = 0, plugins = this.plugins, ln = plugins.length; for (; i < ln; i++) { if (plugins[i].pluginId === pluginId) { return plugins[i]; } } } }, function() { this.createAlias({ on: 'addListener', prev: 'previousSibling', next: 'nextSibling' }); });