\r
X_Class_CLASS_LIST = [],\r
X_Class_DEF_LIST = [],\r
- X_Class_CALLING_SUPER = [],\r
- X_Class_CALL_SUPER_STACK = [],\r
X_Class_SUPER_CALLER = [],\r
X_Class_SUPER_STACKS = [],\r
X_Class_traits = null,\r
'Super' : function( var_args ){\r
var me = this,\r
sClass = me,\r
- i = X_Class_CALLING_SUPER.indexOf( me ),\r
- l, sList, def, sConst, ret;\r
+ i = X_Class_SUPER_CALLER.indexOf( me ),\r
+ stack, t, def, ret;\r
\r
if( i === -1 ){\r
- X_Class_CALLING_SUPER[ l = X_Class_CALLING_SUPER.length ] = me;\r
- X_Class_CALL_SUPER_STACK[ l ] = sList = [];\r
- def = X_Class_getClassDef( me );\r
- if( !def.Constructor ) sClass = def.SuperClass;// 現在のクラスがコンストラクタを持たない場合 SuperConstructor を new で呼んでいるため再び呼ばないようにする\r
+ X_Class_SUPER_CALLER[ i = X_Class_SUPER_CALLER.length ] = me;\r
+ X_Class_SUPER_STACKS[ i ] = stack = 0;\r
} else {\r
- sList = X_Class_CALL_SUPER_STACK[ i ];\r
+ stack = X_Class_SUPER_STACKS[ i ];\r
};\r
\r
+ t = stack;\r
+ \r
+ while( t ){\r
+ sClass = X_Class_getClassDef( sClass ).SuperClass;\r
+ --t;\r
+ };\r
+ \r
while( sClass ){\r
+ ++t;\r
+ sClass = X_Class_getClassDef( sClass ).SuperClass;\r
+ if( !sClass ) break;\r
def = X_Class_getClassDef( sClass );\r
- sClass = def.SuperClass;\r
- sConst = def.SuperConstructor;\r
- if( !sConst ) break;\r
- if( sList.indexOf( sConst ) === -1 ){\r
- sList[ sList.length ] = sConst;\r
- ret = sConst.apply( me, arguments );\r
- --sList.length;\r
- if( !sList.length ){\r
- X_Class_CALLING_SUPER.splice( i, 1 );\r
- X_Class_CALL_SUPER_STACK.splice( i, 1 );\r
- };\r
- return ret || me;\r
+ \r
+ if( def.Constructor ){\r
+ X_Class_SUPER_STACKS[ i ] += t;\r
+ ret = def.Constructor.apply( me, arguments );\r
+ break;\r
};\r
};\r
- console.log( 'スーパークラスのコンストラクタが見つかりません' );\r
+ \r
+ if( X_Class_SUPER_STACKS[ i ] === stack ) console.log( 'スーパークラス、またはスーパークラスのコンストラクタは存在しません' );\r
+ \r
+ if( stack === 0 ){\r
+ X_Class_SUPER_CALLER.splice( i, 1 );\r
+ X_Class_SUPER_STACKS.splice( i, 1 );\r
+ } else {\r
+ X_Class_SUPER_STACKS[ i ] = stack;\r
+ };\r
+ return ret || me;\r
},\r
\r
/**\r
i = X_Class_SUPER_CALLER.indexOf( me ),\r
l, d, ret,\r
args = arguments,\r
- name, p, sFunc, hit;\r
+ name, p, sFunc;\r
\r
if( X_Type_isFunction( myFunc ) ){\r
for( p in proto ){\r
};\r
\r
if( i === -1 ){\r
- X_Class_SUPER_CALLER[ l = X_Class_SUPER_CALLER.length ] = me;\r
- X_Class_SUPER_STACKS[ l ] = d = {};\r
+ X_Class_SUPER_CALLER[ i = X_Class_SUPER_CALLER.length ] = me;\r
+ X_Class_SUPER_STACKS[ i ] = stack = 0;\r
} else {\r
- d = X_Class_SUPER_STACKS[ i ];\r
- };\r
- \r
- if( stack = d[ name ] ){\r
- myFunc = stack[ stack.length - 1 ];\r
- } else {\r
- stack = d[ name ] = [];\r
+ stack = X_Class_SUPER_STACKS[ i ];\r
};\r
\r
- /*\r
+ t = stack;\r
+\r
while( t ){\r
sClass = X_Class_getClassDef( sClass ).SuperClass;\r
--t;\r
};\r
- mysFunc = sClass.prototype[ name ]; */\r
-\r
-\r
- // TODO \r
- while( sClass ){\r
- sFunc = sClass.prototype[ name ];\r
- \r
- if( !hit && sFunc === myFunc ){\r
- hit = true; // 現在の関数にヒット, さらにスーパークラスを辿って同名のプロパティの関数が現れたらそれが目指すもの\r
- } else\r
- if( hit && sFunc !== myFunc /* X_Object_own( name, sClass.prototype ) */ ){\r
- // this の関数と異なり、値が設定されていたら、今は手を抜いて undef か?見ている、正しくは hasOwnProperty\r
- if( X_Type_isFunction( sFunc ) ){\r
- stack[ stack.length ] = sFunc;\r
- switch( args.length ){\r
- case 0 :\r
- ret = sFunc.call( me );\r
- break;\r
- case 1 :\r
- ret = sFunc.call( me, args[ 0 ] );\r
- break;\r
- case 2 :\r
- ret = sFunc.call( me, args[ 0 ], args[ 1 ] );\r
- break;\r
- case 3 :\r
- ret = sFunc.call( me, args[ 0 ], args[ 1 ], args[ 2 ] );\r
- break;\r
- default :\r
- args = X_Array_copy( args );\r
- args.shift();\r
- ret = sFunc.apply( me, args );\r
- break; \r
+ \r
+ if( sClass ){\r
+ myFunc = sClass.prototype[ name ];\r
+\r
+ while( sClass ){\r
+ ++t;\r
+ sClass = X_Class_getClassDef( sClass ).SuperClass; \r
+ sFunc = sClass.prototype[ name ];\r
+ \r
+ if( sFunc !== myFunc /* X_Object_own( name, sClass.prototype ) */ ){\r
+ // this の関数と異なり、値が設定されていたら、今は手を抜いて undef か?見ている、正しくは hasOwnProperty\r
+ if( X_Type_isFunction( sFunc ) ){\r
+ X_Class_SUPER_STACKS[ i ] += t;\r
+ switch( args.length ){\r
+ case 0 :\r
+ ret = sFunc.call( me );\r
+ break;\r
+ case 1 :\r
+ ret = sFunc.call( me, args[ 0 ] );\r
+ break;\r
+ case 2 :\r
+ ret = sFunc.call( me, args[ 0 ], args[ 1 ] );\r
+ break;\r
+ case 3 :\r
+ ret = sFunc.call( me, args[ 0 ], args[ 1 ], args[ 2 ] );\r
+ break;\r
+ default :\r
+ args = X_Array_copy( args );\r
+ args.shift();\r
+ ret = sFunc.apply( me, args );\r
+ break; \r
+ };\r
};\r
- --stack.length;\r
+ break;\r
};\r
- break;\r
};\r
- sClass = X_Class_getClassDef( sClass ).SuperClass; \r
};\r
- \r
- if( !stack.length ) delete d[ name ];\r
- if( X_Object_isEmpty( d ) ){\r
- X_Class_SUPER_CALLER.splice( l, 1 );\r
- X_Class_SUPER_STACKS.splice( l, 1 );\r
+\r
+ if( stack === 0 ){\r
+ X_Class_SUPER_CALLER.splice( i, 1 );\r
+ X_Class_SUPER_STACKS.splice( i, 1 );\r
+ } else {\r
+ X_Class_SUPER_STACKS[ i ] = stack;\r
};\r
return ret;\r
},\r
def = X_Class_getClassDef( klass );\r
// 継承用プロパティを控える\r
def.SuperClass = Super;\r
- def.SuperProto = Super.prototype;\r
- def.SuperConstructor = superDef.Constructor || superDef.SuperConstructor;\r
+ //def.SuperProto = Super.prototype;\r
+ //def.SuperConstructor = superDef.Constructor || superDef.SuperConstructor;\r
\r
return klass;\r
};\r
\r
obj = def.Constructor ?\r
def.Constructor.apply( instance, args ) :\r
- def.SuperConstructor &&\r
- def.SuperConstructor.apply( instance, args );\r
+ instance[ 'Super' ].apply( instance, args );\r
\r
if( obj !== instance && ( X_Type_isObject( obj ) || X_Type_isFunction( obj ) ) ){ // Class\r
instance[ 'kill' ]();\r
XUI_Gesture_CAPTURED = {},\r
XUI_Gesture_DEFAULTS = {};\r
\r
-// AbstractUINode に移動\r
\r
-var XUI_Gesture = Hammer = X_Class_create(\r
- 'X.UI.Gesture',\r
- X_Class.NONE,\r
- {\r
- uinodeRoot : null,\r
- uinode : null,\r
- options : null,\r
- \r
- activated : null,\r
- types : null,\r
-\r
- triggered : null,\r
- canceled : null,\r
- \r
- currentName : '',\r
- startEvent : null,\r
- lastEvent : null,\r
- lastMoveEvent : null,\r
- \r
- 'Constructor' : function( uinodeRoot, uinode, type, opt_options ){\r
- this.uinodeRoot = uinodeRoot;\r
- this.uinode = uinode;\r
- this.options = X_Object_override( X_Object_copy( XUI_Gesture_DEFAULTS ), opt_options );\r
- \r
- this.triggered = {};\r
- this.canceled = {};\r
+function XUI_Gesture_trigger( uinode, type, hammerEvent ){\r
+ if( !uinode.gestureTypes[ type ] ) return X_CALLBACK_NONE;\r
+ hammerEvent = X_Object_copy( hammerEvent );\r
+ hammerEvent.type = type;\r
+ return uinode[ 'dispatch' ]( hammerEvent ) || X_CALLBACK_NONE;\r
+};\r
\r
- uinode[ 'listen' ]( XUI_Event._POINTER_DOWN, this, XUI_Gesture_handleEvent );\r
- \r
- this[ 'listen' ]( type );\r
- },\r
+function XUI_$UINodeBase_listen( type, arg1, arg2, arg3 ){\r
+ var events, gestures, i, g;\r
+ \r
+ if( XUI_Event._START_POINTER <= type && type <= XUI_Event._END_POINTER ){\r
+ if( this.phase < 3 ){\r
+ if( !( events = this.reserveEvents ) ) this.reserveEvents = events = [];\r
+ events[ events.length ] = [ type, arg1, arg2, arg3 ];\r
+ return this;\r
+ };\r
\r
- trigger : function( type, gesture ){\r
- var e;\r
- \r
- if( !this.types[ type ] ) return X_CALLBACK_NONE;\r
- e = X_Object_copy( gesture );\r
- e.type = type;\r
- return this.uinode[ 'dispatch' ]( e ) || X_CALLBACK_NONE;\r
- },\r
+ if( this[ 'listening' ]( type, arg1, arg2, arg3 ) ){\r
+ return this;\r
+ };\r
\r
- listen : function( type ){\r
- var gestures = XUI_Gesture_LIST,\r
- i = gestures.length, g;\r
-\r
- for( ; i; ){\r
+ if( XUI_Event._START_XUI_EVENT < type && type < XUI_Event._END_XUI_EVENT ){\r
+ gestures = XUI_Gesture_LIST;\r
+ for( i = gestures.length; i; ){\r
g = gestures[ --i ];\r
if( g.startID <= type && type <= g.endID ){\r
- if( !this.activated ) this.activated = {};\r
- if( !this.types ) this.types = {};\r
- this.activated[ g.name ] = this.types[ type ] = 1;\r
+ if( !this.gestureActivated ){\r
+ this.gestureOptions = XUI_Gesture_DEFAULTS; //X_Object_override( X_Object_copy( XUI_Gesture_DEFAULTS ), opt_options );\r
+ this.gestureActivated = {};\r
+ this.gestureTypes = {};\r
+ this.gestureTriggered = {};\r
+ this.gestureCanceled = {};\r
+ };\r
+ if( X_Object_isEmpty( this.gestureActivated ) ){\r
+ this[ 'listen' ]( XUI_Event._POINTER_DOWN, this, XUI_Gesture_handleEvent );\r
+ };\r
+ this.gestureActivated[ g.name ] = this.gestureTypes[ type ] = true;\r
break;\r
};\r
};\r
- },\r
- \r
- unlisten : function( type ){\r
- var gestures = XUI_Gesture_LIST,\r
- i = gestures.length,\r
- active = this.activated, g;\r
+ } else\r
+ if( XUI_EVENT_COUNTER[ type ] ){\r
+ ++XUI_EVENT_COUNTER[ type ];\r
+ } else {\r
+ XUI_EVENT_COUNTER[ type ] = 1; \r
+ XUI_xnodeIneraction[ 'listen' ]( XUI_Event.IdToName[ type ], X_UI_eventRellay );\r
+ };\r
+ };\r
+ \r
+ return X_EventDispatcher_listen.apply( this, arguments );\r
+};\r
\r
- if( !active ) return;\r
- for( ; i; ){\r
- g = gestures[ --i ];\r
- if( g.startID <= type && type <= g.endID ){\r
- if( active[ g.name ] ){\r
- if( this.types[ type ] ) delete this.types[ type ];\r
- for( i = g.startID; i <= g.endID; ++i ){\r
- if( this.types[ i ] ) return;\r
+function XUI_$UINodeBase_unlisten( type, arg1, arg2, arg3 ){\r
+ var events, i, ev, gestures, active, g, f;\r
+ \r
+ if( XUI_Event._START_POINTER <= type && type <= XUI_Event._END_POINTER ){\r
+ if( this.phase < 3 ){\r
+ if( !( events = this.reserveEvents ) ) return this;\r
+ for( i = events.length; i; ){\r
+ ev = events[ --i ];\r
+ if( ev[ 0 ] === type && ev[ 1 ] === arg1 && ev[ 2 ] === arg2 && ev[ 3 ] === arg3 ){\r
+ events.split( i, 1 );\r
+ return this;\r
+ };\r
+ }; \r
+ return this;\r
+ };\r
+\r
+ if( !this[ 'listening' ]( type, arg1, arg2, arg3 ) ){\r
+ return this;\r
+ };\r
+ \r
+ if( XUI_Event._START_XUI_EVENT < type && type < XUI_Event._END_XUI_EVENT ){\r
+ if( active = this.gestureActivated ){\r
+ gestures = XUI_Gesture_LIST;\r
+ for( i = gestures.length ; i; ){\r
+ g = gestures[ --i ];\r
+ if( g.startID <= type && type <= g.endID ){\r
+ if( active[ g.name ] ){\r
+ if( this.gestureTypes[ type ] ) delete this.gestureTypes[ type ];\r
+ for( i = g.startID; i <= g.endID; ++i ){\r
+ if( this.gestureTypes[ i ] ){\r
+ f = true;\r
+ break;\r
+ };\r
+ };\r
+ if( !f ){\r
+ delete active[ g.name ];\r
+ \r
+ if( X_Object_isEmpty( active ) ){\r
+ this[ 'unlisten' ]( XUI_Event._POINTER_DOWN, this, XUI_Gesture_handleEvent );\r
+ //delete this.gestureTriggered;\r
+ //delete this.gestureCanceled;\r
+ //delete this.gestureTypes;\r
+ //delete this.gestureActivated;\r
+ };\r
+ };\r
};\r
- delete active[ g.name ];\r
+ break;\r
};\r
- break;\r
- };\r
+ }; \r
};\r
- }\r
- }\r
-);\r
+ } else {\r
+ if( XUI_EVENT_COUNTER[ type ] === 1 ){\r
+ XUI_xnodeIneraction[ 'unlisten' ]( XUI_Event.IdToName[ type ], X_UI_eventRellay );\r
+ XUI_EVENT_COUNTER[ type ] = 0;\r
+ } else\r
+ if( XUI_EVENT_COUNTER[ type ] ){\r
+ --XUI_EVENT_COUNTER[ type ];\r
+ };\r
+ };\r
+ };\r
+\r
+ return X_EventDispatcher_unlisten.apply( this, arguments );\r
+};\r
\r
function XUI_Gesture_handleEvent( e ){\r
var gestures = XUI_Gesture_LIST,\r
i, p, l, j, captured, ret, activated, gesture, startEv,\r
deltaTime, deltaX, deltaY, velocity, center, startCenter;\r
\r
- if( !isStart && !hammer.startEvent ) return;\r
+ if( !isStart && !hammer.gestureStartEvent ) return;\r
\r
-if( type === XUI_Event.POINTER_OUT ) console.log( 'canceled ...' + e.button )\r
+if( type === XUI_Event.POINTER_OUT ) console.log( 'gestureCanceled ...' + e.button )\r
\r
if( isEnd ){\r
if( XUI_Gesture_POINTERS[ uid ] ){\r
\r
// because touchend has no touches, and we often want to use these in our gestures,\r
// we send the last move event as our eventData in touchend\r
- ( isEnd && hammer.lastMoveEvent ) ? ( e = hammer.lastMoveEvent ) : ( hammer.lastMoveEvent = e ); // store the last move event\r
+ ( isEnd && hammer.gestureLastMoveEvent ) ? ( e = hammer.gestureLastMoveEvent ) : ( hammer.gestureLastMoveEvent = e ); // store the last move event\r
\r
hammerEvent = X_Object_copy( e );\r
hammerEvent.touches = touches;\r
\r
- if( isStart && !hammer.startEvent ){\r
+ if( isStart && !hammer.gestureStartEvent ){\r
console.log( '=- add -=' );\r
// already busy with a Hammer.gesture detection on an element\r
- hammer.startEvent = hammerEvent;\r
- hammer.uinodeRoot[ 'listen' ]( [ XUI_Event._POINTER_MOVE, XUI_Event._POINTER_UP, XUI_Event._POINTER_CANCEL, XUI_Event.POINTER_OUT ], hammer, XUI_Gesture_handleEvent ); \r
+ hammer.gestureStartEvent = hammerEvent;\r
+ XUI_rootData[ 'listen' ]( [ XUI_Event._POINTER_MOVE, XUI_Event._POINTER_UP, XUI_Event._POINTER_CANCEL, XUI_Event.POINTER_OUT ], hammer, XUI_Gesture_handleEvent ); \r
};\r
\r
- startEv = hammer.startEvent;\r
+ startEv = hammer.gestureStartEvent;\r
\r
\r
// if the touches change, set the new touches over the startEvent touches\r
scale : XUI_GestureUtils.getScale( startEv.touches, touches ),\r
rotation : XUI_GestureUtils.getRotation( startEv.touches, touches ),\r
\r
- startEvent : startEv\r
+ gestureStartEvent : startEv\r
});\r
\r
// store as previous event event\r
- hammer.lastEvent = hammerEvent;\r
- activated = hammer.activated;\r
+ hammer.gestureLastEvent = hammerEvent;\r
+ activated = hammer.gestureActivated;\r
console.log( '... ' );\r
// call Hammer.gesture handlers\r
for( i = 0, l = gestures.length; i < l; ++i ){\r
gesture = gestures[ i ];\r
\r
- if( activated[ gesture.name ] && !hammer.canceled[ gesture.name ] ){\r
+ if( activated[ gesture.name ] && !hammer.gestureCanceled[ gesture.name ] ){\r
( console.log( '... ' + i + ' ' + gesture.name ) );\r
// if a handler returns false, we stop with the detection\r
( ret |= ( gesture.handler( hammerEvent, hammer ) || X_CALLBACK_NONE ) );\r
\r
if( isEnd ){\r
console.log( '=- clear -=' );\r
- hammer.uinodeRoot[ 'unlisten' ]( [ XUI_Event._POINTER_MOVE, XUI_Event._POINTER_UP, XUI_Event._POINTER_CANCEL, XUI_Event.POINTER_OUT ], hammer, XUI_Gesture_handleEvent );\r
+ XUI_rootData[ 'unlisten' ]( [ XUI_Event._POINTER_MOVE, XUI_Event._POINTER_UP, XUI_Event._POINTER_CANCEL, XUI_Event.POINTER_OUT ], hammer, XUI_Gesture_handleEvent );\r
\r
hammer.previous = {\r
- currentName : hammer.currentName,\r
- startEvent : hammer.startEvent,\r
- lastEvent : hammer.lastEvent,\r
- lastMoveEvent : hammer.lastMoveEvent\r
+ gestureCurrentName : hammer.gestureCurrentName,\r
+ gestureStartEvent : hammer.gestureStartEvent,\r
+ gestureLastEvent : hammer.gestureLastEvent,\r
+ gestureLastMoveEvent : hammer.gestureLastMoveEvent\r
};\r
\r
- X_Object_clear( hammer.triggered );\r
- X_Object_clear( hammer.canceled );\r
+ X_Object_clear( hammer.gestureTriggered );\r
+ X_Object_clear( hammer.gestureCanceled );\r
\r
- delete hammer.currentName;\r
- delete hammer.startEvent;\r
- delete hammer.lastEvent;\r
- delete hammer.lastMoveEvent;\r
+ delete hammer.gestureCurrentName;\r
+ delete hammer.gestureStartEvent;\r
+ delete hammer.gestureLastEvent;\r
+ delete hammer.gestureLastMoveEvent;\r
\r
ret |= X_CALLBACK_RELEASE_POINTER;\r
};\r
prevent_mouseevents : false\r
},\r
handler : function( e, hammer ){\r
- if( hammer.options.prevent_mouseevents && e[ 'pointerType' ] === 'mouse' ){\r
+ if( hammer.gestureOptions.prevent_mouseevents && e[ 'pointerType' ] === 'mouse' ){\r
return X_CALLBACK_STOP_NOW;\r
};\r
\r
- //hammer.options.prevent_default && e.preventDefault();\r
+ //hammer.gestureOptions.prevent_default && e.preventDefault();\r
\r
- return e.type === XUI_Event._POINTER_DOWN && hammer.trigger( XUI_Event.TOUCH, e );\r
+ return e.type === XUI_Event._POINTER_DOWN && XUI_Gesture_trigger( hammer, XUI_Event.TOUCH, e );\r
}\r
},\r
\r
\r
// current gesture isnt drag, but dragged is true\r
// this means an other gesture is busy. now call dragend\r
- if( hammer.currentName !== transform.name && hammer.triggered[ transform.name ] ){\r
- ret = hammer.trigger( XUI_Event.TRANSFORM_END, e );\r
- delete hammer.triggered[ transform.name ];\r
+ if( hammer.gestureCurrentName !== transform.name && hammer.gestureTriggered[ transform.name ] ){\r
+ ret = XUI_Gesture_trigger( hammer, XUI_Event.TRANSFORM_END, e );\r
+ delete hammer.gestureTriggered[ transform.name ];\r
return ret;\r
};\r
\r
if( e.touches.length < 2 ) return;\r
\r
// prevent default when two fingers are on the screen\r
- //hammer.options.transform_always_block && e.preventDefault();\r
+ //hammer.gestureOptions.transform_always_block && e.preventDefault();\r
\r
switch( e.type ){\r
case XUI_Event._POINTER_DOWN :\r
- //hammer.triggered[ transform.name ] = false;\r
+ //hammer.gestureTriggered[ transform.name ] = false;\r
break;\r
\r
case XUI_Event._POINTER_MOVE:\r
\r
// when the distance we moved is too small we skip this gesture\r
// or we can be already in dragging\r
- if( scale_threshold < hammer.options.transform_min_scale && rotation_threshold < hammer.options.transform_min_rotation ) return;\r
+ if( scale_threshold < hammer.gestureOptions.transform_min_scale && rotation_threshold < hammer.gestureOptions.transform_min_rotation ) return;\r
\r
// we are transforming!\r
- hammer.currentName = transform.name;\r
+ hammer.gestureCurrentName = transform.name;\r
\r
// first time, trigger dragstart event\r
- if( !hammer.triggered[ transform.name ] ){\r
- ret = hammer.trigger( XUI_Event.TRANSFORM_START, e );\r
+ if( !hammer.gestureTriggered[ transform.name ] ){\r
+ ret = XUI_Gesture_trigger( hammer, XUI_Event.TRANSFORM_START, e );\r
if( ret & X_CALLBACK_PREVENT_DEFAULT ){\r
- hammer.canceled[ transform.name ] = true;\r
+ hammer.gestureCanceled[ transform.name ] = true;\r
break;\r
};\r
- hammer.triggered[ transform.name ] = true;\r
+ hammer.gestureTriggered[ transform.name ] = true;\r
break;\r
};\r
\r
- ret |= hammer.trigger( XUI_Event.TRANSFORM, e );\r
+ ret |= XUI_Gesture_trigger( hammer, XUI_Event.TRANSFORM, e );\r
// basic transform event\r
\r
// trigger rotate event\r
- if( hammer.options.transform_min_rotation < rotation_threshold ){\r
- ret |= hammer.trigger( XUI_Event.ROTATE, e );\r
+ if( hammer.gestureOptions.transform_min_rotation < rotation_threshold ){\r
+ ret |= XUI_Gesture_trigger( hammer, XUI_Event.ROTATE, e );\r
};\r
\r
// trigger pinch event\r
- if( scale_threshold > hammer.options.transform_min_scale ){\r
- ret |= hammer.trigger( XUI_Event.PINCH, e );\r
- ret |= hammer.trigger( e.scale < 1 ? XUI_Event.PINCH_IN : XUI_Event.PINCH_OUT, e );\r
+ if( scale_threshold > hammer.gestureOptions.transform_min_scale ){\r
+ ret |= XUI_Gesture_trigger( hammer, XUI_Event.PINCH, e );\r
+ ret |= XUI_Gesture_trigger( hammer, e.scale < 1 ? XUI_Event.PINCH_IN : XUI_Event.PINCH_OUT, e );\r
};\r
break;\r
\r
case XUI_Event._POINTER_CANCEL :\r
case XUI_Event._POINTER_UP :\r
// trigger dragend\r
- ret = hammer.triggered[ transform.name ] && hammer.trigger( XUI_Event.TRANSFORM_END, e );\r
- hammer.triggered[ transform.name ] = false;\r
+ ret = hammer.gestureTriggered[ transform.name ] && XUI_Gesture_trigger( hammer, XUI_Event.TRANSFORM_END, e );\r
+ hammer.gestureTriggered[ transform.name ] = false;\r
break;\r
};\r
return ret;\r
\r
// current gesture isnt drag, but dragged is true\r
// this means an other gesture is busy. now call dragend\r
- if( hammer.currentName !== drag.name && hammer.triggered[ drag.name ] ){\r
- ret = hammer.trigger( XUI_Event.DRAG_END, e );\r
- hammer.triggered[ drag.name ] = false;\r
+ if( hammer.gestureCurrentName !== drag.name && hammer.gestureTriggered[ drag.name ] ){\r
+ ret = XUI_Gesture_trigger( hammer, XUI_Event.DRAG_END, e );\r
+ hammer.gestureTriggered[ drag.name ] = false;\r
return ret;\r
};\r
\r
// max touches\r
- if( 0 < hammer.options.drag_max_touches && hammer.options.drag_max_touches < e.touches.length ) return;\r
+ if( 0 < hammer.gestureOptions.drag_max_touches && hammer.gestureOptions.drag_max_touches < e.touches.length ) return;\r
\r
switch( e.type ){\r
case XUI_Event._POINTER_DOWN :\r
- hammer.triggered[ drag.name ] = false;\r
+ hammer.gestureTriggered[ drag.name ] = false;\r
break;\r
\r
case XUI_Event._POINTER_MOVE :\r
// when the distance we moved is too small we skip this gesture\r
// or we can be already in dragging\r
- if( e.distance < hammer.options.drag_min_distance && hammer.currentName !== drag.name ) return;\r
+ if( e.distance < hammer.gestureOptions.drag_min_distance && hammer.gestureCurrentName !== drag.name ) return;\r
\r
// we are dragging!\r
- hammer.currentName = drag.name;\r
+ hammer.gestureCurrentName = drag.name;\r
\r
// lock drag to axis?\r
- if( hammer.lastEvent.drag_locked_to_axis || ( hammer.options.drag_lock_to_axis && hammer.options.drag_lock_min_distance <= e.distance ) ){\r
+ if( hammer.gestureLastEvent.drag_locked_to_axis || ( hammer.gestureOptions.drag_lock_to_axis && hammer.gestureOptions.drag_lock_min_distance <= e.distance ) ){\r
e.drag_locked_to_axis = true;\r
};\r
- last_direction = hammer.lastEvent.direction;\r
+ last_direction = hammer.gestureLastEvent.direction;\r
if( e.drag_locked_to_axis && last_direction !== e.direction ){\r
// keep direction on the axis that the drag gesture started on\r
e.direction = XUI_GestureUtils.isVertical( last_direction ) ?\r
ret = X_CALLBACK_NONE;\r
\r
// first time, trigger dragstart event\r
- if( !hammer.triggered[ drag.name ] ){\r
- ret = hammer.trigger( XUI_Event.DRAG_START, e );\r
+ if( !hammer.gestureTriggered[ drag.name ] ){\r
+ ret = XUI_Gesture_trigger( hammer, XUI_Event.DRAG_START, e );\r
//if( ret & X_CALLBACK_PREVENT_DEFAULT ){\r
- // hammer.canceled[ drag.name ] = true;\r
+ // hammer.gestureCanceled[ drag.name ] = true;\r
// break;\r
//};\r
ret |= X_CALLBACK_CAPTURE_POINTER;\r
console.log( '----- drag start ....' + e.type );\r
- hammer.triggered[ drag.name ] = true;\r
+ hammer.gestureTriggered[ drag.name ] = true;\r
break;\r
};\r
\r
//console.log( '----- drag ....' + e.type );\r
// trigger normal event\r
- ret = hammer.trigger( XUI_Event.DRAG, e ) | X_CALLBACK_CAPTURE_POINTER;\r
+ ret = XUI_Gesture_trigger( hammer, XUI_Event.DRAG, e ) | X_CALLBACK_CAPTURE_POINTER;\r
\r
// direction event, like dragdown\r
- ret |= hammer.trigger(\r
+ ret |= XUI_Gesture_trigger( hammer,\r
e.direction === 'up' ?\r
XUI_Event.DRAG_UP :\r
e.direction === 'down' ?\r
\r
// block the browser events\r
/* (\r
- ( hammer.options.drag_block_vertical && XUI_GestureUtils.isVertical( e.direction ) ) ||\r
- ( hammer.options.drag_block_horizontal && !XUI_GestureUtils.isVertical( e.direction ) )\r
+ ( hammer.gestureOptions.drag_block_vertical && XUI_GestureUtils.isVertical( e.direction ) ) ||\r
+ ( hammer.gestureOptions.drag_block_horizontal && !XUI_GestureUtils.isVertical( e.direction ) )\r
) && e.preventDefault(); */\r
break;\r
\r
case XUI_Event._POINTER_CANCEL :\r
case XUI_Event._POINTER_UP:\r
// trigger dragend\r
- if( hammer.triggered[ drag.name ] ){\r
- ret = hammer.trigger( XUI_Event.DRAG_END, e ) | X_CALLBACK_CAPTURE_POINTER;\r
+ if( hammer.gestureTriggered[ drag.name ] ){\r
+ ret = XUI_Gesture_trigger( hammer, XUI_Event.DRAG_END, e ) | X_CALLBACK_CAPTURE_POINTER;\r
console.log( '----- drag end ....' + e.type );\r
- hammer.triggered[ drag.name ] = false;\r
+ hammer.gestureTriggered[ drag.name ] = false;\r
};\r
break;\r
};\r
// previous gesture, for the double tap since these are two different gesture detections\r
var prev = hammer.previous;\r
\r
- if( e.type === XUI_Event._POINTER_MOVE && hammer.options.tap_max_distance < e.distance ){\r
- hammer.canceled[ 'tap' ] = true;\r
+ if( e.type === XUI_Event._POINTER_MOVE && hammer.gestureOptions.tap_max_distance < e.distance ){\r
+ hammer.gestureCanceled[ 'tap' ] = true;\r
};\r
if( e.type === XUI_Event._POINTER_UP ){\r
// when the touchtime is higher then the max touch time\r
// or when the moving distance is too much\r
- if( hammer.options.tap_max_touchtime < e.deltaTime || hammer.options.tap_max_distance < e.distance ) return;\r
+ if( hammer.gestureOptions.tap_max_touchtime < e.deltaTime || hammer.gestureOptions.tap_max_distance < e.distance ) return;\r
\r
// check if double tap\r
- if( prev && prev.currentName === 'tap' && ( e.timestamp - prev.lastEvent.timestamp ) < hammer.options.doubletap_interval && e.distance < hammer.options.doubletap_distance ){\r
- return hammer.trigger( XUI_Event.DOUBLE_TAP, e );\r
+ if( prev && prev.gestureCurrentName === 'tap' && ( e.timestamp - prev.gestureLastEvent.timestamp ) < hammer.gestureOptions.doubletap_interval && e.distance < hammer.gestureOptions.doubletap_distance ){\r
+ return XUI_Gesture_trigger( hammer, XUI_Event.DOUBLE_TAP, e );\r
} else\r
// do a single tap\r
- if( hammer.options.tap_always ){\r
- //hammer.currentName = 'tap';\r
+ if( hammer.gestureOptions.tap_always ){\r
+ hammer.gestureCurrentName = 'tap';\r
console.log( 'tap! ' + e.deltaTime + 'ms ' + e.type );\r
- return hammer.trigger( XUI_Event.TAP, e );\r
+ return XUI_Gesture_trigger( hammer, XUI_Event.TAP, e );\r
};\r
};\r
}\r
\r
root : null,\r
rootData : null,\r
- hoverList : null,\r
parent : null,\r
parentData : null,\r
xnode : null,\r
\r
role : 1,\r
pointerDisabled : false,\r
- hoverClassName : null,\r
hovering : false,\r
\r
reserveEvents : null,\r
- gesture : null,\r
+ gestureOptions : null,\r
+ gestureActivated : null,\r
+ gestureTypes : null,\r
+ gestureTriggered : null,\r
+ gestureCanceled : null,\r
+ gestureCurrentName : '',\r
+ gestureStartEvent : null,\r
+ gestureLastEvent : null,\r
+ gestureLastMoveEvent : null,\r
\r
absoluteX : 0,\r
absoluteY : 0,\r
y -= this.boxY;\r
\r
if( 0 <= x && x < this.boxWidth && 0 <= y && y < this.boxHeight ){\r
- !this.hovering && ( this.rootData.hoverList[ this.rootData.hoverList.length ] = this );\r
- this.rootData.targetNodeData = this;\r
+ !this.hovering && ( XUI_UINODES_HOVER[ XUI_UINODES_HOVER.length ] = this );\r
+ XUI_uinodeTarget = this;\r
//console.log( 'hit ' + this.xnode.className() )\r
return true;\r
};\r
},\r
\r
- /*\r
- * TODO context を明示しない場合、User が context になる! の処理は User 側へ\r
- */\r
- listen : function( type, arg1, arg2, arg3 ){\r
- var root, events, counter, f;\r
- \r
- if( XUI_Event._START_POINTER <= type && type <= XUI_Event._END_POINTER ){\r
- if( this.phase < 3 ){\r
- if( !( events = this.reserveEvents ) ) this.reserveEvents = events = [];\r
- events[ events.length ] = [ type, arg1, arg2, arg3 ];\r
- return this;\r
- };\r
- \r
- if( this[ 'listening' ]( type, arg1, arg2, arg3 ) ){\r
- console.log( '. listening' )\r
- return this;\r
- };\r
- \r
- if( XUI_Event._START_XUI_EVENT < type && type < XUI_Event._END_XUI_EVENT ){\r
- if( !this.gesture ){\r
- this.gesture = new Hammer( this.rootData, this, type );\r
- } else {\r
- this.gesture[ 'listen' ]( type );\r
- };\r
- } else {\r
- //console.log( type );\r
- root = this.rootData;\r
- counter = root.eventCounter;\r
- if( counter[ type ] ){\r
- ++counter[ type ];\r
- } else {\r
- counter[ type ] = 1; \r
- XUI_xnodeIneraction[ 'listen' ]( XUI_Event.IdToName[ type ], X_UI_eventRellay );\r
- };\r
- if( type === XUI_Event._POINTER_UP ) console.log( '... addEvent ' + counter[ type ] );\r
- };\r
- };\r
- \r
- return X_EventDispatcher_listen.apply( this, arguments );\r
- },\r
- unlisten : function( type, arg1, arg2, arg3 ){\r
- var root, events, i, ev, counter;\r
- \r
- if( XUI_Event._START_POINTER <= type && type <= XUI_Event._END_POINTER ){\r
- if( this.phase < 3 ){\r
- if( !( events = this.reserveEvents ) ) return this;\r
- for( i = events.length; i; ){\r
- ev = events[ --i ];\r
- if( ev[ 0 ] === type && ev[ 1 ] === arg1 && ev[ 2 ] === arg2 && ev[ 3 ] === arg3 ){\r
- events.split( i, 1 );\r
- return this;\r
- };\r
- }; \r
- return this;\r
- };\r
-\r
- if( !this[ 'listening' ]( type, arg1, arg2, arg3 ) ){\r
- return this;\r
- };\r
- \r
- if( XUI_Event._START_XUI_EVENT < type && type < XUI_Event._END_XUI_EVENT ){\r
- this.gesture && this.gesture[ 'unlisten' ]( type );\r
- } else {\r
- root = this.rootData;\r
- counter = root.eventCounter;\r
- \r
- if( !counter[ type ] ){\r
- console.log( '... no event ... ' + counter[ type ] );\r
- };\r
- \r
- if( type === XUI_Event._POINTER_UP ) console.log( '... removeEvent ' + counter[ type ] );\r
- \r
- if( counter[ type ] === 1 ){\r
- XUI_xnodeIneraction[ 'unlisten' ]( XUI_Event.IdToName[ type ], X_UI_eventRellay );\r
- counter[ type ] = 0;\r
- } else\r
- if( counter[ type ] ){\r
- --counter[ type ];\r
- };\r
- };\r
- };\r
-\r
- return X_EventDispatcher_unlisten.apply( this, arguments );\r
- },\r
+ listen : XUI_$UINodeBase_listen,\r
\r
- /*\r
- dispatch : function( e ){\r
- //console.log( e.type + ' ' + ( this[ '_listeners' ] && this[ '_listeners' ][ e.type ] ) );\r
- var ret = X_EventDispatcher_dispatch.call( this, e ),\r
- type = e.type || e;\r
- \r
- // TODO captureEvent PointerEvent\r
- if( ret & X_CALLBACK_CAPTURE_POINTER ){\r
- this.rootData.monopolyNodeData = this;\r
- return ret;\r
- };\r
- if( this.rootData.monopolyNodeData === this ) this.rootData.monopolyNodeData = null;\r
- if( XUI_Event._START_BUBLEUP < type && this.parentData && !( ret & X_CALLBACK_STOP_PROPAGATION ) ){\r
- return this.parentData[ 'dispatch' ]( e );\r
- };\r
- return ret;\r
- }, */\r
+ unlisten : XUI_$UINodeBase_unlisten,\r
\r
setItemData : function( itemData ){\r
if( this.itemData === itemData ) return;\r
-var X_UI_rootData = null,
+var XUI_rootData = null,
XUI_xnodeIneraction = null,
+ XUI_UINODES_HOVER = [],
+ XUI_EVENT_COUNTER = {},
+ XUI_uinodeTarget = null,
+ XUI_xnodeInteractionOverlay,
XUI_interactionBusy = false;
function X_UI_eventRellay( e ){
y = e.pageY / font,
type = XUI_Event.NameToID[ e.type ],
i = 0,
- data = X_UI_rootData,
+ data = XUI_rootData,
sysOnly = false,
ret = X_CALLBACK_NONE,
list, parent, _ret, eventIn, eventOut;
// mouseup で alert を出すと mouseleave が発生、ということでイベント中のイベント発火を禁止
if( !data || XUI_interactionBusy ) return ret;
- XUI_interactionBusy = true;
-
- if( type !== XUI_Event._POINTER_MOVE ){
- console.log( data.xnode.className() + '>' + e.type + ' ' + type + ' x:' + x + ', y:' + y );
- //console.dir( data )
- //data !== X_UI_rootData && console.log( ( data.xnode[ 'className' ]() + data.xnode[ 'text' ]() ).substr( 0, 15 ) );
- };
+ XUI_interactionBusy = true;
+
+ e = X_Object_copy( e );
e.type = type;
// TODO capture は pointer 毎に!
+ list = XUI_UINODES_HOVER;
+ ( XUI_uinodeTarget = XUI_rootData ).capcher( x, y );
+ data = XUI_uinodeTarget;
-
- list = X_UI_rootData.hoverList;
- ( X_UI_rootData.targetNodeData = X_UI_rootData ).capcher( x, y );
- data = X_UI_rootData.targetNodeData;
-
-
-
-
-
- while( true ){
+ while( data ){
_ret = data[ 'dispatch' ]( e, sysOnly );
ret |= _ret;
- if( X_UI_rootData !== data && _ret & X_CALLBACK_CAPTURE_POINTER ){
- X_UI_rootData.monopolyNodeData = data;
- break;
- };
- if( X_UI_rootData.monopolyNodeData === data ) X_UI_rootData.monopolyNodeData = null;
if( type < XUI_Event._START_BUBLEUP || ret & X_CALLBACK_STOP_PROPAGATION ){
break;
};
- if( !data.parentData ) break;
data = data.parentData;
- if( type !== XUI_Event._POINTER_MOVE ){
- //data !== X_UI_rootData && console.log( ( data.xnode[ 'className' ]() + data.xnode[ 'text' ]() ).substr( 0, 15 ) );
- };
};
- if( data !== X_UI_rootData ) ret |= X_UI_rootData[ 'dispatch' ]( e, sysOnly );
- eventOut = X_Object_copy( e );
- eventOut.type = XUI_Event.POINTER_OUT;
-
- eventIn = X_Object_copy( e );
- eventIn.type = XUI_Event.POINTER_IN;
-
for( i = list.length; i; ){
parent = data = list[ --i ];
while( parent.parentData && parent === parent.parentData.hitChildData ){
parent = parent.parentData;
};
- if( parent !== X_UI_rootData ){
- data.hoverClassName && data.xnode[ 'removeClass' ]( data.hoverClassName );
- data[ '_listeners' ] && data[ '_listeners' ][ XUI_Event.POINTER_OUT ] && data[ 'dispatch' ]( eventOut, false ); // new Event
+ if( parent !== XUI_rootData ){
+ if( data[ '_listeners' ] && data[ '_listeners' ][ XUI_Event.POINTER_OUT ] ){
+ if( !eventOut ){
+ eventOut = X_Object_copy( e );
+ eventOut.type = XUI_Event.POINTER_OUT;
+ };
+ data[ 'dispatch' ]( eventOut, false );
+ };
delete data.hovering;
list.splice( i, 1 );
- continue;
- };
+ } else
if( !data.hovering ){
- data.hoverClassName && data.xnode.addClassName( data.hoverClassName );
- data[ '_listeners' ] && data[ '_listeners' ][ XUI_Event.POINTER_IN ] && data[ 'dispatch' ]( eventIn, true ); // new Event
+ if( data[ '_listeners' ] && data[ '_listeners' ][ XUI_Event.POINTER_IN ] ){
+ if( !eventIn ){
+ eventIn = X_Object_copy( e );
+ eventIn.type = XUI_Event.POINTER_IN;
+ };
+ data[ 'dispatch' ]( eventIn, true );
+ };
data.hovering = true;
};
};
};
function X_UI_onMouseOut( e ){
- var list = X_UI_rootData.hoverList,
+ var list = XUI_UINODES_HOVER,
i = list.length;
console.log( 'pointer out!!' + e.type + i + ' ' + e.pointerType );
for( ; i; ){
data = list[ --i ];
- //console.log( data.xnode.className() );
- data.hoverClassName && data.xnode[ 'removeClass' ]( data.hoverClassName );
data[ '_listeners' ] && data[ '_listeners' ][ XUI_Event.POINTER_OUT ] && data[ 'dispatch' ]( e, false ); // new Event
delete data.hovering;
};
layout : XUI_Layout_Canvas,
calcReserved : false,
- hoverList : null,
- targetNodeData : null,
- monopolyNodeData : null,
- xnodeInteractiveLayer : null,
- eventCounter : null,
cursorStyle : null,
Constructor : function( user, layout, args ){
X_ViewPort[ 'listenOnce' ]( X_EVENT_XDOM_READY, this, this.start );
};
- this.hoverList = [];
- this.eventCounter = {};
-
- X_UI_rootData = this;
+ XUI_rootData = this;
},
start : function(){
- // hover や rollover rollout のための move イベントの追加
- // TODO この切り替えを ViewPort へ
- XUI_xnodeIneraction = ( X_UA[ 'IE' ] < 9 ? X_ViewPort_document : X_UA[ 'Opera' ] < 8 ? X_Node_body : X_ViewPort );
+
this.initialize( this.User, this, null, null );
X_Timer_once( 0, this, this.addToView );
},
addToView : function(){
- var counter = this.eventCounter;
-
- // this.xnodeInteractiveLayer の前に追加する!
-
+ // XUI_xnodeInteractionOverlay の前に追加する!
this.addToParent( X_Node_body );
- this.xnodeInteractiveLayer = X_Node_body.create( 'div', {
+ XUI_xnodeInteractionOverlay = X_Node_body.create( 'div', {
'class' : 'mouse-operation-catcher',
unselectable : 'on'
} );
X_Node_body[ 'listen' ]( 'pointerleave', this, X_UI_onMouseOut );
+ // hover や rollover rollout のための move イベントの追加
+ // TODO この切り替えを ViewPort へ
+ XUI_xnodeIneraction = ( X_UA[ 'IE' ] < 9 ? X_ViewPort_document : X_UA[ 'Opera' ] < 8 ? X_Node_body : X_ViewPort );
XUI_xnodeIneraction[ 'listen' ]( 'pointermove', X_UI_eventRellay );
- if( counter[ XUI_Event._POINTER_MOVE ] ){
- ++counter[ XUI_Event._POINTER_MOVE ];
+
+ if( XUI_EVENT_COUNTER[ XUI_Event._POINTER_MOVE ] ){
+ ++XUI_EVENT_COUNTER[ XUI_Event._POINTER_MOVE ];
} else {
- counter[ XUI_Event._POINTER_MOVE ] = 1;
+ XUI_EVENT_COUNTER[ XUI_Event._POINTER_MOVE ] = 1;
};
X_Timer_once( 0, this, this.afterAddToView );
},
_remove : function(){
- X_EventDispatcher_unlistenAll( this.xnodeInteractiveLayer );
+ X_EventDispatcher_unlistenAll( XUI_xnodeInteractionOverlay );
_Box.prototype._remove.call( this );
}
}
//if( !XUI_Root ){
supports = XUI_Attr_createAttrDef( XUI_Box.prototype.usableAttrs, XUI_Layout_Canvas.overrideAttrsForSelf );
- XUI_Root.prototype.layout = XUI_Layout_Canvas;
+ //XUI_Root.prototype.layout = XUI_Layout_Canvas;
XUI_Root.prototype.usableAttrs = supports;
XUI_Root.prototype.attrClass = XUI_Attr_preset( XUI_Box.prototype.attrClass, supports, {
width : '100%',