OSDN Git Service

Version 0.6.168, fix X.UI.Repeater.
[pettanr/clientJs.git] / 0.6.x / js / 20_ui / 16_Repeater.js
index 3f980f8..6deacef 100644 (file)
@@ -7,22 +7,27 @@ var XUI_Repeater = XUI_Box.inherits(
        '_Repeater',\r
        X_Class.NONE,\r
        {\r
-               layout       : XUI_Layout_Vertical,\r
+               layout           : XUI_Layout_Vertical,\r
                \r
-               dataSource   : null, // Array.<object>, Array.<ItemData>\r
+               dataSource       : null, // Array.<object>, Array.<ItemData>\r
                \r
                itemRenderer     : null,\r
                \r
-               \r
-               startIndex       : 0,\r
-               startRenderIndex : 0,\r
-               numItemsParPage  : 0,\r
-               numItems         : 0,\r
+               itemNodes        : null,\r
+\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
                \r
                /*\r
@@ -32,9 +37,6 @@ var XUI_Repeater = XUI_Box.inherits(
                        var dataSource = this[ 'dataSource' ];\r
 \r
                        if( allowedW + allowedH === XUI_Attr_AUTO ) return false;\r
-               \r
-                       this.scrollPortWidth  = allowedW;\r
-                       this.scrollPortHeight = allowedH;                       \r
                        \r
                        this.preMesure( allowedW, allowedH );\r
                        \r
@@ -55,56 +57,26 @@ var XUI_Repeater = XUI_Box.inherits(
                },\r
                \r
                handleEvent : function( e ){\r
-                       var scrollBox, scrollY, dataSource, offsetY, startIndex, maxIndex, offset, uinodes;\r
-                       \r
                        switch( e.type ){\r
-                               case XUI_Event.SCROLL_END :\r
-                                       scrollBox  = this.parentData;\r
-                                       scrollY    = scrollBox.scrollY;\r
-                                       dataSource = this[ 'dataSource' ];\r
-                                       uinodes    = this.uinodes;\r
-                                       // transition Y を 0 付近に。\r
-                                       offsetY    = scrollY % this.itemHeightLast;\r
-                                       scrollBox.scrollTo( 0, offsetY, 0, '', 0 ); // anime無し\r
-                                       // startIndex の計算\r
-                                       startIndex = scrollY / this.itemHeightLast | 0;\r
-                                       maxIndex   = dataSource.length <= this.numItems ? 0 : dataSource.length - this.numItems;\r
-                                       startIndex =\r
-                                               startIndex < 0 ? 0 :\r
-                                               maxIndex < startIndex ? maxIndex : startIndex;\r
-                                       // アイテムの座標の修正とレンジ外のアイテムを配列内で再配置\r
-                                       offset = startIndex - this.startIndex; // visible な stratIndex renderStartIndex\r
-                                       \r
-                                       if( 0 < offset ){\r
-                                               this.addAt( last, uinodes.splice( 0, offset ) );\r
-                                       } else\r
-                                       if( offset < 0 ){\r
-                                               this.addAt( 0, uinodes.splice( uinodes.length - offset ) );\r
-                                       };\r
-                                       // 再配置されたアイテムにitemData のセット\r
-                                       this.updateItemRenderer( this.contentWidth, this.scrollPortHeight );\r
-                                       break;\r
+\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
+                               renderer   = 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
-                       \r
-                       i = start = start < 0 ? 0 : start;\r
+                               itemH      = this.itemHeightLastEM,\r
+                               i = 0, data, node, _y = 0, last, n;\r
                        \r
                        for( ; i < l; ++i ){\r
-                               if( !( node = uinodes[ i ] ) ){\r
-                                       node = render.clone( true );\r
+                               if( !( data = itemNodes[ i ] ) ){\r
+                                       node = renderer.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
@@ -113,42 +85,37 @@ var XUI_Repeater = XUI_Box.inherits(
                                _y += ( itemH || data.boxHeight ) + gapY;\r
                                \r
                                // 一番最初のループ。ここでページあたりのアイテム数を計算\r
-                               if( !itemH && i === start ){\r
+                               if( !itemH && i === 0 ){\r
                                        itemH = _y - gapY;\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
-                                       last = i + n;\r
-                                       // データの最後まで、または、開始位置から 3ページ分を生成する\r
-                                       l    = last < l ? last : l;\r
+                                       this.itemHeightLastEM = itemH;\r
+                                       this.itemHeightLast   = itemH * X_ViewPort_baseFontSize;\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 = l * ( 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 +134,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 +153,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