OSDN Git Service

Version 0.6.157, add X.Net.Form & fix X.EventDispatcher.
[pettanr/clientJs.git] / 0.6.x / js / 20_ui / 16_Repeater.js
index 3f980f8..e709360 100644 (file)
@@ -13,16 +13,28 @@ var XUI_Repeater = XUI_Box.inherits(
                \r
                itemRenderer     : null,\r
                \r
+               itemNodes        : null,\r
                \r
                startIndex       : 0,\r
                startRenderIndex : 0,\r
                numItemsParPage  : 0,\r
+               numItemsPrev     : 0,\r
                numItems         : 0,\r
+               itemHeightLast   : 0,\r
+               itemHeightLastEM : 0,\r
                \r
                Constructor : function( user, dataSource, itemRenderer, attr ){\r
                        this.Super( user, null, [ attr ] );\r
                        this.dataSource   = dataSource;\r
                        this.itemRenderer = itemRenderer;\r
+                       this.itemNodes    = [];\r
+                       this.__item__     = X_Pair_get( itemRenderer );\r
+               },\r
+               \r
+               initialize : function(){\r
+                       XUI_AbstractUINode.prototype.initialize.apply( this, arguments );\r
+                       \r
+                       this.parent[ 'listen' ]( XUI_Event.SCROLL_END, this );\r
                },\r
                \r
                /*\r
@@ -55,56 +67,77 @@ var XUI_Repeater = XUI_Box.inherits(
                },\r
                \r
                handleEvent : function( e ){\r
-                       var scrollBox, scrollY, dataSource, offsetY, startIndex, maxIndex, offset, uinodes;\r
+                       var scrollBox, scrollY, dataSource, offsetY, startIndex, maxIndex, offset, itemNodes, ary, i, l;\r
                        \r
                        switch( e.type ){\r
                                case XUI_Event.SCROLL_END :\r
                                        scrollBox  = this.parentData;\r
-                                       scrollY    = scrollBox.scrollY;\r
+                                       scrollY    = scrollBox.scrollY;\r
                                        dataSource = this[ 'dataSource' ];\r
-                                       uinodes    = this.uinodes;\r
+                                       itemNodes  = this.itemNodes;\r
+                                       itemH      = this.itemHeightLast;\r
+                                       \r
                                        // transition Y を 0 付近に。\r
-                                       offsetY    = scrollY % this.itemHeightLast;\r
-                                       scrollBox.scrollTo( 0, offsetY, 0, '', 0 ); // anime無し\r
+                               \r
+                                       \r
                                        // startIndex の計算\r
-                                       startIndex = scrollY / this.itemHeightLast | 0;\r
-                                       maxIndex   = dataSource.length <= this.numItems ? 0 : dataSource.length - this.numItems;\r
+                                       startIndex = scrollY / itemH | 0;\r
+                                       \r
+                                       /*maxIndex   = dataSource.length <= this.numItems ? 0 : dataSource.length - this.numItems;\r
+                                       console.log( ' >>> ' + startIndex + ' ' + maxIndex );\r
+                                       \r
                                        startIndex =\r
                                                startIndex < 0 ? 0 :\r
-                                               maxIndex < startIndex ? maxIndex : startIndex;\r
+                                               maxIndex < startIndex ? maxIndex : startIndex; */\r
                                        // アイテムの座標の修正とレンジ外のアイテムを配列内で再配置\r
                                        offset = startIndex - this.startIndex; // visible な stratIndex renderStartIndex\r
+                                       this.startIndex = startIndex;\r
+                                       \r
+                                       console.log(  this.numItemsPrev + ' oo ' + offset )\r
                                        \r
                                        if( 0 < offset ){\r
-                                               this.addAt( last, uinodes.splice( 0, offset ) );\r
+                                               itemNodes.push.apply( itemNodes, itemNodes.splice( 0, offset ) );\r
                                        } else\r
-                                       if( offset < 0 ){\r
-                                               this.addAt( 0, uinodes.splice( uinodes.length - offset ) );\r
+                                       if( offset < 0 ){\r
+                                               itemNodes.unshift.apply( itemNodes, itemNodes.splice( itemNodes.length + offset ) );\r
                                        };\r
+\r
                                        // 再配置されたアイテムにitemData のセット\r
                                        this.updateItemRenderer( this.contentWidth, this.scrollPortHeight );\r
+                                       \r
+                                       \r
+                                       \r
+                                       offsetY  = scrollY % itemH;\r
+                                       offsetY  = offsetY === 0 ? 0 : ( offsetY - itemH );\r
+                                       offsetY += ( this.startRenderIndex - this.startIndex ) * itemH;\r
+                                       //console.log( ' ====> ' + this.startRenderIndex + ' -> ' + this.startIndex + ' scrollY:' + offsetY );\r
+\r
+                                       //scrollBox.scrollTo( 0, - scrollY, 0, '', 0 ); // anime無し                                                  \r
+                                       //console.log( '  <==== ' );\r
                                        break;\r
                        };\r
                },\r
                \r
                updateItemRenderer : function( _w, _h ){\r
-                       var uinodes    = this.uinodes || ( this.uinodes = [] ),\r
+                       var itemNodes  = this.itemNodes,\r
                                attrs      = this.attrObject || this.attrClass.prototype,\r
                                gapY       = XUI_AbstractUINode_calcValue( attrs[ this.usableAttrs.gapY.No ], _w ),\r
                                dataSource = this[ 'dataSource' ],\r
                                render     = this[ 'itemRenderer' ],\r
                                l          = dataSource.length,\r
-                               start      = this.startIndex - ( this.numItems - this.numItemsParPage ) / 2 | 0,\r
-                               itemH      = this.itemHeightLast,\r
-                               i, node, data, _y = 0, last, n;\r
+                               start      = this.startIndex - this.numItemsPrev,\r
+                               itemH      = this.itemHeightLastEM,\r
+                               i, data, node, _y = 0, last, n;\r
+                       \r
+                       i = this.startRenderIndex = start = start < 0 ? 0 : start;\r
                        \r
-                       i = start = start < 0 ? 0 : start;\r
+                       _y = ( itemH + gapY ) * i;\r
                        \r
                        for( ; i < l; ++i ){\r
-                               if( !( node = uinodes[ i ] ) ){\r
+                               if( !( data = itemNodes[ i ] ) ){\r
                                        node = render.clone( true );\r
                                        this.addAt( i, [ node ] );\r
-                                       data = X_Pair_get( node );\r
+                                       data = itemNodes[ i ] = X_Pair_get( node );\r
                                        // init -> addToParent -> creationComplete\r
                                };\r
                                data.setItemData( dataSource[ i ] );\r
@@ -115,40 +148,42 @@ var XUI_Repeater = XUI_Box.inherits(
                                // 一番最初のループ。ここでページあたりのアイテム数を計算\r
                                if( !itemH && i === start ){\r
                                        itemH = _y - gapY;\r
-                                       this.itemHeightLast  = itemH * X_ViewPort_baseFontSize,\r
+                                       this.itemHeightLastEM = itemH;\r
+                                       this.itemHeightLast   = itemH * X_ViewPort_baseFontSize,\r
                                        // scroller の miniHeight は(例えば)親の高さの300% そこにいくつのアイテムを並べることが出来るか?端数切り上げ\r
                                        this.numItemsParPage = _h / itemH + 0.999 | 0;\r
                                        n    = this.numItems = ( _h * 3 ) / itemH + 0.999 | 0; // TODO boxHeight\r
+                                       this.numItemsPrev    = ( this.numItems - this.numItemsParPage ) / 2 | 0;\r
                                        last = i + n;\r
                                        // データの最後まで、または、開始位置から 3ページ分を生成する\r
                                        l    = last < l ? last : l;\r
                                };\r
                        };\r
                        \r
-                       for( l = uinodes.length; i < l; ++i ){\r
-                               // uinodes[ i ] hide\r
+                       for( l = itemNodes.length; i < l; ++i ){\r
+                               // itemNodes[ i ] hide\r
                        };\r
                        \r
                        // TODO contentHeight は attr を無視する -> 未表示領域につくるアイテム数 GPU の有無で変わる\r
-                       this.contentHeight = _y - gapY;\r
+                       this.contentHeight = dataSource.length * ( itemH + gapY ) - gapY;\r
                },\r
                \r
                onPropertyChange : function( name, newValue ){\r
-                       var uinodes, i, l, uinode, dataList, from;\r
+                       var itemNodes, i, l, uinode, dataList, from;\r
                        \r
                        switch( name ){\r
                                case 'itemRenderer' :\r
-                                       for( uinodes = this.uinodes, i = uinodes && uinodes.length; i; ){\r
-                                               uinodes[ --i ][ 'kill' ]();\r
+                                       for( itemNodes = this.itemNodes, i = itemNodes && itemNodes.length; i; ){\r
+                                               itemNodes[ --i ][ 'kill' ]();\r
                                        };\r
                                        \r
                                case 'dataSource' :\r
-                                       if( uinodes = this.uinodes ){\r
-                                               i = uinodes.length;\r
+                                       if( itemNodes = this.itemNodes ){\r
+                                               i = itemNodes.length;\r
                                                l = this[ 'dataSource' ].length;\r
                                                while( l < i ){\r
-                                                       uinodes[ --i ][ 'kill' ]();\r
-                                                       uinodes.length = i;\r
+                                                       itemNodes[ --i ][ 'kill' ]();\r
+                                                       itemNodes.length = i;\r
                                                };                                              \r
                                        };\r
 \r
@@ -167,7 +202,8 @@ X.UI.Repeater = X.UI.Box.inherits(
                        var supports;\r
                        \r
                        if( XUI_Repeater.prototype.usableAttrs === XUI_Box.prototype.usableAttrs ){\r
-                               XUI_Repeater.prototype.usableAttrs = supports = XUI_Attr_createAttrDef( XUI_Attr_Support, XUI_Layout_Vertical.overrideAttrsForSelf );\r
+                               supports = XUI_Attr_createAttrDef( XUI_Attr_Support, X_UI_Repeater_SUPPORT_ATTRS );\r
+                               XUI_Repeater.prototype.usableAttrs = supports = XUI_Attr_createAttrDef( supports, XUI_Layout_Vertical.overrideAttrsForSelf );\r
                \r
                                XUI_Repeater.prototype.attrClass   = XUI_Attr_preset( XUI_Box.prototype.attrClass, supports );\r
                        };\r
@@ -185,7 +221,13 @@ X.UI.Repeater = X.UI.Box.inherits(
                                                width     : 'auto',\r
                                                minWidth  : '100%',\r
                                                height    : 'auto',\r
-                                               minHeight : '100%'\r
+                                               minHeight : '100%',\r
+                               borderColor : 0x252527,\r
+                               borderWidth : [ 0.15, 0, 0 ],\r
+                               borderStyle : 'solid',\r
+                               height      : 'auto',\r
+                               bgColor     : 0x444643,\r
+                               gapY        : 0.15\r
                                        }));\r
                },\r
                \r