OSDN Git Service

Fix the bug of X.NodeAnime.
[pettanr/clientJs.git] / 0.6.x / js / 20_ui / 16_Repeater.js
1 var X_UI_Repeater_SUPPORT_ATTRS = {\r
2                 dataSource   : [ null, XUI_Dirty.LAYOUT, XUI_Attr_USER.UINODE, XUI_Attr_Type.OBJECT ],\r
3                 itemRenderer : [ null, XUI_Dirty.LAYOUT, XUI_Attr_USER.UINODE, XUI_Attr_Type.OBJECT ]\r
4 };\r
5 \r
6 var XUI_Repeater = XUI_Box.inherits(\r
7         '_Repeater',\r
8         X_Class.NONE,\r
9         {\r
10                 layout           : XUI_Layout_Vertical,\r
11                 \r
12                 dataSource       : null, // Array.<object>, Array.<ItemData>\r
13                 \r
14                 itemRenderer     : null,\r
15                 \r
16                 itemNodes        : null,\r
17 \r
18                 itemHeightLast   : 0,\r
19                 itemHeightLastEM : 0,\r
20                 \r
21                 Constructor : function( user, dataSource, itemRenderer, attr ){\r
22                         this.Super( user, null, [ attr ] );\r
23                         this.dataSource   = dataSource;\r
24                         this.itemRenderer = itemRenderer;\r
25                         this.itemNodes    = [];\r
26                         this.__item__     = X_Pair_get( itemRenderer );\r
27                 },\r
28                 \r
29                 initialize : function(){\r
30                         XUI_AbstractUINode.prototype.initialize.apply( this, arguments );\r
31                 },\r
32                 \r
33                 /*\r
34                  * ここに来るのは、初描画とリサイズ\r
35                  */\r
36                 calculate : function( isNeedsDetection, x, y, allowedW, allowedH ){\r
37                         var dataSource = this[ 'dataSource' ];\r
38 \r
39                         if( allowedW + allowedH === XUI_Attr_AUTO ) return false;\r
40                         \r
41                         this.preMesure( allowedW, allowedH );\r
42                         \r
43                         if( dataSource && dataSource.length ){\r
44                                 this.updateItemRenderer( this.contentWidth, allowedH );\r
45                         } else\r
46                         if( this.contentHeight === XUI_Attr_AUTO ){\r
47                                 this.contentHeight = this.contentHeightMin !== XUI_Attr_AUTO ? this.contentHeightMin : 0;\r
48                         };\r
49                         \r
50                         this.postMesure();\r
51         \r
52                         if( !isNeedsDetection ){\r
53                                 this.boxX += x;\r
54                                 this.boxY += y;\r
55                         };\r
56                         return true;\r
57                 },\r
58                 \r
59                 handleEvent : function( e ){\r
60                         switch( e.type ){\r
61 \r
62                         };\r
63                 },\r
64                 \r
65                 updateItemRenderer : function( _w, _h ){\r
66                         var itemNodes  = this.itemNodes,\r
67                                 attrs      = this.attrObject || this.attrClass.prototype,\r
68                                 gapY       = XUI_AbstractUINode_calcValue( attrs[ this.usableAttrs.gapY.No ], _w ),\r
69                                 dataSource = this[ 'dataSource' ],\r
70                                 renderer   = this[ 'itemRenderer' ],\r
71                                 l          = dataSource.length,\r
72                                 itemH      = this.itemHeightLastEM,\r
73                                 i = 0, data, node, _y = 0, last, n;\r
74                         \r
75                         for( ; i < l; ++i ){\r
76                                 if( !( data = itemNodes[ i ] ) ){\r
77                                         node = renderer.clone( true );\r
78                                         this.addAt( i, [ node ] );\r
79                                         data = itemNodes[ i ] = X_Pair_get( node );\r
80                                         // init -> addToParent -> creationComplete\r
81                                 };\r
82                                 data.setItemData( dataSource[ i ] );\r
83                                 \r
84                                 data.calculate( false, 0, _y, _w, _h );\r
85                                 _y += ( itemH || data.boxHeight ) + gapY;\r
86                                 \r
87                                 // 一番最初のループ。ここでページあたりのアイテム数を計算\r
88                                 if( !itemH && i === 0 ){\r
89                                         itemH = _y - gapY;\r
90                                         this.itemHeightLastEM = itemH;\r
91                                         this.itemHeightLast   = itemH * X_ViewPort_baseFontSize;\r
92                                 };\r
93                         };\r
94                         \r
95                         for( l = itemNodes.length; i < l; ++i ){\r
96                                 // itemNodes[ i ] hide\r
97                         };\r
98                         \r
99                         // TODO contentHeight は attr を無視する -> 未表示領域につくるアイテム数 GPU の有無で変わる\r
100                         this.contentHeight = l * ( itemH + gapY ) - gapY;\r
101                 },\r
102                 \r
103                 onPropertyChange : function( name, newValue ){\r
104                         var itemNodes, i, l, uinode, dataList, from;\r
105                         \r
106                         switch( name ){\r
107                                 case 'itemRenderer' :\r
108                                         for( itemNodes = this.itemNodes, i = itemNodes && itemNodes.length; i; ){\r
109                                                 itemNodes[ --i ][ 'kill' ]();\r
110                                         };\r
111                                         \r
112                                 case 'dataSource' :\r
113                                         if( itemNodes = this.itemNodes ){\r
114                                                 i = itemNodes.length;\r
115                                                 l = this[ 'dataSource' ].length;\r
116                                                 while( l < i ){\r
117                                                         itemNodes[ --i ][ 'kill' ]();\r
118                                                         itemNodes.length = i;\r
119                                                 };                                              \r
120                                         };\r
121 \r
122                                         \r
123                                         break;\r
124                         };\r
125                 }\r
126         }\r
127 );\r
128 \r
129 X.UI.Repeater = X.UI.Box.inherits(\r
130         'Repeater',\r
131         X_Class.NONE,\r
132         {\r
133                 Constructor : function( dataSource, itemRenderer ){\r
134                         var supports;\r
135                         \r
136                         if( XUI_Repeater.prototype.usableAttrs === XUI_Box.prototype.usableAttrs ){\r
137                                 supports = XUI_Attr_createAttrDef( XUI_Attr_Support, X_UI_Repeater_SUPPORT_ATTRS );\r
138                                 XUI_Repeater.prototype.usableAttrs = supports = XUI_Attr_createAttrDef( supports, XUI_Layout_Vertical.overrideAttrsForSelf );\r
139                 \r
140                                 XUI_Repeater.prototype.attrClass   = XUI_Attr_preset( XUI_Box.prototype.attrClass, supports );\r
141                         };\r
142                         \r
143                         // dataProvider\r
144                         // itemBase parent に追加されている uinode は不可\r
145                         // minHeight=300% height=auto\r
146                         X_Pair_create( this,\r
147                                 XUI_Repeater(\r
148                                         this,\r
149                                         dataSource, itemRenderer,\r
150                                         {\r
151                                                 name      : 'ScrollBox-Scroller',\r
152                                                 role      : 'container',\r
153                                                 width     : 'auto',\r
154                                                 minWidth  : '100%',\r
155                                                 height    : 'auto',\r
156                                                 minHeight : '100%',\r
157                                 borderColor : 0x252527,\r
158                                 borderWidth : [ 0.15, 0, 0 ],\r
159                                 borderStyle : 'solid',\r
160                                 height      : 'auto',\r
161                                 bgColor     : 0x444643,\r
162                                 gapY        : 0.15\r
163                                         }));\r
164                 },\r
165                 \r
166                 getItemDataAt : function(){\r
167                         \r
168                 },\r
169                 \r
170                 add : function( /* node, node, node ... */ ){\r
171                 },\r
172                 addAt : function( index /* , node , node, node ... */ ){\r
173                 },\r
174                 remove : function( /* node, node, node ... */ ){\r
175                 },\r
176                 removeAt : function( from, length ){\r
177                 },\r
178                 getNodesByClass : function( klass ){\r
179                 },\r
180                 getFirstChild : function(){\r
181                 },\r
182                 getLastChild : function(){\r
183                 },\r
184                 getNodeAt : function( index ){\r
185                 },\r
186                 numNodes : function(){\r
187                         var uinodes = X_Pair_get( this ).uinodes;\r
188                         return uinodes && uinodes.length || 0;\r
189                 }\r
190 \r
191         }\r
192 );\r