Upgrade to ExtJS 4.0.0 - Released 04/26/2011
[extjs.git] / src / fx / Queue.js
1 /**
2  * @class Ext.fx.Queue
3  * Animation Queue mixin to handle chaining and queueing by target.
4  * @private
5  */
6
7 Ext.define('Ext.fx.Queue', {
8
9     requires: ['Ext.util.HashMap'],
10
11     constructor: function() {
12         this.targets = Ext.create('Ext.util.HashMap');
13         this.fxQueue = {};
14     },
15
16     // @private
17     getFxDefaults: function(targetId) {
18         var target = this.targets.get(targetId);
19         if (target) {
20             return target.fxDefaults;
21         }
22         return {};
23     },
24
25     // @private
26     setFxDefaults: function(targetId, obj) {
27         var target = this.targets.get(targetId);
28         if (target) {
29             target.fxDefaults = Ext.apply(target.fxDefaults || {}, obj);
30         }
31     },
32
33     // @private
34     stopAnimation: function(targetId) {
35         var me = this,
36             queue = me.getFxQueue(targetId),
37             ln = queue.length;
38         while (ln) {
39             queue[ln - 1].end();
40             ln--;
41         }
42     },
43
44     /**
45      * @private
46      * Returns current animation object if the element has any effects actively running or queued, else returns false.
47      */
48     getActiveAnimation: function(targetId) {
49         var queue = this.getFxQueue(targetId);
50         return (queue && !!queue.length) ? queue[0] : false;
51     },
52
53     // @private
54     hasFxBlock: function(targetId) {
55         var queue = this.getFxQueue(targetId);
56         return queue && queue[0] && queue[0].block;
57     },
58
59     // @private get fx queue for passed target, create if needed.
60     getFxQueue: function(targetId) {
61         if (!targetId) {
62             return false;
63         }
64         var me = this,
65             queue = me.fxQueue[targetId],
66             target = me.targets.get(targetId);
67
68         if (!target) {
69             return false;
70         }
71
72         if (!queue) {
73             me.fxQueue[targetId] = [];
74             // GarbageCollector will need to clean up Elements since they aren't currently observable
75             if (target.type != 'element') {
76                 target.target.on('destroy', function() {
77                     me.fxQueue[targetId] = [];
78                 });
79             }
80         }
81         return me.fxQueue[targetId];
82     },
83
84     // @private
85     queueFx: function(anim) {
86         var me = this,
87             target = anim.target,
88             queue, ln;
89
90         if (!target) {
91             return;
92         }
93
94         queue = me.getFxQueue(target.getId());
95         ln = queue.length;
96
97         if (ln) {
98             if (anim.concurrent) {
99                 anim.paused = false;
100             }
101             else {
102                 queue[ln - 1].on('afteranimate', function() {
103                     anim.paused = false;
104                 });
105             }
106         }
107         else {
108             anim.paused = false;
109         }
110         anim.on('afteranimate', function() {
111             Ext.Array.remove(queue, anim);
112             if (anim.remove) {
113                 if (target.type == 'element') {
114                     var el = Ext.get(target.id);
115                     if (el) {
116                         el.remove();
117                     }
118                 }
119             }
120         }, this);
121         queue.push(anim);
122     }
123 });