4 * Copyright(c) 2006-2007, Ext JS, LLC.
6 * Originally Released Under LGPL - original licence link has changed is not relivant.
9 * <script type="text/javascript">
13 * @class Roo.Component
14 * @extends Roo.util.Observable
15 * Base class for all major Roo components. All subclasses of Component can automatically participate in the standard
16 * Roo component lifecycle of creation, rendering and destruction. They also have automatic support for basic hide/show
17 * and enable/disable behavior. Component allows any subclass to be lazy-rendered into any {@link Roo.Container} and
18 * to be automatically registered with the {@link Roo.ComponentMgr} so that it can be referenced at any time via {@link Roo.getCmp}.
19 * All visual components (widgets) that require rendering into a layout should subclass Component.
21 * @param {Roo.Element/String/Object} config The configuration options. If an element is passed, it is set as the internal
22 * element and its id used as the component id. If a string is passed, it is assumed to be the id of an existing element
23 * and is used as the component id. Otherwise, it is assumed to be a standard config object and is applied to the component.
25 Roo.Component = function(config){
26 config = config || {};
27 if(config.tagName || config.dom || typeof config == "string"){ // element object
28 config = {el: config, id: config.id || config};
30 this.initialConfig = config;
32 Roo.apply(this, config);
36 * Fires after the component is disabled.
37 * @param {Roo.Component} this
42 * Fires after the component is enabled.
43 * @param {Roo.Component} this
48 * Fires before the component is shown. Return false to stop the show.
49 * @param {Roo.Component} this
54 * Fires after the component is shown.
55 * @param {Roo.Component} this
60 * Fires before the component is hidden. Return false to stop the hide.
61 * @param {Roo.Component} this
66 * Fires after the component is hidden.
67 * @param {Roo.Component} this
72 * Fires before the component is rendered. Return false to stop the render.
73 * @param {Roo.Component} this
78 * Fires after the component is rendered.
79 * @param {Roo.Component} this
83 * @event beforedestroy
84 * Fires before the component is destroyed. Return false to stop the destroy.
85 * @param {Roo.Component} this
90 * Fires after the component is destroyed.
91 * @param {Roo.Component} this
96 this.id = "roo-comp-" + (++Roo.Component.AUTO_ID);
98 Roo.ComponentMgr.register(this);
99 Roo.Component.superclass.constructor.call(this);
100 this.initComponent();
101 if(this.renderTo){ // not supported by all components yet. use at your own risk!
102 this.render(this.renderTo);
103 delete this.renderTo;
108 Roo.Component.AUTO_ID = 1000;
110 Roo.extend(Roo.Component, Roo.util.Observable, {
112 * @scope Roo.Component.prototype
114 * true if this component is hidden. Read-only.
119 * true if this component is disabled. Read-only.
124 * true if this component has been rendered. Read-only.
128 /** @cfg {String} disableClass
129 * CSS class added to the component when it is disabled (defaults to "x-item-disabled").
131 disabledClass : "x-item-disabled",
132 /** @cfg {Boolean} allowDomMove
133 * Whether the component can move the Dom node when rendering (defaults to true).
136 /** @cfg {String} hideMode (display|visibility)
137 * How this component should hidden. Supported values are
138 * "visibility" (css visibility), "offsets" (negative offset position) and
139 * "display" (css display) - defaults to "display".
144 ctype : "Roo.Component",
147 * @cfg {String} actionMode
148 * which property holds the element that used for hide() / show() / disable() / enable()
149 * default is 'el' for forms you probably want to set this to fieldEl
154 * @cfg {String} style
155 * css styles to add to component
156 * eg. text-align:right;
161 getActionEl : function(){
162 return this[this.actionMode];
165 initComponent : Roo.emptyFn,
167 * If this is a lazy rendering component, render it to its container element.
168 * @param {String/HTMLElement/Element} container (optional) The element this component should be rendered into. If it is being applied to existing markup, this should be left off.
170 render : function(container, position){
172 Roo.log('render ' + this.xtype);
173 Roo.log(this.rendered);
178 if(this.fireEvent("beforerender", this) === false){
182 if(!container && this.el){
183 this.el = Roo.get(this.el);
184 container = this.el.dom.parentNode;
185 this.allowDomMove = false;
187 this.container = Roo.get(container);
188 this.rendered = true;
189 if(position !== undefined){
190 if(typeof position == 'number'){
191 position = this.container.dom.childNodes[position];
193 position = Roo.getDom(position);
196 this.onRender(this.container, position || null);
198 this.el.addClass(this.cls);
202 this.el.applyStyles(this.style);
205 this.fireEvent("render", this);
206 this.afterRender(this.container);
219 // default function is not really useful
220 onRender : function(ct, position){
222 this.el = Roo.get(this.el);
223 if(this.allowDomMove !== false){
224 ct.dom.insertBefore(this.el.dom, position);
230 getAutoCreate : function(){
231 var cfg = typeof this.autoCreate == "object" ?
232 this.autoCreate : Roo.apply({}, this.defaultAutoCreate);
233 if(this.id && !cfg.id){
240 afterRender : Roo.emptyFn,
243 * Destroys this component by purging any event listeners, removing the component's element from the DOM,
244 * removing the component from its {@link Roo.Container} (if applicable) and unregistering it from {@link Roo.ComponentMgr}.
246 destroy : function(){
247 if(this.fireEvent("beforedestroy", this) !== false){
248 this.purgeListeners();
249 this.beforeDestroy();
251 this.el.removeAllListeners();
253 if(this.actionMode == "container"){
254 this.container.remove();
258 Roo.ComponentMgr.unregister(this);
259 this.fireEvent("destroy", this);
264 beforeDestroy : function(){
269 onDestroy : function(){
274 * Returns the underlying {@link Roo.Element}.
275 * @return {Roo.Element} The element
282 * Returns the id of this component.
290 * Try to focus this component.
291 * @param {Boolean} selectText True to also select the text in this component (if applicable)
292 * @return {Roo.Component} this
294 focus : function(selectText){
297 if(selectText === true){
298 this.el.dom.select();
313 * Disable this component.
314 * @return {Roo.Component} this
316 disable : function(){
320 this.disabled = true;
321 this.fireEvent("disable", this);
326 onDisable : function(){
327 this.getActionEl().addClass(this.disabledClass);
328 this.el.dom.disabled = true;
332 * Enable this component.
333 * @return {Roo.Component} this
339 this.disabled = false;
340 this.fireEvent("enable", this);
345 onEnable : function(){
346 this.getActionEl().removeClass(this.disabledClass);
347 this.el.dom.disabled = false;
351 * Convenience function for setting disabled/enabled by boolean.
352 * @param {Boolean} disabled
354 setDisabled : function(disabled){
355 this[disabled ? "disable" : "enable"]();
359 * Show this component.
360 * @return {Roo.Component} this
363 if(this.fireEvent("beforeshow", this) !== false){
368 this.fireEvent("show", this);
375 var ae = this.getActionEl();
376 if(this.hideMode == 'visibility'){
377 ae.dom.style.visibility = "visible";
378 }else if(this.hideMode == 'offsets'){
379 ae.removeClass('x-hidden');
381 ae.dom.style.display = "";
386 * Hide this component.
387 * @return {Roo.Component} this
390 if(this.fireEvent("beforehide", this) !== false){
395 this.fireEvent("hide", this);
402 var ae = this.getActionEl();
403 if(this.hideMode == 'visibility'){
404 ae.dom.style.visibility = "hidden";
405 }else if(this.hideMode == 'offsets'){
406 ae.addClass('x-hidden');
408 ae.dom.style.display = "none";
413 * Convenience function to hide or show this component by boolean.
414 * @param {Boolean} visible True to show, false to hide
415 * @return {Roo.Component} this
417 setVisible: function(visible){
427 * Returns true if this component is visible.
429 isVisible : function(){
430 return this.getActionEl().isVisible();
433 cloneConfig : function(overrides){
434 overrides = overrides || {};
435 var id = overrides.id || Roo.id();
436 var cfg = Roo.applyIf(overrides, this.initialConfig);
437 cfg.id = id; // prevent dup id
438 return new this.constructor(cfg);