OSDN Git Service

bug fixes superCall, merge X.UI.Gesture to X.UI.AbstructUINode.
[pettanr/clientJs.git] / 0.6.x / js / 20_ui / 20_Root.js
index e1a756f..6339c63 100644 (file)
@@ -1,5 +1,10 @@
-var X_UI_rootData  = null,
-       X_UI_eventBusy = false;
+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 ){
        var font    = X_ViewPort_baseFontSize,
@@ -7,61 +12,80 @@ 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;
+               list, parent, _ret, eventIn, eventOut;
 
        // mouseup で alert を出すと mouseleave が発生、ということでイベント中のイベント発火を禁止
-       if( !data || X_UI_eventBusy ) return ret;
-       data._eventBusy = true;
+       if( !data || XUI_interactionBusy ) return ret;
        
-       if( type !== '' + XUI_Event._POINTER_MOVE ){
-               //console.log( e.type + ' ' + type + ' x:' + x + ', y:' + y );
-       };
-       
-       e.type = type;
+       XUI_interactionBusy = true;
 
-       if( data && ( data = data.monopolyNodeData ) && ( ret = data[ 'dispatch' ]( e ) ) & X_CALLBACK_CAPTURE_POINTER ){
-               X_UI_eventBusy = false;
-               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;
+       e = X_Object_copy( e );
+       e.type = type;
 
-       //data !== X_UI_rootData && console.log( data.xnode[ 'text' ]() );
+       // TODO capture は pointer 毎に!
+       list = XUI_UINODES_HOVER;
+       ( XUI_uinodeTarget = XUI_rootData ).capcher( x, y );
+       data = XUI_uinodeTarget;
 
        while( data ){
                _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( type < XUI_Event._START_BUBLEUP || ret & X_CALLBACK_STOP_PROPAGATION ){
+                       break;
+               };
                data = data.parentData;
        };
-       
+
        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' ]( e, XUI_Event.POINTER_OUT, 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' ]( e, XUI_Event.POINTER_IN, 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;
                };
        };
-       X_UI_eventBusy = false;
+       XUI_interactionBusy = false;
        return ret | X_CALLBACK_PREVENT_DEFAULT;
 };
 
+function X_UI_onMouseOut( e ){
+       var list = XUI_UINODES_HOVER,
+               i = list.length;
+       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 ];
+               data[ '_listeners' ] && data[ '_listeners' ][ XUI_Event.POINTER_OUT ] && data[ 'dispatch' ]( e, false ); // new Event
+               delete data.hovering;
+       };
+       list.length = 0;
+};
+
 /*
  * body が存在したら要素を作成、css も指定
  * 背景画像を読み終える onload で活動開始
@@ -74,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 ){
@@ -88,37 +107,38 @@ var XUI_Root = XUI_Box.inherits(
                        if( X_ViewPort_readyState === X_EVENT_XDOM_READY ){
                                X_Timer_once( 0, this, this.start );
                        } else {
-                               X.ViewPort[ 'listenOnce' ]( X_EVENT_XDOM_READY, this, this.start );
+                               X_ViewPort[ 'listenOnce' ]( X_EVENT_XDOM_READY, this, this.start );
                        };
                        
-                       this.hoverList    = [];
-                       this.eventCounter = {};
-                       
-                       X_UI_rootData = this;
+                       XUI_rootData = this;
                },
                
                start : function(){
+
+                       
                        this.initialize( this.User, this, null, null );
                        X_Timer_once( 0, this, this.addToView );
                },
                addToView : function(){
-                       var     counter = this.eventCounter, flg;
-                       
-                       // this.xnodeInteractiveLayer の前に追加する!
-
-                       this.addToParent( X.Doc.body );
+                       // XUI_xnodeInteractionOverlay の前に追加する!
+                       this.addToParent( X_Node_body );
                        
-                       this.xnodeInteractiveLayer = X.Doc.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 イベントの追加
-                       ( X_UA[ 'IE' ] < 9 ? X_ViewPort_document : X_UA[ 'Opera' ] < 8 ? X_Node_body : X_ViewPort )[ 'listen' ]( 'pointermove', X_UI_eventRellay );
-                       if( counter[ XUI_Event._POINTER_MOVE ] ){
-                               ++counter[ XUI_Event._POINTER_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( 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 );
@@ -140,7 +160,7 @@ var XUI_Root = XUI_Box.inherits(
                        var cancelable = !e || ( e.type !== X_EVENT_VIEW_RESIZED && e.type !== X_EVENT_BASE_FONT_RESIZED ),
                                size, font, w, h;
                        
-                       if( this[ 'dispatch' ]( { type : XUI_Event.LAYOUT_BEFORE, 'cancelable' : cancelable } ) & X_CALLBACK_PREVENT_DEFAULT && cancelable ){
+                       if( ( this[ 'dispatch' ]( { type : XUI_Event.LAYOUT_BEFORE, 'cancelable' : cancelable } ) & X_CALLBACK_PREVENT_DEFAULT ) && cancelable ){
                                return X_CALLBACK_NONE;
                        };
                        
@@ -161,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 );
                }
        }
@@ -170,7 +190,7 @@ var XUI_Root = XUI_Box.inherits(
 function XUI_Root_do1stCalculate(){
        this.calculate();
        this.phase = 4;
-       X.ViewPort
+       X_ViewPort
                [ 'listen' ]( X_EVENT_VIEW_RESIZED, this, this.calculate )
                [ 'listen' ]( X_EVENT_BASE_FONT_RESIZED, this, this.calculate );
 };
@@ -191,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%',