| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390 | <!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-draw-Component'>/**</span> * The Draw Component is a surface in which sprites can be rendered. The Draw Component * manages and holds an {@link Ext.draw.Surface} instance where * {@link Ext.draw.Sprite Sprites} can be appended. * * One way to create a draw component is: * *     @example *     var drawComponent = Ext.create('Ext.draw.Component', { *         viewBox: false, *         items: [{ *             type: 'circle', *             fill: '#79BB3F', *             radius: 100, *             x: 100, *             y: 100 *         }] *     }); * *     Ext.create('Ext.Window', { *         width: 215, *         height: 235, *         layout: 'fit', *         items: [drawComponent] *     }).show(); * * In this case we created a draw component and added a {@link Ext.draw.Sprite sprite} to it. * The {@link Ext.draw.Sprite#type type} of the sprite is `circle` so if you run this code you'll see a yellow-ish * circle in a Window. When setting `viewBox` to `false` we are responsible for setting the object's position and * dimensions accordingly. * * You can also add sprites by using the surface's add method: * *     drawComponent.surface.add({ *         type: 'circle', *         fill: '#79BB3F', *         radius: 100, *         x: 100, *         y: 100 *     }); * * ## Larger example * *     @example *     var drawComponent = Ext.create('Ext.draw.Component', { *         width: 800, *         height: 600, *         renderTo: document.body *     }), surface = drawComponent.surface; * *     surface.add([{ *         type: 'circle', *         radius: 10, *         fill: '#f00', *         x: 10, *         y: 10, *         group: 'circles' *     }, { *         type: 'circle', *         radius: 10, *         fill: '#0f0', *         x: 50, *         y: 50, *         group: 'circles' *     }, { *         type: 'circle', *         radius: 10, *         fill: '#00f', *         x: 100, *         y: 100, *         group: 'circles' *     }, { *         type: 'rect', *         width: 20, *         height: 20, *         fill: '#f00', *         x: 10, *         y: 10, *         group: 'rectangles' *     }, { *         type: 'rect', *         width: 20, *         height: 20, *         fill: '#0f0', *         x: 50, *         y: 50, *         group: 'rectangles' *     }, { *         type: 'rect', *         width: 20, *         height: 20, *         fill: '#00f', *         x: 100, *         y: 100, *         group: 'rectangles' *     }]); * *     // Get references to my groups *     circles = surface.getGroup('circles'); *     rectangles = surface.getGroup('rectangles'); * *     // Animate the circles down *     circles.animate({ *         duration: 1000, *         to: { *             translate: { *                 y: 200 *             } *         } *     }); * *     // Animate the rectangles across *     rectangles.animate({ *         duration: 1000, *         to: { *             translate: { *                 x: 200 *             } *         } *     }); * * For more information on Sprites, the core elements added to a draw component's surface, * refer to the {@link Ext.draw.Sprite} documentation. */Ext.define('Ext.draw.Component', {    /* Begin Definitions */    alias: 'widget.draw',    extend: 'Ext.Component',    requires: [        'Ext.draw.Surface',        'Ext.layout.component.Draw'    ],    /* End Definitions */<span id='Ext-draw-Component-cfg-enginePriority'>    /**</span>     * @cfg {String[]} enginePriority     * Defines the priority order for which Surface implementation to use. The first     * one supported by the current environment will be used.     */    enginePriority: ['Svg', 'Vml'],    baseCls: Ext.baseCSSPrefix + 'surface',    componentLayout: 'draw',<span id='Ext-draw-Component-cfg-viewBox'>    /**</span>     * @cfg {Boolean} viewBox     * Turn on view box support which will scale and position items in the draw component to fit to the component while     * maintaining aspect ratio. Note that this scaling can override other sizing settings on your items.     */    viewBox: true,    shrinkWrap: 3,    <span id='Ext-draw-Component-cfg-autoSize'>    /**</span>     * @cfg {Boolean} autoSize     * Turn on autoSize support which will set the bounding div's size to the natural size of the contents.     */    autoSize: false,<span id='Ext-draw-Component-cfg-gradients'>    /**</span>     * @cfg {Object[]} gradients (optional) Define a set of gradients that can be used as `fill` property in sprites.     * The gradients array is an array of objects with the following properties:     *     *  - `id` - string - The unique name of the gradient.     *  - `angle` - number, optional - The angle of the gradient in degrees.     *  - `stops` - object - An object with numbers as keys (from 0 to 100) and style objects as values     *     * ## Example     *     *     gradients: [{     *         id: 'gradientId',     *         angle: 45,     *         stops: {     *             0: {     *                 color: '#555'     *             },     *             100: {     *                 color: '#ddd'     *             }     *         }     *     }, {     *         id: 'gradientId2',     *         angle: 0,     *         stops: {     *             0: {     *                 color: '#590'     *             },     *             20: {     *                 color: '#599'     *             },     *             100: {     *                 color: '#ddd'     *             }     *         }     *     }]     *     * Then the sprites can use `gradientId` and `gradientId2` by setting the fill attributes to those ids, for example:     *     *     sprite.setAttributes({     *         fill: 'url(#gradientId)'     *     }, true);     */<span id='Ext-draw-Component-cfg-items'>    /**</span>     * @cfg {Ext.draw.Sprite[]} items     * Array of sprites or sprite config objects to add initially to the surface.     */<span id='Ext-draw-Component-property-surface'>    /**</span>     * @property {Ext.draw.Surface} surface     * The Surface instance managed by this component.     */    initComponent: function() {        this.callParent(arguments);        this.addEvents(<span id='Ext-draw-Component-event-mousedown'>            /**</span>             * @event             * Event forwarded from {@link Ext.draw.Surface surface}.             * @inheritdoc Ext.draw.Surface#mousedown             */            'mousedown',<span id='Ext-draw-Component-event-mouseup'>            /**</span>             * @event             * Event forwarded from {@link Ext.draw.Surface surface}.             * @inheritdoc Ext.draw.Surface#mouseup             */            'mouseup',<span id='Ext-draw-Component-event-mousemove'>            /**</span>             * @event             * Event forwarded from {@link Ext.draw.Surface surface}.             * @inheritdoc Ext.draw.Surface#mousemove             */            'mousemove',<span id='Ext-draw-Component-event-mouseenter'>            /**</span>             * @event             * Event forwarded from {@link Ext.draw.Surface surface}.             * @inheritdoc Ext.draw.Surface#mouseenter             */            'mouseenter',<span id='Ext-draw-Component-event-mouseleave'>            /**</span>             * @event             * Event forwarded from {@link Ext.draw.Surface surface}.             * @inheritdoc Ext.draw.Surface#mouseleave             */            'mouseleave',<span id='Ext-draw-Component-event-click'>            /**</span>             * @event             * Event forwarded from {@link Ext.draw.Surface surface}.             * @inheritdoc Ext.draw.Surface#click             */            'click',<span id='Ext-draw-Component-event-dblclick'>            /**</span>             * @event             * Event forwarded from {@link Ext.draw.Surface surface}.             * @inheritdoc Ext.draw.Surface#dblclick             */            'dblclick'        );    },<span id='Ext-draw-Component-method-onRender'>    /**</span>     * @private     *     * Create the Surface on initial render     */    onRender: function() {        var me = this,            viewBox = me.viewBox,            autoSize = me.autoSize,            bbox, items, width, height, x, y;        me.callParent(arguments);        if (me.createSurface() !== false) {            items = me.surface.items;            if (viewBox || autoSize) {                bbox = items.getBBox();                width = bbox.width;                height = bbox.height;                x = bbox.x;                y = bbox.y;                if (me.viewBox) {                    me.surface.setViewBox(x, y, width, height);                } else {                    me.autoSizeSurface();                }            }        }    },    // @private    autoSizeSurface: function() {        var bbox = this.surface.items.getBBox();        this.setSurfaceSize(bbox.width, bbox.height);    },    setSurfaceSize: function (width, height) {        this.surface.setSize(width, height);        if (this.autoSize) {            var bbox = this.surface.items.getBBox();            this.surface.setViewBox(bbox.x, bbox.y - (+Ext.isOpera), width, height);        }    },    <span id='Ext-draw-Component-method-createSurface'>    /**</span>     * Create the Surface instance. Resolves the correct Surface implementation to     * instantiate based on the 'enginePriority' config. Once the Surface instance is     * created you can use the handle to that instance to add sprites. For example:     *     *     drawComponent.surface.add(sprite);     *     * @private     */    createSurface: function() {        var me = this,            cfg = Ext.applyIf({                renderTo: me.el,                height: me.height,                width: me.width,                items: me.items            }, me.initialConfig), surface;        // ensure we remove any listeners to prevent duplicate events since we refire them below        delete cfg.listeners;        surface = Ext.draw.Surface.create(cfg);        if (!surface) {            // In case we cannot create a surface, return false so we can stop            return false;        }        me.surface = surface;        function refire(eventName) {            return function(e) {                me.fireEvent(eventName, e);            };        }        surface.on({            scope: me,            mouseup: refire('mouseup'),            mousedown: refire('mousedown'),            mousemove: refire('mousemove'),            mouseenter: refire('mouseenter'),            mouseleave: refire('mouseleave'),            click: refire('click'),            dblclick: refire('dblclick')        });    },<span id='Ext-draw-Component-method-onDestroy'>    /**</span>     * @private     *     * Clean up the Surface instance on component destruction     */    onDestroy: function() {        Ext.destroy(this.surface);        this.callParent(arguments);    }});</pre></body></html>
 |