OSDN Git Service

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