OSDN Git Service

Version 0.6.47, fix for IE5 & Opera7.x.
[pettanr/clientJs.git] / 0.6.x / js / _old / BasicLayoutManager.js
1         /**\r
2          * 再計算と再描画\r
3          * redraw 再描画はパラメータ変更後に setTimeout で\r
4          * reflow 再計算は値が get された場合 invalidate が サイズだったら\r
5          * または再描画前に invalidate がサイズなフラグが足っていたら \r
6          */\r
7         \r
8 var BasicLayoutManager = X.Class.create(\r
9         'BasicLayoutManager',\r
10         X.Class.POOL_OBJECT,\r
11         {\r
12                 Constructor : function(){\r
13                         \r
14                 },\r
15                 redraw : function( nodeData ){\r
16                         var root = nodeData.__root;\r
17                         root.dirty === X.Css.Dirty.REFLOW && this.reflow( root );\r
18                         \r
19                         // draw\r
20                 },\r
21                 reflow : function( nodeData, allowW, allowH ){\r
22                         nodeData.preMesure( allowW, allowH );\r
23                         \r
24                         var children = nodeData.children,                               \r
25                                 contentW = nodeData.contentWidth,\r
26                                 contentH = nodeData.contentHeight,\r
27                                 autoW    = contentW === AUTO,\r
28                                 autoH    = contentH === AUTO,\r
29                                 auto, calc, childW, childH, child, i, style, data,\r
30                                 t, r, b, l;                     \r
31                         if( children ){\r
32                                 auto     = autoW && autoH;\r
33                                 childW   = 0;\r
34                                 childH   = 0;\r
35                                 calc     = BasicLayoutManager.calcValue;                        \r
36                                 for( i = children.length; i; ){\r
37                                         child = children[ --i ];\r
38                                         style = child.__style;\r
39                                         if( style ){\r
40                                                 data = style.data;\r
41                                                 t = calc( data[ X.Css.AttrNo.top ],    contentH );\r
42                                                 r = calc( data[ X.Css.AttrNo.right ],  contentW );\r
43                                                 b = calc( data[ X.Css.AttrNo.bottom ], contentH );\r
44                                                 l = calc( data[ X.Css.AttrNo.left ],   contentW );\r
45                                         } else {\r
46                                                 t = r = b = l = 0;\r
47                                         };\r
48                                         if( child instanceof LayoutBoxPrivate ){\r
49                                                 child.layoutManager.reflow( child, contentW - r - l, contentH - t - b );\r
50                                         } else {\r
51                                                 child.preMesure( contentW - r - l, contentH - t - b );\r
52                                                 child.mesure();\r
53                                                 child.postMesure();\r
54                                         };\r
55                                         if( !auto ) continue;\r
56                                         if( autoW && childW < child.boxWidth  + r + l ) childW = child.boxWidth  + r + l;\r
57                                         if( autoH && childH < child.boxHeight + t + b ) childH = child.boxHeight + t + b;                                               \r
58                                 };\r
59                                 if( autoW )     nodeData.contentWidth  = childW;\r
60                                 if( autoH ) nodeData.contentHeight = childH;\r
61                         };\r
62                         ( autoW || autoH ) && nodeData.postMesure();\r
63                         \r
64                         delete nodeData.dirty;\r
65                 }\r
66         }\r
67 );\r
68 BasicLayoutManager.finalValue = function( styleValue, styleMin, styleMax, srcValue ){\r
69         var calc = BasicLayoutManager.calcValue,\r
70                 v    = calc( styleValue, srcValue ),\r
71                 min  = calc( styleMin,   srcValue ),\r
72                 max  = calc( styleMax,   srcValue );\r
73         if( v < min ) return min;\r
74         if( max < v ) return max;\r
75         return v;\r
76 };\r
77 BasicLayoutManager.calcValue = function( styleValue, srcValue ){\r
78         switch( styleValue ){\r
79                 case 0 :\r
80                         return 0;\r
81                 case AUTO :\r
82                         return AUTO;\r
83                 case FULL :\r
84                         return srcValue; // 100%\r
85                 default :\r
86                         if( 1 <= styleValue ) return styleValue; // legth\r
87                         if( -1 < styleValue ) return FLOOR( srcValue * styleValue ); // %\r
88         };\r
89         return styleValue; // - length\r
90 };\r
91 BasicLayoutManager.advancedCalcValue = function( styleValue, srcValue ){\r
92         switch( styleValue ){\r
93                 case 0 :\r
94                         return 0;\r
95                 case AUTO :\r
96                         return srcValue;\r
97                 case FULL :\r
98                         throw new Error( 'advancedCalcValue FULL' ); \r
99                         // return ; // 100%\r
100                 default :\r
101                         if( 1 <= styleValue ) return styleValue; \r
102                         if( -1 < styleValue ) return FLOOR( ( srcValue / ( 1 - styleValue ) ) * styleValue ); // %\r
103         };\r
104         return styleValue; // - length\r
105 };