OSDN Git Service

Version 0.6.141, fix X.UI.ScrollBox.
[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         function XUI_Attr_createAttrDef( base, defs ){\r
122                 var F = base ? X_Object_clone( base ) : {},\r
123                         z = base ? base._last : 0,\r
124                         n = 1,\r
125                         p, def;\r
126                 \r
127                 // 属性定義の上書き\r
128                 for( p in defs ){\r
129                         if( X_EMPTY_OBJECT[ p ] ) continue;\r
130                         if( p === '_last' ) continue;\r
131                         if( !X_Type_isArray( def = defs[ p ] ) ) continue;\r
132                         F[ p ] = def;\r
133                         if( !base || !X_Type_isArray( base[ p ] ) ){\r
134                                 def.No = z += n;\r
135                                 // add\r
136                                 n = def[ 3 ] & XUI_Attr_Type.QUARTET ? 4 :\r
137                                     def[ 3 ] & XUI_Attr_Type.COMBI   ? 2 : 1;\r
138                         } else {\r
139                                 def.No = base[ p ].No;\r
140                         };\r
141                         if( def[ 3 ] & XUI_Attr_Type.LIST && X_Type_isString( def[ 4 ] ) ){\r
142                                 def[ 4 ] = XUI_createChecker( def[ 4 ] );\r
143                         };\r
144                 };\r
145                 F._last = z;\r
146                 return F;\r
147         };\r
148 \r
149 function XUI_Attr_copy( proto, supports ){\r
150         var support, p;\r
151         \r
152         for( p in supports ){\r
153                 if( X_EMPTY_OBJECT[ p ] ) continue;\r
154                 if( p === '_last' ) continue;\r
155                 support = supports[ p ];\r
156                 proto[ support.No ] = support[ 0 ];\r
157                 if( support[ 3 ] & XUI_Attr_Type.QUARTET ){\r
158                         proto[ support.No + 1 ] = support[ 0 ];\r
159                         proto[ support.No + 2 ] = support[ 0 ];\r
160                         proto[ support.No + 3 ] = support[ 0 ];\r
161                 } else\r
162                 if( support[ 3 ] & XUI_Attr_Type.COMBI ){\r
163                         proto[ support.No + 1 ] = support[ 0 ];\r
164                 };\r
165         };\r
166 };\r
167 \r
168 XUI_Attr_copy( XUI_AttrClass.prototype, XUI_Attr_Support );\r
169 \r
170 function XUI_Attr_preset( baseKlass, opt_supports, opt_attrs ){\r
171         var klass = baseKlass.inherits(),\r
172                 proto = klass.prototype,\r
173                 p;\r
174         \r
175         // 属性プリセット\r
176         XUI_Attr_copy( proto, opt_supports );\r
177         \r
178         // setAttr に書き換え\r
179         XUI_attrClassProto = proto;\r
180         for( p in opt_attrs ){\r
181                 if( X_EMPTY_OBJECT[ p ] ) continue;\r
182                 opt_supports[ p ] && XUI_AbstractUINode.prototype.setAttr( p, opt_supports[ p ], opt_attrs[ p ] );\r
183         };\r
184         XUI_attrClassProto = null;\r
185         return klass;\r
186 };\r