OSDN Git Service

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