<?xml version="1.0" encoding="UTF-8"?>
<!--

    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.

-->


<ext>
    <object name="Ext.application">
        <property name="name" type="String">
            <doc>
                The name of your application. This will also be the namespace for your views, 
                controllers models and stores. Don't use spaces or special characters in the name.
            </doc>
            <template>
                <![CDATA[
                    '${cursor}'
                ]]>
            </template>
        </property>
        <property name="controllers" type="String[]">
            <doc>
                Names of controllers that the app uses.
            </doc>
            <template>
                <![CDATA[
                    ['${cursor}']
                ]]>
            </template>
        </property>
        <property name="scope" type="Object">
            <doc>
                The scope to execute the launch function in.
            </doc>
        </property>
        <property name="enableQuickTips" type="Boolean">
            <doc>
                True to automatically set up Ext.tip.QuickTip support.
            </doc>
        </property>
        <property name="appFolder" type="String">
            <doc>
                <![CDATA[ The path to the directory which contains all application's classes.
                This path will be registered via {@link Ext.Loader#setPath} for the namespace specified
                in the {@link #name name} config. ]]>
            </doc>
        </property>
        <property name="appProperty" type="String">
            <doc>
                <![CDATA[
The name of a property to be assigned to the main namespace to gain a reference to
this application. Can be set to an empty value to prevent the reference from
being created
<pre>
Ext.application({
    name: 'MyApp',
    appProperty: 'myProp',

    launch: function() {
        console.log(MyApp.myProp === this);
    }
});
</pre>
     ]]>
            </doc>
        </property>
        <property name="namespaces" type="String[]">
            <doc>
                <![CDATA[
The list of namespace prefixes used in the application to resolve dependencies
like Views and Stores:

<pre> 
Ext.application({
    name: 'MyApp',

    namespaces: ['Common.code'],

    controllers: [ 'Common.code.controller.Foo', 'Bar' ]
});

Ext.define('Common.code.controller.Foo', {
    extend: 'Ext.app.Controller',

    models: ['Foo'],    // Loads Common.code.model.Foo
    views:  ['Bar']     // Loads Common.code.view.Bar
});

Ext.define('MyApp.controller.Bar', {
    extend: 'Ext.app.Controller',

    models: ['Foo'],    // Loads MyApp.model.Foo
    views:  ['Bar']     // Loads MyApp.view.Bar
});
</pre>

You don't need to include main namespace (MyApp), it will be added to the list
automatically.
                ]]>
            </doc>
        </property>
        <property name="autoCreateViewport" type="Boolean">
            <doc>
                True to automatically load and instantiate AppName.view.Viewport before firing the launch function.
            </doc>
        </property>
        <property name="path" type="Object">
            <doc>
                <![CDATA[
                Additional load paths to add to Ext.Loader.
                See {@link Ext.Loader#paths} config for more details.
                ]]>
            </doc>
        </property>
        <property name="launch" type="Function">
            <doc>
                <![CDATA[
      Called automatically when the page has completely loaded. This is an empty function that should be
      overridden by each application that needs to take action on page load.
      @param {String} profile The detected application profile
      @return {Boolean} By default, the Application will dispatch to the configured startup controller and
      action immediately after running the launch function. Return false to prevent this behavior.
                ]]>
            </doc>
            <template><![CDATA[function (profile) {
    // This is fired as soon as the page is ready
    ${cursor}
}]]>
            </template>
        </property>
    </object>
    <object name="Ext.define">
        <property name="extend">
            <template>'${cursor}'</template>
        </property>
        <property name="alias">
            <template>'${cursor}'</template>
        </property>
        <property name="store">
            <template>'${cursor}'</template>
        </property>
    </object>
</ext>
