From 8d8fe1700b3ffd802ad9bbb0e2d45c8a42f31db1 Mon Sep 17 00:00:00 2001 From: Vladimir Enchev Date: Wed, 13 May 2015 16:05:45 +0300 Subject: [PATCH 1/4] Context support for gesture handler binding --- ui/builder/component-builder.ts | 2 +- ui/core/view-common.ts | 4 ++-- ui/core/view.d.ts | 2 +- ui/gestures/gestures-common.ts | 4 ++-- ui/gestures/gestures.d.ts | 4 ++-- ui/gestures/gestures.ios.ts | 26 +++++++++++++++++--------- 6 files changed, 25 insertions(+), 17 deletions(-) diff --git a/ui/builder/component-builder.ts b/ui/builder/component-builder.ts index eb2a22d01..ee1672cf6 100644 --- a/ui/builder/component-builder.ts +++ b/ui/builder/component-builder.ts @@ -194,7 +194,7 @@ function attachGestureBinding(instance: view.View, gestureName: string, value: s var handler = instance.bindingContext && instance.bindingContext[getBindingExpressionFromAttribute(value)]; // Check if the handler is function and add it to the instance for specified event name. if (types.isFunction(handler)) { - instance.observe(gestures.fromString(gestureName.toLowerCase()), handler); + instance.observe(gestures.fromString(gestureName.toLowerCase()), handler, instance.bindingContext); } instance.off(observable.Observable.propertyChangeEvent, propertyChangeHandler); } diff --git a/ui/core/view-common.ts b/ui/core/view-common.ts index 87d1a90dd..a67d2d027 100644 --- a/ui/core/view-common.ts +++ b/ui/core/view-common.ts @@ -147,8 +147,8 @@ export class View extends proxy.ProxyObject implements definition.View { this._visualState = visualStateConstants.Normal; } - observe(type: number, callback: (args: gestures.GestureEventData) => void): gestures.GesturesObserver { - this._gesturesObserver = gestures.observe(this, type, callback); + observe(type: number, callback: (args: gestures.GestureEventData) => void, thisArg?: any): gestures.GesturesObserver { + this._gesturesObserver = gestures.observe(this, type, callback, thisArg); return this._gesturesObserver; } diff --git a/ui/core/view.d.ts b/ui/core/view.d.ts index bbe9232c4..f981f3cf1 100644 --- a/ui/core/view.d.ts +++ b/ui/core/view.d.ts @@ -355,7 +355,7 @@ declare module "ui/core/view" { */ public focus(): boolean; - observe(type: number, callback: (args: gestures.GestureEventData) => void): gestures.GesturesObserver; + observe(type: number, callback: (args: gestures.GestureEventData) => void, thisArg?: any): gestures.GesturesObserver; /** * A basic method signature to hook an event listener (shortcut alias to the addEventListener method). diff --git a/ui/gestures/gestures-common.ts b/ui/gestures/gestures-common.ts index 62eec6113..4ace2eea1 100644 --- a/ui/gestures/gestures-common.ts +++ b/ui/gestures/gestures-common.ts @@ -28,9 +28,9 @@ export enum SwipeDirection { down = 1 << 3 } -export function observe(target: view.View, type: number, callback: (args: definition.GestureEventData) => void): definition.GesturesObserver { +export function observe(target: view.View, type: number, callback: (args: definition.GestureEventData) => void, thisArg?: any): definition.GesturesObserver { var observer = new definition.GesturesObserver(callback); - observer.observe(target, type); + observer.observe(target, type, thisArg); return observer; } diff --git a/ui/gestures/gestures.d.ts b/ui/gestures/gestures.d.ts index ea50afb8b..c8d6fa0b7 100644 --- a/ui/gestures/gestures.d.ts +++ b/ui/gestures/gestures.d.ts @@ -126,7 +126,7 @@ declare module "ui/gestures" { * @param target - View which will be watched for originating a specific gesture. * @param type - Type of the gesture. */ - observe(target: view.View, type: GestureTypes); + observe(target: view.View, type: GestureTypes, thisArg?: any); /** * Disconnects the gesture observer. @@ -140,7 +140,7 @@ declare module "ui/gestures" { * @param type - Type of the gesture. * @param callback - A function that will be executed when a gesture is received. */ - export function observe(target: view.View, type: GestureTypes, callback: (args: GestureEventData) => void): GesturesObserver; + export function observe(target: view.View, type: GestureTypes, callback: (args: GestureEventData) => void, thisArg?: any): GesturesObserver; /** * Returns a string representation of a gesture type. diff --git a/ui/gestures/gestures.ios.ts b/ui/gestures/gestures.ios.ts index ca4b7a872..d867c28c8 100644 --- a/ui/gestures/gestures.ios.ts +++ b/ui/gestures/gestures.ios.ts @@ -16,14 +16,20 @@ class UIGestureRecognizerImpl extends NSObject { private _owner: GesturesObserver; private _type: any; private _callback: Function; + private _context: any; - public initWithOwnerTypeCallback(owner: GesturesObserver, type: any, callback?: Function): UIGestureRecognizerImpl { + public initWithOwnerTypeCallback(owner: GesturesObserver, type: any, callback?: Function, thisArg?: any): UIGestureRecognizerImpl { this._owner = owner; this._type = type; + if (callback) { this._callback = callback; } + if (thisArg) { + this._context = thisArg; + } + return this; } @@ -44,7 +50,7 @@ class UIGestureRecognizerImpl extends NSObject { }; if (callback) { - callback(args); + callback.call(this._context, args); } } } @@ -53,6 +59,7 @@ export class GesturesObserver implements definition.GesturesObserver { public _callback: (args: definition.GestureEventData) => void; public _target: view.View; private _recognizers: {}; + private _context: any; private _onTargetLoaded: (data: observable.EventData) => void; private _onTargetUnloaded: (data: observable.EventData) => void; @@ -62,9 +69,10 @@ export class GesturesObserver implements definition.GesturesObserver { this._recognizers = {}; } - public observe(target: view.View, type: definition.GestureTypes) { + public observe(target: view.View, type: definition.GestureTypes, thisArg?: any) { if (target) { this._target = target; + this._context = thisArg; this._onTargetLoaded = args => { trace.write(this._target + ".target loaded. _nativeView:" + this._target._nativeView, "gestures"); this._attach(target, type); @@ -84,7 +92,7 @@ export class GesturesObserver implements definition.GesturesObserver { } - private _attach(target: view.View, type: definition.GestureTypes) { + private _attach(target: view.View, type: definition.GestureTypes) { trace.write(target + "._attach() _nativeView:" + target._nativeView, "gestures"); this._dettach(); @@ -175,14 +183,14 @@ export class GesturesObserver implements definition.GesturesObserver { private _executeCallback(args: definition.GestureEventData) { if (this._callback) { - this._callback(args); + this._callback.call(this._context, args); } } private _createRecognizer(type: definition.GestureTypes, callback?: (args: definition.GestureEventData) => void, swipeDirection?: UISwipeGestureRecognizerDirection): UIGestureRecognizer { var recognizer: UIGestureRecognizer; var name = definition.toString(type); - var target = _createUIGestureRecognizerTarget(this, type, callback); + var target = _createUIGestureRecognizerTarget(this, type, callback, this._context); var recognizerType = _getUIGestureRecognizerType(type); if (recognizerType) { @@ -194,7 +202,7 @@ export class GesturesObserver implements definition.GesturesObserver { else { recognizer = recognizerType.alloc().initWithTargetAction(target, "recognize"); } - + if (recognizer) { this._recognizers[name] = { recognizer: recognizer, target: target }; } @@ -204,8 +212,8 @@ export class GesturesObserver implements definition.GesturesObserver { } } -function _createUIGestureRecognizerTarget(owner: GesturesObserver, type: definition.GestureTypes, callback?: (args: definition.GestureEventData) => void): any { - return UIGestureRecognizerImpl.new().initWithOwnerTypeCallback(owner, type, callback); +function _createUIGestureRecognizerTarget(owner: GesturesObserver, type: definition.GestureTypes, callback?: (args: definition.GestureEventData) => void, thisArg?: any): any { + return UIGestureRecognizerImpl.new().initWithOwnerTypeCallback(owner, type, callback, thisArg); } interface RecognizerCache { From d9f0fda3867299c59d6442f01e6f7506d256e159 Mon Sep 17 00:00:00 2001 From: Vladimir Enchev Date: Wed, 13 May 2015 16:12:12 +0300 Subject: [PATCH 2/4] android support added --- ui/gestures/gestures.android.ts | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/ui/gestures/gestures.android.ts b/ui/gestures/gestures.android.ts index 587c81f4b..9de6e3164 100644 --- a/ui/gestures/gestures.android.ts +++ b/ui/gestures/gestures.android.ts @@ -14,6 +14,7 @@ var SWIPE_VELOCITY_THRESHOLD = 100; export class GesturesObserver implements definition.GesturesObserver { private _callback: (args: definition.GestureEventData) => void; private _target: view.View; + private _context: any; private _onTouchListener: android.view.View.OnTouchListener; public _simpleGestureDetector: android.view.GestureDetector; @@ -32,17 +33,18 @@ export class GesturesObserver implements definition.GesturesObserver { return this._callback; } - public observe(target: view.View, type: definition.GestureTypes) { + public observe(target: view.View, type: definition.GestureTypes, thisArg?: any) { if (target) { this._target = target; - this._onTargetLoaded = args => { + this._context = thisArg; + this._onTargetLoaded = args => { trace.write(this._target + ".target loaded. android:" + this._target.android, "gestures"); - this._attach(target, type); + this._attach(target, type); }; - this._onTargetUnloaded = args => { + this._onTargetUnloaded = args => { trace.write(this._target + ".target unloaded. android:" + this._target.android, "gestures"); this._dettach(); - }; + }; target.on(view.View.loadedEvent, this._onTargetLoaded); target.on(view.View.unloadedEvent, this._onTargetUnloaded); @@ -140,7 +142,7 @@ export class GesturesObserver implements definition.GesturesObserver { var observer = that.get(); if (observer && observer.callback) { - observer.callback(args); + observer.callback.apply(observer._context, args); } } @@ -184,7 +186,7 @@ function _getPanArgs(deltaX: number, deltaY: number, view: view.View, function _executeCallback(observer: GesturesObserver, args: definition.GestureEventData) { if (observer && observer.callback) { - observer.callback(args); + observer.callback.apply((observer)._context, args); } } From a73c42c85339b962edbb18d6d3386f1f26e98044 Mon Sep 17 00:00:00 2001 From: Vladimir Enchev Date: Wed, 13 May 2015 16:33:36 +0300 Subject: [PATCH 3/4] apply changed to call --- ui/gestures/gestures.android.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/gestures/gestures.android.ts b/ui/gestures/gestures.android.ts index 9de6e3164..c45cf5ed3 100644 --- a/ui/gestures/gestures.android.ts +++ b/ui/gestures/gestures.android.ts @@ -142,7 +142,7 @@ export class GesturesObserver implements definition.GesturesObserver { var observer = that.get(); if (observer && observer.callback) { - observer.callback.apply(observer._context, args); + observer.callback.call(observer._context, args); } } @@ -186,7 +186,7 @@ function _getPanArgs(deltaX: number, deltaY: number, view: view.View, function _executeCallback(observer: GesturesObserver, args: definition.GestureEventData) { if (observer && observer.callback) { - observer.callback.apply((observer)._context, args); + observer.callback.call((observer)._context, args); } } From 979cc7eb1fd6c813e258bc4904e45e3af73ef44b Mon Sep 17 00:00:00 2001 From: Vladimir Enchev Date: Thu, 14 May 2015 09:24:15 +0300 Subject: [PATCH 4/4] test improved --- apps/tests/xml-declaration/xml-declaration-tests.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/apps/tests/xml-declaration/xml-declaration-tests.ts b/apps/tests/xml-declaration/xml-declaration-tests.ts index 594e8f2d1..a0600b51b 100644 --- a/apps/tests/xml-declaration/xml-declaration-tests.ts +++ b/apps/tests/xml-declaration/xml-declaration-tests.ts @@ -165,14 +165,19 @@ export function test_parse_ShouldParseBindingsToEvents() { export function test_parse_ShouldParseBindingsToGestures() { var p = builder.parse(""); - p.bindingContext = { + var context = { myTap: function (args) { // } }; + + p.bindingContext = context; var lbl = p.content; - TKUnit.assert((lbl)._gesturesObserver !== undefined, "Expected result: true."); + var observer = (lbl)._gesturesObserver; + + TKUnit.assert(observer !== undefined, "Expected result: true."); + TKUnit.assert(observer._context === context, "Context should be equal to binding context. Actual result: " + observer._context); }; export function test_parse_ShouldParseSubProperties() {