OSDN Git Service

bug fixes superCall, merge X.UI.Gesture to X.UI.AbstructUINode.
authoritozyun <itozyun@user.sourceforge.jp>
Wed, 11 Nov 2015 03:11:02 +0000 (12:11 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Wed, 11 Nov 2015 03:11:02 +0000 (12:11 +0900)
0.6.x/js/01_core/13_XClass.js
0.6.x/js/07_audio/01_XWebAudio.js
0.6.x/js/20_ui/05_XUI_Gesture.js
0.6.x/js/20_ui/06_AbstractUINode.js
0.6.x/js/20_ui/08_Box.js
0.6.x/js/20_ui/15_ScrollBox.js
0.6.x/js/20_ui/20_Root.js

index dc1166b..072bc2c 100644 (file)
@@ -20,8 +20,6 @@ var
 \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
@@ -133,35 +131,45 @@ X_Class_CommonMethods =
        '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
@@ -193,7 +201,7 @@ X_Class_CommonMethods =
                        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
@@ -208,67 +216,61 @@ X_Class_CommonMethods =
                };\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
@@ -610,8 +612,8 @@ function X_Class_inherits( /* displayName, classSetting, props */ ){
        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
@@ -645,8 +647,7 @@ function X_Class_actualConstructor( f, args ){
 \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
index fb43240..292b6b4 100644 (file)
@@ -88,7 +88,7 @@ var X_WebAudio_context      = // 4s 以下ではない iPad 2G または iPad mi
                                                                //!X_UA[ 'Blink' ] &&
                                                                // Firefox40.0.5 + Windows8 で音声が途中から鳴らなくなる
                                                                // Firefox41.0.1 + Windows8 で音声が途中から鳴らなくなる
-                                                               !( 40 <= X_UA[ 'Gecko' ] && X_UA[ 'Gecko' ] < 42 && X_UA[ 'Windows' ] ) &&
+                                                               !( 40 <= X_UA[ 'Gecko' ] && X_UA[ 'Gecko' ] < 43 && X_UA[ 'Windows' ] ) &&
                                                                ( window[ 'AudioContext' ] || window[ 'webkitAudioContext' ] ),
        X_WebAudio_BUFFER_LIST  = [],
        X_WebAudio_need1stTouch = X_UA[ 'iOS' ],
index f8b9535..f22672f 100644 (file)
@@ -132,86 +132,122 @@ var XUI_Gesture_POINTERS = {},
        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
@@ -226,9 +262,9 @@ function XUI_Gesture_handleEvent( e ){
                        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
@@ -263,19 +299,19 @@ if( type === XUI_Event.POINTER_OUT ) console.log( 'canceled ...' + e.button )
 \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
@@ -317,18 +353,18 @@ if( type === XUI_Event.POINTER_OUT ) console.log( 'canceled ...' + e.button )
                                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
@@ -363,22 +399,22 @@ if( type === XUI_Event.POINTER_OUT ) console.log( 'canceled ...' + e.button )
 \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
@@ -409,13 +445,13 @@ var XUI_Gesture_LIST = [
                        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
@@ -445,9 +481,9 @@ var XUI_Gesture_LIST = [
                        \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
@@ -455,11 +491,11 @@ var XUI_Gesture_LIST = [
                        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
@@ -468,34 +504,34 @@ var XUI_Gesture_LIST = [
 \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
@@ -503,8 +539,8 @@ var XUI_Gesture_LIST = [
                                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
@@ -546,33 +582,33 @@ var XUI_Gesture_LIST = [
 \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
@@ -583,24 +619,24 @@ var XUI_Gesture_LIST = [
                                        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
@@ -613,8 +649,8 @@ var XUI_Gesture_LIST = [
 \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
@@ -623,10 +659,10 @@ var XUI_Gesture_LIST = [
                                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
@@ -655,23 +691,23 @@ var XUI_Gesture_LIST = [
                        // 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
index 16f8234..3bd4cf3 100644 (file)
@@ -10,7 +10,6 @@ var XUI_AbstractUINode = X_EventDispatcher[ 'inherits' ](
                \r
                root              : null,\r
                rootData          : null,\r
-               hoverList         : null,\r
                parent            : null,\r
                parentData        : null,\r
                xnode             : null,\r
@@ -22,11 +21,18 @@ var XUI_AbstractUINode = X_EventDispatcher[ 'inherits' ](
                \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
@@ -703,115 +709,16 @@ var XUI_AbstractUINode = X_EventDispatcher[ 'inherits' ](
                        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
index 73e6067..0aa8008 100644 (file)
@@ -195,13 +195,13 @@ var XUI_Box = XUI_AbstractUINode.inherits(
                                };\r
                        };\r
                        if( this.through ){\r
-                               this.hitChildData && !this.hovering && ( this.rootData.hoverList[ this.rootData.hoverList.length ] = this );\r
+                               this.hitChildData && !this.hovering && ( XUI_UINODES_HOVER[ XUI_UINODES_HOVER.length ] = this );\r
                                return !!this.hitChildData;\r
                        };\r
                        hit = 0 <= x && x < this.boxWidth && 0 <= y && y < this.boxHeight;\r
-                       ( this.hitChildData || hit ) && !this.hovering && ( this.rootData.hoverList[ this.rootData.hoverList.length ] = this );\r
+                       ( this.hitChildData || hit ) && !this.hovering && ( XUI_UINODES_HOVER[ XUI_UINODES_HOVER.length ] = this );\r
                        if( hit && this.hitChildData === null ){\r
-                               this.rootData.targetNodeData = this;\r
+                               XUI_uinodeTarget = this;\r
                        };\r
                        return hit || !!this.hitChildData;\r
                },\r
index 323b95b..7574493 100644 (file)
@@ -156,7 +156,7 @@ var XUI_ScrollBox = XUI_ChromeBox.inherits(
                                        this.lastBoxWidth    !== this.boxWidth    || this.lastBoxHeight    !== this.boxHeight\r
                                ){\r
                                        console.log( 'scroll - calc' );\r
-                                       X_UI_rootData[ 'listenOnce' ]( XUI_Event.LAYOUT_COMPLETE, this, X_UI_ScrollBox_onLayoutComplete );\r
+                                       XUI_rootData[ 'listenOnce' ]( XUI_Event.LAYOUT_COMPLETE, this, X_UI_ScrollBox_onLayoutComplete );\r
                                };\r
                },\r
        \r
@@ -184,7 +184,7 @@ var XUI_ScrollBox = XUI_ChromeBox.inherits(
 \r
 function X_UI_ScrollBox_onLayoutBefore( e ){\r
        if( e[ 'cancelable' ] && this.isInTransition && X_Node_Anime_translateZ ){\r
-               this[ 'listenOnce' ]( XUI_Event.SCROLL_END, X_UI_rootData, X_UI_rootData.calculate );\r
+               this[ 'listenOnce' ]( XUI_Event.SCROLL_END, XUI_rootData, XUI_rootData.calculate );\r
                return X_CALLBACK_PREVENT_DEFAULT;\r
        };\r
        this.scrollXRatio = this.scrollX / this.scrollXMax;\r
@@ -229,7 +229,7 @@ function X_UI_ScrollBox_onLayoutComplete( e ){
                        this[ 'listen' ]( XUI_Event._POINTER_DOWN, this, X_UI_ScrollBox_onStart )\r
                                [ 'listen' ]( XUI_Event.DRAG, this, X_UI_ScrollBox_onMove );\r
        this[ 'listen' ]( XUI_Event.DRAG_END, this, X_UI_ScrollBox_onEnd );\r
-                       X_UI_rootData[ 'listen' ]( XUI_Event.LAYOUT_BEFORE, this, X_UI_ScrollBox_onLayoutBefore );\r
+                       XUI_rootData[ 'listen' ]( XUI_Event.LAYOUT_BEFORE, this, X_UI_ScrollBox_onLayoutBefore );\r
                        \r
                        X_UI_ScrollBox_translate( this, this.scrollXMax * this.scrollXRatio, this.scrollYMax * this.scrollYRatio, 100, '', 300 );\r
                        this.scrolling = true;\r
@@ -241,7 +241,7 @@ function X_UI_ScrollBox_onLayoutComplete( e ){
                this[ 'unlisten' ]( XUI_Event._POINTER_DOWN, this, X_UI_ScrollBox_onStart )\r
                        [ 'unlisten' ]( XUI_Event.DRAG, this, X_UI_ScrollBox_onMove );\r
        this[ 'unlisten' ]( XUI_Event.DRAG_END, this, X_UI_ScrollBox_onEnd );\r
-               X_UI_rootData[ 'unlisten' ]( XUI_Event.LAYOUT_BEFORE, this, X_UI_ScrollBox_onLayoutBefore );\r
+               XUI_rootData[ 'unlisten' ]( XUI_Event.LAYOUT_BEFORE, this, X_UI_ScrollBox_onLayoutBefore );\r
                \r
                ( this.scrollX !== 0 || this.scrollY !== 0 ) && X_UI_ScrollBox_translate( this, 0, 0, 100, '', 300 );\r
                \r
index 237af6a..6339c63 100644 (file)
@@ -1,5 +1,9 @@
-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 ){
@@ -8,74 +12,57 @@ 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;
                };
        };
@@ -84,7 +71,7 @@ function X_UI_eventRellay( e ){
 };
 
 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 );
 
@@ -93,8 +80,6 @@ function X_UI_onMouseOut( e ){
        
        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;
        };
@@ -113,12 +98,7 @@ var XUI_Root = XUI_Box.inherits(
                layout                : XUI_Layout_Canvas,
                
                calcReserved          : false,
-               hoverList             : null,
-               targetNodeData        : null,
-               monopolyNodeData      : null,
                
-               xnodeInteractiveLayer : null,
-               eventCounter          : null,
                cursorStyle           : null,
                
                Constructor : function( user, layout, args ){
@@ -130,39 +110,35 @@ var XUI_Root = XUI_Box.inherits(
                                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 );
@@ -205,7 +181,7 @@ var XUI_Root = XUI_Box.inherits(
                },
                
                _remove : function(){
-                       X_EventDispatcher_unlistenAll( this.xnodeInteractiveLayer );
+                       X_EventDispatcher_unlistenAll( XUI_xnodeInteractionOverlay );
                        _Box.prototype._remove.call( this );
                }
        }
@@ -235,7 +211,7 @@ X.UI.Root = X.UI.Box.inherits(
                        //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%',