1 var XUI_rootData = null,
2 XUI_xnodeIneraction = null,
3 XUI_UINODES_HOVER = [],
4 XUI_EVENT_COUNTER = {},
5 XUI_uinodeTarget = null,
6 XUI_xnodeInteractionOverlay,
7 XUI_interactionBusy = false;
9 function X_UI_eventRellay( e ){
10 var font = X_ViewPort_baseFontSize,
11 x = e.pageX / font, // clientX は iOS4- で通らない?
13 type = XUI_Event.NameToID[ e.type ],
17 ret = X_CALLBACK_NONE,
18 list, parent, _ret, eventIn, eventOut;
20 // mouseup で alert を出すと mouseleave が発生、ということでイベント中のイベント発火を禁止
21 if( !data || XUI_interactionBusy ) return ret;
23 XUI_interactionBusy = true;
25 e = X_Object_copy( e );
28 // TODO capture は pointer 毎に!
29 list = XUI_UINODES_HOVER;
30 ( XUI_uinodeTarget = XUI_rootData ).capcher( x, y );
31 data = XUI_uinodeTarget;
34 _ret = data[ 'dispatch' ]( e, sysOnly );
36 if( type < XUI_Event._START_BUBLEUP || ret & X_CALLBACK_STOP_PROPAGATION ){
39 data = data.parentData;
42 for( i = list.length; i; ){
43 parent = data = list[ --i ];
44 while( parent.parentData && parent === parent.parentData.hitChildData ){
45 parent = parent.parentData;
47 if( parent !== XUI_rootData ){
48 if( data[ '_listeners' ] && data[ '_listeners' ][ XUI_Event.POINTER_OUT ] ){
50 eventOut = X_Object_copy( e );
51 eventOut.type = XUI_Event.POINTER_OUT;
53 data[ 'dispatch' ]( eventOut, false );
59 if( data[ '_listeners' ] && data[ '_listeners' ][ XUI_Event.POINTER_IN ] ){
61 eventIn = X_Object_copy( e );
62 eventIn.type = XUI_Event.POINTER_IN;
64 data[ 'dispatch' ]( eventIn, true );
69 XUI_interactionBusy = false;
70 return ret | X_CALLBACK_PREVENT_DEFAULT;
73 function X_UI_onMouseOut( e ){
74 var list = XUI_UINODES_HOVER,
76 console.log( 'pointer out!!' + e.type + i + ' ' + e.pointerType );
78 e = X_Object_copy( e );
79 e.type = XUI_Event.POINTER_OUT;
83 data[ '_listeners' ] && data[ '_listeners' ][ XUI_Event.POINTER_OUT ] && data[ 'dispatch' ]( e, false ); // new Event
90 * body が存在したら要素を作成、css も指定
91 * 背景画像を読み終える onload で活動開始
94 var XUI_Root = XUI_Box.inherits(
98 layout : XUI_Layout_Canvas,
100 calcReserved : false,
104 Constructor : function( user, layout, args ){
105 this[ 'Super' ]( user, layout, args );
107 if( X_ViewPort_readyState === X_EVENT_XDOM_READY ){
108 X_Timer_once( 0, this, this.start );
110 X_ViewPort[ 'listenOnce' ]( X_EVENT_XDOM_READY, this, this.start );
119 this.initialize( this.User, this, null, null );
120 X_Timer_once( 0, this, this.addToView );
122 addToView : function(){
123 // XUI_xnodeInteractionOverlay の前に追加する!
124 this.addToParent( X_Node_body );
126 XUI_xnodeInteractionOverlay = X_Node_body.create( 'div', {
127 'class' : 'mouse-operation-catcher',
131 X_Node_body[ 'listen' ]( 'pointerleave', this, X_UI_onMouseOut );
133 // hover や rollover rollout のための move イベントの追加
134 // TODO この切り替えを ViewPort へ
135 XUI_xnodeIneraction = ( X_UA[ 'IE' ] < 9 ? X_ViewPort_document : X_UA[ 'Opera' ] < 8 ? X_Node_body : X_ViewPort );
136 XUI_xnodeIneraction[ 'listen' ]( 'pointermove', X_UI_eventRellay );
138 if( XUI_EVENT_COUNTER[ XUI_Event._POINTER_MOVE ] ){
139 ++XUI_EVENT_COUNTER[ XUI_Event._POINTER_MOVE ];
141 XUI_EVENT_COUNTER[ XUI_Event._POINTER_MOVE ] = 1;
144 X_Timer_once( 0, this, this.afterAddToView );
146 afterAddToView : function(){
147 this.xnode[ 'className' ]( 'Root' );
149 this.creationComplete();
150 X_Timer_once( 0, this, XUI_Root_do1stCalculate );
153 reserveCalc : function(){
154 if( this.calcReserved === false ){
155 this.calcReserved = true;
156 X_Timer_once( 0, this, this.calculate );
159 calculate : function( e ){
160 var cancelable = !e || ( e.type !== X_EVENT_VIEW_RESIZED && e.type !== X_EVENT_BASE_FONT_RESIZED ),
163 if( ( this[ 'dispatch' ]( { type : XUI_Event.LAYOUT_BEFORE, 'cancelable' : cancelable } ) & X_CALLBACK_PREVENT_DEFAULT ) && cancelable ){
164 return X_CALLBACK_NONE;
167 size = X[ 'ViewPort' ][ 'getSize' ]();
168 font = X[ 'ViewPort' ][ 'getBaseFontSize' ]();
169 this.layout.calculate( this, false, 0, 0, size[ 0 ] / font, size[ 1 ] / font );
172 this.calcReserved = false;
174 X_ViewPort[ 'listenOnce' ]( X_EVENT_AFTER_UPDATE, this, XUI_Root_onViewUpdate );
176 return X_CALLBACK_NONE;
179 updateCoursor : function( cursor ){
183 _remove : function(){
184 X_EventDispatcher_unlistenAll( XUI_xnodeInteractionOverlay );
185 _Box.prototype._remove.call( this );
190 function XUI_Root_do1stCalculate(){
194 [ 'listen' ]( X_EVENT_VIEW_RESIZED, this, this.calculate )
195 [ 'listen' ]( X_EVENT_BASE_FONT_RESIZED, this, this.calculate );
198 function XUI_Root_onViewUpdate( e ){
199 this[ 'dispatch' ]( XUI_Event.LAYOUT_COMPLETE );
204 X.UI.Root = X.UI.Box.inherits(
208 Constructor : function(){
212 supports = XUI_Attr_createAttrDef( XUI_Box.prototype.usableAttrs, XUI_Layout_Canvas.overrideAttrsForSelf );
214 //XUI_Root.prototype.layout = XUI_Layout_Canvas;
215 XUI_Root.prototype.usableAttrs = supports;
216 XUI_Root.prototype.attrClass = XUI_Attr_preset( XUI_Box.prototype.attrClass, supports, {
221 X_Pair_create( this, XUI_Root( this, XUI_Layout_Canvas, arguments ) );
225 X.UI.Root = X.UI.Box.presets(