]>
Commit | Line | Data |
---|---|---|
6527f429 DM |
1 | /**\r |
2 | * A wrapper class which can be applied to any element. Fires a "tap" event while\r | |
3 | * touching the device. The interval between firings may be specified in the config but\r | |
4 | * defaults to 20 milliseconds.\r | |
5 | */\r | |
6 | Ext.define('Ext.util.TapRepeater', {\r | |
7 | \r | |
8 | mixins: {\r | |
9 | observable: 'Ext.mixin.Observable'\r | |
10 | },\r | |
11 | \r | |
12 | /**\r | |
13 | * @event touchstart\r | |
14 | * Fires when the touch is started.\r | |
15 | * @param {Ext.util.TapRepeater} this\r | |
16 | * @param {Ext.event.Event} e\r | |
17 | */\r | |
18 | \r | |
19 | /**\r | |
20 | * @event tap\r | |
21 | * Fires on a specified interval during the time the element is pressed.\r | |
22 | * @param {Ext.util.TapRepeater} this\r | |
23 | * @param {Ext.event.Event} e\r | |
24 | */\r | |
25 | \r | |
26 | /**\r | |
27 | * @event touchend\r | |
28 | * Fires when the touch is ended.\r | |
29 | * @param {Ext.util.TapRepeater} this\r | |
30 | * @param {Ext.event.Event} e\r | |
31 | */\r | |
32 | \r | |
33 | config: {\r | |
34 | el: null,\r | |
35 | accelerate: true,\r | |
36 | interval: 10,\r | |
37 | delay: 250,\r | |
38 | preventDefault: true,\r | |
39 | stopDefault: false,\r | |
40 | timer: 0,\r | |
41 | pressCls: null\r | |
42 | },\r | |
43 | \r | |
44 | /**\r | |
45 | * Creates new TapRepeater.\r | |
46 | * @param {Object} config\r | |
47 | */\r | |
48 | constructor: function(config) {\r | |
49 | var me = this;\r | |
50 | //<debug>\r | |
51 | for (var configName in config) {\r | |
52 | if (me.self.prototype.config && !(configName in me.self.prototype.config)) {\r | |
53 | me[configName] = config[configName];\r | |
54 | Ext.Logger.warn('Applied config as instance property: "' + configName + '"', me);\r | |
55 | }\r | |
56 | }\r | |
57 | //</debug>\r | |
58 | me.mixins.observable.constructor.call(me, config);\r | |
59 | },\r | |
60 | \r | |
61 | updateEl: function(newEl, oldEl) {\r | |
62 | var eventCfg = {\r | |
63 | touchstart: 'onTouchStart',\r | |
64 | touchend: 'onTouchEnd',\r | |
65 | tap: 'eventOptions',\r | |
66 | scope: this\r | |
67 | };\r | |
68 | if (oldEl) {\r | |
69 | oldEl.un(eventCfg)\r | |
70 | }\r | |
71 | newEl.on(eventCfg);\r | |
72 | },\r | |
73 | \r | |
74 | /**\r | |
75 | * @private\r | |
76 | */\r | |
77 | eventOptions: function(e) {\r | |
78 | if (this.getPreventDefault()) {\r | |
79 | e.preventDefault();\r | |
80 | }\r | |
81 | if (this.getStopDefault()) {\r | |
82 | e.stopEvent();\r | |
83 | }\r | |
84 | },\r | |
85 | \r | |
86 | destroy: function() {\r | |
87 | this.el = Ext.destroy(this.el);\r | |
88 | this.callParent();\r | |
89 | },\r | |
90 | \r | |
91 | /**\r | |
92 | * @private\r | |
93 | */\r | |
94 | onTouchStart: function(e) {\r | |
95 | var me = this,\r | |
96 | pressCls = me.getPressCls();\r | |
97 | clearTimeout(me.getTimer());\r | |
98 | if (pressCls) {\r | |
99 | me.getEl().addCls(pressCls);\r | |
100 | }\r | |
101 | me.tapStartTime = new Date();\r | |
102 | \r | |
103 | me.fireEvent('touchstart', me, e);\r | |
104 | me.fireEvent('tap', me, e);\r | |
105 | \r | |
106 | // Do not honor delay or interval if acceleration wanted.\r | |
107 | if (me.getAccelerate()) {\r | |
108 | me.delay = 400;\r | |
109 | }\r | |
110 | me.setTimer(Ext.defer(me.tap, me.getDelay() || me.getInterval(), me, [e]));\r | |
111 | },\r | |
112 | \r | |
113 | /**\r | |
114 | * @private\r | |
115 | */\r | |
116 | tap: function(e) {\r | |
117 | var me = this;\r | |
118 | me.fireEvent('tap', me, e);\r | |
119 | me.setTimer(Ext.defer(me.tap, me.getAccelerate() ? me.easeOutExpo(Ext.Date.getElapsed(me.tapStartTime),\r | |
120 | 400,\r | |
121 | -390,\r | |
122 | 12000) : me.getInterval(), me, [e]));\r | |
123 | },\r | |
124 | \r | |
125 | /**\r | |
126 | * @private\r | |
127 | * Easing calculation\r | |
128 | */\r | |
129 | easeOutExpo: function(t, b, c, d) {\r | |
130 | return (t == d) ? b + c : c * ( - Math.pow(2, -10 * t / d) + 1) + b;\r | |
131 | },\r | |
132 | \r | |
133 | /**\r | |
134 | * @private\r | |
135 | */\r | |
136 | onTouchEnd: function(e) {\r | |
137 | var me = this;\r | |
138 | clearTimeout(me.getTimer());\r | |
139 | me.getEl().removeCls(me.getPressCls());\r | |
140 | me.fireEvent('touchend', me, e);\r | |
141 | }\r | |
142 | });\r |