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,
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 ];
};
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;
},
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 {