OSDN Git Service

Version 0.6.149, fix X.Audio & X.UI.
[pettanr/clientJs.git] / 0.6.x / js / 20_ui / 02_XUI_Attr.js
1 var XUI_Attr_AUTO = 1/0,//Number.POSITIVE_INFINITY,\r
2         XUI_Attr_FLOOR = new Function( 'v', 'return 0 <= v ? v | 0 : -( -v | 0 )' ),\r
3         XUI_Attr_USER = {\r
4                 XNODE  : 0, // 値は xnode.css にコピーされます。\r
5                 UINODE : 1, // 値は _uinode にコピーされます。\r
6                 LAYOUT : 2  // \r
7         },\r
8         XUI_Attr_Type = {\r
9                 LIST              : 16384,\r
10                 LENGTH            :     1, // '1.5em'\r
11                 MINUS_LENGTH      :     2,\r
12                 PERCENT           :     4, // '90%', 0.0 ~ 1.0 こういう指定はできない!\r
13                 MINUS_PERCENT     :     8,\r
14                 NUMERICAL         :    16, // 1.1 (lineHeight only)\r
15                 AUTO              :    32, // 'auto'\r
16                 COLOR             :    64, // 0x000000 ~ 0xFFFFFF, RED, #000000 ~ #FFFFFF, #000 ~ #FFF\r
17                 URL               :   128,\r
18                 STRING            :   128,\r
19                 FONT_NAME         :   256,\r
20                 BOOLEAN           :   512,\r
21                 COMBI             :  1024,\r
22                 QUARTET           :  2048,\r
23                 DEFAULT_ONLY      :  4096,\r
24                 INIT_ONLY         :  8192\r
25         },\r
26         XUI_Attr_Option = {\r
27                 BORDER_STYLE      : 'none,hidden,dotted,dashed,solid,double,groove,ridge,inset,outset',\r
28                 ALIGN             : 'left,center,right,justify',\r
29                 TEXT_DECORATION   : 'none,underline,overline,line-through,blink',\r
30                 TEXT_TRANSFORM    : 'none,capitalize,lowercase,uppercase',\r
31                 BOX_SIZING        : 'content,padding,border',\r
32                 CURSOR            : 'pointer,wait'\r
33         },\r
34         XUI_Attr_CSS3 = {\r
35                 opacity         : true,\r
36                 bgColorAlpha    : true,\r
37                 bgGradient      : true,\r
38                 bgGradientAplha : true,\r
39                 cournerRadius   : true,\r
40                 boxShadowBlur   : true,\r
41                 boxShadowAlpha  : true,\r
42                 glowBlur        : true,\r
43                 glowAlpha       : true,\r
44                 textShadowBlur  : true,\r
45                 textShadowAlpha : true\r
46         },\r
47         XUI_Attr_Rename = {\r
48                 bgColor       : 'background-color',\r
49                 fontColor     : 'color',\r
50                 fontBold      : 'fontWeight',\r
51                 fontItalic    : 'fontStyle',\r
52                 fontSmallCaps : 'fontVariant'\r
53         },\r
54 \r
55 /*\r
56  * 0: 初期値 : undefined は不可!\r
57  * 1: dirty\r
58  * 2: この attr を処理する人\r
59  * 3: 受け付けるデータ型\r
60  * 4: 選択方式の場合、その候補\r
61  */\r
62         XUI_Attr_Support = XUI_Attr_createAttrDef( 0,\r
63 {\r
64         className         : [ null,           XUI_Dirty.CLEAN,  XUI_Attr_USER.UINODE, XUI_Attr_Type.DEFAULT_ONLY | XUI_Attr_Type.STRING ],\r
65         pointerHoverClass : [ null,           XUI_Dirty.CLEAN,  XUI_Attr_USER.UINODE, XUI_Attr_Type.DEFAULT_ONLY | XUI_Attr_Type.STRING ],\r
66         pointerDownClass  : [ null,           XUI_Dirty.CLEAN,  XUI_Attr_USER.UINODE, XUI_Attr_Type.DEFAULT_ONLY | XUI_Attr_Type.STRING ],\r
67         invalidLayoutColor: [ null,           XUI_Dirty.CLEAN,  XUI_Attr_USER.UINODE, XUI_Attr_Type.DEFAULT_ONLY | XUI_Attr_Type.COLOR ],\r
68         \r
69         role              : [ 1,              XUI_Dirty.CLEAN,  XUI_Attr_USER.UINODE, XUI_Attr_Type.INIT_ONLY | XUI_Attr_Type.LIST, 'none,chrome' ],\r
70         selectable        : [ false,          XUI_Dirty.CLEAN,  XUI_Attr_USER.UINODE, XUI_Attr_Type.INIT_ONLY | XUI_Attr_Type.BOOLEAN ],\r
71         \r
72         visible           : [ true,           XUI_Dirty.LAYOUT, XUI_Attr_USER.UINODE, XUI_Attr_Type.BOOLEAN ],\r
73         pointerEnabled    : [ false,          XUI_Dirty.CLEAN,  XUI_Attr_USER.UINODE, XUI_Attr_Type.BOOLEAN ],\r
74         pointerChildren   : [ true,           XUI_Dirty.CLEAN,  XUI_Attr_USER.UINODE, XUI_Attr_Type.BOOLEAN ],\r
75         cursor            : [ 1,              XUI_Dirty.CLEAN,  XUI_Attr_USER.UINODE, XUI_Attr_Type.LIST, XUI_Attr_Option.CURSOR ],\r
76         tooltip           : [ null,           XUI_Dirty.CLEAN,  XUI_Attr_USER.UINODE, XUI_Attr_Type.STRING ],\r
77         \r
78         borderWidth       : [ 0,              XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.QUARTET | XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT  ], // em [ top, right, bottom, left ]\r
79         padding           : [ 0,              XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.QUARTET | XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT ],\r
80         \r
81         width             : [ XUI_Attr_AUTO, XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT | XUI_Attr_Type.AUTO ],\r
82         minWidth          : [ 0,              XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT ],\r
83         maxWidth          : [ XUI_Attr_AUTO, XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT | XUI_Attr_Type.AUTO ],\r
84         height            : [ XUI_Attr_AUTO, XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT | XUI_Attr_Type.AUTO ],\r
85         minHeight         : [ 0,              XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT ],\r
86         maxHeight         : [ XUI_Attr_AUTO, XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT | XUI_Attr_Type.AUTO ],\r
87         sizing            : [ 1,              XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LIST, XUI_Attr_Option.BOX_SIZING ],\r
88         left              : [ null,           XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT | XUI_Attr_Type.MINUS_LENGTH | XUI_Attr_Type.MINUS_PERCENT ],\r
89         top               : [ null,           XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT | XUI_Attr_Type.MINUS_LENGTH | XUI_Attr_Type.MINUS_PERCENT ],\r
90         bottom            : [ null,           XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT | XUI_Attr_Type.MINUS_LENGTH | XUI_Attr_Type.MINUS_PERCENT ],\r
91         right             : [ null,           XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT | XUI_Attr_Type.MINUS_LENGTH | XUI_Attr_Type.MINUS_PERCENT ],        \r
92 \r
93         borderColor       : [ 0x0,            XUI_Dirty.PAINT,  XUI_Attr_USER.XNODE,  XUI_Attr_Type.QUARTET | XUI_Attr_Type.COLOR   ], // color [ top, right, bottom, left ]\r
94         borderStyle       : [ 1,              XUI_Dirty.PAINT,  XUI_Attr_USER.XNODE,  XUI_Attr_Type.QUARTET | XUI_Attr_Type.LIST, XUI_Attr_Option.BORDER_STYLE ], // string [ top, right, bottom, left ]\r
95         bgColor           : [ 0xFFFFFF,       XUI_Dirty.PAINT,  XUI_Attr_USER.XNODE,  XUI_Attr_Type.COLOR     ], // color, none\r
96 \r
97         fontColor         : [ 0x0,            XUI_Dirty.PAINT,  XUI_Attr_USER.XNODE, XUI_Attr_Type.COLOR     ],\r
98         fontFamily        : [ null,           XUI_Dirty.FONT,   XUI_Attr_USER.XNODE, XUI_Attr_Type.FONT_NAME ],\r
99         fontSize          : [ 1,              XUI_Dirty.FONT,   XUI_Attr_USER.XNODE, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT ],\r
100         fontBold          : [ false,          XUI_Dirty.FONT,   XUI_Attr_USER.XNODE, XUI_Attr_Type.BOOLEAN, 'bold'   ],\r
101         fontItalic        : [ false,          XUI_Dirty.FONT,   XUI_Attr_USER.XNODE, XUI_Attr_Type.BOOLEAN, 'italic' ],\r
102         fontSmallCaps     : [ false,          XUI_Dirty.FONT,   XUI_Attr_USER.XNODE, XUI_Attr_Type.BOOLEAN, 'small-caps' ],\r
103         lineHeight        : [ 1,              XUI_Dirty.FONT,   XUI_Attr_USER.XNODE, XUI_Attr_Type.NUMERICAL ], // percent\r
104         letterSpacing     : [ 0,              XUI_Dirty.FONT,   XUI_Attr_USER.XNODE, XUI_Attr_Type.LENGTH    ],\r
105         wordSpacing       : [ 0,              XUI_Dirty.FONT,   XUI_Attr_USER.XNODE, XUI_Attr_Type.LENGTH    ],\r
106         textAlign         : [ 1,              XUI_Dirty.FONT,   XUI_Attr_USER.XNODE, XUI_Attr_Type.LIST, XUI_Attr_Option.ALIGN           ],\r
107         textDecoration    : [ 1,              XUI_Dirty.FONT,   XUI_Attr_USER.XNODE, XUI_Attr_Type.LIST, XUI_Attr_Option.TEXT_DECORATION ],\r
108         textTransform     : [ 1,              XUI_Dirty.FONT,   XUI_Attr_USER.XNODE, XUI_Attr_Type.LIST, XUI_Attr_Option.TEXT_TRANSFORM  ]\r
109 }\r
110 ),\r
111 \r
112 /*\r
113  * 共通する attr 指定を prototype に設定しながら拡張できる、属性データ保持クラス\r
114  */\r
115 \r
116 XUI_attrClassProto = null,\r
117 \r
118 XUI_AttrClass = X_Class_create( 'XUI_AttrClass', X_Class.POOL_OBJECT );\r
119 \r
120 /*\r
121  * 'none,chrome,container' を受け取ったら、\r
122  * {\r
123  *      'none' : 1,\r
124  *  'chrome' : 2,\r
125  *  'container' : 3,\r
126  *  1 : 'none',\r
127  *  2 : 'chrome',\r
128  *  3 : 'container'\r
129  * } こんな object を返す。\r
130  */\r
131 function XUI_createChecker( str ){\r
132         var ret = {},\r
133                 ary = str.split( ',' ),\r
134                 l   = ary.length,\r
135                 i   = 0, v;\r
136         for( ; i < l; ){\r
137                 v = ary[ i ];\r
138                 ret[ v ] = ++i;\r
139                 ret[ i ] = v;\r
140         };\r
141         return ret;\r
142 };\r
143 \r
144         function XUI_Attr_createAttrDef( base, defs ){\r
145                 var F = base ? X_Object_clone( base ) : {},\r
146                         z = base ? base._last : 0,\r
147                         n = 1,\r
148                         p, def;\r
149                 \r
150                 // 属性定義の上書き\r
151                 for( p in defs ){\r
152                         if( X_EMPTY_OBJECT[ p ] ) continue;\r
153                         if( p === '_last' ) continue;\r
154                         if( !X_Type_isArray( def = defs[ p ] ) ) continue;\r
155                         F[ p ] = def;\r
156                         if( !base || !X_Type_isArray( base[ p ] ) ){\r
157                                 def.No = z += n;\r
158                                 // add\r
159                                 n = def[ 3 ] & XUI_Attr_Type.QUARTET ? 4 :\r
160                                     def[ 3 ] & XUI_Attr_Type.COMBI   ? 2 : 1;\r
161                         } else {\r
162                                 def.No = base[ p ].No;\r
163                         };\r
164                         if( def[ 3 ] & XUI_Attr_Type.LIST && X_Type_isString( def[ 4 ] ) ){\r
165                                 def[ 4 ] = XUI_createChecker( def[ 4 ] );\r
166                         };\r
167                 };\r
168                 F._last = z;\r
169                 return F;\r
170         };\r
171 \r
172 function XUI_Attr_copy( proto, supports ){\r
173         var support, p;\r
174         \r
175         for( p in supports ){\r
176                 if( X_EMPTY_OBJECT[ p ] ) continue;\r
177                 if( p === '_last' ) continue;\r
178                 support = supports[ p ];\r
179                 proto[ support.No ] = support[ 0 ];\r
180                 if( support[ 3 ] & XUI_Attr_Type.QUARTET ){\r
181                         proto[ support.No + 1 ] = support[ 0 ];\r
182                         proto[ support.No + 2 ] = support[ 0 ];\r
183                         proto[ support.No + 3 ] = support[ 0 ];\r
184                 } else\r
185                 if( support[ 3 ] & XUI_Attr_Type.COMBI ){\r
186                         proto[ support.No + 1 ] = support[ 0 ];\r
187                 };\r
188         };\r
189 };\r
190 \r
191 XUI_Attr_copy( XUI_AttrClass.prototype, XUI_Attr_Support );\r
192 \r
193 function XUI_Attr_preset( baseKlass, opt_supports, opt_attrs ){\r
194         var klass = baseKlass.inherits(),\r
195                 proto = klass.prototype,\r
196                 p;\r
197         \r
198         // 属性プリセット\r
199         XUI_Attr_copy( proto, opt_supports );\r
200         \r
201         // setAttr に書き換え\r
202         XUI_attrClassProto = proto;\r
203         for( p in opt_attrs ){\r
204                 if( X_EMPTY_OBJECT[ p ] ) continue;\r
205                 opt_supports[ p ] && XUI_AbstractUINode.prototype.setAttr( p, opt_supports[ p ], opt_attrs[ p ] );\r
206         };\r
207         XUI_attrClassProto = null;\r
208         return klass;\r
209 };\r