'_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
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
},\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
_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
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
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