| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678 | <!DOCTYPE html><html><head>  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  <title>The source code</title>  <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />  <script type="text/javascript" src="../resources/prettify/prettify.js"></script>  <style type="text/css">    .highlight { display: block; background-color: #ddd; }  </style>  <script type="text/javascript">    function highlight() {      document.getElementById(location.hash.replace(/#/, "")).className = "highlight";    }  </script></head><body onload="prettyPrint(); highlight();">  <pre class="prettyprint lang-js"><span id='Ext-ClassManager'>/**</span> * @author Jacky Nguyen <jacky@sencha.com> * @docauthor Jacky Nguyen <jacky@sencha.com> * @class Ext.ClassManager * * Ext.ClassManager manages all classes and handles mapping from string class name to * actual class objects throughout the whole framework. It is not generally accessed directly, rather through * these convenient shorthands: * * - {@link Ext#define Ext.define} * - {@link Ext#create Ext.create} * - {@link Ext#widget Ext.widget} * - {@link Ext#getClass Ext.getClass} * - {@link Ext#getClassName Ext.getClassName} * * # Basic syntax: * *     Ext.define(className, properties); * * in which `properties` is an object represent a collection of properties that apply to the class. See * {@link Ext.ClassManager#create} for more detailed instructions. * *     Ext.define('Person', { *          name: 'Unknown', * *          constructor: function(name) { *              if (name) { *                  this.name = name; *              } *          }, * *          eat: function(foodType) { *              alert("I'm eating: " + foodType); * *              return this; *          } *     }); * *     var aaron = new Person("Aaron"); *     aaron.eat("Sandwich"); // alert("I'm eating: Sandwich"); * * Ext.Class has a powerful set of extensible {@link Ext.Class#registerPreprocessor pre-processors} which takes care of * everything related to class creation, including but not limited to inheritance, mixins, configuration, statics, etc. * * # Inheritance: * *     Ext.define('Developer', { *          extend: 'Person', * *          constructor: function(name, isGeek) { *              this.isGeek = isGeek; * *              // Apply a method from the parent class' prototype *              this.callParent([name]); *          }, * *          code: function(language) { *              alert("I'm coding in: " + language); * *              this.eat("Bugs"); * *              return this; *          } *     }); * *     var jacky = new Developer("Jacky", true); *     jacky.code("JavaScript"); // alert("I'm coding in: JavaScript"); *                               // alert("I'm eating: Bugs"); * * See {@link Ext.Base#callParent} for more details on calling superclass' methods * * # Mixins: * *     Ext.define('CanPlayGuitar', { *          playGuitar: function() { *             alert("F#...G...D...A"); *          } *     }); * *     Ext.define('CanComposeSongs', { *          composeSongs: function() { ... } *     }); * *     Ext.define('CanSing', { *          sing: function() { *              alert("I'm on the highway to hell...") *          } *     }); * *     Ext.define('Musician', { *          extend: 'Person', * *          mixins: { *              canPlayGuitar: 'CanPlayGuitar', *              canComposeSongs: 'CanComposeSongs', *              canSing: 'CanSing' *          } *     }) * *     Ext.define('CoolPerson', { *          extend: 'Person', * *          mixins: { *              canPlayGuitar: 'CanPlayGuitar', *              canSing: 'CanSing' *          }, * *          sing: function() { *              alert("Ahem...."); * *              this.mixins.canSing.sing.call(this); * *              alert("[Playing guitar at the same time...]"); * *              this.playGuitar(); *          } *     }); * *     var me = new CoolPerson("Jacky"); * *     me.sing(); // alert("Ahem..."); *                // alert("I'm on the highway to hell..."); *                // alert("[Playing guitar at the same time...]"); *                // alert("F#...G...D...A"); * * # Config: * *     Ext.define('SmartPhone', { *          config: { *              hasTouchScreen: false, *              operatingSystem: 'Other', *              price: 500 *          }, * *          isExpensive: false, * *          constructor: function(config) { *              this.initConfig(config); *          }, * *          applyPrice: function(price) { *              this.isExpensive = (price > 500); * *              return price; *          }, * *          applyOperatingSystem: function(operatingSystem) { *              if (!(/^(iOS|Android|BlackBerry)$/i).test(operatingSystem)) { *                  return 'Other'; *              } * *              return operatingSystem; *          } *     }); * *     var iPhone = new SmartPhone({ *          hasTouchScreen: true, *          operatingSystem: 'iOS' *     }); * *     iPhone.getPrice(); // 500; *     iPhone.getOperatingSystem(); // 'iOS' *     iPhone.getHasTouchScreen(); // true; *     iPhone.hasTouchScreen(); // true * *     iPhone.isExpensive; // false; *     iPhone.setPrice(600); *     iPhone.getPrice(); // 600 *     iPhone.isExpensive; // true; * *     iPhone.setOperatingSystem('AlienOS'); *     iPhone.getOperatingSystem(); // 'Other' * * # Statics: * *     Ext.define('Computer', { *          statics: { *              factory: function(brand) { *                 // 'this' in static methods refer to the class itself *                  return new this(brand); *              } *          }, * *          constructor: function() { ... } *     }); * *     var dellComputer = Computer.factory('Dell'); * * Also see {@link Ext.Base#statics} and {@link Ext.Base#self} for more details on accessing * static properties within class methods * * @singleton */(function(Class, alias, arraySlice, arrayFrom, global) {    // Creates a constructor that has nothing extra in its scope chain.    function makeCtor () {        function constructor () {            // Opera has some problems returning from a constructor when Dragonfly isn't running. The || null seems to            // be sufficient to stop it misbehaving. Known to be required against 10.53, 11.51 and 11.61.            return this.constructor.apply(this, arguments) || null;        }        return constructor;    }    var Manager = Ext.ClassManager = {<span id='Ext-ClassManager-property-classes'>        /**</span>         * @property {Object} classes         * All classes which were defined through the ClassManager. Keys are the         * name of the classes and the values are references to the classes.         * @private         */        classes: {},<span id='Ext-ClassManager-property-existCache'>        /**</span>         * @private         */        existCache: {},<span id='Ext-ClassManager-property-namespaceRewrites'>        /**</span>         * @private         */        namespaceRewrites: [{            from: 'Ext.',            to: Ext        }],<span id='Ext-ClassManager-property-maps'>        /**</span>         * @private         */        maps: {            alternateToName: {},            aliasToName: {},            nameToAliases: {},            nameToAlternates: {}        },<span id='Ext-ClassManager-property-enableNamespaceParseCache'>        /** @private */</span>        enableNamespaceParseCache: true,<span id='Ext-ClassManager-property-namespaceParseCache'>        /** @private */</span>        namespaceParseCache: {},<span id='Ext-ClassManager-property-instantiators'>        /** @private */</span>        instantiators: [],<span id='Ext-ClassManager-method-isCreated'>        /**</span>         * Checks if a class has already been created.         *         * @param {String} className         * @return {Boolean} exist         */        isCreated: function(className) {            var existCache = this.existCache,                i, ln, part, root, parts;            //<debug error>            if (typeof className != 'string' || className.length < 1) {                throw new Error("[Ext.ClassManager] Invalid classname, must be a string and must not be empty");            }            //</debug>            if (this.classes[className] || existCache[className]) {                return true;            }            root = global;            parts = this.parseNamespace(className);            for (i = 0, ln = parts.length; i < ln; i++) {                part = parts[i];                if (typeof part != 'string') {                    root = part;                } else {                    if (!root || !root[part]) {                        return false;                    }                    root = root[part];                }            }            existCache[className] = true;            this.triggerCreated(className);            return true;        },<span id='Ext-ClassManager-property-createdListeners'>        /**</span>         * @private         */        createdListeners: [],<span id='Ext-ClassManager-property-nameCreatedListeners'>        /**</span>         * @private         */        nameCreatedListeners: {},<span id='Ext-ClassManager-method-triggerCreated'>        /**</span>         * @private         */        triggerCreated: function(className) {            var listeners = this.createdListeners,                nameListeners = this.nameCreatedListeners,                alternateNames = this.maps.nameToAlternates[className],                names = [className],                i, ln, j, subLn, listener, name;            for (i = 0,ln = listeners.length; i < ln; i++) {                listener = listeners[i];                listener.fn.call(listener.scope, className);            }            if (alternateNames) {                names.push.apply(names, alternateNames);            }            for (i = 0,ln = names.length; i < ln; i++) {                name = names[i];                listeners = nameListeners[name];                if (listeners) {                    for (j = 0,subLn = listeners.length; j < subLn; j++) {                        listener = listeners[j];                        listener.fn.call(listener.scope, name);                    }                    delete nameListeners[name];                }            }        },<span id='Ext-ClassManager-method-onCreated'>        /**</span>         * @private         */        onCreated: function(fn, scope, className) {            var listeners = this.createdListeners,                nameListeners = this.nameCreatedListeners,                listener = {                    fn: fn,                    scope: scope                };            if (className) {                if (this.isCreated(className)) {                    fn.call(scope, className);                    return;                }                if (!nameListeners[className]) {                    nameListeners[className] = [];                }                nameListeners[className].push(listener);            }            else {                listeners.push(listener);            }        },<span id='Ext-ClassManager-method-parseNamespace'>        /**</span>         * Supports namespace rewriting         * @private         */        parseNamespace: function(namespace) {            //<debug error>            if (typeof namespace != 'string') {                throw new Error("[Ext.ClassManager] Invalid namespace, must be a string");            }            //</debug>            var cache = this.namespaceParseCache,                parts,                rewrites,                root,                name,                rewrite, from, to, i, ln;            if (this.enableNamespaceParseCache) {                if (cache.hasOwnProperty(namespace)) {                    return cache[namespace];                }            }            parts = [];            rewrites = this.namespaceRewrites;            root = global;            name = namespace;            for (i = 0, ln = rewrites.length; i < ln; i++) {                rewrite = rewrites[i];                from = rewrite.from;                to = rewrite.to;                if (name === from || name.substring(0, from.length) === from) {                    name = name.substring(from.length);                    if (typeof to != 'string') {                        root = to;                    } else {                        parts = parts.concat(to.split('.'));                    }                    break;                }            }            parts.push(root);            parts = parts.concat(name.split('.'));            if (this.enableNamespaceParseCache) {                cache[namespace] = parts;            }            return parts;        },<span id='Ext-ClassManager-method-setNamespace'>        /**</span>         * Creates a namespace and assign the `value` to the created object         *         *     Ext.ClassManager.setNamespace('MyCompany.pkg.Example', someObject);         *         *     alert(MyCompany.pkg.Example === someObject); // alerts true         *         * @param {String} name         * @param {Object} value         */        setNamespace: function(name, value) {            var root = global,                parts = this.parseNamespace(name),                ln = parts.length - 1,                leaf = parts[ln],                i, part;            for (i = 0; i < ln; i++) {                part = parts[i];                if (typeof part != 'string') {                    root = part;                } else {                    if (!root[part]) {                        root[part] = {};                    }                    root = root[part];                }            }            root[leaf] = value;            return root[leaf];        },<span id='Ext-ClassManager-method-createNamespaces'>        /**</span>         * The new Ext.ns, supports namespace rewriting         * @private         */        createNamespaces: function() {            var root = global,                parts, part, i, j, ln, subLn;            for (i = 0, ln = arguments.length; i < ln; i++) {                parts = this.parseNamespace(arguments[i]);                for (j = 0, subLn = parts.length; j < subLn; j++) {                    part = parts[j];                    if (typeof part != 'string') {                        root = part;                    } else {                        if (!root[part]) {                            root[part] = {};                        }                        root = root[part];                    }                }            }            return root;        },<span id='Ext-ClassManager-method-set'>        /**</span>         * Sets a name reference to a class.         *         * @param {String} name         * @param {Object} value         * @return {Ext.ClassManager} this         */        set: function(name, value) {            var me = this,                maps = me.maps,                nameToAlternates = maps.nameToAlternates,                targetName = me.getName(value),                alternates;            me.classes[name] = me.setNamespace(name, value);            if (targetName && targetName !== name) {                maps.alternateToName[name] = targetName;                alternates = nameToAlternates[targetName] || (nameToAlternates[targetName] = []);                alternates.push(name);            }            return this;        },<span id='Ext-ClassManager-method-get'>        /**</span>         * Retrieve a class by its name.         *         * @param {String} name         * @return {Ext.Class} class         */        get: function(name) {            var classes = this.classes,                root,                parts,                part, i, ln;            if (classes[name]) {                return classes[name];            }            root = global;            parts = this.parseNamespace(name);            for (i = 0, ln = parts.length; i < ln; i++) {                part = parts[i];                if (typeof part != 'string') {                    root = part;                } else {                    if (!root || !root[part]) {                        return null;                    }                    root = root[part];                }            }            return root;        },<span id='Ext-ClassManager-method-setAlias'>        /**</span>         * Register the alias for a class.         *         * @param {Ext.Class/String} cls a reference to a class or a className         * @param {String} alias Alias to use when referring to this class         */        setAlias: function(cls, alias) {            var aliasToNameMap = this.maps.aliasToName,                nameToAliasesMap = this.maps.nameToAliases,                className;            if (typeof cls == 'string') {                className = cls;            } else {                className = this.getName(cls);            }            if (alias && aliasToNameMap[alias] !== className) {                //<debug info>                if (aliasToNameMap[alias] && Ext.isDefined(global.console)) {                    global.console.log("[Ext.ClassManager] Overriding existing alias: '" + alias + "' " +                        "of: '" + aliasToNameMap[alias] + "' with: '" + className + "'. Be sure it's intentional.");                }                //</debug>                aliasToNameMap[alias] = className;            }            if (!nameToAliasesMap[className]) {                nameToAliasesMap[className] = [];            }            if (alias) {                Ext.Array.include(nameToAliasesMap[className], alias);            }            return this;        },<span id='Ext-ClassManager-method-getByAlias'>        /**</span>         * Get a reference to the class by its alias.         *         * @param {String} alias         * @return {Ext.Class} class         */        getByAlias: function(alias) {            return this.get(this.getNameByAlias(alias));        },<span id='Ext-ClassManager-method-getNameByAlias'>        /**</span>         * Get the name of a class by its alias.         *         * @param {String} alias         * @return {String} className         */        getNameByAlias: function(alias) {            return this.maps.aliasToName[alias] || '';        },<span id='Ext-ClassManager-method-getNameByAlternate'>        /**</span>         * Get the name of a class by its alternate name.         *         * @param {String} alternate         * @return {String} className         */        getNameByAlternate: function(alternate) {            return this.maps.alternateToName[alternate] || '';        },<span id='Ext-ClassManager-method-getAliasesByName'>        /**</span>         * Get the aliases of a class by the class name         *         * @param {String} name         * @return {Array} aliases         */        getAliasesByName: function(name) {            return this.maps.nameToAliases[name] || [];        },<span id='Ext-ClassManager-method-getName'>        /**</span>         * Get the name of the class by its reference or its instance;         * usually invoked by the shorthand {@link Ext#getClassName Ext.getClassName}         *         *     Ext.ClassManager.getName(Ext.Action); // returns "Ext.Action"         *         * @param {Ext.Class/Object} object         * @return {String} className         */        getName: function(object) {            return object && object.$className || '';        },<span id='Ext-ClassManager-method-getClass'>        /**</span>         * Get the class of the provided object; returns null if it's not an instance         * of any class created with Ext.define. This is usually invoked by the shorthand {@link Ext#getClass Ext.getClass}         *         *     var component = new Ext.Component();         *         *     Ext.ClassManager.getClass(component); // returns Ext.Component         *         * @param {Object} object         * @return {Ext.Class} class         */        getClass: function(object) {            return object && object.self || null;        },<span id='Ext-ClassManager-method-create'>        /**</span>         * Defines a class.         * @deprecated 4.1.0 Use {@link Ext#define} instead, as that also supports creating overrides.         */        create: function(className, data, createdFn) {            //<debug error>            if (className != null && typeof className != 'string') {                throw new Error("[Ext.define] Invalid class name '" + className + "' specified, must be a non-empty string");            }            //</debug>            var ctor = makeCtor();            if (typeof data == 'function') {                data = data(ctor);            }            //<debug>            if (className) {                ctor.displayName = className;            }            //</debug>            data.$className = className;            return new Class(ctor, data, function() {                var postprocessorStack = data.postprocessors || Manager.defaultPostprocessors,                    registeredPostprocessors = Manager.postprocessors,                    postprocessors = [],                    postprocessor, i, ln, j, subLn, postprocessorProperties, postprocessorProperty;                delete data.postprocessors;                for (i = 0,ln = postprocessorStack.length; i < ln; i++) {                    postprocessor = postprocessorStack[i];                    if (typeof postprocessor == 'string') {                        postprocessor = registeredPostprocessors[postprocessor];                        postprocessorProperties = postprocessor.properties;                        if (postprocessorProperties === true) {                            postprocessors.push(postprocessor.fn);                        }                        else if (postprocessorProperties) {                            for (j = 0,subLn = postprocessorProperties.length; j < subLn; j++) {                                postprocessorProperty = postprocessorProperties[j];                                if (data.hasOwnProperty(postprocessorProperty)) {                                    postprocessors.push(postprocessor.fn);                                    break;                                }                            }                        }                    }                    else {                        postprocessors.push(postprocessor);                    }                }                data.postprocessors = postprocessors;                data.createdFn = createdFn;                Manager.processCreate(className, this, data);            });        },                processCreate: function(className, cls, clsData){            var me = this,                postprocessor = clsData.postprocessors.shift(),                createdFn = clsData.createdFn;            if (!postprocessor) {                if (className) {                    me.set(className, cls);                }                if (createdFn) {                    createdFn.call(cls, cls);                }                if (className) {                    me.triggerCreated(className);                }                return;            }            if (postprocessor.call(me, className, cls, clsData, me.processCreate) !== false) {                me.processCreate(className, cls, clsData);            }        },        createOverride: function (className, data, createdFn) {            var me = this,                overriddenClassName = data.override,                requires = data.requires,                uses = data.uses,                classReady = function () {                    var cls, temp;                    if (requires) {                        temp = requires;                        requires = null; // do the real thing next time (which may be now)                        // Since the override is going to be used (its target class is now                        // created), we need to fetch the required classes for the override                        // and call us back once they are loaded:                        Ext.Loader.require(temp, classReady);                    } else {                        // The target class and the required classes for this override are                        // ready, so we can apply the override now:                        cls = me.get(overriddenClassName);                        // We don't want to apply these:                        delete data.override;                        delete data.requires;                        delete data.uses;                        Ext.override(cls, data);                        // This pushes the overridding file itself into Ext.Loader.history                        // Hence if the target class never exists, the overriding file will                        // never be included in the build.                        me.triggerCreated(className);                        if (uses) {                            Ext.Loader.addUsedClasses(uses); // get these classes too!                        }                        if (createdFn) {                            createdFn.call(cls); // last but not least!                        }                    }                };            me.existCache[className] = true;            // Override the target class right after it's created            me.onCreated(classReady, me, overriddenClassName);             return me;        },<span id='Ext-ClassManager-method-instantiateByAlias'>        /**</span>         * Instantiate a class by its alias; usually invoked by the convenient shorthand {@link Ext#createByAlias Ext.createByAlias}         * If {@link Ext.Loader} is {@link Ext.Loader#setConfig enabled} and the class has not been defined yet, it will         * attempt to load the class via synchronous loading.         *         *     var window = Ext.ClassManager.instantiateByAlias('widget.window', { width: 600, height: 800, ... });         *         * @param {String} alias         * @param {Object...} args Additional arguments after the alias will be passed to the         * class constructor.         * @return {Object} instance         */        instantiateByAlias: function() {            var alias = arguments[0],                args = arraySlice.call(arguments),                className = this.getNameByAlias(alias);            if (!className) {                className = this.maps.aliasToName[alias];                //<debug error>                if (!className) {                    throw new Error("[Ext.createByAlias] Cannot create an instance of unrecognized alias: " + alias);                }                //</debug>                //<debug warn>                if (global.console) {                    global.console.warn("[Ext.Loader] Synchronously loading '" + className + "'; consider adding " +                         "Ext.require('" + alias + "') above Ext.onReady");                }                //</debug>                Ext.syncRequire(className);            }            args[0] = className;            return this.instantiate.apply(this, args);        },<span id='Ext-ClassManager-method-instantiate'>        /**</span>         * @private         */        instantiate: function() {            var name = arguments[0],                nameType = typeof name,                args = arraySlice.call(arguments, 1),                alias = name,                possibleName, cls;            if (nameType != 'function') {                if (nameType != 'string' && args.length === 0) {                    args = [name];                    name = name.xclass;                }                //<debug error>                if (typeof name != 'string' || name.length < 1) {                    throw new Error("[Ext.create] Invalid class name or alias '" + name + "' specified, must be a non-empty string");                }                //</debug>                cls = this.get(name);            }            else {                cls = name;            }            // No record of this class name, it's possibly an alias, so look it up            if (!cls) {                possibleName = this.getNameByAlias(name);                if (possibleName) {                    name = possibleName;                    cls = this.get(name);                }            }            // Still no record of this class name, it's possibly an alternate name, so look it up            if (!cls) {                possibleName = this.getNameByAlternate(name);                if (possibleName) {                    name = possibleName;                    cls = this.get(name);                }            }            // Still not existing at this point, try to load it via synchronous mode as the last resort            if (!cls) {                //<debug warn>                if (global.console) {                    global.console.warn("[Ext.Loader] Synchronously loading '" + name + "'; consider adding " +                         "Ext.require('" + ((possibleName) ? alias : name) + "') above Ext.onReady");                }                //</debug>                Ext.syncRequire(name);                cls = this.get(name);            }            //<debug error>            if (!cls) {                throw new Error("[Ext.create] Cannot create an instance of unrecognized class name / alias: " + alias);            }            if (typeof cls != 'function') {                throw new Error("[Ext.create] '" + name + "' is a singleton and cannot be instantiated");            }            //</debug>            return this.getInstantiator(args.length)(cls, args);        },<span id='Ext-ClassManager-method-dynInstantiate'>        /**</span>         * @private         * @param name         * @param args         */        dynInstantiate: function(name, args) {            args = arrayFrom(args, true);            args.unshift(name);            return this.instantiate.apply(this, args);        },<span id='Ext-ClassManager-method-getInstantiator'>        /**</span>         * @private         * @param length         */        getInstantiator: function(length) {            var instantiators = this.instantiators,                instantiator,                i,                args;            instantiator = instantiators[length];            if (!instantiator) {                i = length;                args = [];                for (i = 0; i < length; i++) {                    args.push('a[' + i + ']');                }                instantiator = instantiators[length] = new Function('c', 'a', 'return new c(' + args.join(',') + ')');                //<debug>                instantiator.displayName = "Ext.ClassManager.instantiate" + length;                //</debug>            }            return instantiator;        },<span id='Ext-ClassManager-property-postprocessors'>        /**</span>         * @private         */        postprocessors: {},<span id='Ext-ClassManager-property-defaultPostprocessors'>        /**</span>         * @private         */        defaultPostprocessors: [],<span id='Ext-ClassManager-method-registerPostprocessor'>        /**</span>         * Register a post-processor function.         *         * @private         * @param {String} name         * @param {Function} postprocessor         */        registerPostprocessor: function(name, fn, properties, position, relativeTo) {            if (!position) {                position = 'last';            }            if (!properties) {                properties = [name];            }            this.postprocessors[name] = {                name: name,                properties: properties || false,                fn: fn            };            this.setDefaultPostprocessorPosition(name, position, relativeTo);            return this;        },<span id='Ext-ClassManager-method-setDefaultPostprocessors'>        /**</span>         * Set the default post processors array stack which are applied to every class.         *         * @private         * @param {String/Array} The name of a registered post processor or an array of registered names.         * @return {Ext.ClassManager} this         */        setDefaultPostprocessors: function(postprocessors) {            this.defaultPostprocessors = arrayFrom(postprocessors);            return this;        },<span id='Ext-ClassManager-method-setDefaultPostprocessorPosition'>        /**</span>         * Insert this post-processor at a specific position in the stack, optionally relative to         * any existing post-processor         *         * @private         * @param {String} name The post-processor name. Note that it needs to be registered with         * {@link Ext.ClassManager#registerPostprocessor} before this         * @param {String} offset The insertion position. Four possible values are:         * 'first', 'last', or: 'before', 'after' (relative to the name provided in the third argument)         * @param {String} relativeName         * @return {Ext.ClassManager} this         */        setDefaultPostprocessorPosition: function(name, offset, relativeName) {            var defaultPostprocessors = this.defaultPostprocessors,                index;            if (typeof offset == 'string') {                if (offset === 'first') {                    defaultPostprocessors.unshift(name);                    return this;                }                else if (offset === 'last') {                    defaultPostprocessors.push(name);                    return this;                }                offset = (offset === 'after') ? 1 : -1;            }            index = Ext.Array.indexOf(defaultPostprocessors, relativeName);            if (index !== -1) {                Ext.Array.splice(defaultPostprocessors, Math.max(0, index + offset), 0, name);            }            return this;        },<span id='Ext-ClassManager-method-getNamesByExpression'>        /**</span>         * Converts a string expression to an array of matching class names. An expression can either refers to class aliases         * or class names. Expressions support wildcards:         *         *      // returns ['Ext.window.Window']         *     var window = Ext.ClassManager.getNamesByExpression('widget.window');         *         *     // returns ['widget.panel', 'widget.window', ...]         *     var allWidgets = Ext.ClassManager.getNamesByExpression('widget.*');         *         *     // returns ['Ext.data.Store', 'Ext.data.ArrayProxy', ...]         *     var allData = Ext.ClassManager.getNamesByExpression('Ext.data.*');         *         * @param {String} expression         * @return {String[]} classNames         */        getNamesByExpression: function(expression) {            var nameToAliasesMap = this.maps.nameToAliases,                names = [],                name, alias, aliases, possibleName, regex, i, ln;            //<debug error>            if (typeof expression != 'string' || expression.length < 1) {                throw new Error("[Ext.ClassManager.getNamesByExpression] Expression " + expression + " is invalid, must be a non-empty string");            }            //</debug>            if (expression.indexOf('*') !== -1) {                expression = expression.replace(/\*/g, '(.*?)');                regex = new RegExp('^' + expression + '$');                for (name in nameToAliasesMap) {                    if (nameToAliasesMap.hasOwnProperty(name)) {                        aliases = nameToAliasesMap[name];                        if (name.search(regex) !== -1) {                            names.push(name);                        }                        else {                            for (i = 0, ln = aliases.length; i < ln; i++) {                                alias = aliases[i];                                if (alias.search(regex) !== -1) {                                    names.push(name);                                    break;                                }                            }                        }                    }                }            } else {                possibleName = this.getNameByAlias(expression);                if (possibleName) {                    names.push(possibleName);                } else {                    possibleName = this.getNameByAlternate(expression);                    if (possibleName) {                        names.push(possibleName);                    } else {                        names.push(expression);                    }                }            }            return names;        }    };    //<feature classSystem.alias><span id='Ext-Class-cfg-alias'>    /**</span>     * @cfg {String[]} alias     * @member Ext.Class     * List of short aliases for class names.  Most useful for defining xtypes for widgets:     *     *     Ext.define('MyApp.CoolPanel', {     *         extend: 'Ext.panel.Panel',     *         alias: ['widget.coolpanel'],     *         title: 'Yeah!'     *     });     *     *     // Using Ext.create     *     Ext.create('widget.coolpanel');     *     *     // Using the shorthand for defining widgets by xtype     *     Ext.widget('panel', {     *         items: [     *             {xtype: 'coolpanel', html: 'Foo'},     *             {xtype: 'coolpanel', html: 'Bar'}     *         ]     *     });     *     * Besides "widget" for xtype there are alias namespaces like "feature" for ftype and "plugin" for ptype.     */    Manager.registerPostprocessor('alias', function(name, cls, data) {        var aliases = data.alias,            i, ln;        for (i = 0,ln = aliases.length; i < ln; i++) {            alias = aliases[i];            this.setAlias(cls, alias);        }    }, ['xtype', 'alias']);    //</feature>    //<feature classSystem.singleton><span id='Ext-Class-cfg-singleton'>    /**</span>     * @cfg {Boolean} singleton     * @member Ext.Class     * When set to true, the class will be instantiated as singleton.  For example:     *     *     Ext.define('Logger', {     *         singleton: true,     *         log: function(msg) {     *             console.log(msg);     *         }     *     });     *     *     Logger.log('Hello');     */    Manager.registerPostprocessor('singleton', function(name, cls, data, fn) {        fn.call(this, name, new cls(), data);        return false;    });    //</feature>    //<feature classSystem.alternateClassName><span id='Ext-Class-cfg-alternateClassName'>    /**</span>     * @cfg {String/String[]} alternateClassName     * @member Ext.Class     * Defines alternate names for this class.  For example:     *     *     Ext.define('Developer', {     *         alternateClassName: ['Coder', 'Hacker'],     *         code: function(msg) {     *             alert('Typing... ' + msg);     *         }     *     });     *     *     var joe = Ext.create('Developer');     *     joe.code('stackoverflow');     *     *     var rms = Ext.create('Hacker');     *     rms.code('hack hack');     */    Manager.registerPostprocessor('alternateClassName', function(name, cls, data) {        var alternates = data.alternateClassName,            i, ln, alternate;        if (!(alternates instanceof Array)) {            alternates = [alternates];        }        for (i = 0, ln = alternates.length; i < ln; i++) {            alternate = alternates[i];            //<debug error>            if (typeof alternate != 'string') {                throw new Error("[Ext.define] Invalid alternate of: '" + alternate + "' for class: '" + name + "'; must be a valid string");            }            //</debug>            this.set(alternate, cls);        }    });    //</feature>    Ext.apply(Ext, {<span id='Ext-method-create'>        /**</span>         * Instantiate a class by either full name, alias or alternate name.         *         * If {@link Ext.Loader} is {@link Ext.Loader#setConfig enabled} and the class has         * not been defined yet, it will attempt to load the class via synchronous loading.         *         * For example, all these three lines return the same result:         *         *      // alias         *      var window = Ext.create('widget.window', {         *          width: 600,         *          height: 800,         *          ...         *      });         *         *      // alternate name         *      var window = Ext.create('Ext.Window', {         *          width: 600,         *          height: 800,         *          ...         *      });         *         *      // full class name         *      var window = Ext.create('Ext.window.Window', {         *          width: 600,         *          height: 800,         *          ...         *      });         *         *      // single object with xclass property:         *      var window = Ext.create({         *          xclass: 'Ext.window.Window', // any valid value for 'name' (above)         *          width: 600,         *          height: 800,         *          ...         *      });         *         * @param {String} [name] The class name or alias. Can be specified as `xclass`         * property if only one object parameter is specified.         * @param {Object...} [args] Additional arguments after the name will be passed to         * the class' constructor.         * @return {Object} instance         * @member Ext         * @method create         */        create: alias(Manager, 'instantiate'),<span id='Ext-method-widget'>        /**</span>         * Convenient shorthand to create a widget by its xtype or a config object.         * See also {@link Ext.ClassManager#instantiateByAlias}.         *         *      var button = Ext.widget('button'); // Equivalent to Ext.create('widget.button');         *         *      var panel = Ext.widget('panel', { // Equivalent to Ext.create('widget.panel')         *          title: 'Panel'         *      });         *         *      var grid = Ext.widget({         *          xtype: 'grid',         *          ...         *      });         *         * If a {@link Ext.Component component} instance is passed, it is simply returned.         *         * @member Ext         * @param {String} [name] The xtype of the widget to create.         * @param {Object} [config] The configuration object for the widget constructor.         * @return {Object} The widget instance         */        widget: function(name, config) {            // forms:            //      1: (xtype)            //      2: (xtype, config)            //      3: (config)            //      4: (xtype, component)            //      5: (component)            //                  var xtype = name,                alias, className, T, load;            if (typeof xtype != 'string') { // if (form 3 or 5)                // first arg is config or component                config = name; // arguments[0]                xtype = config.xtype;            } else {                config = config || {};            }                        if (config.isComponent) {                return config;            }            alias = 'widget.' + xtype;            className = Manager.getNameByAlias(alias);            // this is needed to support demand loading of the class            if (!className) {                load = true;            }                        T = Manager.get(className);            if (load || !T) {                return Manager.instantiateByAlias(alias, config);            }            return new T(config);        },<span id='Ext-method-createByAlias'>        /**</span>         * Convenient shorthand, see {@link Ext.ClassManager#instantiateByAlias}         * @member Ext         * @method createByAlias         */        createByAlias: alias(Manager, 'instantiateByAlias'),<span id='Ext-method-define'>        /**</span>         * @method         * Defines a class or override. A basic class is defined like this:         *         *      Ext.define('My.awesome.Class', {         *          someProperty: 'something',         *         *          someMethod: function(s) {         *              alert(s + this.someProperty);         *          }         *         *          ...         *      });         *         *      var obj = new My.awesome.Class();         *         *      obj.someMethod('Say '); // alerts 'Say something'         *         * To create an anonymous class, pass `null` for the `className`:         *          *      Ext.define(null, {         *          constructor: function () {         *              // ...         *          }         *      });         *         * In some cases, it is helpful to create a nested scope to contain some private         * properties. The best way to do this is to pass a function instead of an object         * as the second parameter. This function will be called to produce the class         * body:         *          *      Ext.define('MyApp.foo.Bar', function () {         *          var id = 0;         *                   *          return {         *              nextId: function () {         *                  return ++id;         *              }         *          };         *      });         *          * When using this form of `Ext.define`, the function is passed a reference to its         * class. This can be used as an efficient way to access any static properties you         * may have:         *          *      Ext.define('MyApp.foo.Bar', function (Bar) {         *          return {         *              statics: {         *                  staticMethod: function () {         *                      // ...         *                  }         *              },         *                       *              method: function () {         *                  return Bar.staticMethod();         *              }         *          };         *      });         *         * To define an override, include the `override` property. The content of an         * override is aggregated with the specified class in order to extend or modify         * that class. This can be as simple as setting default property values or it can         * extend and/or replace methods. This can also extend the statics of the class.         *         * One use for an override is to break a large class into manageable pieces.         *         *      // File: /src/app/Panel.js         *         *      Ext.define('My.app.Panel', {         *          extend: 'Ext.panel.Panel',         *          requires: [         *              'My.app.PanelPart2',         *              'My.app.PanelPart3'         *          ]         *         *          constructor: function (config) {         *              this.callParent(arguments); // calls Ext.panel.Panel's constructor         *              //...         *          },         *         *          statics: {         *              method: function () {         *                  return 'abc';         *              }         *          }         *      });         *         *      // File: /src/app/PanelPart2.js         *      Ext.define('My.app.PanelPart2', {         *          override: 'My.app.Panel',         *         *          constructor: function (config) {         *              this.callParent(arguments); // calls My.app.Panel's constructor         *              //...         *          }         *      });         *         * Another use of overrides is to provide optional parts of classes that can be         * independently required. In this case, the class may even be unaware of the         * override altogether.         *         *      Ext.define('My.ux.CoolTip', {         *          override: 'Ext.tip.ToolTip',         *         *          constructor: function (config) {         *              this.callParent(arguments); // calls Ext.tip.ToolTip's constructor         *              //...         *          }         *      });         *         * The above override can now be required as normal.         *         *      Ext.define('My.app.App', {         *          requires: [         *              'My.ux.CoolTip'         *          ]         *      });         *         * Overrides can also contain statics:         *         *      Ext.define('My.app.BarMod', {         *          override: 'Ext.foo.Bar',         *         *          statics: {         *              method: function (x) {         *                  return this.callParent([x * 2]); // call Ext.foo.Bar.method         *              }         *          }         *      });         *         * IMPORTANT: An override is only included in a build if the class it overrides is         * required. Otherwise, the override, like the target class, is not included.         *         * @param {String} className The class name to create in string dot-namespaced format, for example:         * 'My.very.awesome.Class', 'FeedViewer.plugin.CoolPager'         * It is highly recommended to follow this simple convention:         *  - The root and the class name are 'CamelCased'         *  - Everything else is lower-cased         * Pass `null` to create an anonymous class.         * @param {Object} data The key - value pairs of properties to apply to this class. Property names can be of any valid         * strings, except those in the reserved listed below:         *  - `mixins`         *  - `statics`         *  - `config`         *  - `alias`         *  - `self`         *  - `singleton`         *  - `alternateClassName`         *  - `override`         *         * @param {Function} createdFn Optional callback to execute after the class is created, the execution scope of which         * (`this`) will be the newly created class itself.         * @return {Ext.Base}         * @markdown         * @member Ext         * @method define         */        define: function (className, data, createdFn) {            if (data.override) {                return Manager.createOverride.apply(Manager, arguments);            }            return Manager.create.apply(Manager, arguments);        },<span id='Ext-method-getClassName'>        /**</span>         * Convenient shorthand, see {@link Ext.ClassManager#getName}         * @member Ext         * @method getClassName         */        getClassName: alias(Manager, 'getName'),<span id='Ext-ClassManager-method-getDisplayName'>        /**</span>         * Returns the displayName property or className or object. When all else fails, returns "Anonymous".         * @param {Object} object         * @return {String}         */        getDisplayName: function(object) {            if (object) {                if (object.displayName) {                    return object.displayName;                }                if (object.$name && object.$class) {                    return Ext.getClassName(object.$class) + '#' + object.$name;                }                if (object.$className) {                    return object.$className;                }            }            return 'Anonymous';        },<span id='Ext-method-getClass'>        /**</span>         * Convenient shorthand, see {@link Ext.ClassManager#getClass}         * @member Ext         * @method getClass         */        getClass: alias(Manager, 'getClass'),<span id='Ext-method-namespace'>        /**</span>         * Creates namespaces to be used for scoping variables and classes so that they are not global.         * Specifying the last node of a namespace implicitly creates all other nodes. Usage:         *         *     Ext.namespace('Company', 'Company.data');         *         *     // equivalent and preferable to the above syntax         *     Ext.ns('Company.data');         *         *     Company.Widget = function() { ... };         *         *     Company.data.CustomStore = function(config) { ... };         *         * @param {String...} namespaces         * @return {Object} The namespace object.         * (If multiple arguments are passed, this will be the last namespace created)         * @member Ext         * @method namespace         */        namespace: alias(Manager, 'createNamespaces')    });<span id='Ext-method-createWidget'>    /**</span>     * Old name for {@link Ext#widget}.     * @deprecated 4.0.0 Use {@link Ext#widget} instead.     * @method createWidget     * @member Ext     */    Ext.createWidget = Ext.widget;<span id='Ext-method-ns'>    /**</span>     * Convenient alias for {@link Ext#namespace Ext.namespace}.     * @inheritdoc Ext#namespace     * @member Ext     * @method ns     */    Ext.ns = Ext.namespace;    Class.registerPreprocessor('className', function(cls, data) {        if (data.$className) {            cls.$className = data.$className;            //<debug>            cls.displayName = cls.$className;            //</debug>        }    }, true, 'first');    Class.registerPreprocessor('alias', function(cls, data) {        var prototype = cls.prototype,            xtypes = arrayFrom(data.xtype),            aliases = arrayFrom(data.alias),            widgetPrefix = 'widget.',            widgetPrefixLength = widgetPrefix.length,            xtypesChain = Array.prototype.slice.call(prototype.xtypesChain || []),            xtypesMap = Ext.merge({}, prototype.xtypesMap || {}),            i, ln, alias, xtype;        for (i = 0,ln = aliases.length; i < ln; i++) {            alias = aliases[i];            //<debug error>            if (typeof alias != 'string' || alias.length < 1) {                throw new Error("[Ext.define] Invalid alias of: '" + alias + "' for class: '" + name + "'; must be a valid string");            }            //</debug>            if (alias.substring(0, widgetPrefixLength) === widgetPrefix) {                xtype = alias.substring(widgetPrefixLength);                Ext.Array.include(xtypes, xtype);            }        }        cls.xtype = data.xtype = xtypes[0];        data.xtypes = xtypes;        for (i = 0,ln = xtypes.length; i < ln; i++) {            xtype = xtypes[i];            if (!xtypesMap[xtype]) {                xtypesMap[xtype] = true;                xtypesChain.push(xtype);            }        }        data.xtypesChain = xtypesChain;        data.xtypesMap = xtypesMap;        Ext.Function.interceptAfter(data, 'onClassCreated', function() {            var mixins = prototype.mixins,                key, mixin;            for (key in mixins) {                if (mixins.hasOwnProperty(key)) {                    mixin = mixins[key];                    xtypes = mixin.xtypes;                    if (xtypes) {                        for (i = 0,ln = xtypes.length; i < ln; i++) {                            xtype = xtypes[i];                            if (!xtypesMap[xtype]) {                                xtypesMap[xtype] = true;                                xtypesChain.push(xtype);                            }                        }                    }                }            }        });        for (i = 0,ln = xtypes.length; i < ln; i++) {            xtype = xtypes[i];            //<debug error>            if (typeof xtype != 'string' || xtype.length < 1) {                throw new Error("[Ext.define] Invalid xtype of: '" + xtype + "' for class: '" + name + "'; must be a valid non-empty string");            }            //</debug>            Ext.Array.include(aliases, widgetPrefix + xtype);        }        data.alias = aliases;    }, ['xtype', 'alias']);}(Ext.Class, Ext.Function.alias, Array.prototype.slice, Ext.Array.from, Ext.global));</pre></body></html>
 |