Ext.gesture.Gesture = Ext.extend(Object, {
listenForStart: true,
listenForEnd: true,
listenForMove: true,
disableLocking: false,
touches: 1,
constructor: function(config) {
config = config || {};
Ext.apply(this, config);
this.target = Ext.getDom(this.target);
this.listeners = {};
//
if (!this.target) {
throw new Error('Trying to bind a ' + this.type + ' event to element that does\'nt exist: ' + this.target);
}
//
this.id = this.target.id + '-' + this.type;
Ext.gesture.Gesture.superclass.constructor.call(this);
Ext.gesture.Manager.register(this);
},
addListener: function(name, listener) {
this.listeners[name] = this.listeners[name] || [];
this.listeners[name].push(listener);
},
removeListener: function(name, listener) {
var listeners = this.listeners[name];
if (listeners) {
listeners.remove(listener);
if (listeners.length == 0) {
delete this.listeners[name];
}
for (name in this.listeners) {
if (this.listeners.hasOwnProperty(name)) {
return;
}
}
this.listeners = {};
}
},
fire: function(type, e, args) {
var listeners = this.listeners[type],
ln = listeners && listeners.length,
i;
if (!this.disableLocking && this.isLocked(type)) {
return false;
}
if (ln) {
args = Ext.apply(args || {}, {
time: e.timeStamp,
type: type,
gesture: this,
target: (e.target.nodeType == 3) ? e.target.parentNode: e.target
});
for (i = 0; i < ln; i++) {
listeners[i](e, args);
}
}
return true;
},
stop: function() {
Ext.gesture.Manager.stopGesture(this);
},
lock: function() {
if (!this.disableLocking) {
var args = arguments,
ln = args.length,
i;
for (i = 0; i < ln; i++) {
Ext.gesture.Manager.locks[args[i]] = this.id;
}
}
},
unlock: function() {
if (!this.disableLocking) {
var args = arguments,
ln = args.length,
i;
for (i = 0; i < ln; i++) {
if (Ext.gesture.Manager.locks[args[i]] == this.id) {
delete Ext.gesture.Manager.locks[args[i]];
}
}
}
},
isLocked : function(type) {
var lock = Ext.gesture.Manager.locks[type];
return !!(lock && lock !== this.id);
},
getLockingGesture : function(type) {
var lock = Ext.gesture.Manager.locks[type];
if (lock) {
return Ext.gesture.Manager.get(lock) || null;
}
return null;
},
onTouchStart: Ext.emptyFn,
onTouchMove: Ext.emptyFn,
onTouchEnd: Ext.emptyFn,
destroy: function() {
this.stop();
this.listeners = null;
Ext.gesture.Manager.unregister(this);
}
});