@@ -13,9 +13,11 @@ import imageSource = require("image-source");
1313import utils = require( "utils/utils" ) ;
1414
1515// key is the property id and value is Dictionary<string, StylePropertyChangedHandler>;
16- var _registeredHandlers = { } ;
16+ var _registeredHandlers = Array < Object > ( ) ;
17+
1718// key is a className + property id and value is StylePropertyChangedHandler;
1819var _handlersCache = { } ;
20+
1921// classes like Frame that does not need to handle styling properties.
2022var noStylingClasses = { } ;
2123
@@ -292,48 +294,53 @@ export function registerHandler(property: dependencyObservable.Property,
292294 handler : styling . stylers . StylePropertyChangedHandler ,
293295 className ?: string ) {
294296 var realClassName = className ? className : "default" ;
295- if ( _registeredHandlers . hasOwnProperty ( property . id + "" ) ) {
296- _registeredHandlers [ property . id ] [ realClassName ] = handler ;
297- }
298- else {
299- var handlerRecord = { } ;
300- handlerRecord [ realClassName ] = handler ;
297+
298+ var handlerRecord = _registeredHandlers [ property . id ] ;
299+ if ( ! handlerRecord ) {
300+ handlerRecord = { } ;
301301 _registeredHandlers [ property . id ] = handlerRecord ;
302302 }
303+
304+ handlerRecord [ realClassName ] = handler ;
303305}
304306
305307export function registerNoStylingClass ( className ) {
306308 noStylingClasses [ className ] = 1 ;
307309}
308310
309311export function getHandler ( property : dependencyObservable . Property , view : view . View ) : styling . stylers . StylePropertyChangedHandler {
310- var classNames = types . getBaseClasses ( view ) ;
311- // adding default as last class name if no other class is found default handler will be used
312- classNames . push ( "default" ) ;
313- if ( _handlersCache . hasOwnProperty ( classNames [ 0 ] + property . id ) ) {
314- return _handlersCache [ classNames [ 0 ] + property . id ] ;
312+ return getHandlerInternal ( property . id , types . getClassInfo ( view ) ) ;
313+ }
314+
315+ function getHandlerInternal ( propertyId : number , classInfo : types . ClassInfo ) : styling . stylers . StylePropertyChangedHandler {
316+ var className = classInfo ? classInfo . name : "default" ;
317+ var handlerKey = className + propertyId ;
318+
319+ // try the cache first
320+ var result = _handlersCache [ handlerKey ] ;
321+ if ( types . isDefined ( result ) ) {
322+ return result ;
323+ }
324+
325+ var propertyHandlers = _registeredHandlers [ propertyId ] ;
326+ if ( noStylingClasses . hasOwnProperty ( className ) || ! propertyHandlers ) {
327+ // Reached 'no-styling' class or no property handlers are registered for this proeprtyID
328+ result = null ;
329+ }
330+ else if ( propertyHandlers . hasOwnProperty ( className ) ) {
331+ // Found handler for this class
332+ result = propertyHandlers [ className ] ;
333+ }
334+ else if ( classInfo ) {
335+ // Check the base class
336+ result = getHandlerInternal ( propertyId , classInfo . baseClassInfo ) ;
315337 }
316338 else {
317- var i ;
318- var propertyHandlers ;
319- var handler ;
320- propertyHandlers = _registeredHandlers [ property . id ] ;
321- for ( i = 0 ; i < classNames . length ; i ++ ) {
322- if ( propertyHandlers ) {
323- var loopClassName = classNames [ i ] ;
324- if ( noStylingClasses . hasOwnProperty ( loopClassName ) ) {
325- _handlersCache [ loopClassName + property . id ] = null ;
326- return null ;
327- }
328- if ( propertyHandlers . hasOwnProperty ( loopClassName ) ) {
329- handler = propertyHandlers [ loopClassName ] ;
330- _handlersCache [ loopClassName + property . id ] = handler ;
331- return handler ;
332- }
333- }
334- }
339+ result = null ;
335340 }
336- return null ;
341+
342+ _handlersCache [ handlerKey ] = result ;
343+ return result ;
337344}
338345
339346// Property registration
0 commit comments