X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F20_ui%2F20_Root.js;h=6339c635f319e1cfc3b31f020701393515f961f0;hb=54eba266c29baf743f6ac67942a2788cd697b12d;hp=237af6ae7ae76c2254e093f8d4abab725bedd9bb;hpb=74f0206369c34768338a44ad8442a7bcdf7d5a7e;p=pettanr%2FclientJs.git diff --git a/0.6.x/js/20_ui/20_Root.js b/0.6.x/js/20_ui/20_Root.js index 237af6a..6339c63 100644 --- a/0.6.x/js/20_ui/20_Root.js +++ b/0.6.x/js/20_ui/20_Root.js @@ -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%',