1 var X_UI_rootData = null,
2 X_UI_eventBusy = false;
4 function X_UI_eventRellay( e ){
5 var font = X_ViewPort_baseFontSize,
6 x = e.pageX / font, // clientX は iOS4- で通らない?
8 type = XUI_Event.NameToID[ e.type ],
12 ret = X_CALLBACK_NONE,
15 // mouseup で alert を出すと mouseleave が発生、ということでイベント中のイベント発火を禁止
16 if( !data || X_UI_eventBusy ) return ret;
17 data._eventBusy = true;
19 if( type !== '' + XUI_Event._POINTER_MOVE ){
20 //console.log( e.type + ' ' + type + ' x:' + x + ', y:' + y );
25 if( data && ( data = data.monopolyNodeData ) && ( ret = data[ 'dispatch' ]( e ) ) & X_CALLBACK_CAPTURE_POINTER ){
26 X_UI_eventBusy = false;
27 return ret | X_CALLBACK_PREVENT_DEFAULT;
30 list = X_UI_rootData.hoverList;
31 ( X_UI_rootData.targetNodeData = X_UI_rootData ).capcher( x, y );
32 data = X_UI_rootData.targetNodeData;
34 //data !== X_UI_rootData && console.log( data.xnode[ 'text' ]() );
37 _ret = data[ 'dispatch' ]( e, sysOnly );
39 if( _ret & X_CALLBACK_CAPTURE_POINTER || _ret & X_CALLBACK_STOP_PROPAGATION || _ret & X_CALLBACK_STOP_NOW ) break; // sysOnly = true;
40 data = data.parentData;
43 for( i = list.length; i; ){
44 parent = data = list[ --i ];
45 while( parent.parentData && parent === parent.parentData.hitChildData ){
46 parent = parent.parentData;
48 if( parent !== X_UI_rootData ){
49 data.hoverClassName && data.xnode[ 'removeClass' ]( data.hoverClassName );
50 data[ '_listeners' ] && data[ '_listeners' ][ XUI_Event.POINTER_OUT ] && data[ 'dispatch' ]( XUI_Event.POINTER_OUT, false ); // new Event
56 data.hoverClassName && data.xnode.addClassName( data.hoverClassName );
57 data[ '_listeners' ] && data[ '_listeners' ][ XUI_Event.POINTER_IN ] && data[ 'dispatch' ]( XUI_Event.POINTER_IN, true ); // new Event
61 X_UI_eventBusy = false;
62 return ret | X_CALLBACK_PREVENT_DEFAULT;
65 function X_UI_onMouseOut( e ){
66 var list = X_UI_rootData.hoverList,
68 console.log( e.type + i + ' ' + e.pointerType )
71 console.log( data.xnode.className() );
72 data.hoverClassName && data.xnode[ 'removeClass' ]( data.hoverClassName );
73 data[ '_listeners' ] && data[ '_listeners' ][ XUI_Event.POINTER_OUT ] && data[ 'dispatch' ](
74 { type : XUI_Event.POINTER_OUT, pointerType : e.pointerType }, false ); // new Event
81 * body が存在したら要素を作成、css も指定
82 * 背景画像を読み終える onload で活動開始
85 var XUI_Root = XUI_Box.inherits(
89 layout : XUI_Layout_Canvas,
93 targetNodeData : null,
94 monopolyNodeData : null,
96 xnodeInteractiveLayer : null,
100 Constructor : function( user, layout, args ){
101 this[ 'Super' ]( user, layout, args );
103 if( X_ViewPort_readyState === X_EVENT_XDOM_READY ){
104 X_Timer_once( 0, this, this.start );
106 X_ViewPort[ 'listenOnce' ]( X_EVENT_XDOM_READY, this, this.start );
110 this.eventCounter = {};
112 X_UI_rootData = this;
116 this.initialize( this.User, this, null, null );
117 X_Timer_once( 0, this, this.addToView );
119 addToView : function(){
120 var counter = this.eventCounter, flg;
122 // this.xnodeInteractiveLayer の前に追加する!
124 this.addToParent( X.Doc.body );
126 this.xnodeInteractiveLayer = X.Doc.body.create( 'div', {
127 'class' : 'mouse-operation-catcher',
129 } )[ 'listen' ]( 'pointerleave', this, X_UI_onMouseOut );
131 // hover や rollover rollout のための move イベントの追加
132 // TODO この切り替えを ViewPort へ
133 ( X_UA[ 'IE' ] < 9 ? X_ViewPort_document : X_UA[ 'Opera' ] < 8 ? X_Node_body : X_ViewPort )[ 'listen' ]( 'pointermove', X_UI_eventRellay );
134 if( counter[ XUI_Event._POINTER_MOVE ] ){
135 ++counter[ XUI_Event._POINTER_MOVE ];
137 counter[ XUI_Event._POINTER_MOVE ] = 1;
140 X_Timer_once( 0, this, this.afterAddToView );
142 afterAddToView : function(){
143 this.xnode[ 'className' ]( 'Root' );
145 this.creationComplete();
146 X_Timer_once( 0, this, XUI_Root_do1stCalculate );
149 reserveCalc : function(){
150 if( this.calcReserved === false ){
151 this.calcReserved = true;
152 X_Timer_once( 0, this, this.calculate );
155 calculate : function( e ){
156 var cancelable = !e || ( e.type !== X_EVENT_VIEW_RESIZED && e.type !== X_EVENT_BASE_FONT_RESIZED ),
159 if( ( this[ 'dispatch' ]( { type : XUI_Event.LAYOUT_BEFORE, 'cancelable' : cancelable } ) & X_CALLBACK_PREVENT_DEFAULT ) && cancelable ){
160 return X_CALLBACK_NONE;
163 size = X[ 'ViewPort' ][ 'getSize' ]();
164 font = X[ 'ViewPort' ][ 'getBaseFontSize' ]();
165 this.layout.calculate( this, false, 0, 0, size[ 0 ] / font, size[ 1 ] / font );
168 this.calcReserved = false;
170 X_ViewPort[ 'listenOnce' ]( X_EVENT_AFTER_UPDATE, this, XUI_Root_onViewUpdate );
172 return X_CALLBACK_NONE;
175 updateCoursor : function( cursor ){
179 _remove : function(){
180 X_EventDispatcher_unlistenAll( this.xnodeInteractiveLayer );
181 _Box.prototype._remove.call( this );
186 function XUI_Root_do1stCalculate(){
190 [ 'listen' ]( X_EVENT_VIEW_RESIZED, this, this.calculate )
191 [ 'listen' ]( X_EVENT_BASE_FONT_RESIZED, this, this.calculate );
194 function XUI_Root_onViewUpdate( e ){
195 this[ 'dispatch' ]( XUI_Event.LAYOUT_COMPLETE );
200 X.UI.Root = X.UI.Box.inherits(
204 Constructor : function(){
208 supports = XUI_Attr_createAttrDef( XUI_Box.prototype.usableAttrs, XUI_Layout_Canvas.overrideAttrsForSelf );
210 XUI_Root.prototype.layout = XUI_Layout_Canvas;
211 XUI_Root.prototype.usableAttrs = supports;
212 XUI_Root.prototype.attrClass = XUI_Attr_preset( XUI_Box.prototype.attrClass, supports, {
217 X_Pair_create( this, XUI_Root( this, XUI_Layout_Canvas, arguments ) );
221 X.UI.Root = X.UI.Box.presets(