OSDN Git Service

Version 0.6.190, fix X.UI.ScrollBox & X.UI.Gesture.
[pettanr/clientJs.git] / 0.6.x / js / 20_ui / 20_Root.js
index 6c2dd6b..d5b794d 100644 (file)
@@ -1,5 +1,6 @@
 var X_UI_rootData  = null,
-       X_UI_eventBusy = false;
+       XUI_xnodeIneraction = null,
+       XUI_interactionBusy = false;
 
 function X_UI_eventRellay( e ){
        var font    = X_ViewPort_baseFontSize,
@@ -10,35 +11,63 @@ function X_UI_eventRellay( e ){
                data    = X_UI_rootData,
                sysOnly = false,
                ret     = X_CALLBACK_NONE,
-               list, parent, _ret;
+               list, parent, _ret, eventIn, eventOut;
 
        // mouseup で alert を出すと mouseleave が発生、ということでイベント中のイベント発火を禁止
-       if( !data || X_UI_eventBusy ) return ret;
-       data._eventBusy = true;
+       if( !data || XUI_interactionBusy ) return ret;
+       XUI_interactionBusy = true;
        
-       if( type !== '' + XUI_Event._POINTER_MOVE ){
-               //console.log( e.type + ' ' + type + ' x:' + x + ', y:' + y );
-       };
+
        
        e.type = type;
 
+       // TODO capture は pointer 毎に!
        if( data && ( data = data.monopolyNodeData ) && ( ret = data[ 'dispatch' ]( e ) ) & X_CALLBACK_CAPTURE_POINTER ){
-               X_UI_eventBusy = false;
+               console.log( 'capture ' + data.xnode.className() );
+               XUI_interactionBusy = false;
                return ret | X_CALLBACK_PREVENT_DEFAULT;
        };
+       //if( ret & X_CALLBACK_RELEASE_POINTER ){
+               data && ( data.monopolyNodeData = null );
+               //return ret | X_CALLBACK_PREVENT_DEFAULT;
+       //};
        
        list = X_UI_rootData.hoverList;
        ( X_UI_rootData.targetNodeData = X_UI_rootData ).capcher( x, y );
        data = X_UI_rootData.targetNodeData;
 
-       //data !== X_UI_rootData && console.log( data.xnode[ 'text' ]() );
+       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 ) );
+       };
 
-       while( data ){
+       
+       
+       while( true ){
                _ret = data[ 'dispatch' ]( e, sysOnly );
                ret |= _ret;
-               if( _ret & X_CALLBACK_CAPTURE_POINTER || _ret & X_CALLBACK_STOP_PROPAGATION || _ret & X_CALLBACK_STOP_NOW ) break; // sysOnly = true;
+               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 ];
@@ -47,31 +76,34 @@ function X_UI_eventRellay( e ){
                };
                if( parent !== X_UI_rootData ){
                        data.hoverClassName && data.xnode[ 'removeClass' ]( data.hoverClassName );
-                       data[ '_listeners' ] && data[ '_listeners' ][ XUI_Event.POINTER_OUT ] && data[ 'dispatch' ]( XUI_Event.POINTER_OUT, false ); // new Event
+                       data[ '_listeners' ] && data[ '_listeners' ][ XUI_Event.POINTER_OUT ] && data[ 'dispatch' ]( eventOut, false ); // new Event
                        delete data.hovering;
                        list.splice( i, 1 );
                        continue;
                };
                if( !data.hovering ){
                        data.hoverClassName && data.xnode.addClassName( data.hoverClassName );
-                       data[ '_listeners' ] && data[ '_listeners' ][ XUI_Event.POINTER_IN ] && data[ 'dispatch' ]( XUI_Event.POINTER_IN, true ); // new Event
+                       data[ '_listeners' ] && data[ '_listeners' ][ XUI_Event.POINTER_IN ] && data[ 'dispatch' ]( eventIn, true ); // new Event
                        data.hovering = true;
                };
        };
-       X_UI_eventBusy = false;
+       XUI_interactionBusy = false;
        return ret | X_CALLBACK_PREVENT_DEFAULT;
 };
 
 function X_UI_onMouseOut( e ){
        var list = X_UI_rootData.hoverList,
                i = list.length;
-console.log( e.type + i + ' ' + e.pointerType )                
+       console.log( 'pointer out!!' + e.type + i + ' ' + e.pointerType );
+
+       e = X_Object_copy( e );
+       e.type = XUI_Event.POINTER_OUT;
+       
        for( ; i; ){
                data = list[ --i ];
-               console.log( data.xnode.className() );
+               //console.log( data.xnode.className() );
                data.hoverClassName && data.xnode[ 'removeClass' ]( data.hoverClassName );
-               data[ '_listeners' ] && data[ '_listeners' ][ XUI_Event.POINTER_OUT ] && data[ 'dispatch' ](
-                       { type : XUI_Event.POINTER_OUT, pointerType : e.pointerType }, false ); // new Event
+               data[ '_listeners' ] && data[ '_listeners' ][ XUI_Event.POINTER_OUT ] && data[ 'dispatch' ]( e, false ); // new Event
                delete data.hovering;
        };
        list.length = 0;
@@ -113,24 +145,28 @@ var XUI_Root = XUI_Box.inherits(
                },
                
                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, flg;
+                       var     counter = this.eventCounter;
                        
                        // this.xnodeInteractiveLayer の前に追加する!
 
-                       this.addToParent( X.Doc.body );
+                       this.addToParent( X_Node_body );
                        
-                       this.xnodeInteractiveLayer = X.Doc.body.create( 'div', {
+                       this.xnodeInteractiveLayer = X_Node_body.create( 'div', {
                                'class'      : 'mouse-operation-catcher',
                                unselectable : 'on'
-                       } )[ 'listen' ]( 'pointerleave', this, X_UI_onMouseOut );
+                       } );
                        
-                       // hover や rollover rollout のための move イベントの追加
-                       // TODO この切り替えを ViewPort へ
-                       ( X_UA[ 'IE' ] < 9 ? X_ViewPort_document : X_UA[ 'Opera' ] < 8 ? X_Node_body : X_ViewPort )[ 'listen' ]( 'pointermove', X_UI_eventRellay );
+                       X_Node_body[ 'listen' ]( 'pointerleave', this, X_UI_onMouseOut );
+                       
+                       XUI_xnodeIneraction[ 'listen' ]( 'pointermove', X_UI_eventRellay );
                        if( counter[ XUI_Event._POINTER_MOVE ] ){
                                ++counter[ XUI_Event._POINTER_MOVE ];
                        } else {