    /** * A base class for all gesture recognizers. * * The following gestures are enabled by default in both Ext JS and Sencha Touch: * * * {@link Ext.event.gesture.Tap} * * {@link Ext.event.gesture.DoubleTap} * * {@link Ext.event.gesture.LongPress} * * {@link Ext.event.gesture.Drag} * * {@link Ext.event.gesture.Swipe} * * {@link Ext.event.gesture.Pinch} * * {@link Ext.event.gesture.Rotate} * * {@link Ext.event.gesture.EdgeSwipe} * * @abstract * @private */Ext.define('Ext.event.gesture.Recognizer', {    requires: ['Ext.event.publisher.Gesture'],    mixins: ['Ext.mixin.Identifiable'],     /**     * @property {Number}     * The priority of the recognizer. Determines the order in which it recognizes gestures     * relative to other recognizers.  The default recognizers use the following priorities:     *     * - Ext.event.gesture.Drag: 100     * - Ext.event.gesture.Tap: 200     * - Ext.event.gesture.DoubleTap: 300     * - Ext.event.gesture.LongPress: 400     * - Ext.event.gesture.EdgeSwipe: 500     * - Ext.event.gesture.Swipe: 600     * - Ext.event.gesture.Pinch: 700     * - Ext.event.gesture.Rotate: 800     */    priority: 0,     handledEvents: [],     isStarted: false,     config: {        onRecognized: Ext.emptyFn,        callbackScope: null    },     constructor: function(config) {        this.initConfig(config);        Ext.event.publisher.Gesture.instance.registerRecognizer(this);    },     onStart: Ext.emptyFn,     onEnd: Ext.emptyFn,     onTouchStart: Ext.emptyFn,     onTouchMove: Ext.emptyFn,     onTouchEnd: function() {        return this.reset();    },     onTouchCancel: function(e) {        return this.cancel(e);    },     fire: function(eventName, e, info, isCancel) {        this.getOnRecognized().call(this.getCallbackScope(), this, eventName, e, info, isCancel);    },     cancel: function(e) {        if (this.isStarted) {            // If the recognizer is started, that is to say, it has already begun publishing             // events for the current gesture, then we need to make sure it fires a "cancel"             // event (implementation determined by subclasses).             this.onCancel(e);        }         return this.reset();    },     onCancel: Ext.emptyFn,     reset: function() {        this.isStarted = false;        return false;    }});