OSDN Git Service

Version 0.6.45, replace to new X.UI!
authoritozyun <itozyun@user.sourceforge.jp>
Wed, 4 Jun 2014 11:46:15 +0000 (20:46 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Wed, 4 Jun 2014 11:46:15 +0000 (20:46 +0900)
20 files changed:
0.6.x/css/ju.css
0.6.x/index.html
0.6.x/js/bootstrap.js [deleted file]
0.6.x/js/core/04_XClass.js
0.6.x/js/core/06_XEventDispatcher.js
0.6.x/js/main.js [new file with mode: 0644]
0.6.x/js/ui/00_XUI.js
0.6.x/js/ui/02_XUI_Attr.js [new file with mode: 0644]
0.6.x/js/ui/04_XUI_Event.js
0.6.x/js/ui/06_AbstractUINode.js
0.6.x/js/ui/07_LayoutManagerBase.js [deleted file]
0.6.x/js/ui/08_Box.js
0.6.x/js/ui/09_UINodeStyle.js [deleted file]
0.6.x/js/ui/11_VBox.js
0.6.x/js/ui/12_HBox.js
0.6.x/js/ui/13_TileBox.js
0.6.x/js/ui/14_ChromeBox.js
0.6.x/js/ui/15_ScrollBox.js [new file with mode: 0644]
0.6.x/js/ui/17_Text.js
0.6.x/js/ui/20_PageRoot.js [moved from 0.6.x/js/ui/16_PageRoot.js with 72% similarity]

index 8758d7f..badd6fb 100644 (file)
@@ -6,7 +6,7 @@ html, body {
        overflow : hidden;\r
 }\r
 \r
-#xui div {\r
+.PageRoot div {\r
 /* 要素は絶対配置される */\r
        position           : absolute;\r
        top                : 0;\r
@@ -15,13 +15,13 @@ html, body {
        margin             : 0;\r
 /* ブラウザのレイアウト機能による auto なサイズ指定は行わない */\r
        overflow           : hidden;\r
-/* border-box がデフォルト */\r
+/* border-box がデフォルト \r
        box-sizing         : border-box;\r
        -o-box-sizing      : border-box;\r
        -ms-box-sizing     : border-box;\r
        -moz-box-sizing    : border-box;\r
        -khtml-box-sizing  : border-box;\r
-       -webkit-box-sizing : border-box;\r
+       -webkit-box-sizing : border-box;*/\r
 /* browser bug fix */\r
        -moz-opacity       : 0.99;\r
        zoom               : 1;\r
index 4ed54e8..bd5426f 100644 (file)
@@ -2,7 +2,7 @@
 <html lang="ja" class="js-disabled">\r
 <head>\r
 <meta charset="utf-8">\r
-<title>X</title>\r
+<title>New X.UI</title>\r
 <meta name="HandheldFriendly" content="true">\r
 <meta name="mobileoptimized" content="0">\r
 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">\r
@@ -11,7 +11,6 @@
 <meta name="apple-mobile-web-app-capable">\r
 <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0,maximum-scale=1">\r
 <link rel="stylesheet" type="text/css" media="all" href="css/ju.css">\r
-<link rel="stylesheet" type="text/css" media="all" href="css/tree.css">\r
 \r
 <script type="text/javascript" src="js/core/00_builtin.js"></script>\r
 <script type="text/javascript" src="js/core/00_X.js"></script>\r
 <script type="text/javascript" src="js/dom/18_XDomQuery.js"></script>\r
 <script type="text/javascript" src="js/dom/19_XDomParser.js"></script>\r
 <script type="text/javascript" src="js/dom/20_XDomImage.js"></script>\r
-<!-- <script type="text/javascript" src="js/dom/22_XDomBuilder.js"></script> -->\r
+<!--<script type="text/javascript" src="js/dom/22_XDomBuilder.js"></script>-->\r
 \r
 <script type="text/javascript" src="js/ui/00_XUI.js"></script>\r
+<script type="text/javascript" src="js/ui/02_XUI_Attr.js"></script>\r
 <script type="text/javascript" src="js/ui/04_XUI_Event.js"></script>\r
-\r
 <script type="text/javascript" src="js/ui/05_XUI_Gesture.js"></script>\r
 <script type="text/javascript" src="js/ui/06_AbstractUINode.js"></script>\r
-<script type="text/javascript" src="js/ui/07_LayoutManagerBase.js"></script>\r
 <script type="text/javascript" src="js/ui/08_Box.js"></script>\r
-<script type="text/javascript" src="js/ui/09_UINodeStyle.js"></script>\r
 <script type="text/javascript" src="js/ui/11_VBox.js"></script>\r
 <script type="text/javascript" src="js/ui/12_HBox.js"></script>\r
 <script type="text/javascript" src="js/ui/13_TileBox.js"></script>\r
 <script type="text/javascript" src="js/ui/14_ChromeBox.js"></script>\r
-<!--<script type="text/javascript" src="js/ui/15_ScrollBox.js"></script>-->\r
-<script type="text/javascript" src="js/ui/16_PageRoot.js"></script>\r
+<script type="text/javascript" src="js/ui/15_ScrollBox.js"></script>\r
 <script type="text/javascript" src="js/ui/17_Text.js"></script>\r
+<script type="text/javascript" src="js/ui/20_PageRoot.js"></script>\r
+\r
+<script type="text/javascript" src="js/main.js"></script>\r
 \r
 </head>\r
 <body></body>\r
diff --git a/0.6.x/js/bootstrap.js b/0.6.x/js/bootstrap.js
deleted file mode 100644 (file)
index dc8c884..0000000
+++ /dev/null
@@ -1,248 +0,0 @@
-/*\r
- * + checkActiveX\r
- * + fetch core lib   x_ie6.js || x._gecko36.js\r
- * + ResponsiveImage\r
- */\r
-\r
-var options = {\r
-       outputID : 'bootstrap-output',\r
-       \r
-       responsiveCSS : [\r
-       ]\r
-};\r
-\r
-;(function( window, document, options, undefined ){\r
-\r
-var emptyFunction = new Function();\r
-\r
-// この script は head の中に書かれているか?\r
-var inHead = (function(){\r
-       var ss     = document.getElementsByTagName ? document.getElementsByTagName( 'script' ) :\r
-                                       document.all ? document.all.tags( 'script' ) : null,\r
-               self   = ss ? ss[ ss.length - 1 ] : null,\r
-               parent = self ? ( self.parentNode || self.parentElement ) : null;\r
-       if( parent && parent.tagName.toUpperCase() === 'HEAD' ) return true;\r
-       return false;\r
-})();\r
-\r
-// body にアクセス可能にする\r
-var body = document.body;\r
-if( !body ){\r
-       document.write('&lt;body&gt;');\r
-       body = document.body;\r
-};\r
-\r
-\r
-var UA = (function(){\r
-       var acme = {};\r
-       var n    = navigator;\r
-       var dua  = n.userAgent;\r
-       var dav  = n.appVersion;\r
-       var tv   = parseFloat(dav);\r
-       acme.isOpera  = (dua.indexOf("Opera") >= 0) ? tv: undefined;\r
-       acme.isKhtml  = (dav.indexOf("Konqueror") >= 0) ? tv : undefined;\r
-       acme.isWebKit = parseFloat(dua.split("WebKit\/")[1]) || undefined;\r
-       acme.isChrome = parseFloat(dua.split("Chrome\/")[1]) || undefined;\r
-       acme.isGecko  = (dua.indexOf("Gecko\/") >= 0) ? parseFloat(dua.split("rv:")[1].replace( /^(\d*\.\d*)\.(\d*)/, '$1$2' )) : undefined;\r
-       var index = Math.max(dav.indexOf("WebKit"), dav.indexOf("Safari"), 0);\r
-       if(index && !acme.isChrome){\r
-               acme.isSafari = parseFloat(dav.split("Version/")[1]);\r
-               if(!acme.isSafari || parseFloat(dav.substr(index + 7)) <= 419.3){\r
-                       acme.isSafari = 2;\r
-               };\r
-       };\r
-       if(document.all && !acme.isOpera){\r
-               acme.isIE = parseFloat(dav.split("MSIE ")[1]) || undefined;\r
-       };\r
-       \r
-       return acme;\r
-})();\r
-\r
-\r
-// load CoreLib\r
-(function(){\r
-       var test = new Function( 'return !!( window.X && X.$ )' ),\r
-               libs = [\r
-                       'js/builtin.js',\r
-                       'js/xua.js',\r
-                       'js/xtype.js',\r
-                       'js/xcallback.js',\r
-                       'js/xtimer.js',\r
-                       'js/xviewport.js',\r
-                       'js/xdom.js',\r
-                       'js/xdomevent.js',\r
-                       'js/xquery.js'\r
-               ],\r
-               src, script,\r
-               root = inHead ?\r
-                       ( document.getElementsByTagName ? document.getElementsByTagName('head')[0] :\r
-                       document.all ? document.all.tags( 'HEAD' )[0] : document.head )\r
-                       : document.body,\r
-               timerID = window.setInterval( function(){\r
-                               if( test() === true ){\r
-                                       window.clearInterval( timerID );\r
-                                       onLibReady();\r
-                                       test = onLibReady = null;\r
-                               };\r
-                       }, 0 );\r
-       \r
-       while( libs.length ){\r
-               src = libs.shift();\r
-               if( document.getElementById ){\r
-                       script = document.createElement( 'script' );\r
-                       root.appendChild( script );\r
-                       script.src = src;\r
-               } else\r
-               if( document.all ){\r
-                       root.insertAdjacentHTML( 'BeforeEnd', '<script src="' + src + '">' );\r
-               };\r
-       };\r
-       libs = src = script = null;\r
-       \r
-       \r
-       var onLibReady = function(){\r
-               X.Dom.Event.add( window, 'load', ResponsiveImage.onPageLoad );\r
-               //();\r
-       };      \r
-})();\r
-\r
-\r
-/*\r
- * http://code.google.com/p/css3-mediaqueries-js/source/browse/trunk/css3-mediaqueries_src.js\r
- */\r
-var nativeSupport = function () {\r
-    // check support for media queries\r
-    var id = 'css3-mediaqueries-test';\r
-    var el = document.createElement('div');\r
-    el.id = id;\r
-    var style = cssHelper.addStyle('@media all and (width) { #' + id + ' { width: 1px !important; } }', false);\r
-    // false means don't parse this temp style\r
-    body.appendChild(el);\r
-    var ret = el.offsetWidth === 1;\r
-    style.parentNode.removeChild(style);\r
-    el.parentNode.removeChild(el);\r
-    nativeSupport = new Function('return ' + ret);\r
-    return ret;\r
-};\r
-\r
-\r
-\r
-\r
-var ResponsiveImage = {\r
-       images  : [],\r
-       attrs   : [],\r
-       timerID : -1,\r
-       _onload : false,\r
-       detect : function(){\r
-               var regW   = /.*width=['"]?([0-9]+)['"]?.*/,\r
-                       regH   = /.*height=['"]?([0-9]+)['"]?.*/,\r
-                       images = document.images,\r
-                       saved  = ResponsiveImage.images,\r
-                       attrs  = ResponsiveImage.attrs,\r
-                       i      = 0,\r
-                       l      = images.length,\r
-                       img, w, h, html;\r
-               for( ; i < l; ++i ){\r
-                       img = images[ i ];\r
-                       if( saved.indexOf( img ) === -1 ){\r
-                               html = img.outerHTML; // for IE8\r
-                               w    = html ? html.replace( regW, '$1' ) : img.getAttribute( 'width' );\r
-                               h    = html ? html.replace( regH, '$1' ) : img.getAttribute( 'height' );\r
-                               if( !isFinite( w ) || !isFinite( h ) || !isFinite( w / h ) ){\r
-                                       continue;\r
-                               };\r
-                               saved[ saved.length ] = img;\r
-                               attrs[ saved.length - 1 ] = {\r
-                                       src    : img.src, // get Absolute\r
-                                       lowsrc : img.lowsrc,\r
-                                       getSrc : ResponsiveImage._getResponsiveSrc,\r
-                                       width  : w,\r
-                                       height : h,\r
-                                       ratio  : h / w\r
-                               };\r
-                               img.src = img.lowsrc = '';\r
-                       };\r
-               };\r
-               if( ResponsiveImage._onload === true ){\r
-                       window.clearInterval( ResponsiveImage.timerID );\r
-                       delete ResponsiveImage.timerID;\r
-                       delete ResponsiveImage.detect;\r
-                       delete ResponsiveImage._onload;\r
-                       \r
-                       ResponsiveImage.onResize();\r
-                       X.Dom.add( ResponsiveImage.onResize );\r
-               };\r
-       },\r
-       start : function(){\r
-               ResponsiveImage.timerID = window.setInterval( ResponsiveImage.detect, 0 );\r
-               delete ResponsiveImage.start;\r
-       },\r
-       onPageLoad : function(){\r
-               ResponsiveImage._onload = true;\r
-               delete ResponsiveImage.onPageLoad;\r
-       },\r
-       onResize : function( e ){\r
-               var saved = ResponsiveImage.images,\r
-                       attrs = ResponsiveImage.attrs,\r
-                       id    = 'img-area-size',\r
-                       i     = 0,\r
-                       l     = saved.length,\r
-                       $, img, attr, div, w;\r
-               for( ; i < l; ++i ){\r
-                       img  = saved[ i ];\r
-                       attr = attrs[ i ];\r
-                       X.$( img ).before( '<div id="' + id + '"></div>' );\r
-                       div = X.Dom.getElementById( id );\r
-                       w   = div.offsetWidth;\r
-                       if( attr.width < w ) w = attr.width;\r
-                       img.style.width  = w + 'px';\r
-                       img.style.height = attr.ratio * w + 'px';\r
-                       img.src = attr.getSrc( attr.src, w );\r
-                       X.$( div ).remove();\r
-               };\r
-       },\r
-       _getResponsiveSrc : function( src, width ){\r
-               var attr = this,\r
-                       src  = attr.src,\r
-                       url  = document.location.href;\r
-               if( ( url.indexOf( 'file:' ) === 0 || url.indexOf( '://localhost' ) ) && src.indexOf( 'http' ) !== 0 ){\r
-                       attr.getSrc = ResponsiveImage._getSrcLocal;\r
-               } else\r
-               if( src.indexOf( 'bp.bp.blogspot.com/' ) ){\r
-                       attr.getSrc = ResponsiveImage._getSrcBlogger;\r
-               } else\r
-               if( src.indexOf( '.googleusercontent.com/' ) ){\r
-                       attr.getSrc = ResponsiveImage._getSrcPicasa;\r
-               } else {\r
-                       attr.getSrc = ResponsiveImage._getSrcSenchaIO;\r
-               };\r
-               return attr.getSrc( src, width );\r
-       },\r
-       _getSrcLocal : function( src, width ){\r
-               return src;\r
-       },\r
-       _getSrcBlogger : function( src, width ){\r
-               return src;\r
-       },\r
-       _getSrcPicasa : function( src, width ){\r
-               return src;\r
-       },\r
-       _getSrcFlicker : function( src, width ){\r
-               return src;\r
-       },\r
-       _getSrcSenchaIO : function( src, width ){\r
-               return src;\r
-       }\r
-};\r
-ResponsiveImage.start();\r
-\r
-\r
-\r
-var BICFixed = false;\r
-// bonus: hotfix for IE6 SP1 (bug KB823727)\r
-try {\r
-       document.execCommand("BackgroundImageCache", false, true);\r
-       BICFixed = true;\r
-}catch(e){};\r
-\r
-})( window, document, options );
\ No newline at end of file
index 7f2eeb9..34c603a 100644 (file)
@@ -243,12 +243,7 @@ X.Class = ( function(){
                        klass.superClassOf = X.Class._superClassOf;\r
                        klass.subClassOf   = X.Class._subClassOf;\r
                        \r
-                       if( X.UA.Safari && X.UA.Safari < 2 ){ // Webkit で判定、Gecko もこちら\r
-                               // Safari では、prototype の差し替えができない, 1.3 で確認\r
-                               // あとから super class にプロパティを足しても、sub に伝播しない、、、\r
-                               //traits && X.Class._override( klass.prototype, traits, false );\r
-                               //X.Class._override( X.Class._override( klass.prototype, CommonProps, false ), props, true );\r
-                               // F = new Function; F.prototype = traits; traits.constructor = klass; klass.prototype = new F;\r
+                       if( X.UA.Safari && X.UA.Safari < 3 ){ // TODO Gecko もこちらへ\r
                                X.Class._override( X.Class._override( traits || klass.prototype, props, true ), CommonProps, false );\r
                                if( traits ) klass.prototype.__proto__ = traits;\r
                        } else {\r
index cf00404..5044400 100644 (file)
@@ -48,7 +48,7 @@ X.EventDispatcher =
                                list[ list.length ] = f =\r
                                        ( arg1 && !arg2 ) ?\r
                                                arg1 :\r
-                                               X.Callback.create( arg1, arg2, arg3 );\r
+                                               X.Callback.create( arg1, arg2, arg3 ); // TODO create しないで、arg1~arg3 を保持\r
                                f.once = X.EventDispatcher._once;\r
                                return this;\r
                        },\r
diff --git a/0.6.x/js/main.js b/0.6.x/js/main.js
new file mode 100644 (file)
index 0000000..843ba40
--- /dev/null
@@ -0,0 +1,31 @@
+\r
+PageRoot(\r
+       VBox({\r
+               width   : '30%',\r
+               height  : 10,\r
+               left    : '10%',\r
+               top     : 12,\r
+               bgColor : 0xcccccc\r
+       }),\r
+       VBox({\r
+               width       : '50%',\r
+               height      : 10,\r
+               left        : '30%',\r
+               bottom      : 12,\r
+               bgColor     : 0x999999\r
+       }),\r
+       VBox(\r
+               {\r
+                       width       : '50%',\r
+                       left        : '49%',\r
+                       top         : 5,\r
+                       bottom      : 5,\r
+                       bgColor     : 0x666666,\r
+                       borderColor : 0x111111,\r
+                       borderWidth : [ 0.5, 1, 5 ],\r
+                       borderStyle : 'solid dotted',\r
+                       sizing      : 'border'\r
+               },\r
+               Text( 'Hello,world' )\r
+       )\r
+);
\ No newline at end of file
index 6790c75..676ec7c 100644 (file)
@@ -1,37 +1,7 @@
-X.UI = X.UI || {};\r
-\r
-X.UI.State = {\r
-       DEFAULT     : 0,\r
-       HOVER       : 1,\r
-       FOCUSED     : 2,\r
-       DISABLED    : 4,\r
-       CHECKED     : 8,\r
-       FIRST_CHILD : 16,\r
-       LAST_CHILD  : 32\r
-};\r
-\r
-X.Css = {};\r
-\r
-X.Css.Type = {\r
-       LENGTH            :  1,\r
-       PERCENT           :  2,\r
-       COLOR             :  4,\r
-       U_DECIMAL         :  8,\r
-       NUMERICAL         : 16,\r
-       BOOLEAN           : 32,\r
-       QUARTET           : 64,\r
-       URL               : 128,\r
-       FONT_NAME         : 256,\r
-       LIST              : 512,\r
-       AUTO              : 1024,\r
-       COMBI             : 2048\r
-};\r
-\r
-var AUTO      = Number.POSITIVE_INFINITY;\r
-var FULL      = X.Css; // something unigue value;\r
-var FLOOR     = Math.floor;\r
-\r
 /*\r
+ * init_only,\r
+ * always,\r
+ * \r
  * uinode によって指定可能な css は異なる\r
  * + 直接 xnode.css() に渡す値\r
  * + uinode 内で加工してから xnode.css() に渡す値\r
@@ -40,89 +10,54 @@ var FLOOR     = Math.floor;
  *    x, y, gap, childW, childH など\r
  */\r
 \r
-X.Css.Option = {\r
-       BORDER_STYLE      : 'none,hidden,dotted,dashed,solid,double,groove,ridge,inset,outset'.split(','),\r
-       POSITION_X        : 'left,center,right'.split(','),\r
-       POSITION_Y        : 'top,center,bottom'.split(','),\r
-       ALIGN             : 'left,center,right,justify'.split(','),\r
-       TEXT_DECORATION   : 'none,underline,overline,line-through,blink'.split(','),\r
-       TEXT_TRANSFORM    : 'none,capitalize,lowercase,uppercase'.split(','),\r
-       WIDTH_HEIGHT      : [ 'auto' ],\r
-       BOX_SIZING        : 'content-box,padding-box,border-box'.split(',') // ,margin-box\r
-};\r
-\r
-X.Css.Dirty = {\r
-       CLEAN             : 0,\r
-       PAINT             : 1, // 再描画のみ必要\r
-       REFLOW            : 2, // レイアウト(ボックスサイズ)の再計算が必要\r
-       FONT              : 3, // フォントサイズが変更された\r
-       CONTENT_UPDATE    : 4 // コンテンツが変更された\r
-};\r
-\r
-X.Css.Attr = {\r
-       borderWidth       : [ X.Css.Dirty.REFLOW,  0, X.Css.Type.QUARTET | X.Css.Type.LENGTH  ], // em [ top, right, bottom, left ]\r
-       borderColor       : [ X.Css.Dirty.PAINT,   4, X.Css.Type.QUARTET | X.Css.Type.COLOR   ], // color [ top, right, bottom, left ]\r
-       borderStyle       : [ X.Css.Dirty.PAINT,   8, X.Css.Type.QUARTET | X.Css.Type.LIST, X.Css.Option.BORDER_STYLE ], // string [ top, right, bottom, left ]\r
-       cornerRadius      : [ X.Css.Dirty.PAINT,  12, X.Css.Type.QUARTET | X.Css.Type.LENGTH | X.Css.Type.PERCENT ], // em, px [ top, right, bottom, left ]\r
-       bgColor           : [ X.Css.Dirty.PAINT,  16, X.Css.Type.COLOR     ], // color\r
-       bgAlpha           : [ X.Css.Dirty.PAINT,  17, X.Css.Type.U_DECIMAL ], // 0 - 1\r
-       bgImgUrl          : [ X.Css.Dirty.PAINT,  18, X.Css.Type.URL       ], // url\r
-       bgImgRepeatX      : [ X.Css.Dirty.PAINT,  19, X.Css.Type.BOOLEAN   ], // true / false\r
-       bgImgRepeatY      : [ X.Css.Dirty.PAINT,  20, X.Css.Type.BOOLEAN   ], // true / false\r
-       bgImgPositionX    : [ X.Css.Dirty.PAINT,  21, X.Css.Type.LENGTH | X.Css.Type.PERCENT | X.Css.Type.LIST, X.Css.Option.POSITION_X ], // em %, px, string\r
-       bgImgPositionY    : [ X.Css.Dirty.PAINT,  22, X.Css.Type.LENGTH | X.Css.Type.PERCENT | X.Css.Type.LIST, X.Css.Option.POSITION_Y ], // em %, px, string\r
-       shadowColor       : [ X.Css.Dirty.PAINT,  23, X.Css.Type.COLOR     ], // color\r
-       shadowAlpha       : [ X.Css.Dirty.PAINT,  24, X.Css.Type.U_DECIMAL ], // 0 - 1\r
-       shadowOffsetX     : [ X.Css.Dirty.PAINT,  25, X.Css.Type.LENGTH    ], // em\r
-       shadowOffsetY     : [ X.Css.Dirty.PAINT,  26, X.Css.Type.LENGTH    ], // em\r
-       shadowBlur        : [ X.Css.Dirty.PAINT,  27, X.Css.Type.LENGTH    ], // em\r
-       shadowSpread      : [ X.Css.Dirty.PAINT,  28, X.Css.Type.LENGTH    ], // em\r
-       shadowInset       : [ X.Css.Dirty.PAINT,  29, X.Css.Type.BOOLEAN   ], // true / false\r
+X.UI = {\r
+       State : {\r
+               DEFAULT     : 0,\r
+               HOVER       : 1,\r
+               FOCUSED     : 2,\r
+               DISABLED    : 4,\r
+               CHECKED     : 8,\r
+               FIRST_CHILD : 16,\r
+               LAST_CHILD  : 32\r
+       },\r
        \r
-       color             : [ X.Css.Dirty.PAINT,  30, X.Css.Type.COLOR     ], // color\r
-       fontFamily        : [ X.Css.Dirty.FONT,   31, X.Css.Type.FONT_NAME ], // string\r
-       fontSize          : [ X.Css.Dirty.FONT,   32, X.Css.Type.LENGTH | X.Css.Type.PERCENT ], // em, %\r
-       bold              : [ X.Css.Dirty.FONT,   33, X.Css.Type.BOOLEAN   ], // true / false\r
-       italic            : [ X.Css.Dirty.FONT,   34, X.Css.Type.BOOLEAN   ], // true / false\r
-       lineHeight        : [ X.Css.Dirty.FONT,   35, X.Css.Type.LENGTH | X.Css.Type.PERCENT | X.Css.Type.NUMERICAL ], // em, %, \r
-       letterSpacing     : [ X.Css.Dirty.FONT,   36, X.Css.Type.LENGTH    ], // em\r
-       wordSpacing       : [ X.Css.Dirty.FONT,   37, X.Css.Type.LENGTH    ],\r
-       align             : [ X.Css.Dirty.FONT,   38, X.Css.Type.LIST, X.Css.Type.ALIGN           ],\r
-       decoration        : [ X.Css.Dirty.PAINT,  39, X.Css.Type.LIST, X.Css.Type.TEXT_DECORATION ],\r
-       transform         : [ X.Css.Dirty.FONT,   40, X.Css.Type.LIST, X.Css.Type.TEXT_TRANSFORM  ],\r
-       textShadowColor   : [ X.Css.Dirty.PAINT,  41, X.Css.Type.COLOR     ],\r
-       textShadowOffsetX : [ X.Css.Dirty.PAINT,  42, X.Css.Type.LENGTH    ],\r
-       textShadowOffsetY : [ X.Css.Dirty.PAINT,  43, X.Css.Type.LENGTH    ],\r
-       shadowBlur        : [ X.Css.Dirty.PAINT,  44, X.Css.Type.LENGTH    ],\r
+       Dirty : {\r
+               CLEAN   : 0,\r
+               PAINT   : 1, // 再描画のみ必要\r
+               LAYOUT  : 2, // レイアウト(ボックスサイズ)の再計算が必要\r
+               FONT    : 3, // フォントサイズが変更された\r
+               CONTENT : 4  // コンテンツが変更された\r
+       },\r
        \r
-       width             : [ X.Css.Dirty.REFLOW, 45, X.Css.Type.LENGTH | X.Css.Type.PERCENT, X.Css.Option.WIDTH_HEIGHT ],\r
-       minWidth          : [ X.Css.Dirty.REFLOW, 46, X.Css.Type.LENGTH | X.Css.Type.PERCENT ],\r
-       maxWidth          : [ X.Css.Dirty.REFLOW, 47, X.Css.Type.LENGTH | X.Css.Type.PERCENT ],\r
-       height            : [ X.Css.Dirty.REFLOW, 48, X.Css.Type.LENGTH | X.Css.Type.PERCENT, X.Css.Option.WIDTH_HEIGHT ],\r
-       minHeight         : [ X.Css.Dirty.REFLOW, 49, X.Css.Type.LENGTH | X.Css.Type.PERCENT ],\r
-       maxHeight         : [ X.Css.Dirty.REFLOW, 50, X.Css.Type.LENGTH | X.Css.Type.PERCENT ],\r
-       padding           : [ X.Css.Dirty.REFLOW, 51, X.Css.Type.QUARTET | X.Css.Type.LENGTH | X.Css.Type.PERCENT ],\r
-       margin            : [ X.Css.Dirty.REFLOW, 55, X.Css.Type.QUARTET | X.Css.Type.LENGTH | X.Css.Type.PERCENT ],\r
-       sizing            : [ X.Css.Dirty.REFLOW, 59, X.Css.Type.LIST, X.Css.Option.BOX_SIZING ],\r
-       pageBox           : [ X.Css.Dirty.REFLOW, 60, X.Css.Type.BOOLEAN ], // true / false\r
-       left              : [ X.Css.Dirty.REFLOW, 61, X.Css.Type.LENGTH | X.Css.Type.PERCENT ],\r
-       top               : [ X.Css.Dirty.REFLOW, 62, X.Css.Type.LENGTH | X.Css.Type.PERCENT ],\r
-       bottom            : [ X.Css.Dirty.REFLOW, 63, X.Css.Type.LENGTH | X.Css.Type.PERCENT ],\r
-       right             : [ X.Css.Dirty.REFLOW, 64, X.Css.Type.LENGTH | X.Css.Type.PERCENT ]\r
+       Util : {\r
+               createChecker : function( str ){\r
+                       var ret = {},\r
+                               ary = str.split( ',' ),\r
+                               l   = ary.length,\r
+                               i   = 0, v;\r
+                       for( ; i < l; ){\r
+                               v = ary[ i ];\r
+                               ret[ v ] = ++i;\r
+                               ret[ i ] = v;\r
+                       };\r
+                       return ret;\r
+               }\r
+       },\r
+       \r
+       currentRootData : null,\r
+       \r
+       Layout : {\r
+               Base : X.Class.create(\r
+                       'X.UI.Layout.Base',\r
+                       {\r
+                               overrideAttrsForSelf  : null,\r
+                               overrideAttrsForChild : null,\r
+                               calculate             : X.emptyFunction //function( data, isNeedsDetection, x, y, w, h )\r
+                       }\r
+               ),\r
+               create : function( props ){\r
+                       return X.Class._override( new X.UI.Layout.Base, props, true );\r
+               }\r
+       }\r
 };\r
 \r
-X.Css.Attr.x = X.Css.Attr.left;\r
-X.Css.Attr.y = X.Css.Attr.top;\r
-\r
-X.Css.AttrNo = ( function(){\r
-       var ret = {},\r
-               obj = X.Css.Attr,\r
-               max = 0,\r
-               p, no;\r
-       for( p in obj ){\r
-               ret[ p ] = no = obj[ p ][ 1 ];\r
-               if( max < no ) max = no;\r
-       };\r
-       ret.max = max;\r
-       return ret;\r
-})();
\ No newline at end of file
diff --git a/0.6.x/js/ui/02_XUI_Attr.js b/0.6.x/js/ui/02_XUI_Attr.js
new file mode 100644 (file)
index 0000000..ab224ff
--- /dev/null
@@ -0,0 +1,202 @@
+X.UI.Attr = {\r
+       AUTO  : Number.POSITIVE_INFINITY,\r
+       FLOOR : new Function( 'v', 'return 0 <= v ? v | 0 : -( -v | 0 )' ),\r
+       \r
+       USER : {\r
+               XNODE  : 0,\r
+               UINODE : 1,\r
+               LAYOUT : 2\r
+       },\r
+       \r
+       Type : {\r
+               LIST              :    0,\r
+               LENGTH            :    1, // '1.5em'\r
+               MINUS_LENGTH      :    2,\r
+               PERCENT           :    4, // '90%', 0.0 ~ 1.0 こういう指定はできない!\r
+               MINUS_PERCENT     :    8,\r
+               NUMERICAL         :   16, // 1.1 (lineHeight only)\r
+               AUTO              :   32, // 'auto'\r
+               COLOR             :   64, // 0x000000 ~ 0xFFFFFF, RED, #000000 ~ #FFFFFF, #000 ~ #FFF\r
+               URL               :  128,\r
+               STRING            :  128,\r
+               FONT_NAME         :  256,\r
+               BOOLEAN           :  512,\r
+               COMBI             : 1024,\r
+               QUARTET           : 2048,\r
+               DEFAULT_ONLY      : 4096,\r
+               INIT_ONLY         : 8192\r
+       },\r
+       \r
+       Option : {\r
+               BORDER_STYLE      : X.UI.Util.createChecker( 'none,hidden,dotted,dashed,solid,double,groove,ridge,inset,outset' ),\r
+               ALIGN             : X.UI.Util.createChecker( 'left,center,right,justify' ),\r
+               TEXT_DECORATION   : X.UI.Util.createChecker( 'none,underline,overline,line-through,blink' ),\r
+               TEXT_TRANSFORM    : X.UI.Util.createChecker( 'none,capitalize,lowercase,uppercase' ),\r
+               BOX_SIZING        : X.UI.Util.createChecker( 'content,padding,border' ), // ,margin-box\r
+               CURSOR            : X.UI.Util.createChecker( 'pointer,wait' )\r
+       },\r
+       \r
+       createAttrDef : function( base, defs ){\r
+               var F = base ? X.cloneObject( base ) : {},\r
+                       z = base ? base._last : 0,\r
+                       n = 1,\r
+                       p, def;\r
+               \r
+               // 属性定義の上書き\r
+               for( p in defs ){\r
+                       if( p === '_last' ) continue;\r
+                       if( !X.Type.isArray( def = defs[ p ] ) ) continue;\r
+                       F[ p ] = def;\r
+                       if( !base || !X.Type.isArray( base[ p ] ) ){\r
+                               def.No = z += n;\r
+                               // add\r
+                               n = def[ 3 ] & X.UI.Attr.Type.QUARTET ? 4 :\r
+                                   def[ 3 ] & X.UI.Attr.Type.COMBI   ? 2 : 1;\r
+                       } else {\r
+                               def.No = base[ p ].No;\r
+                       };\r
+               };\r
+               F._last = z;\r
+               return F;\r
+       },\r
+       \r
+       CSS3 : {\r
+               opacity         : true,\r
+               bgColorAlpha    : true,\r
+               bgGradient      : true,\r
+               bgGradientAplha : true,\r
+               cournerRadius   : true,\r
+               boxShadowBlur   : true,\r
+               boxShadowAlpha  : true,\r
+               glowBlur        : true,\r
+               glowAlpha       : true,\r
+               textShadowBlur  : true,\r
+               textShadowAlpha : true\r
+       },\r
+       \r
+       Rename : {\r
+               bgColor       : 'background-color',\r
+               fontColor     : 'color',\r
+               fontBold      : 'fontWeight',\r
+               fontItalic    : 'fontStyle',\r
+               fontSmallCaps : 'fontVariant'\r
+       }\r
+};\r
+\r
+/*\r
+ * 0: 初期値 : undefined は不可!\r
+ * 1: dirty\r
+ * 2: この attr を処理する人\r
+ * 3: 受け付けるデータ型\r
+ * 4: 選択方式の場合、その候補\r
+ */\r
+X.UI.Attr.Support = X.UI.Attr.createAttrDef( false,\r
+{\r
+       className         : [ null,           X.UI.Dirty.CLEAN,  X.UI.Attr.USER.UINODE, X.UI.Attr.Type.DEFAULT_ONLY | X.UI.Attr.Type.STRING ],\r
+       pointerHoverClass : [ null,           X.UI.Dirty.CLEAN,  X.UI.Attr.USER.UINODE, X.UI.Attr.Type.DEFAULT_ONLY | X.UI.Attr.Type.STRING ],\r
+       pointerDownClass  : [ null,           X.UI.Dirty.CLEAN,  X.UI.Attr.USER.UINODE, X.UI.Attr.Type.DEFAULT_ONLY | X.UI.Attr.Type.STRING ],\r
+       invalidLayoutColor: [ null,           X.UI.Dirty.CLEAN,  X.UI.Attr.USER.UINODE, X.UI.Attr.Type.DEFAULT_ONLY | X.UI.Attr.Type.COLOR ],\r
+       \r
+       role              : [ 0,              X.UI.Dirty.CLEAN,  X.UI.Attr.USER.UINODE, X.UI.Attr.Type.INIT_ONLY | X.UI.Attr.Type.LIST, 'none,chrome' ],\r
+       selectable        : [ false,          X.UI.Dirty.CLEAN,  X.UI.Attr.USER.UINODE, X.UI.Attr.Type.INIT_ONLY | X.UI.Attr.Type.BOOLEAN ],\r
+       \r
+       visible           : [ true,           X.UI.Dirty.LAYOUT, X.UI.Attr.USER.UINODE, X.UI.Attr.Type.BOOLEAN ],\r
+       pointerEnabled    : [ false,          X.UI.Dirty.CLEAN,  X.UI.Attr.USER.UINODE, X.UI.Attr.Type.BOOLEAN ],\r
+       pointerChildren   : [ true,           X.UI.Dirty.CLEAN,  X.UI.Attr.USER.UINODE, X.UI.Attr.Type.BOOLEAN ],\r
+       cursor            : [ null,           X.UI.Dirty.CLEAN,  X.UI.Attr.USER.UINODE, X.UI.Attr.Type.LIST, X.UI.Attr.Option.CURSOR ],\r
+       tooltip           : [ null,           X.UI.Dirty.CLEAN,  X.UI.Attr.USER.UINODE, X.UI.Attr.Type.STRING ],\r
+       \r
+       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
+       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
+       \r
+       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
+       minWidth          : [ 0,              X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LENGTH | X.UI.Attr.Type.PERCENT ],\r
+       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
+       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
+       minHeight         : [ 0,              X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LENGTH | X.UI.Attr.Type.PERCENT ],\r
+       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
+       sizing            : [ 0,              X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LIST, X.UI.Attr.Option.BOX_SIZING ],\r
+       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
+       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
+       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
+       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
+\r
+       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
+       borderStyle       : [ 0,              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
+       bgColor           : [ 0xFFFFFF,       X.UI.Dirty.PAINT,  X.UI.Attr.USER.XNODE,  X.UI.Attr.Type.COLOR     ], // color\r
+\r
+       fontColor         : [ 0x0,            X.UI.Dirty.PAINT,  X.UI.Attr.USER.XNODE, X.UI.Attr.Type.COLOR     ],\r
+       fontFamily        : [ null,           X.UI.Dirty.FONT,   X.UI.Attr.USER.XNODE, X.UI.Attr.Type.FONT_NAME ],\r
+       fontSize          : [ 1,              X.UI.Dirty.FONT,   X.UI.Attr.USER.XNODE, X.UI.Attr.Type.LENGTH | X.UI.Attr.Type.PERCENT ],\r
+       fontBold          : [ false,          X.UI.Dirty.FONT,   X.UI.Attr.USER.XNODE, X.UI.Attr.Type.BOOLEAN, 'bold'   ],\r
+       fontItalic        : [ false,          X.UI.Dirty.FONT,   X.UI.Attr.USER.XNODE, X.UI.Attr.Type.BOOLEAN, 'italic' ],\r
+       fontSmallCaps     : [ false,          X.UI.Dirty.FONT,   X.UI.Attr.USER.XNODE, X.UI.Attr.Type.BOOLEAN, 'small-caps' ],\r
+       lineHeight        : [ 1,              X.UI.Dirty.FONT,   X.UI.Attr.USER.XNODE, X.UI.Attr.Type.NUMERICAL ], // percent\r
+       letterSpacing     : [ 0,              X.UI.Dirty.FONT,   X.UI.Attr.USER.XNODE, X.UI.Attr.Type.LENGTH    ],\r
+       wordSpacing       : [ 0,              X.UI.Dirty.FONT,   X.UI.Attr.USER.XNODE, X.UI.Attr.Type.LENGTH    ],\r
+       textAlign         : [ 0,              X.UI.Dirty.FONT,   X.UI.Attr.USER.XNODE, X.UI.Attr.Type.LIST, X.UI.Attr.Option.ALIGN           ],\r
+       textDecoration    : [ 0,              X.UI.Dirty.FONT,   X.UI.Attr.USER.XNODE, X.UI.Attr.Type.LIST, X.UI.Attr.Option.TEXT_DECORATION ],\r
+       textTransform     : [ 0,              X.UI.Dirty.FONT,   X.UI.Attr.USER.XNODE, X.UI.Attr.Type.LIST, X.UI.Attr.Option.TEXT_TRANSFORM  ]\r
+}\r
+);\r
+\r
+/*\r
+ * 共通する attr 指定を prototype に設定しながら拡張できる、属性データ保持クラス\r
+ */\r
+\r
+X.UI.attrClassProto = null;\r
+\r
+X.UI.AttrClass = function( opt_supports, opt_attrs ){\r
+       var klass, proto, p, support;\r
+       if( opt_supports && opt_attrs ){\r
+               // クラス拡張\r
+               klass   = new Function( 'a,b', 'var f=arguments.callee;if(a||b)return f._(a,b)' );\r
+               klass._ = X.UI.AttrClass;\r
+               klass.prototype = proto = new ( this._ === X.UI.AttrClass ? this : X.UI.AttrClass )();\r
+               proto.constructor = klass;\r
+               \r
+               // 属性プリセット\r
+               for( p in opt_supports ){\r
+                       if( p === '_last' ) continue;\r
+                       support = opt_supports[ p ];\r
+                       proto[ support.No ] = support[ 0 ];\r
+                       if( support[ 3 ] & X.UI.Attr.Type.QUARTET ){\r
+                               proto[ support.No + 1 ] = support[ 0 ];\r
+                               proto[ support.No + 2 ] = support[ 0 ];\r
+                               proto[ support.No + 3 ] = support[ 0 ];\r
+                       } else\r
+                       if( support[ 3 ] & X.UI.Attr.Type.COMBI ){\r
+                               proto[ support.No + 1 ] = support[ 0 ];\r
+                       };\r
+               };\r
+               \r
+               // setAttr に書き換え\r
+               X.UI.attrClassProto = proto;\r
+               for( p in opt_attrs ){\r
+                       _AbstractUINode.prototype.setAttr( p, opt_supports[ p ], opt_attrs[ p ] );\r
+               };\r
+               X.UI.attrClassProto = null;\r
+               return klass;\r
+       };\r
+};\r
+\r
+(function(){\r
+       var proto    = X.UI.AttrClass.prototype,\r
+               supports = X.UI.Attr.Support,\r
+               support, p;\r
+       \r
+       for( p in supports ){\r
+               if( p === '_last' ) continue;\r
+               support = supports[ p ];\r
+               proto[ support.No ] = support[ 0 ];\r
+               if( support[ 3 ] & X.UI.Attr.Type.QUARTET ){\r
+                       proto[ support.No + 1 ] = support[ 0 ];\r
+                       proto[ support.No + 2 ] = support[ 0 ];\r
+                       proto[ support.No + 3 ] = support[ 0 ];\r
+               } else\r
+               if( support[ 3 ] & X.UI.Attr.Type.COMBI ){\r
+                       proto[ support.No + 1 ] = support[ 0 ];\r
+               };\r
+       };\r
+})();\r
+\r
index 2fbed8f..1190ff6 100644 (file)
@@ -44,8 +44,6 @@ X.UI.Event = {
        _MOUSE_MOVE       : ++X.UI.i,\r
        _MOUSE_CANCEL     : ++X.UI.i,\r
        \r
-       SELECT            : ++X.UI.i, // click or tap or enterkey\r
-       \r
        FILE_DRAG         : ++X.UI.i,\r
        FILE_DRAG_START   : ++X.UI.i,\r
        FILE_DRAG_END     : ++X.UI.i,\r
@@ -97,6 +95,7 @@ X.UI.Event = {
        KEY_DOWN          : ++X.UI.i,\r
        KEY_UP            : ++X.UI.i,\r
        KEY_HOLD          : ++X.UI.i,\r
+       KEY_CANCEL        : ++X.UI.i,\r
        \r
        SCROLL_BEFORE_START : ++X.UI.i, // cancelable\r
        SCROLL_START        : ++X.UI.i,\r
@@ -112,8 +111,17 @@ X.UI.Event = {
        ANIME_BEFORE_STOP   : ++X.UI.i, // before cancel\r
        ANIME_STOP          : ++X.UI.i,\r
 \r
+       PAGE_BEFORE_SHOW    : ++X.UI.i,\r
+       PAGE_SHOW           : ++X.UI.i,\r
+       PAGE_AFTER_SHOW     : ++X.UI.i,\r
+       PAGE_BEFORE_HIDE    : ++X.UI.i,\r
+       PAGE_HIDE           : ++X.UI.i,\r
+       PAGE_AFTER_HIDE     : ++X.UI.i,\r
+\r
+       // X.UI.Form\r
        CHANGE            : ++X.UI.i,\r
        SUBMIT            : ++X.UI.i,\r
+       SELECT            : ++X.UI.i, // click or tap or enterkey\r
        \r
        IdToName : {},\r
        NameToID : {}\r
index 65bfd49..c96bed5 100644 (file)
@@ -2,377 +2,572 @@ var _AbstractUINode = X.EventDispatcher.inherits(
        '_AbstractUINode',\r
        X.Class.ABSTRACT | X.Class.PRIVATE_DATA,\r
        {\r
-               phase         : 0,\r
-               root          : null,\r
-               rootData      : null,\r
-               parent        : null,\r
-               parentData    : null,\r
-               rawElement    : null,\r
-               rawStyle      : null,\r
+               phase             : 0,\r
+               root              : null,\r
+               rootData          : null,\r
+               hoverList         : null,\r
+               parent            : null,\r
+               parentData        : null,\r
+               xnode             : null,\r
+\r
+               supportAttrs      : X.UI.Attr.Support,\r
+               attrClass         : X.UI.AttrClass,\r
+               attrObject        : null,\r
+               unverifiedAttrs   : null,\r
                \r
-               //events        : null, // X.EventDispatcher で設定される\r
-               reserveEvents : null,\r
-               gesture       : null,\r
-               //elmScroll     : null,\r
-               //elmScroller   : null,\r
-               //elmScrollbar  : null,\r
-                               \r
-               style         : null,\r
-               styleData     : null,\r
-               forChrome     : false, // メッキ\r
+               role              : null,\r
+               pointerDisabled   : false,\r
+               hoverClassName    : null,\r
+               hovering          : false,\r
+               \r
+               reserveEvents     : null,\r
+               gesture           : null,\r
 \r
-               x              : 0,\r
-               y              : 0,\r
-               w              : 0,\r
-               h              : 0,\r
-               t              : 0, // top\r
-               l              : 0, // left\r
-               b              : 0, // bottom\r
-               r              : 0, // right\r
-               absoluteX      : 0,\r
-               absoluteY      : 0,\r
-               //_scrollX       : 0,\r
-               //_scrollY       : 0,\r
-               scrollingX     : 0,\r
-               scrollingY     : 0,\r
-               _cursor        : '',\r
-               hitChildData   : null,\r
-               hitSelf        : false,\r
-               _disabled      : false,\r
-               _childDisabled : false,\r
-               through        : false,\r
-               clip           : false,\r
-               hover          : false,\r
-               hoverStyleName : null,\r
-               isHover        : false,\r
-               scroll         : false,\r
-               dragdrop       : false,\r
-               tooltip        : null,\r
+               x                 : 0,\r
+               y                 : 0,\r
                \r
-               _content          : null,\r
-               updateContent     : false,\r
+               t                 : 0, // top\r
+               l                 : 0, // left\r
+               b                 : 0, // bottom\r
+               r                 : 0, // right\r
+               absoluteX         : 0,\r
+               absoluteY         : 0,\r
                \r
-               boxWidth          : 0,\r
-               boxHeight         : 0,\r
+               boxX              : 0,\r
+               boxY              : 0,\r
+               scrollWidth       : 0,\r
+               scrollHeight      : 0,          \r
+               boxWidth          : X.UI.Attr.AUTO,\r
+               minBoxWidth       : 0,\r
+               maxBoxWidth       : X.UI.Attr.AUTO,     \r
+               boxHeight         : X.UI.Attr.AUTO,\r
+               minBoxHeight      : 0,\r
+               maxBoxHeight      : X.UI.Attr.AUTO,\r
                contentL          : 0,\r
                contentT          : 0,\r
                contentR          : 0,\r
                contentB          : 0,\r
                boxSizingOffsetLR : 0,\r
                boxSizingOffsetTB : 0,          \r
-               contentWidth      : 0,\r
+               contentWidth      : X.UI.Attr.AUTO,\r
                minContentWidth   : 0,\r
-               maxContentWidth   : AUTO,\r
+               maxContentWidth   : X.UI.Attr.AUTO,\r
                lastContentWidth  : -1,\r
-               contentHeight     : 0,\r
+               contentHeight     : X.UI.Attr.AUTO,\r
                minContentHeight  : 0,\r
-               maxContentHeight  : AUTO,\r
+               maxContentHeight  : X.UI.Attr.AUTO,\r
                \r
+               constraintW       : false,\r
+               constraintH       : false,\r
+               autoWidth         : false,\r
+               autoHeight        : false,\r
+               percentWidth      : false,\r
+               percentHeight     : false,\r
                // :hover, :focus, :disabled\r
                \r
                initialize : function( root, rootData, parent, parentData ){\r
+                       var events = this.reserveEvents,\r
+                               l, i;                   \r
+                       \r
                        this.root       = root;\r
                        this.rootData   = rootData;\r
+                       this.hoverList  = rootData.hoverList;\r
                        this.parent     = parent;\r
                        this.parentData = parentData;\r
-                       this.rawElement = X.Dom.Node.create( 'div' );\r
+                       //this.xnode      = X.Dom.Node.create( 'div' );\r
+                       this.phase      = 1;\r
                        \r
-                       this.styleData.initialize();\r
-                       \r
-                       this.phase = 1;\r
                        this.dispatch( { type : X.UI.Event.INIT } );\r
+                       \r
+                       // html 要素が親に追加されるまで控えていたイベントの登録\r
+                       if( events && ( l = events.length ) ){\r
+                               for( i = 0; i < l; ++i ){\r
+                                       this.listen.apply( this, events[ i ] );\r
+                               };\r
+                               events.length = 0;\r
+                               delete this.reserveEvents;\r
+                       };                      \r
                },\r
                \r
                addToParent : function( parentElement ){\r
-                       //parentElement && parentElement.appendChild( this.rawElement );\r
-                       parentElement && parentElement.append( this.rawElement );\r
+                       parentElement && parentElement.append( this.xnode );\r
                        \r
                        this.phase = 2;\r
                        this.dispatch( { type : X.UI.Event.ADDED } );\r
                },\r
-\r
-       /* Rellay\r
-               afterAddition : function(){\r
-                       this.styleData.afterAddition();\r
-                       \r
-                       this.phase = 3;\r
-                       this.dispatch( { type : X.UI.Event.CREATION_COMPLETE } );\r
-               }, */\r
                \r
                creationComplete : function(){\r
-                       if( this.phase < 3 ) return;\r
-                       \r
-                       var nodes  = this.nodes,\r
-                               events = this.reserveEvents,\r
-                               l, i;\r
-                       if( nodes ){\r
-                               for( i = 0, l = nodes.length; i < l; ++i ){\r
-                                       nodes[ i ].creationComplete();\r
+                       this.phase = 3;\r
+                       this.User.dispatch( { type : X.UI.Event.CREATION_COMPLETE } );\r
+               },\r
+               \r
+               /*\r
+                * _UINode への setAttr の他、attrClass.prototype への setAttr にも対応する\r
+                * 親要素が変化した場合、unverifiedAttrs を元に attrObject を再設定.\r
+                */\r
+               setAttr : function( name, def, v ){\r
+                       var attrs      = X.UI.attrClassProto || this.attrObject,\r
+                               propID     = def.No || def[ 5 ],\r
+                               defaultVal = X.UI.attrClassProto ? attrs[ propID ] : this.attrClass.prototype[ propID ], // def[ 0 ],\r
+                               currentVal = attrs ? attrs[ propID ] : defaultVal,\r
+                               dirty      = def[ 1 ],\r
+                               user       = def[ 2 ],\r
+                               type       = def[ 3 ],\r
+                               list       = def[ 4 ],\r
+                               length     = !!( type & X.UI.Attr.Type.LENGTH        ),\r
+                               minusLen   = !!( type & X.UI.Attr.Type.MINUS_LENGTH  ),\r
+                               percent    = !!( type & X.UI.Attr.Type.PERCENT       ),\r
+                               minusPct   = !!( type & X.UI.Attr.Type.MINUS_PERCENT ),\r
+                               numerical  = !!( type & X.UI.Attr.Type.NUMERICAL     ),\r
+                               auto       = !!( type & X.UI.Attr.Type.AUTO          ),\r
+                               color      = !!( type & X.UI.Attr.Type.COLOR         ),\r
+                               url        = !!( type & X.UI.Attr.Type.URL           ),\r
+                               fontName   = !!( type & X.UI.Attr.Type.FONT_NAME     ),\r
+                               flag       = !!( type & X.UI.Attr.Type.BOOLEAN       ),\r
+                               combi      = !!( type & X.UI.Attr.Type.COMBI         ),\r
+                               quartet    = !!( type & X.UI.Attr.Type.QUARTET       ),\r
+                               _v, i, l, nodes, root, roots;\r
+               \r
+                       if( X.Type.isString( v ) ){\r
+                               //v = v.toLowercase();\r
+                               if( url || fontName ){\r
+                                       // good\r
+                               } else\r
+                               if( auto && v === 'auto' ){\r
+                                       v = X.UI.Attr.AUTO;\r
+                               } else\r
+                               if( list && ( _v = list[ v ] ) ){\r
+                                       // good\r
+                                       v = _v;\r
+                               } else\r
+                               if( ( percent || minusPct ) && v.lastIndexOf( '%' ) !== -1 && isFinite( _v = parseFloat( v ) ) && v === _v + '%' ){\r
+                                       // good\r
+                               } else\r
+                               if( ( length || minusLen ) && v.lastIndexOf( 'em' ) !== -1 && isFinite( _v = parseFloat( v ) ) && v === _v + 'em' ){\r
+                                       v = _v;\r
+                               } else                          \r
+                               if( v.indexOf( ' ' ) !== -1 ){\r
+                                       v = v.split( ' ' );\r
+                               } else\r
+                               if( color && X.Type.isNumber( _v = X.Dom.Style.parseColor( v ) ) ){\r
+                                       v = _v;\r
+                               } else {\r
+                                       // bad\r
+                                       return;\r
                                };\r
                        };\r
-                       this.mesure();\r
                        \r
-                       // this.scroll === true && ScrollBarManager.register( this );\r
+                       if( ( quartet || combi ) && !X.Type.isArray( v ) ){\r
+                               v = [ v ];\r
+                       };\r
                        \r
-                       // html 要素が親に追加されるまで控えていたイベントの登録\r
-                       if( events && ( l = events.length ) ){\r
-                               for( i = 0; i < l; ++i ){\r
-                                       this.listen.apply( this, events[ i ] );\r
+                       if( X.Type.isNumber( v ) ){\r
+                               if( \r
+                                   ( length    && ( 0 <= v ) ) ||\r
+                                   ( minusLen  && ( v <= 0 ) ) ||\r
+                                   ( percent   && 0 <= v && v <= 1 ) ||\r
+                                       ( minusPct  && -1 <= v && v < 0 ) ||\r
+                                   ( numerical && 0 <= v ) ||\r
+                                   ( auto      && v === X.UI.Attr.AUTO ) ||\r
+                                   ( color     && 0 <= v && v <= 0xFFFFFF ) ||\r
+                                   ( list      && list[ v ] )\r
+                               ){\r
+                                       // good\r
+                               } else {\r
+                                       // bad\r
+                                       return;\r
                                };\r
-                               events.length = 0;\r
-                               delete this.reserveEvents;\r
+                       } else\r
+                       if( X.Type.isBoolean( v ) && !flag ){\r
+                               return;\r
+                       } else\r
+                       if( X.Type.isArray( v ) ){\r
+                               if( v.length <= 4 && quartet ){\r
+                                       type &= ~X.UI.Attr.Type.QUARTET;\r
+                                       switch( v.length ){\r
+                                               case 1 :\r
+                                                       this.setAttr( false, [ defaultVal, user, dirty, type, list,   propID ], v[ 0 ] );\r
+                                                       this.setAttr( false, [ defaultVal, user, dirty, type, list, ++propID ], v[ 0 ] );\r
+                                                       this.setAttr( false, [ defaultVal, user, dirty, type, list, ++propID ], v[ 0 ] );\r
+                                                       this.setAttr( false, [ defaultVal, user, dirty, type, list, ++propID ], v[ 0 ] );\r
+                                                       break;\r
+                                               case 2 :\r
+                                                       this.setAttr( false, [ defaultVal, user, dirty, type, list,   propID ], v[ 0 ] );\r
+                                                       this.setAttr( false, [ defaultVal, user, dirty, type, list, ++propID ], v[ 1 ] );\r
+                                                       this.setAttr( false, [ defaultVal, user, dirty, type, list, ++propID ], v[ 0 ] );\r
+                                                       this.setAttr( false, [ defaultVal, user, dirty, type, list, ++propID ], v[ 1 ] );\r
+                                                       break;\r
+                                               case 3 :\r
+                                                       this.setAttr( false, [ defaultVal, user, dirty, type, list,   propID ], v[ 0 ] );\r
+                                                       this.setAttr( false, [ defaultVal, user, dirty, type, list, ++propID ], v[ 1 ] );\r
+                                                       this.setAttr( false, [ defaultVal, user, dirty, type, list, ++propID ], v[ 2 ] );\r
+                                                       this.setAttr( false, [ defaultVal, user, dirty, type, list, ++propID ], v[ 1 ] );\r
+                                                       break;\r
+                                               case 4 :\r
+                                                       this.setAttr( false, [ defaultVal, user, dirty, type, list,   propID ], v[ 0 ] );\r
+                                                       this.setAttr( false, [ defaultVal, user, dirty, type, list, ++propID ], v[ 1 ] );\r
+                                                       this.setAttr( false, [ defaultVal, user, dirty, type, list, ++propID ], v[ 2 ] );\r
+                                                       this.setAttr( false, [ defaultVal, user, dirty, type, list, ++propID ], v[ 3 ] );\r
+                                                       break;\r
+                                       };                                      \r
+                               } else\r
+                               if( v.length === 2 && combi ){\r
+                                       type &= ~X.UI.Attr.Type.COMBI;\r
+                                       this.setAttr( false, [ defaultVal, user, dirty, type, list,   propID ], v[ 0 ] );\r
+                                       this.setAttr( false, [ defaultVal, user, dirty, type, list, ++propID ], v[ 1 ] );\r
+                               } else {\r
+                                       // bad\r
+                                       return;\r
+                               };\r
+\r
+                               if( !X.UI.attrClassProto && user === X.UI.Attr.USER.XNODE && this.xnode ){\r
+                                       this.xnode.css( X.UI.Attr.Rename[ name ] || name, this._createCssText( name ) );\r
+                                       //console.log( ( X.UI.Attr.Rename[ name ] || name ) + ' ' + this._createCssText( name ) + ' ' + propID + ' ' + attrs[ propID ] );\r
+                               };\r
+                               return;\r
                        };\r
-               },\r
-               \r
-               mesure : function(){\r
-                       var elm = this.rawElement,\r
-                               x, y, w, h, parent;\r
-                       if( elm ){\r
-                               w = elm.width();//w = elm.offsetWidth;\r
-                               h = elm.height();//h = elm.offsetHeight;\r
-                               x = elm.x();//x = elm.offsetLeft;\r
-                               y = elm.y();//y = elm.offsetTop;                                \r
-                               if( this.x !== x || this.y !== y || this.w !== w || this.h !== h ){\r
-                                       this.x = x;\r
-                                       this.y = y;\r
-                                       this.w = w;\r
-                                       this.h = h;\r
-                                       ( parent = this.parentData ) && this.updateAbsoluteXY( parent.absoluteX, parent.absoluteY );\r
-                               };                      \r
+\r
+                       if( !v && v !== 0 ) v = defaultVal;\r
+                       \r
+                       if( X.UI.attrClassProto ){\r
+                               attrs[ propID ] = v;\r
+                               return;                 \r
+                       };              \r
+\r
+                       if( currentVal !== v ){\r
+                               switch( propID ){\r
+                                       case X.UI.Attr.Support.left.No :\r
+                                               this.constraintW = attrs[ X.UI.Attr.Support.right.No ] !== null;\r
+                                               break;\r
+                                       case X.UI.Attr.Support.right.No :\r
+                                               this.constraintW = attrs[ X.UI.Attr.Support.left.No ] !== null;\r
+                                               break;\r
+                                       case X.UI.Attr.Support.top.No :\r
+                                               this.constraintH = attrs[ X.UI.Attr.Support.bottom.No ] !== null;\r
+                                               break;\r
+                                       case X.UI.Attr.Support.bottom.No :\r
+                                               this.constraintH = attrs[ X.UI.Attr.Support.top.No ] !== null;\r
+                                               break;\r
+                                       case X.UI.Attr.Support.width.No :\r
+                                               this.autoWidth    = v === X.UI.Attr.AUTO;\r
+                                               this.percentWidth = X.Type.isString( v );\r
+                                               break;\r
+                                       case X.UI.Attr.Support.height.No :\r
+                                               this.autoHeight    = v === X.UI.Attr.AUTO;\r
+                                               this.percentHeight = X.Type.isString( v );\r
+                                               break;\r
+                               };\r
+                               \r
+                               if( defaultVal === v ){\r
+                                       if( attrs ) delete attrs[ propID ];\r
+                               } else {\r
+                                       if( !attrs ) attrs = this.attrObject = new this.attrClass;\r
+                                       attrs[ propID ] = v;\r
+                               };\r
+                               \r
+                               if( name && user === X.UI.Attr.USER.XNODE && this.xnode ){\r
+                                       this.xnode.css( X.UI.Attr.Rename[ name ] || name, this._createCssText( name ) );\r
+                                       //console.log( ( X.UI.Attr.Rename[ name ] || name ) + ' ' + this._createCssText( name ) + ' ' + propID + ' ' + attrs[ propID ] );\r
+                               } else\r
+                               if( this.dirty < dirty ) this.dirty = dirty;                                                    \r
                        };\r
-                       this.updateRectangle();\r
                },\r
-               \r
-               updateAbsoluteXY : function( x, y /* , scrollX, scrollY */ ){\r
-                       var nodes = this.nodes, i;\r
-                       this.absoluteX = x = this.x + x;\r
-                       this.absoluteY = y = this.y + y;\r
-                       if( !nodes ) return;\r
-                       for( i = nodes.length; i; ){\r
-                               nodes[ --i ].updateAbsoluteXY( x, y );\r
+\r
+               _createCssText : function( name ){\r
+                       var attrs      = this.attrObject || this.attrClass.prototype || X.UI.AttrClass,\r
+                               def        = this.supportAttrs[ name ],\r
+                               no         = def.No,\r
+                               v          = attrs[ def.No ],\r
+                               type       = def[ 3 ],\r
+                               list       = def[ 4 ],\r
+                               flag       = !!( type & X.UI.Attr.Type.BOOLEAN ),\r
+                               combi      = !!( type & X.UI.Attr.Type.COMBI   ),\r
+                               quartet    = !!( type & X.UI.Attr.Type.QUARTET );\r
+\r
+                       if( quartet ){\r
+                               if( attrs[ no + 1 ] === attrs[ no + 3 ] ){\r
+                                       if( v === attrs[ no + 2 ] ){\r
+                                               if( v === attrs[ no + 1 ] ){\r
+                                                       return this._createCssValue( v, type, list );\r
+                                               };\r
+                                               return [\r
+                                                       this._createCssValue( v, type, list ),\r
+                                                       this._createCssValue( attrs[ no + 1 ], type, list )\r
+                                               ].join( ' ' );\r
+                                       };\r
+                                       return [\r
+                                               this._createCssValue( v, type, list ),\r
+                                               this._createCssValue( attrs[ no + 1 ], type, list ),\r
+                                               this._createCssValue( attrs[ no + 2 ], type, list )\r
+                                       ].join( ' ' );\r
+                               };\r
+                               return [\r
+                                       this._createCssValue( v, type, list ),\r
+                                       this._createCssValue( attrs[ no + 1 ], type, list ),\r
+                                       this._createCssValue( attrs[ no + 2 ], type, list ),\r
+                                       this._createCssValue( attrs[ no + 3 ], type, list )\r
+                               ].join( ' ' );\r
+                       } else\r
+                       if( combi ){\r
+                               return [\r
+                                       this._createCssValue( v, type, list ),\r
+                                       this._createCssValue( attrs[ no + 1 ], type, list )\r
+                               ].join( ' ' );\r
+                       } else\r
+                       if( flag ){\r
+                               return v ? list : 'normal'; // \r
                        };\r
+                       return this._createCssValue( v, type, list );\r
                },\r
-               \r
-               updateRectangle : function(){\r
-                       var w = this.w, h = this.h, x = this.x, y = this.y,\r
-                               l = x, t = y, r = x + w, b = y + h,\r
-                               nodes = this.nodes, i, node;\r
-                               \r
-                       if( nodes && this.clip === false ){\r
-                               for( i = nodes.length; i; ){\r
-                                       node = nodes[ --i ];\r
-                                       if( node.l + x < l ) l = x + node.l;\r
-                                       if( node.t + y < t ) t = y + node.t;\r
-                                       if( r < node.r + x ) r = x + node.r;\r
-                                       if( b < node.b + y ) b = y + node.b;\r
+\r
+               _createCssValue : function( v, type, list ){\r
+                       var length     = !!( type & X.UI.Attr.Type.LENGTH        ),\r
+                               minusLen   = !!( type & X.UI.Attr.Type.MINUS_LENGTH  ),\r
+                               percent    = !!( type & X.UI.Attr.Type.PERCENT       ),\r
+                               minusPct   = !!( type & X.UI.Attr.Type.MINUS_PERCENT ),\r
+                               numerical  = !!( type & X.UI.Attr.Type.NUMERICAL     ),\r
+                               auto       = !!( type & X.UI.Attr.Type.AUTO          ),\r
+                               color      = !!( type & X.UI.Attr.Type.COLOR         ),\r
+                               url        = !!( type & X.UI.Attr.Type.URL           ),\r
+                               fontName   = !!( type & X.UI.Attr.Type.FONT_NAME     );\r
+                       \r
+                       if( X.Type.isNumber( v ) ){\r
+                               if( auto && v === X.UI.Attr.AUTO ) return 'auto';\r
+                               if( length || minusLen ) return v + 'em';\r
+                               if( numerical ) return v;\r
+                               if( list && list[ v ] ) return list[ v ];\r
+                               if( color ){\r
+                                       return '#' + v.toString( 16 );\r
                                };\r
                        };\r
-                       // update\r
-                       if( b !== this.b || r !== this.r || t !== this.t || l !== this.l ){\r
-                               this.l = l;\r
-                               this.t = t;\r
-                               this.r = r;\r
-                               this.b = b;\r
-                               this.parentData && this.parentData.clip === false && this.parentData.updateRectangle();\r
+                       if( X.Type.isString( v ) ){\r
+                               if( percent || minusPct || url || fontName ) return v;\r
                        };\r
                },\r
-               \r
-               capcher : function( x, y ){\r
-                       var nodes, child, _x, _y, hit, i;\r
-                       if( this._disabled === true ) return false;\r
-                       delete this.hitChildData;\r
-                       x -= this.x;\r
-                       y -= this.y;\r
-                       // この部分 Box に移動\r
-                       if( nodes = this.nodes ){\r
-                               _x = x - this.scrollingX;\r
-                               _y = y - this.scrollingY;\r
-                               for( i = nodes.length; i; ){\r
-                                       child = nodes[ --i ];\r
-                                       if( child._disabled === false && child.l <= _x && _x < child.r && child.t <= _y && _y < child.b && child.capcher( _x, _y ) === true ){\r
-                                               this.hitChildData = child;\r
-                                               break;\r
-                                       };\r
-                               };\r
+\r
+               getAttr : function( name ){\r
+                       var attrs   = this.attrObject || this.attrClass.prototype || X.UI.AttrClass,\r
+                               support = this.supportAttrs[ name ],\r
+                               v;\r
+                       if( !support ) return;\r
+                       \r
+                       if( name.indexOf( 'border' ) === 0 ){\r
+                               name = name.substr( 6 );\r
+                               return [ this.getAttr( 'borderTop' + name ), this.getAttr( 'borderRight' + name ), this.getAttr( 'borderBottom' + name ), this.getAttr( 'borderLeft' + name ) ];\r
                        };\r
-                       if( this.through === true ){\r
-                               this.hitChildData && this.hitSelf === false && this.rootData.hoverList.push( this );\r
-                               return !!this.hitChildData;\r
+                       \r
+                       type = support[ 3 ];\r
+                       // Unit\r
+                       if( type & X.UI.Attr.Type.QUARTET ){\r
+                               return [ this.getAttr( name + 'Top' ), this.getAttr( name + 'Right' ), this.getAttr( name + 'Bottom' ), this.getAttr( name + 'Left' ) ];\r
                        };\r
-                       hit = 0 <= x && x < this.w && 0 <= y && y < this.h;\r
-                       ( this.hitChildData || hit ) && this.hitSelf === false && this.rootData.hoverList.push( this );\r
-                       if( hit === true && this.hitChildData === null ) this.rootData.targetNodeData = this;\r
-                       return hit || !!this.hitChildData;\r
+                       if( type & X.UI.Attr.Type.COMBI   ) return [ v, data[ ++propID ] ];\r
+                       \r
+                       v    = attrs[ support.No ];             \r
+                       if( type & X.UI.Attr.Type.AUTO && v === X.UI.Attr.AUTO ) return 'auto'; \r
+                       \r
+                       list = support[ 4 ];\r
+                       if( list ) return list[ v ];\r
+                       \r
+                       if( type & X.UI.Attr.Type.COLOR && X.Type.isNumber( v ) ) return v;\r
+                       if( !( type & X.UI.Attr.Type.NUMERICAL ) && X.Type.isNumber( v ) ) return v + 'em';\r
+                       return v;\r
                },\r
                \r
+               // em, px, %\r
+               getAttrWithUnit : function( prop, unit ){\r
+                       \r
+               },\r
+\r
                _remove : function(){\r
                        switch( this.phase ){\r
                                case 4:\r
                                case 3:\r
-                                       //this.styleData.afterAddition();\r
+\r
                                case 2:\r
-                                       //this.rawElement.parentNode.removeChild( this.rawElement );\r
-                                       this.rawElement.remove();\r
+                                       this.xnode.destroy();\r
                                case 1:\r
-                                       //this.styleData.initialize();\r
                                        delete this.root;\r
                                        delete this.rootData;\r
                                        delete this.parent;\r
                                        delete this.parentData;\r
-                                       delete this.rawElement;\r
+                                       delete this.xnode;\r
+                                       \r
+                                       delete this.phase;\r
                        };\r
-                       delete this.phase;\r
+                       \r
                },\r
                //killed\r
-               \r
-               \r
-               content : function( v ){\r
-                       if( Type.isString( v ) === true ){\r
-                               if( !this.rawText || this.rawText.data !== v ){\r
-                                       this._content = v;\r
-                                       this.updateContent = true;\r
-                               };\r
-                               return this.User;\r
-                       } else\r
-                       if( v === null ){\r
-                               if( this._content !== v && this.rawText ){\r
-                                       this.updateContent = true;\r
-                               };\r
-                               delete this._content;\r
-                               return this.User;\r
+\r
+               calculate : function( isNeedsDetection, x, y, allowW, allowH ){\r
+                       this.preMesure( allowW, allowH );\r
+                       \r
+                       if( this.boxWidth === X.UI.Attr.AUTO || this.boxHeight === X.UI.Attr.AUTO ){\r
+                               this.mesure();\r
+                               this.postMesure();\r
                        };\r
-                       if( this._content || this._content === null ) return this._content;\r
-                       if( this.rawText ) return this.rawText.data;\r
-                       return null;\r
+                       \r
+                       !isNeedsDetection && this.updateLayout( x, y );\r
+               },\r
+               \r
+               /**\r
+                * X.Dom.BoxModel の情報を引きながら top,left,width,height,padding,border の設定\r
+                */\r
+               updateLayout : function( x, y ){\r
+                       x += this.boxX;\r
+                       y += this.boxY;\r
+                       this.xnode\r
+                               .css( 'left',        x ? x + 'em' : 0 )\r
+                               .css( 'top',         y ? y + 'em' : 0 )\r
+                               .css( 'width',       this.contentWidth  ? this.contentWidth  + 'em' : 0 )\r
+                               .css( 'height',      this.contentHeight ? this.contentHeight + 'em' : 0 )\r
+                               .css( 'padding',     this._createCssText( 'padding' ) )\r
+                               .css( 'borderWidth', this._createCssText( 'borderWidth' ) );\r
                },\r
-\r
-\r
 \r
                /*\r
                 * 親の サイズを元に自身のサイズを計算していく\r
                 */\r
                preMesure : function( allowW, allowH ){\r
-                       var style    = this.styleData,\r
-                               styles, calc, box, min, max,\r
+                       var attrs = this.attrObject || this.attrClass.prototype || X.UI.AttrClass,\r
+                               calc  = _AbstractUINode.calcValue,\r
+                               box   = attrs[ X.UI.Attr.Support.sizing.No ],\r
+                               min, max,\r
+                               boxL, boxT, boxR, boxB,\r
                                contentW, contentH, boxMinus,\r
                                paddingT, paddingR, paddingB, paddingL,\r
                                borderT, borderR, borderB, borderL;\r
-\r
-                       if( style ){\r
-                               styles   = style.data;\r
-                               calc     = _AbstractUINode.calcValue;\r
-                               box      = styles[ X.Css.AttrNo.sizing ];\r
-                               \r
-                               // Width が確定するパターン\r
-                               // 自身が constraintW の場合 親が AUTO ではない\r
-                               // 自身が constraintW でない場合自身が  AUTO はなくかつ親 が AUTO の場合 or 自身は % でない\r
-                               if( style.constraintW ? allowW !== AUTO : !style.autoWidth && ( allowW !== AUTO || !style.percentWidth ) ){\r
-                                       if( style.constraintW ){ // 制約レイアウト\r
-                                               contentW = allowW - calc( styles[ X.Css.AttrNo.left ], allowW ) - calc( styles[ X.Css.AttrNo.right ], allowW );\r
-                                       } else {\r
-                                               contentW = _AbstractUINode.finalValue( styles[ X.Css.AttrNo.width ], styles[ X.Css.AttrNo.minWidth ], styles[ X.Css.AttrNo.maxWidth ], allowW );                                        \r
-                                       };\r
-                                       paddingR = calc( styles[ X.Css.AttrNo.padding + 1 ], allowW );\r
-                                       paddingL = calc( styles[ X.Css.AttrNo.padding + 3 ], allowW );\r
-                                       borderR  = styles[ X.Css.AttrNo.border + 1 ];\r
-                                       borderL  = styles[ X.Css.AttrNo.border + 3 ];\r
-                                       boxMinus = 0;\r
-                                       switch( box ){\r
-                                               case 2 : // border-box\r
-                                                        boxMinus -= borderR + borderL;\r
-                                               case 1 : // padding-box\r
-                                                        boxMinus -= paddingR + paddingL;\r
-                                               // case 0 : // content-box\r
-                                       };\r
-                                       this.contentL     = borderL + paddingL;\r
-                                       this.contentR     = borderR + paddingR;         \r
-                                       this.contentWidth = contentW + boxMinus;\r
-                                       this.boxWidth     = contentW - boxMinus + this.contentL + this.contentR;\r
-                                       this.boxSizingOffsetLR = boxMinus;\r
-                               } else {\r
-                                       this.boxWidth = this.contentWidth = AUTO;\r
-                                       min = styles[ X.Css.AttrNo.minWidth ];\r
-                                       max = styles[ X.Css.AttrNo.maxWidth ];\r
-                                       this.minContentWidth = 1 <= min ? min : 0;\r
-                                       this.maxContentWidth = 1 <= max ? max : AUTO;\r
-                                       delete this.boxSizingOffsetLR;\r
-                               };\r
-                               \r
-                               // Height\r
-                               if( style.constraintH ? allowH !== AUTO : !style.autoHeight && ( allowH !== AUTO || !style.percentHeight ) ){\r
-                                       if( style.constraintH ){ // 制約レイアウト\r
-                                               contentH = allowH - calc( styles[ X.Css.AttrNo.top ], allowH ) - calc( styles[ X.Css.AttrNo.bottom ], allowH );\r
-                                       } else {\r
-                                               contentH = _AbstractUINode.finalValue( styles[ X.Css.AttrNo.height ], styles[ X.Css.AttrNo.minHeight ], styles[ X.Css.AttrNo.maxHeight ], allowH );\r
-                                       };\r
-                                       paddingT  = calc( styles[ X.Css.AttrNo.padding + 0 ], allowH );// paddingTRBL の % 指定は 最大幅に対して TB でも幅に対して\r
-                                       paddingB  = calc( styles[ X.Css.AttrNo.padding + 2 ], allowH );\r
-                                       borderT   = styles[ X.Css.AttrNo.border + 0 ];\r
-                                       borderB   = styles[ X.Css.AttrNo.border + 2 ];\r
-                                       this.boxHeight = contentH;\r
-                                       boxMinus = 0;\r
-                                       switch( box ){\r
-                                               case 2 : // border-box\r
-                                                        boxMinus -= borderT + borderB;\r
-                                               case 1 : // padding-box\r
-                                                        boxMinus -= paddingT + paddingB;\r
-                                               // case 0 : // content-box\r
-                                       };                      \r
-                                       this.contentT      = borderT + paddingT;\r
-                                       this.conetntB      = borderB + paddingB;                        \r
-                                       this.contentHeight = contentH + boxMinus;\r
-                                       this.boxHeight     = contentH - boxMinus + this.contentT + this.conetntB; // padding-box の場合 border だけ足される\r
-                                       this.boxSizingOffsetTB = boxMinus;\r
+                       \r
+                       // Width が確定するパターン\r
+                       // 自身が constraintW の場合 親が AUTO ではない\r
+                       // 自身が constraintW でない場合自身が  AUTO はなくかつ親 が AUTO の場合 or 自身は % でない\r
+                       \r
+                       paddingR = calc( attrs[ X.UI.Attr.Support.padding.No + 1 ], allowW );\r
+                       paddingL = calc( attrs[ X.UI.Attr.Support.padding.No + 3 ], allowW );\r
+                       borderR  = calc( attrs[ X.UI.Attr.Support.borderWidth.No + 1 ], allowW );\r
+                       borderL  = calc( attrs[ X.UI.Attr.Support.borderWidth.No + 3 ], allowW );\r
+                       boxMinus = 0;\r
+                       switch( box ){\r
+                               case 3 : // border-box\r
+                                        boxMinus -= borderR + borderL;\r
+                               case 2 : // padding-box\r
+                                        boxMinus -= paddingR + paddingL;\r
+                               // case 1 : // content-box\r
+                       };\r
+                       this.contentL = borderL + paddingL;\r
+                       this.contentR = borderR + paddingR;\r
+                       \r
+                       if( this.constraintW ? allowW !== X.UI.Attr.AUTO : !this.autoWidth && ( allowW !== X.UI.Attr.AUTO || !this.percentWidth ) ){\r
+                               if( this.constraintW ){ // 制約レイアウト\r
+                                       contentW = allowW - ( boxL = calc( attrs[ X.UI.Attr.Support.left.No ], allowW ) ) - ( boxR = calc( attrs[ X.UI.Attr.Support.right.No ], allowW ) );\r
                                } else {\r
-                                       this.boxHeight = this.contentHeight = AUTO;\r
-                                       min = styles[ X.Css.AttrNo.minHeight ];\r
-                                       max = styles[ X.Css.AttrNo.maxHeight ];\r
-                                       this.minContentHeight = 1 <= min ? min : 0;\r
-                                       this.maxContentHeight = 1 <= max ? max : AUTO;\r
-                                       delete this.boxSizingOffsetTB;\r
+                                       contentW = _AbstractUINode.finalValue( attrs[ X.UI.Attr.Support.width.No ], attrs[ X.UI.Attr.Support.minWidth.No ], attrs[ X.UI.Attr.Support.maxWidth.No ], allowW );                                   \r
                                };\r
-                       } else {\r
-                               this.boxWidth  = this.contentWidth  = allowW;\r
-                               this.boxHeight = this.contentHeight = allowH;\r
+                               this.contentWidth = contentW + boxMinus;\r
+                               this.scrollWidth  = this.contentWidth + this.contentL + this.contentR;\r
+                               this.boxWidth     = contentW - boxMinus + this.contentL + this.contentR;\r
+                               this.boxSizingOffsetLR = boxMinus;\r
                                delete this.minContentWidth;\r
                                delete this.maxContentWidth;\r
+                               delete this.minBoxWidth;\r
+                               delete this.maxBoxWidth;\r
+                       } else {        \r
+                               this.minContentWidth = calc( attrs[ X.UI.Attr.Support.minWidth.No ], allowW ) + boxMinus;\r
+                               this.maxContentWidth = calc( attrs[ X.UI.Attr.Support.maxWidth.No ], allowW ) + boxMinus;\r
+                               this.scrollWidth     = this.contentWidth + this.contentL + this.contentR;\r
+                               this.minBoxWidth     = this.minContentWidth - boxMinus + this.contentL + this.contentR;\r
+                               this.maxBoxWidth     = this.maxContentWidth - boxMinus + this.contentL + this.contentR;\r
+                               delete this.contentWidth;\r
+                               delete this.scrollWidth;\r
+                               delete this.boxWidth;\r
+                               delete this.boxSizingOffsetLR;\r
+                       };\r
+                       \r
+                       paddingT  = calc( attrs[ X.UI.Attr.Support.padding.No + 0 ], allowH );// paddingTRBL の % 指定は 最大幅に対して TB でも幅に対して\r
+                       paddingB  = calc( attrs[ X.UI.Attr.Support.padding.No + 2 ], allowH );\r
+                       borderT   = calc( attrs[ X.UI.Attr.Support.borderWidth.No  + 0 ], allowH );\r
+                       borderB   = calc( attrs[ X.UI.Attr.Support.borderWidth.No  + 2 ], allowH );\r
+                       boxMinus = 0;\r
+                       switch( box ){\r
+                               case 3 : // border-box\r
+                                        boxMinus -= borderT + borderB;\r
+                               case 2 : // padding-box\r
+                                        boxMinus -= paddingT + paddingB;\r
+                               // case 1 : // content-box\r
+                       };\r
+                       this.contentT = borderT + paddingT;\r
+                       this.conetntB = borderB + paddingB;\r
+                       \r
+                       // Height\r
+                       if( this.constraintH ? allowH !== X.UI.Attr.AUTO : !this.autoHeight && ( allowH !== X.UI.Attr.AUTO || !this.percentHeight ) ){\r
+                               if( this.constraintH ){ // 制約レイアウト\r
+                                       contentH = allowH - ( boxT = calc( attrs[ X.UI.Attr.Support.top.No ], allowH ) ) - ( boxB = calc( attrs[ X.UI.Attr.Support.bottom.No ], allowH ) );\r
+                               } else {\r
+                                       contentH = _AbstractUINode.finalValue( attrs[ X.UI.Attr.Support.height.No ], attrs[ X.UI.Attr.Support.minHeight.No ], attrs[ X.UI.Attr.Support.maxHeight.No ], allowH );\r
+                               };                      \r
+                               this.contentHeight = contentH + boxMinus;\r
+                               this.scrollHeight  = this.contentHeight + this.contentT + this.contentB;\r
+                               this.boxHeight     = contentH - boxMinus + this.contentT + this.conetntB; // padding-box の場合 border だけ足される\r
+                               this.boxSizingOffsetTB = boxMinus;\r
                                delete this.minContentHeight;\r
                                delete this.maxContentHeight;\r
-                               delete this.contentL;\r
-                               delete this.contentT;\r
-                               delete this.contentR;\r
-                               delete this.contentB;\r
+                               delete this.minBoxHeight;\r
+                               delete this.maxBoxHeight;\r
+                       } else {\r
+                               this.minContentHeight = calc( attrs[ X.UI.Attr.Support.minHeight.No ], allowH ) + boxMinus;\r
+                               this.maxContentHeight = calc( attrs[ X.UI.Attr.Support.maxHeight.No ], allowH ) + boxMinus;                             \r
+                               this.minBoxHeight = this.minContentHeight - boxMinus + this.contentT + this.conetntB;\r
+                               this.maxBoxHeight = this.maxContentHeight - boxMinus + this.contentT + this.conetntB;\r
+               \r
+                               delete this.contentHeight;\r
+                               delete this.scrollHeight;\r
+                               delete this.boxHeight;\r
+                               delete this.boxSizingOffsetTB;\r
+                       };\r
+                       \r
+                       if( this.parentData && this.parentData.layout.overrideAttrsForChild.left ){\r
+                               if( this.constraintW ){\r
+                                       this.boxX = ( boxL || boxL === 0 ) ? boxL : calc( attrs[ X.UI.Attr.Support.left.No ], allowW );\r
+                               } else\r
+                               if( attrs[ X.UI.Attr.Support.right.No ] === null ){\r
+                                       this.boxX = ( boxL || boxL === 0 ) ? boxL : calc( attrs[ X.UI.Attr.Support.left.No ], allowW );\r
+                               } else {\r
+                                       this.boxX = alllowW - this.boxWidth - ( ( boxR || boxR === 0 ) ? boxR : calc( attrs[ X.UI.Attr.Support.right.No ], allowW ) );\r
+                               };\r
+                       } else {\r
+                               delete this.boxX;\r
+                       };\r
+                       \r
+                       if( this.parentData && this.parentData.layout.overrideAttrsForChild.top ){\r
+                               if( this.constraintH ){\r
+                                       this.boxY = ( boxT || boxT === 0 ) ? boxT : calc( attrs[ X.UI.Attr.Support.top.No ], allowH );\r
+                               } else\r
+                               if( attrs[ X.UI.Attr.Support.bottom.No ] === null ){\r
+                                       this.boxY = ( boxT || boxT === 0 ) ? boxT : calc( attrs[ X.UI.Attr.Support.top.No ], allowH );\r
+                               } else {\r
+                                       this.boxY = allowH - this.boxHeight - ( ( boxB || boxB === 0 ) ? boxB : calc( attrs[ X.UI.Attr.Support.bottom.No ], allowH ) );\r
+                               };\r
+                       } else {\r
+                               delete this.boxY;\r
                        };\r
                },\r
                \r
                /**\r
-                * 要素の追加・削除\r
-                * 1. ペイントがある // 予約のみ\r
-                * 2. コンテンツがある // 予約のみ *\r
-                * 3. コンテンツを削除 // 予約のみ\r
-                * 4. 要素を削除 // 予約のみ\r
-                * \r
-                * コンテンツの再計算\r
-                * 0. 要素追加して css セット\r
-                * 1. コンテンツの変更\r
-                * 2. font 指定の変更\r
-                * 3. contentWidth の変更 (コンテンツの高さの再計算) 前回の contentWidth の保持\r
-                * \r
-                * contentSize, scrollSize の決定\r
+                * 描画・計測を行って、contentSize, scrollSize の決定\r
                 */\r
-               _mesure : function( dirty ){\r
-                       var content = this._content,\r
-                               root    = this.rootData,\r
-                               style   = this.styleData,\r
-                               w       = this.contentWidth,\r
-                               h       = this.contentHeight;\r
-                       switch( this.updateContent === true ? X.Css.Dirty.CONTENT : dirty ){\r
+               mesure : function(){\r
+                       var dirty = this.dirty,\r
+                               w, h, xnode;\r
+                       switch( dirty ){\r
                                \r
-                               case X.Css.Dirty.CONTENT : // コンテンツが変更された\r
-                               case X.Css.Dirty.FONT   : // フォントサイズが変更された\r
-                                       this.hasTextNode && Node.root._startUpdate();\r
-                                       this.lastContentWidth = -1;\r
-                               case X.Css.Dirty.REFLOW : // レイアウトの再計算が必要\r
+                               case X.UI.Dirty.CONTENT : // コンテンツが変更された\r
+                               case X.UI.Dirty.FONT   : // フォントサイズが変更された\r
+                                       delete this.lastContentWidth;\r
+                               case X.UI.Dirty.LAYOUT : // レイアウトの再計算が必要\r
+                                       w     = this.contentWidth;\r
+                                       h     = this.contentHeight;\r
+                                       xnode = this.xnode;\r
+                                       \r
                                        /* http://web-designs.seesaa.net/article/188400668.html\r
                                         * min-width の値が max-width の値より大きい場合は、max-width の値は min-width の値に設定される。\r
                                         * \r
@@ -390,32 +585,31 @@ var _AbstractUINode = X.EventDispatcher.inherits(
                                         * 3. content のサイズがすでに決定している\r
                                         *     コンテンツの高さの再取得が必要\r
                                         *     必要でない\r
-                                        */   \r
-                                       if( this.hasTextNode ){\r
-                                               elm = this.rawElement;\r
-                                               if( w === AUTO ){\r
-                                                       w = this.contentWidth = elm.width();\r
+                                        */\r
+                                       if( xnode._xnodes && xnode._xnodes.length ){\r
+                                               if( w === X.UI.Attr.AUTO ){\r
+                                                       w = this.contentWidth = xnode.width() / xnode._getCharSize();\r
                                                        this.scrollWidth = w + this.contentL + this.contentR;\r
                                                        if( this.maxContentWidth < w - this.boxSizingOffsetLR ) this.contentWidth = this.maxContentWidth + this.boxSizingOffsetLR;\r
                                                        if( w - this.boxSizingOffsetLR < this.minContentWidth ) this.contentWidth = this.minContentWidth + this.boxSizingOffsetLR;\r
                                                        this.lastContentWidth = this.contentWidth;\r
                                                        \r
-                                                       w !== this.contentWidth && elm.css( 'width', this.contentWidth + 'px' );\r
+                                                       w !== this.contentWidth && xnode.css( 'width', this.contentWidth + 'em' );\r
                                                        \r
-                                                       if( h === AUTO ){\r
-                                                               this.conetntHeight = h = elm.height();\r
+                                                       if( h === X.UI.Attr.AUTO ){\r
+                                                               this.conetntHeight = h = xnode.height() / xnode._getCharSize();\r
                                                                this.scrollHeight  = h + this.contentT + this.contentB;\r
                                                                if( this.maxContentHeight < h - this.boxSizingOffsetTB ) this.contentHeight = this.maxContentHeight + this.boxSizingOffsetTB;\r
                                                                if( h - this.boxSizingOffsetTB < this.minContentHeight ) this.contentHeight = this.minContentHeight + this.boxSizingOffsetTB;\r
                                                        } else {\r
-                                                               this.scrollHeight = elm.height() + this.contentT + this.contentB;\r
+                                                               this.scrollHeight = xnode.height() / xnode._getCharSize() + this.contentT + this.contentB;\r
                                                        };\r
                                                } else\r
-                                               if( h === AUTO ){\r
+                                               if( h === X.UI.Attr.AUTO ){\r
                                                        if( w !== this.lastContentWidth ){\r
-                                                               elm.css( 'width', w + 'px' );\r
+                                                               xnode.css( 'width', w + 'em' );\r
                                                                this.lastContentWidth  = w;\r
-                                                               this.conetntHeight = h = elm.height();\r
+                                                               this.conetntHeight = h = xnode.height() / xnode._getCharSize();\r
                                                                this.scrollWidth       = w + this.contentL + this.contentR;\r
                                                                this.scrollHeight      = h + this.contentT + this.contentB;\r
                                                                if( this.maxContentHeight < h - this.boxSizingOffsetTB ) this.contentHeight = this.maxContentHeight + this.boxSizingOffsetTB;\r
@@ -423,123 +617,118 @@ var _AbstractUINode = X.EventDispatcher.inherits(
                                                        } else {\r
                                                                this.scrollWidth  = w + this.contentL + this.contentR;\r
                                                                this.scrollHeight = h + this.contentT + this.contentB;\r
-                                                               //root.paintReserve( this );\r
                                                        };\r
                                                } else\r
-                                               if( dirty !== X.Css.Dirty.REFLOW ){\r
-                                                       this.contentWidth  = elm.width();\r
-                                                       this.contentHeight = elm.height();\r
+                                               if( dirty !== X.UI.Dirty.LAYOUT ){\r
+                                                       this.contentWidth  = this.lastContentWidth = w; //xnode.width();\r
+                                                       this.contentHeight = xnode.height() / xnode._getCharSize();\r
                                                        this.scrollWidth   = this.contentWidth  + this.contentL + this.contentR;\r
                                                        this.scrollHeight  = this.contentHeight + this.contentT + this.contentB;\r
                                                } else {\r
-                                                       //root.paintReserve( this );\r
                                                        this.scrollWidth  = w + this.contentL + this.contentR;\r
                                                        this.scrollHeight = h + this.contentT + this.contentB;\r
                                                };              \r
                                        } else {\r
                                                // コンテンツを持たないため基本のサイズは0\r
-                                               if( w === AUTO ) this.contentWidth  = w = 0 < this.minContentWidth  ? this.minContentWidth  : 0;\r
-                                               if( h === AUTO ) this.contentHeight = h = 0 < this.minContentHeight ? this.minContentHeight : 0;\r
+                                               if( w === X.UI.Attr.AUTO ) this.contentWidth  = w = 0 < this.minContentWidth  ? this.minContentWidth  : 0;\r
+                                               if( h === X.UI.Attr.AUTO ) this.contentHeight = h = 0 < this.minContentHeight ? this.minContentHeight : 0;\r
                                                this.scrollWidth  = w + this.contentL + this.contentR;\r
                                                this.scrollHeight = h + this.contentT + this.contentB;\r
-                                               //root.paintReserve( this );\r
                                        };\r
                                        break;                  \r
-                               case X.Css.Dirty.PAINT : // 再描画のみ必要\r
-                                       root.paintReserve( this );\r
-                                       break;                                          \r
+                               //case X.UI.Dirty.PAINT : // 再描画のみ必要\r
+                               //      break;\r
                        };\r
                },\r
                /**\r
-                * 自身のコンテンツサイズを元に AUTO な width, height を確定していく\r
+                * 自身の contentWidth, contentHeight を元に AUTO な width, height を確定していく\r
                 */\r
                postMesure : function(){\r
-                       var style = this.styleData,\r
-                               styles, calc, box,\r
+                       var     attrs    = this.attrObject || this.attrClass.prototype || X.UI.AttrClass,\r
+                               calc     = _AbstractUINode.calcValue,\r
+                               box      = attrs[ X.UI.Attr.Support.sizing.No ],\r
                                contentW, contentH,\r
                                contentPlus,\r
                                paddingT, paddingR, paddingB, paddingL,\r
                                borderT, borderR, borderB, borderL,\r
                                min, max;\r
-                       if( style ){\r
-                               styles   = style.data;\r
-                               calc     = _AbstractUINode.advancedCalcValue;\r
+                               \r
+                       // Width\r
+                       if( this.boxWidth === X.UI.Attr.AUTO ){\r
                                contentW = this.contentWidth;\r
-                               box      = styles[ X.Css.AttrNo.sizing ];\r
+                               paddingR = calc( attrs[ X.UI.Attr.Support.padding.No + 1 ], contentW );                                 \r
+                               paddingL = calc( attrs[ X.UI.Attr.Support.padding.No + 3 ], contentW );                                 \r
+                               borderR  = calc( attrs[ X.UI.Attr.Support.borderWidth.No + 1 ], contentW );\r
+                               borderL  = calc( attrs[ X.UI.Attr.Support.borderWidth.No + 3 ], contentW );\r
+                               contentPlus = 0;\r
+                               switch( box ){\r
+                                       case 3 : // border-box\r
+                                                contentPlus  = borderR + borderL;\r
+                                       case 2 : // padding-box\r
+                                                contentPlus += paddingR + paddingL;\r
+                                       // case 1 : // content-box\r
+                               };\r
                                \r
-                               // Width\r
-                               if( this.boxWidth === AUTO ){\r
-                                       paddingR = calc( styles[ X.Css.AttrNo.padding + 1 ], contentW );                                        \r
-                                       paddingL = calc( styles[ X.Css.AttrNo.padding + 3 ], contentW );                                        \r
-                                       borderR  = styles[ X.Css.AttrNo.border + 1 ];\r
-                                       borderL  = styles[ X.Css.AttrNo.border + 3 ];\r
-                                       contentPlus = 0;\r
-                                       switch( box ){\r
-                                               case 2 : // border-box\r
-                                                        contentPlus  = borderR + borderL;\r
-                                               case 1 : // padding-box\r
-                                                        contentPlus += paddingR + paddingL;\r
-                                               // case 0 : // content-box\r
+                               if( !this.constraintW ){\r
+                                       contentW += contentPlus;\r
+                                       min = calc( attrs[ X.UI.Attr.Support.minWidth.No ], contentW );\r
+                                       max = calc( attrs[ X.UI.Attr.Support.maxWidth.No ], contentW );\r
+                                       if( contentW < min && contentPlus < min ){\r
+                                               this.contentWidth = min - contentPlus;\r
+                                       } else\r
+                                       if( max < contentW && contentPlus < max ){\r
+                                               this.contentWidth = max - contentPlus;\r
                                        };\r
-                                       \r
-                                       if( !style.constraintW ){\r
-                                               contentW += contentPlus;\r
-                                               min = styles[ X.Css.AttrNo.minWidth ];\r
-                                               max = styles[ X.Css.AttrNo.maxWidth ];\r
-                                               if( contentW < min && contentPlus < min ){\r
-                                                       this.contentWidth = min - contentPlus;\r
-                                               } else\r
-                                               if( max < contentW && contentPlus < max ){\r
-                                                       this.contentWidth = max - contentPlus;\r
-                                               };\r
-                                       };\r
-                                       this.contentL = borderL + paddingL;\r
-                                       this.contentR = borderR + paddingR;\r
-                                       this.boxWidth = this.contentWidth + this.contentL + this.contentR;\r
                                };\r
-                               // Height\r
-                               if( this.boxHeight === AUTO ){\r
-                                       contentH    = this.contentHeight;\r
-                                       paddingT    = calc( styles[ X.Css.AttrNo.padding + 0 ], contentH );// paddingTRBL の % 指定は 最大幅に対して TB でも幅に対して\r
-                                       paddingB    = calc( styles[ X.Css.AttrNo.padding + 2 ], contentH );\r
-                                       borderT     = styles[ X.Css.AttrNo.border + 0 ];\r
-                                       borderB     = styles[ X.Css.AttrNo.border + 2 ];\r
-                                       contentPlus = 0;\r
-                                       switch( box ){\r
-                                               case 2 : // border-box\r
-                                                        contentPlus  = borderT + borderB;\r
-                                               case 1 : // padding-box\r
-                                                        contentPlus += paddingT + paddingB;\r
-                                               // case 0 : // content-box\r
-                                       };\r
-                                       if( !style.constraintH ){\r
-                                               contentH += contentPlus;\r
-                                               min = styles[ X.Css.AttrNo.minHeight ];\r
-                                               max = styles[ X.Css.AttrNo.maxHeight ];\r
-                                               if( contentH < min && contentPlus < min ){\r
-                                                       this.contentHeight = min - contentPlus;\r
-                                               } else\r
-                                               if( max < contentH && contentPlus < max ){\r
-                                                       this.contentHeight = max - contentPlus;\r
-                                               };\r
+                               this.contentL = borderL + paddingL;\r
+                               this.contentR = borderR + paddingR;\r
+                               this.boxWidth = this.contentWidth + this.contentL + this.contentR;\r
+                       };\r
+                       // Height\r
+                       if( this.boxHeight === X.UI.Attr.AUTO ){\r
+                               contentH    = this.contentHeight;\r
+                               paddingT    = calc( attrs[ X.UI.Attr.Support.padding.No + 0 ], contentH );// paddingTRBL の % 指定は 最大幅に対して TB でも幅に対して\r
+                               paddingB    = calc( attrs[ X.UI.Attr.Support.padding.No + 2 ], contentH );\r
+                               borderT     = calc( attrs[ X.UI.Attr.Support.borderWidth.No  + 0 ], contentH );\r
+                               borderB     = calc( attrs[ X.UI.Attr.Support.borderWidth.No  + 2 ], contentH );\r
+                               contentPlus = 0;\r
+                               switch( box ){\r
+                                       case 3 : // border-box\r
+                                                contentPlus  = borderT + borderB;\r
+                                       case 2 : // padding-box\r
+                                                contentPlus += paddingT + paddingB;\r
+                                       // case 1 : // content-box\r
+                               };\r
+                               if( !this.constraintH ){\r
+                                       contentH += contentPlus;\r
+                                       min = calc( attrs[ X.UI.Attr.Support.minHeight.No ], contentH );\r
+                                       max = calc( attrs[ X.UI.Attr.Support.maxHeight.No ], contentH );\r
+                                       if( contentH < min && contentPlus < min ){\r
+                                               this.contentHeight = min - contentPlus;\r
+                                       } else\r
+                                       if( max < contentH && contentPlus < max ){\r
+                                               this.contentHeight = max - contentPlus;\r
                                        };\r
-                                       this.contentT  = borderT + paddingT;\r
-                                       this.contentB  = borderB + paddingB;\r
-                                       this.boxHeight = this.contentHeight + this.contentT + this.contentB;\r
-                               };                              \r
-                       } else {\r
-                               this.boxWidth  = this.contentWidth;\r
-                               this.boxHeight = this.contentHeight;\r
-                               delete this.minContentWidth;\r
-                               delete this.maxContentWidth;\r
-                               delete this.minContentHeight;\r
-                               delete this.maxContentHeight;\r
-                               delete this.contentL;\r
-                               delete this.contentT;\r
-                               delete this.contentR;\r
-                               delete this.contentB;\r
+                               };\r
+                               this.contentT  = borderT + paddingT;\r
+                               this.contentB  = borderB + paddingB;\r
+                               this.boxHeight = this.contentHeight + this.contentT + this.contentB;\r
                        };\r
                },\r
+\r
+               capcher : function( x, y ){\r
+                       if( this.pointerDisabled ) return false;\r
+                       \r
+                       x -= this.x;\r
+                       y -= this.y;\r
+\r
+                       if( 0 <= x && x < this.boxWidth && 0 <= y && y < this.boxHeight ){\r
+                               !this.hovering && ( this.hoverList[ this.hoverList.length ] = this );\r
+                               this.rootData.targetNodeData = this;\r
+                               return true;\r
+                       };\r
+               },\r
+               \r
                \r
                listen : function( type, arg1, arg2, arg3 ){\r
                        var root, events, counter;\r
@@ -621,55 +810,76 @@ var _AbstractUINode = X.EventDispatcher.inherits(
        }\r
 );\r
 \r
-_AbstractUINode.finalValue = function( styleValue, styleMin, styleMax, srcValue ){\r
-       var calc = _AbstractUINode.calcValue,\r
-               v    = calc( styleValue, srcValue ),\r
-               min  = calc( styleMin,   srcValue ),\r
-               max  = calc( styleMax,   srcValue );\r
-       if( v < min ) return min;\r
-       if( max < v ) return max;\r
-       return v;\r
-};\r
 _AbstractUINode.calcValue = function( styleValue, srcValue ){\r
-       switch( styleValue ){\r
-               case 0 :\r
-                       return 0;\r
-               case AUTO :\r
-                       return AUTO;\r
-               case FULL :\r
-                       return srcValue; // 100%\r
+       /*\r
+        * String の場合は必ず %\r
+        */     \r
+       if( X.Type.isString( styleValue ) ){\r
+               return srcValue * parseFloat( styleValue ) / 100;\r
        };\r
-       if( 1 <= styleValue ) return styleValue; // legth\r
-       if( -1 < styleValue ) return FLOOR( srcValue * styleValue ); // %       \r
-       return styleValue; // - length\r
-};\r
-_AbstractUINode.advancedCalcValue = function( styleValue, srcValue ){\r
-       switch( styleValue ){\r
-               case 0 :\r
-                       return 0;\r
-               case AUTO :\r
-                       return srcValue;\r
-               case FULL :\r
-                       //throw new Error( 'advancedCalcValue FULL' ); \r
-                       // return ; // 100%\r
-       };\r
-       if( 1 <= styleValue ) return styleValue; \r
-       if( -1 < styleValue ) return FLOOR( ( srcValue / ( 1 - styleValue ) ) * styleValue ); // %      \r
-       return styleValue; // - length\r
+       if( !X.Type.isNumber( styleValue ) ) return 0;\r
+       return styleValue;\r
 };\r
 \r
+_AbstractUINode.finalValue = function( styleValue, styleMin, styleMax, srcValue ){\r
+       var calc = _AbstractUINode.calcValue,\r
+               v    = calc( styleValue, srcValue ),\r
+               min  = calc( styleMin, srcValue ),\r
+               max  = calc( styleMax, srcValue );\r
+       return v <= min ? min : max <= v ? max : v;\r
+};\r
 \r
 var AbstractUINode = X.Class.create(\r
        'AbstractUINode',\r
        X.Class.ABSTRACT | X.Class.SUPER_ACCESS,\r
        {\r
-               style : null,\r
                parent : function(){\r
                        return X.Class._getPrivate( this ).parent;\r
                },\r
                root : function(){\r
                        return X.Class._getPrivate( this ).root;\r
                },\r
+               \r
+               /*\r
+                * unverifiedAttrs に全ての指定を控える\r
+                * サポートされていない場合は無視される.親のレイアウトによって変わる\r
+                */\r
+               attr : function( nameOrObject, valueOrUnit ){\r
+                       var p = X.Class._getPrivate( this ),\r
+                               layout, k, def, attrs, v;\r
+                       if( nameOrObject && X.Type.isObject( nameOrObject ) ){\r
+                               // setter\r
+                               layout = p.parentData && p.parentData.layout.overrideAttrsForChild; // root には parent がない\r
+                               for( k in nameOrObject ){\r
+                                       // 親のレイアウトマネージャの許可しない\r
+                                       if( layout && !layout[ k ] ){\r
+                                               continue;\r
+                                       };\r
+                                       if( def = p.supportAttrs[ k ] ){\r
+                                               p.setAttr( k, def, nameOrObject[ k ] );\r
+                                       };\r
+                               };\r
+                       } else\r
+                       if( X.Type.isString( nameOrObject ) ){\r
+                               if( valueOrUnit !== undefined ){\r
+                                       if( 'em,%'.indexOf( valueOrUnit ) === -1 ){\r
+                                               // setter\r
+                                               p.setAttr( nameOrObject, valueOrUnit );\r
+                                       } else {\r
+                                               // getter with unit\r
+                                               return p.getAttrWithUnit( nameOrObject, valueOrUnit );\r
+                                       };\r
+                               };\r
+                               // getter\r
+                               if( attrs = ( p.attrObject || p.attrClass.prototype || X.UI.AttrClass ) ){\r
+                                       def = p.supportAttrs[ nameOrObject ];\r
+                                       return def && attrs[ def.No ];\r
+                               };\r
+                               return v;\r
+                       };\r
+                       return this;\r
+               },\r
+               \r
                listen : function( type, arg1, arg2, arg3 ){\r
                        X.Class._getPrivate( this ).listen( type, arg1, arg2, arg3 );\r
                        return this;\r
@@ -682,15 +892,16 @@ var AbstractUINode = X.Class.create(
                        X.Class._getPrivate( this ).unlisten( type, arg1, arg2, arg3 );\r
                        return this;\r
                },\r
+               dispatch : function( e ){\r
+                       return X.Class._getPrivate( this ).dispatch( e );\r
+               },\r
+                       \r
                getNextNode : function(){\r
                        \r
                },\r
                getPrevNode : function(){\r
                        \r
                },\r
-               dispatch : function( e ){\r
-                       return X.Class._getPrivate( this ).dispatch( e );\r
-               },\r
                nodeIndex : function( v ){\r
                        var data = X.Class._getPrivate( this );\r
                        if( typeof v === 'number' ){\r
@@ -702,13 +913,6 @@ var AbstractUINode = X.Class.create(
                displayIndex : function(){\r
                        \r
                },\r
-               // ちゃんとやれば不要!\r
-               mesure : function(){\r
-                       var data = X.Class._getPrivate( this );\r
-                       data.mesure();\r
-                       4 <= data.phase && data.rootData.reserveCalc();\r
-                       return this;\r
-               },\r
                getX : function(){\r
                        // dirty の場合、rootData.calculate\r
                        return X.Class._getPrivate( this ).x;\r
@@ -727,11 +931,11 @@ var AbstractUINode = X.Class.create(
                },\r
                getWidth : function(){\r
                        // dirty の場合、rootData.calculate\r
-                       return X.Class._getPrivate( this ).w;\r
+                       return X.Class._getPrivate( this ).boxWidth;\r
                },\r
                getHeight : function(){\r
                        // dirty の場合、rootData.calculate\r
-                       return X.Class._getPrivate( this ).h;\r
+                       return X.Class._getPrivate( this ).boxHeight;\r
                },\r
                scrollTo : function( x, y ){\r
                        X.Class._getPrivate( this ).scrollTo( x, y );\r
@@ -751,4 +955,5 @@ var AbstractUINode = X.Class.create(
                        return X.Class._getPrivate( this ).cursor( v );\r
                }\r
        }\r
-);
\ No newline at end of file
+);\r
+\r
diff --git a/0.6.x/js/ui/07_LayoutManagerBase.js b/0.6.x/js/ui/07_LayoutManagerBase.js
deleted file mode 100644 (file)
index ef134c9..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-var LayoutManagerBase = X.Class.create(
-       'LayoutManagerBase',
-       {
-               allowForSelf  : null,
-               allowForChild : null,
-               define : function( src ){
-                       return X.Class._override( this, src, true );
-               },
-               
-               
-               reflow : function( nodeData, allowW, allowH ){
-                       nodeData.preMesure( allowW, allowH );
-                       
-                       var children = nodeData.children,                               
-                               contentW = nodeData.contentWidth,
-                               contentH = nodeData.contentHeight,
-                               autoW    = contentW === AUTO,
-                               autoH    = contentH === AUTO,
-                               auto, calc, childW, childH, child, i, style, data,
-                               t, r, b, l;                     
-                       if( children ){
-                               auto     = autoW && autoH;
-                               childW   = 0;
-                               childH   = 0;
-                               calc     = BasicLayoutManager.calcValue;                        
-                               for( i = children.length; i; ){
-                                       child = children[ --i ];
-                                       style = child.__style;
-                                       if( style ){
-                                               data = style.data;
-                                               t = calc( data[ X.Css.AttrNo.top ],    contentH );
-                                               r = calc( data[ X.Css.AttrNo.right ],  contentW );
-                                               b = calc( data[ X.Css.AttrNo.bottom ], contentH );
-                                               l = calc( data[ X.Css.AttrNo.left ],   contentW );
-                                       } else {
-                                               t = r = b = l = 0;
-                                       };
-                                       if( child.instanceOf( LayoutBoxPrivate ) ){
-                                               child.layoutManager.reflow( child, contentW - r - l, contentH - t - b );
-                                       } else {
-                                               child.preMesure( contentW - r - l, contentH - t - b );
-                                               child.mesure();
-                                               child.postMesure();
-                                       };
-                                       if( !auto ) continue;
-                                       if( autoW && childW < child.boxWidth  + r + l ) childW = child.boxWidth  + r + l;
-                                       if( autoH && childH < child.boxHeight + t + b ) childH = child.boxHeight + t + b;                                               
-                               };
-                               if( autoW )     nodeData.contentWidth  = childW;
-                               if( autoH ) nodeData.contentHeight = childH;
-                       };
-                       ( autoW || autoH ) && nodeData.postMesure();
-                       
-                       delete nodeData.dirty;
-               },
-               redraw : function( nodeData ){
-                       var root = nodeData.rootData;
-                       root.dirty === X.Css.Dirty.REFLOW && this.reflow( root );
-                       
-                       // draw
-               }
-       }
-);
index 791afee..34846c0 100644 (file)
 \r
+X.UI.Layout.Canvas = X.UI.Layout.create( {\r
+       name : 'CanvasLayout',\r
+       \r
+       overrideAttrsForSelf : {\r
+               selectable  : false,\r
+               role        : [ 0, X.UI.Dirty.CLEAN, X.UI.Attr.USER.UINODE, X.UI.Attr.Type.INIT_ONLY | X.UI.Attr.Type.LIST, 'none,chrome,container' ],\r
+               \r
+               width       : [ '100%',         X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LENGTH | X.UI.Attr.Type.PERCENT ],\r
+               maxWidth    : [ X.UI.Attr.AUTO, X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LENGTH | X.UI.Attr.Type.PERCENT ],\r
+               height      : [ 0,              X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LENGTH | X.UI.Attr.Type.PERCENT ],\r
+               maxHeight   : [ X.UI.Attr.AUTO, X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LENGTH | X.UI.Attr.Type.PERCENT ]\r
+       },\r
+       \r
+       overrideAttrsForChild : {\r
+               left   : true,\r
+               top    : true,\r
+               bottom : true,\r
+               right  : true\r
+       },\r
+       \r
+       calculate : function( data, isNeedsDetection, x, y, w, h ){\r
+               var uinodes, l, _x, _y, _w, _h, node;\r
+\r
+               data.preMesure( w, h );\r
+               \r
+               if( isNeedsDetection && ( data.boxWidth === X.UI.Attr.AUTO || data.boxHeight === X.UI.Attr.AUTO ) ) return;\r
+               \r
+               _x = data.contentL;\r
+               _y = data.contentT;\r
+               _w = data.contentWidth;\r
+               _h = data.contentHeight;\r
+\r
+               if( ( uinodes = data.uinodes ) && ( l = uinodes.length ) ){\r
+                       for( i = 0; i < l; ++i ){\r
+                               node = uinodes[ i ];\r
+                               node.calculate( false, _x, _y, _w, _h );        \r
+                       };\r
+               } else\r
+               if( data.contentHeight === X.UI.Attr.AUTO ){\r
+                       data.contentHeight = data.minContentHeight !== X.UI.Attr.AUTO ? data.minContentHeight : 0;\r
+               };\r
+               \r
+               data.postMesure();\r
+               data.updateLayout( x, y );\r
+       }\r
+});\r
+\r
+\r
 var _Box = _AbstractUINode.inherits(\r
        '_Box',\r
-       X.Class.PRIVATE_DATA,\r
+       X.Class.PRIVATE_DATA | X.Class.SUPER_ACCESS, // 現状 super 指定がないとconstructor未定擬時に親のconstructor が使われない\r
        {\r
-               layout        : null,\r
-               nodes         : null,\r
-               forContainer  : false,\r
-               tmpCss        : null,\r
+               layout          : null,\r
+               uinodes         : null,\r
+               xnodes          : null,\r
+               \r
+               hitChildData    : null,\r
+               pointerChildren : true,\r
+               through         : false,\r
+\r
                Constructor : function( layout, args ){\r
+                       var i = 0,\r
+                               l = args.length,\r
+                               j = -1,\r
+                               uinodes, arg, _data, attrs, support;\r
+                       \r
                        if( !this.User.instanceOf( Box ) ){\r
                                //throw new Error( 'Box を継承したインスタンスだけが _Box のオーナーになれます' );\r
-                       };\r
-                       var i     = 0,\r
-                               l     = args.length,\r
-                               nodes = [],\r
-                               arg, _data;\r
+                       };                      \r
+                       \r
+                       this.xnode  = X.Dom.Node.create( 'div' );\r
+                       \r
+                       // すでに定義されていればそちらを採用\r
+                       // supportAttrs や attrClass が、layout を元に上書きされているため\r
+                       this.layout = this.layout || layout;\r
+                       \r
                        for( ; i < l; ++i ){\r
                                arg = args[ i ];\r
                                if( arg.instanceOf && arg.instanceOf( AbstractUINode ) ){\r
                                        _data = X.Class._getPrivate( arg );\r
-                                       nodes[ nodes.length ] = _data;\r
+                                       if( !uinodes ) this.uinodes = uinodes = [];\r
+                                       uinodes[ ++j ] = _data;\r
                                        if( _data.parent ){\r
                                                //throw new Error( 'インスタンスはすでに親に追加されています ' + arg );\r
                                        };\r
                                } else\r
-                               if( arg.instanceOf && arg.instanceOf( LayoutManagerBase ) ){\r
-                                       layout = arg;\r
+                               if( arg.instanceOf && arg.instanceOf( X.UI.Layout.Base ) ){\r
+                                       //this.layout = arg;\r
                                } else\r
-                               if( X.Type.isObject( arg ) === true ){\r
-                                       this.tmpCss = arg;\r
+                               if( X.Type.isObject( arg ) ){\r
+                                       if( attrs ){\r
+                                               attrs = X.Class._override( attrs, arg );\r
+                                       } else {\r
+                                               attrs = arg;\r
+                                       };\r
                                } else {\r
                                        //throw new Error( 'AbstractUINode を継承したインスタンスを渡してください ' + arg );\r
                                };\r
                        };\r
-                       this.layout = layout;\r
-                       this.nodes = nodes;\r
+                       \r
+                       for( p in attrs ){\r
+                               ( support = this.supportAttrs[ p ] ) && this.setAttr( p, support, attrs[ p ] );\r
+                       };\r
                },\r
        /* Rellay */\r
                initialize : function( root, rootData, parent, parentData ){\r
-                       var nodes = this.nodes,\r
-                               i     nodes.length;\r
+                       var uinodes = this.uinodes,\r
+                               i       = uinodes && uinodes.length;\r
                        this.root       = root;\r
                        this.rootData   = rootData;\r
+                       this.hoverList  = rootData.hoverList;\r
                        this.parent     = parent;\r
                        this.parentData = parentData;\r
-                       this.rawElement = X.Dom.Node.create( 'div' );\r
+                       //this.xnode      = X.Dom.Node.create( 'div' );\r
                        \r
-                       for( ; i; ){\r
-                               nodes[ --i ].initialize( root, rootData, this.User, this );\r
+                       if( i ){\r
+                               for( ; i; ){\r
+                                       uinodes[ --i ].initialize( root, rootData, this.User, this );\r
+                               };                              \r
                        };\r
                        \r
-                       this.styleData.initialize();\r
-                       \r
                        this.phase = 1;\r
                        this.User.dispatch( { type : X.UI.Event.INIT } );\r
                },\r
                \r
-               addToParent : function( parentElement ){\r
-                       var nodes = this.nodes,\r
-                               l     nodes.length,\r
-                               i     = 0;\r
+               addToParent : function( parentXNode ){\r
+                       var uinodes = this.uinodes,\r
+                               l       = uinodes && uinodes.length,\r
+                               i;\r
 \r
-                       parentElement && parentElement.append( this.rawElement );\r
+                       parentXNode && parentXNode.append( this.xnode );\r
                        \r
-                       for( ; i < l; ++i ){\r
-                               nodes[ i ].addToParent( this.rawElement );\r
+                       if( l ){\r
+                               for( i = 0; i < l; ++i ){\r
+                                       uinodes[ i ].addToParent( this.xnode );\r
+                               };\r
                        };\r
                        \r
                        this.phase = 2;\r
@@ -72,84 +142,109 @@ var _Box = _AbstractUINode.inherits(
                },\r
                \r
        /* Rellay */\r
-               afterAddition : function(){\r
-                       var nodes = this.nodes,\r
-                               i = nodes.length;\r
-                       for( ; i; ){\r
-                               nodes[ --i ].afterAddition();\r
+               creationComplete : function(){\r
+                       var uinodes = this.uinodes,\r
+                               i       = uinodes && uinodes.length;\r
+                       if( i ){\r
+                               for( ; i; ){\r
+                                       uinodes[ --i ].creationComplete();\r
+                               };                              \r
                        };\r
-                       this.styleData.afterAddition();\r
                        \r
                        this.phase = 3;\r
                        this.User.dispatch( { type : X.UI.Event.CREATION_COMPLETE } );\r
                },\r
                \r
-               calculate : function( x, y, w, h ){\r
-                       this.layout.calculate( this, x, y, w, h );                      \r
+               calculate : function( isNeedsDetection, x, y, w, h ){\r
+                       this.layout.calculate( this, isNeedsDetection, x, y, w, h );                    \r
                        this.phase = 4;\r
                },\r
                \r
-               commitUpdate : function(){\r
-                       \r
+               capcher : function( x, y ){\r
+                       var uinodes, child, _x, _y, hit, i;\r
+                       if( this.pointerDisabled ) return false;\r
+                       delete this.hitChildData;\r
+                       x -= this.x;\r
+                       y -= this.y;\r
+                       if( this.pointerChildren && ( uinodes = this.uinodes ) ){\r
+                               _x = x - this.scrollingX;\r
+                               _y = y - this.scrollingY;\r
+                               for( i = uinodes.length; i; ){\r
+                                       child = uinodes[ --i ];\r
+                                       if( !child.pointerDisabled && child.l <= _x && _x < child.r && child.t <= _y && _y < child.b && child.capcher( _x, _y ) ){\r
+                                               this.hitChildData = child;\r
+                                               break;\r
+                                       };\r
+                               };\r
+                       };\r
+                       if( this.through ){\r
+                               this.hitChildData && !this.hovering && ( this.hoverList[ this.hoverList.length ] = this );\r
+                               return !!this.hitChildData;\r
+                       };\r
+                       hit = 0 <= x && x < this.w && 0 <= y && y < this.h;\r
+                       ( this.hitChildData || hit ) && !this.hovering && ( this.hoverList[ this.hoverList.length ] = this );\r
+                       if( hit && this.hitChildData === null ) this.rootData.targetNodeData = this;\r
+                       return hit || !!this.hitChildData;\r
                },\r
                \r
-               addAt : function( index, _nodes ){\r
+               addAt : function( index, _uinodes ){\r
                        //console.log( '# AddAt ' + this.phase )\r
-                       var nodes = this.nodes,\r
-                               num   = nodes.length,\r
-                               p1    = 1 <= this.phase,\r
-                               p2    = 2 <= this.phase,\r
-                               p3    = 3 <= this.phase,\r
+                       var uinodes = this.uinodes,\r
+                               num     = uinodes.length,\r
+                               p1      = 1 <= this.phase,\r
+                               p2      = 2 <= this.phase,\r
+                               p3      = 3 <= this.phase,\r
+                               i       = 0,\r
                                _p1, _p2,\r
-                               i = 0, l, data;\r
+                               l, data;\r
 \r
                        //console.log( '### AddAt ' + this.phase )\r
-                       for( l = _nodes.length; i < l; ++i ){\r
-                               data = X.Class._getPrivate( _nodes[ i ] );\r
+                       for( l = _uinodes.length; i < l; ++i ){\r
+                               data = X.Class._getPrivate( _uinodes[ i ] );\r
                                _p1  = p1 && data.phase < 1;\r
                                _p2  = p2 && data.phase < 2;\r
                                _p1 && data.initialize( this.root, this.rootData, this.User, this );\r
                                if( index <= num ){\r
-                                       // _p2 && this.rawElement.insertBefore( data.rawElement, nodes[ index + i ].rawElement );\r
-                                       _p2 && nodes[ index + i ].rawElement.before( data.rawElement );\r
-                                       _p2 && data.addToParent( null );\r
-                                       nodes.splice( index + i, 0, data );\r
+                                       // _p2 && this.xnode.insertBefore( data.xnode, uinodes[ index + i ].xnode );\r
+                                       _p2 && uinodes[ index + i ].xnode.before( data.xnode );\r
+                                       _p2 && data.addToParent( this.xnode );\r
+                                       uinodes.splice( index + i, 0, data );\r
                                } else {\r
-                                       _p2 && data.addToParent( this.rawElement );\r
-                                       nodes[ nodes.length ] = data;   \r
+                                       _p2 && data.addToParent( this.xnode );\r
+                                       uinodes[ uinodes.length ] = data;       \r
                                };\r
-                               p3 && data.phase < 3 && data.afterAddition();\r
+                               //p3 && data.phase < 3 && data.afterAddition();\r
                                p3 && data.phase < 4 && data.creationComplete();\r
                        };\r
                        4 <= this.phase && this.rootData.reserveCalc();\r
                },\r
                \r
-               remove : function( _nodes ){\r
+               remove : function( _uinodes ){\r
                        //console.log( '# AddAt ' + this.phase )\r
-                       var nodes = this.nodes,\r
-                               i     = _nodes.length,\r
-                               n, node;\r
+                       var uinodes = this.uinodes,\r
+                               i       = _uinodes.length,\r
+                               n, data;\r
 \r
                        //console.log( '### AddAt ' + this.phase )\r
                        for( ; i; ){\r
-                               node = X.Class._getPrivate( _nodes[ --i ] );\r
-                               if( ( n = nodes.indexOf( node ) ) !== -1 ){\r
-                                       nodes.splice( n, 1 );\r
-                                       node._remove();\r
+                               data = X.Class._getPrivate( _uinodes[ --i ] );\r
+                               if( ( n = uinodes.indexOf( data ) ) !== -1 ){\r
+                                       uinodes.splice( n, 1 );\r
+                                       data._remove();\r
                                };\r
                        };\r
                        4 <= this.phase && this.rootData.reserveCalc();\r
                },\r
                \r
                removeAt : function( from, length ){\r
-                       var nodes = this.nodes,\r
-                               i     nodes.length,\r
-                               to    = from + ( X.Type.isNumber( length ) && 1 <= length ? length : 1 ),\r
+                       var uinodes = this.uinodes,\r
+                               i       = uinodes.length,\r
+                               to      = from + ( X.Type.isNumber( length ) && 1 <= length ? length : 1 ),\r
                                node;\r
                        for( ; i; ){\r
-                               node = nodes[ --i ];\r
+                               node = uinodes[ --i ];\r
                                if( from <= i && i < to ){\r
-                                       nodes.splice( i, 1 );\r
+                                       uinodes.splice( i, 1 );\r
                                        node._remove();\r
                                };\r
                        };\r
@@ -157,66 +252,34 @@ var _Box = _AbstractUINode.inherits(
                },\r
                \r
                _remove : function(){\r
-                       var nodes = this.nodes,\r
-                               i     nodes.length;\r
-                       for( ; i; ){ nodes[ --i ]._remove(); };\r
+                       var uinodes = this.uinodes,\r
+                               i       = uinodes.length;\r
+                       for( ; i; ){ uinodes[ --i ]._remove(); };\r
                                        \r
                        switch( this.phase ){\r
                                case 4:\r
                                case 3:\r
-                                       //this.styleData.afterAddition();\r
                                case 2:\r
-                                       //this.styleData.initialize();\r
-                                       this.rawElement.remove();\r
+                                       this.xnode.remove();\r
                                case 1:\r
                                        delete this.root;\r
                                        delete this.rootData;\r
                                        delete this.parent;\r
                                        delete this.parentData;\r
-                                       delete this.rawElement;\r
+                                       delete this.xnode;\r
                        };\r
                        delete this.phase;\r
                }\r
        }\r
 );\r
 \r
-var BasicLayoutManager = ( new LayoutManagerBase() ).define( {\r
-       allowForSelf : {\r
-               childW  : false,\r
-               childH  : false,\r
-               gapX    : false,\r
-               gapY    : false,\r
-               padding : false\r
-       },\r
-       allowForChild : {\r
-               x  : true,\r
-               y  : true,\r
-               w  : true,\r
-               h  : true\r
-       },\r
-       calculate : function( data, x, y, w, h ){\r
-               var nodes = data.nodes,\r
-                       i = 0, l = nodes.length, node;\r
-               for( ; i < l; ++i ){\r
-                       node = nodes[ i ];\r
-                       if( node.instanceOf( _Box ) ){\r
-                               node.calculate( x, y, w, h );\r
-                       } else {\r
-                               //node.styleData.layout( x, y, w, h );\r
-                       };\r
-               };\r
-               data.styleData.layout( x, y, w, h );\r
-       }\r
-});\r
-\r
 var Box = AbstractUINode.inherits(\r
        'Box',\r
        X.Class.SUPER_ACCESS,\r
        _Box,\r
        {\r
                Constructor : function(){\r
-                       this.style = DisplayNodeStyle( this, X.Class._newPrivate( this, BasicLayoutManager, arguments ) );\r
-                       this.style.addName( 'Box' );\r
+                       X.Class._newPrivate( this, X.UI.Layout.Canvas, arguments );\r
                },\r
                \r
                add : function( node /* , node, node ... */ ){\r
@@ -237,12 +300,12 @@ var Box = AbstractUINode.inherits(
                        return this;\r
                },\r
                getNodesByClass : function( klass ){\r
-                       var ret   = [],\r
-                               nodes = X.Class._getPrivate( this ).nodes,\r
+                       var ret     = [],\r
+                               uinodes = X.Class._getPrivate( this ).uinodes,\r
                                i, l, node;\r
-                       if( !nodes || nodes.length === 0 ) return ret;\r
-                       for( i = 0, l = nodes.length; i < l; ++i ){\r
-                               node = nodes[ i ].User;\r
+                       if( !uinodes || uinodes.length === 0 ) return ret;\r
+                       for( i = 0, l = uinodes.length; i < l; ++i ){\r
+                               node = uinodes[ i ].User;\r
                                if( node.instanceOf( klass ) ) ret[ ret.length ] = node;\r
                        };\r
                        return ret;\r
@@ -251,21 +314,78 @@ var Box = AbstractUINode.inherits(
                        return this.getNodeAt( 0 );\r
                },\r
                getLastChild : function(){\r
-                       var nodes = X.Class._getPrivate( this ).nodes;\r
-                       return nodes && nodes.length && nodes[ nodes.length - 1 ].User || null;\r
-               },\r
-               getNodeByUID : function( uid ){\r
+                       var uinodes = X.Class._getPrivate( this ).uinodes;\r
+                       return uinodes && uinodes.length && uinodes[ uinodes.length - 1 ].User || null;\r
                },\r
                getNodeAt : function( index ){\r
                        if( index < 0 ) return null;\r
-                       var nodes = X.Class._getPrivate( this ).nodes;\r
-                       return nodes && nodes[ index ].User || null;\r
+                       var uinodes = X.Class._getPrivate( this ).uinodes;\r
+                       return uinodes && uinodes[ index ].User || null;\r
                },\r
                numNodes : function(){\r
-                       var nodes = X.Class._getPrivate( this ).nodes;\r
-                       return nodes && nodes.length || 0;\r
+                       var uinodes = X.Class._getPrivate( this ).uinodes;\r
+                       return uinodes && uinodes.length || 0;\r
                }\r
        }\r
 );\r
 \r
+/*\r
+ * layout が設定されている Box のサブクラスに対して、layout を指定できない.\r
+ * \r
+ */\r
+Box.presets = function(){\r
+       var args   = arguments,\r
+               i      = 0,\r
+               l      = args.length,   \r
+               shadow = X.Class._getClassDef( this ).privateClass,\r
+               layout = shadow.prototype.layout,\r
+               arg, attrs, supports, klass, klassDef, privateKlass, boxName;\r
+                       \r
+       for( ; i < l; ++i ){\r
+               arg = args[ i ];\r
+               if( !arg ) continue;\r
+               // レイアウトの preset ができるのは layout が未定義な Box だけ\r
+               if( !shadow.prototype.layout && arg.instanceOf && arg.instanceOf( X.UI.Layout.Base ) ){\r
+                       layout = arg;\r
+               } else\r
+               if( ( klassDef = X.Class._getClassDef( arg ) ) && klassDef.isPrivate ){\r
+                       privateKlass = arg;\r
+                       layout = privateKlass.prototype.layout;\r
+               } else\r
+               if( X.Type.isObject( arg ) ){\r
+                       if( attrs ){\r
+                               X.Class._override( attrs, arg, true );\r
+                       } else {\r
+                               attrs = arg;\r
+                       };\r
+               } else\r
+               if( X.Type.isString( arg ) ){\r
+                       boxName = arg;\r
+               };\r
+       };\r
+       \r
+       if( privateKlass ){\r
+               supports = X.UI.Attr.createAttrDef( privateKlass.prototype.supportAttrs, layout.overrideAttrsForSelf );\r
+               \r
+               klass = this.inherits( privateKlass );\r
+               privateKlass.prototype.supportAttrs = supports,\r
+               privateKlass.prototype.attrClass    = privateKlass.prototype.attrClass( supports, attrs );\r
+       } else {\r
+               supports = X.UI.Attr.createAttrDef( shadow.prototype.supportAttrs, layout.overrideAttrsForSelf );\r
+               \r
+               klass = this.inherits(\r
+                       boxName,\r
+                       shadow.inherits(\r
+                               {\r
+                                       layout       : layout,\r
+                                       supportAttrs : supports,\r
+                                       attrClass    : shadow.prototype.attrClass( supports, attrs )\r
+                               }\r
+                       )\r
+               );              \r
+       };\r
 \r
+       klass.presets = this.presets || Box.presets;\r
+       \r
+       return klass;\r
+};\r
diff --git a/0.6.x/js/ui/09_UINodeStyle.js b/0.6.x/js/ui/09_UINodeStyle.js
deleted file mode 100644 (file)
index 6ba26b0..0000000
+++ /dev/null
@@ -1,603 +0,0 @@
-
-
-var _DisplayNodeStyle = X.Class.create(
-       '_DisplayNodeStyle',
-       X.Class.PRIVATE_DATA,
-       {
-               Constructor : function( node, nodeData ){
-                       this.node= node;
-                       this.nodeData= nodeData;
-                       
-                       nodeData.style= this.User;
-                       nodeData.styleData= this;
-                       
-                       this._cssObj= {};
-                       
-                       if( nodeData.tmpCss ){
-                               if( nodeData.tmpCss.role === 'container' ) nodeData.forContainer = true;
-                               if( nodeData.tmpCss.role === 'chrome' ) nodeData.forChrome = true;
-                       };
-               },
-               initialize : function(){
-                       if( this.nodeData.layout ){
-                               this.allow = this.nodeData.layout.allowForSelf; // これに加えて親の allowForChild を合成
-                       } else
-                       if( this.nodeData.parentData.layout ){
-                               this.allow = this.nodeData.parentData.layout.allowForChild;
-                       } else {
-                               this.allow = void 0;
-                       };
-                       
-                       if( this.nodeData.tmpCss ){
-                               this.css( this.nodeData.tmpCss );
-                               delete this.nodeData.tmpCss;
-                       };
-               },
-               
-               afterAddition : function(){
-                       var elm = this.nodeData.rawElement;
-                       if( elm ){
-                               if( this._name ){
-                                       elm.className( this._name );
-                                       // dirty flag
-                               };
-                               if( this._cssText ){
-                                       elm.cssText( this._cssText );
-                               };              
-                       };      
-               },
-               
-               name : function( v ){
-                       var sp = ' ', sp2 = '  ', elm;
-                       if( this._name !== v ){
-                               if( !v ){
-                                       delete this._name;
-                                       v = '';
-                               } else {
-                                       // cleanup
-                                       while( v.indexOf( sp2 ) !== -1 ){ v = v.split( sp2 ).join( sp ); };
-                                       while( 0 < v.length && v.charAt( 0 ) === sp ){ v = v.substr( 1 ); };
-                                       while( 0 < v.length && v.lastIndexOf( sp ) === 0 ){ --v.length; };
-                                                                       
-                                       if( !v.length ){
-                                               delete this._name;
-                                               v = '';
-                                       } else {
-                                               this._name = v;
-                                       };
-                               };
-                               if( elm = this.nodeData.rawElement ){
-                                       //elm.className = v;
-                                       elm.className( v );
-                               };
-                       };
-                       return this.User;
-               },
-               addName : function( _names ){
-                       var sp = ' ',
-                               names, _name, i;
-                       if( !this._name || !this._name.length ) return this.name( _names );
-                       _names = _names.split( sp );
-                       for( i = _names.length; i; ){
-                               if( ( _name = _names[ --i ] ) !== '' && this.hasName( _name ) === false ){
-                                       if( !names ) names = this._name.split( sp );
-                                       names[ names.length ] = _name;
-                               };                              
-                       };
-                       return this.name( names.join( sp ) );
-               },
-               removeName : function( _names ){
-                       var sp    = ' ',
-                               names = this._name,
-                               i, index;
-                       if( !names || !names.length ) return this.User;
-                       names  = names.split( sp );
-                       _names = _names.split( sp );
-                       for( i = _names.length; i; ){
-                               ( index = names.indexOf( _names[ --i ] ) ) !== -1 && names.splice( index, 1 );
-                       };
-                       return this.name( names.join( sp ) );
-               },
-               hasName : function( _names ){
-                       var names = this._name, i;
-                       if( !names || !names.length ) return false;
-                       names  = names.split( ' ' );
-                       _names = _names.split( ' ' );
-                       for( i = _names.length; i; ){
-                               if( names.indexOf( _names[ --i ] ) === -1 ) return false;
-                       };
-                       return true;
-               },
-               cssText : function( v ){
-                       var elm, style;
-                       if( this._cssText !== v ){
-                               this._cssText = v;
-                               //if( style = this.nodeData.rawStyle ){
-                               //      style.cssText = v;
-                               //};
-                               if( elm = this.nodeData.rawElement ) elm.cssText( v );
-                       };
-               },
-               css : function( v ){
-                       var css    = this._cssObj,
-                               allow  = this.allow,
-                               TRANS  = {
-                                       x : 'left',
-                                       y : 'top'
-                               },
-                               REMOVE = {
-                                       role : 0
-                               }, p;
-                       for( p in v ){
-                               if( REMOVE[ p ] === 0 ) continue;
-
-                               switch( p = TRANS[ p ] || p ){
-                                       case 'name' :
-                                               this.addName( v[ p ] );
-                                               continue;
-                                       case 'hoverStyleName' :
-                                               this.nodeData.hoverStyleName = v[ p ];
-                                               this.nodeData.hover = !!( v[ p ] && v[ p ].length );
-                                               continue;
-                                       case 'left' :
-                                               if( allow.x === false ) continue;
-                                               break;
-                                       case 'top' :
-                                               if( allow.y === false ) continue;
-                                               break;
-                                       case 'width' :
-                                               if( allow.w === false ) continue;
-                                               break;
-                                       case 'height' :
-                                               if( allow.h === false ) continue;
-                                               break;
-                                       case 'gapX' :
-                                               if( allow.gapX === false ) continue;
-                                               break;
-                                       case 'gapY' :
-                                               if( allow.gapY === false ) continue;
-                                               break;
-                                       case 'padding' :
-                                               if( allow.padding === false ) continue;
-                                               break;
-                               };
-                               css[ p ] = v[ p ];
-                       };
-                       this.cssText( X.Dom.Style.objToCssText( css ) );
-               },
-               layout : function( x, y, w, h ){
-                       var isFinite = X.Type.isFinite,
-                               isString = X.Type.isString,
-                               obj      = this._cssObj,
-                               data     = this.nodeData,
-                               elm      = data.rawElement,
-                               parent;
-                       
-                       if( elm ){
-                               // width
-                               if( isFinite( w ) === true ){
-                                       elm.css( 'width', w + 'px' );
-                                       obj.width   = w;
-                               } else
-                               if( isString( w ) === true ){
-                                       obj.width = w;
-                                       elm.css( 'width', w );
-                                       w = elm.width();
-                               };
-                               // height
-                               if( isFinite( h ) === true ){
-                                       elm.css( 'height', h + 'px' );
-                                       obj.height   = h;
-                               } else
-                               if( isString( h ) === true ){
-                                       obj.height = h;
-                                       elm.css( 'height', h );
-                                       h = elm.height();
-                               };
-                               
-                               // x
-                               if( isFinite( x ) === true ){
-                                       elm.css( 'left', x + 'px' );
-                                       obj.left = x;
-                               } else
-                               if( isString( x ) === true ){
-                                       obj.left = x;
-                                       elm.css( 'left', x );
-                                       x = elm.x();
-                               };
-                               
-                               // y
-                               if( isFinite( y ) === true ){
-                                       elm.css( 'top', y + 'px' );
-                                       obj.top   = y;
-                               } else
-                               if( isString( y ) === true ){
-                                       obj.top = y;
-                                       elm.css( 'top', y );
-                                       y = elm.y();
-                               };
-                       };
-                       x = isFinite( x ) === true ? x : data.x;
-                       y = isFinite( y ) === true ? y : data.y;
-                       w = isFinite( w ) === true ? w : data.w;
-                       h = isFinite( h ) === true ? h : data.h;
-                       if( data.x !== x || data.y !== y ){
-                               data.x = x;
-                               data.y = y;
-                               ( parent = data.parentData ) && data.updateAbsoluteXY( parent.absoluteX, parent.absoluteY );
-                               if( data.w === w && data.h === h ){
-                                       data.updateRectangle();
-                                       4 <= data.phase && data.rootData.reserveCalc();
-                                       return;
-                               };
-                       };
-                       if( data.w !== w || data.h !== h ){
-                               data.w = w;
-                               data.h = h;
-                               data.updateRectangle();
-                               4 <= data.phase && data.rootData.reserveCalc();
-                       };
-                       
-                       // ScrollBarManager.update( this );
-               },
-               
-               /*
-                * opt_unit は getter のみ
-                */
-               attr : function( prop, v, opt_unit ){
-                       var update    = prop[ 0 ],
-                               propID    = prop[ 1 ],
-                               type      = prop[ 2 ],
-                               list      = prop[ 3 ],
-                               length    = !!( type & X.Css.Type.LENGTH    ),
-                               percent   = !!( type & X.Css.Type.PERCENT   ),
-                               color     = !!( type & X.Css.Type.COLOR     ),
-                               uDecimal  = !!( type & X.Css.Type.U_DECIMAL ),
-                               numerical = !!( type & X.Css.Type.NUMERICAL ),
-                               flag      = !!( type & X.Css.Type.BOOLEAN   ),
-                               quartet   = !!( type & X.Css.Type.QUARTET   ),
-                               url       = !!( type & X.Css.Type.URL       ),
-                               fontName  = !!( type & X.Css.Type.FONT_NAME ),
-                               //list      = !!( type & X.Css.Type.LIST      ),
-                               combi     = !!( type & X.Css.Type.COMBI     ),
-                               data      = this.data,
-                               _v        = -1,
-                               i, l, nodes, root, roots;
-               /*
-                * Setter
-                */
-                       if( v !== undefined ){
-                               if( Type.isNumber( v ) === true ){
-                                       if( numerical === false ){
-                                               if( uDecimal === false || v < 0 || 1 < v ){} //throw new Error( '' );
-                                       };
-                               } else
-                               if( Type.isBoolean( v ) === true ){
-                                       if( flag === false ){} //throw new Error( '' );
-                               } else
-                               if( Type.isString( v ) === true ){
-                                       if( url === false && fontName === false ){
-                                               if( v.indexOf( ' ' ) !== -1 ){
-                                                       v = v.split( ' ' );
-                                               } else {
-                                                       if( length === false && percent === false && color === false ){} //throw new Error( '' );
-                                               };
-                                       };
-                               };                                      
-                               if( Type.isArray( v ) === true ){
-                                       if( v.length <= 4 && quartet === true ){
-                                               type ^= X.Css.Type.QUARTET;
-                                       } else
-                                       if( v.length === 2 && combi === true ){
-                                               type ^= X.Css.Type.COMBI;
-                                       } else {
-                                               //throw new Error( '' );
-                                       };
-                                       switch( v.length ){
-                                               case 1 :
-                                                       this.attr( [ propID  , type, list ], v[ 0 ] );
-                                                       this.attr( [ ++propID, type, list ], v[ 0 ] );
-                                                       this.attr( [ ++propID, type, list ], v[ 0 ] );
-                                                       this.attr( [ ++propID, type, list ], v[ 0 ] );
-                                                       break;
-                                               case 2 :
-                                                       this.attr( [ propID  , type, list ], v[ 0 ] );
-                                                       this.attr( [ ++propID, type, list ], v[ 1 ] );
-                                                       this.attr( [ ++propID, type, list ], v[ 0 ] );
-                                                       this.attr( [ ++propID, type, list ], v[ 1 ] );
-                                                       break;
-                                               case 3 :
-                                                       this.attr( [ propID  , type, list ], v[ 0 ] );
-                                                       this.attr( [ ++propID, type, list ], v[ 1 ] );
-                                                       this.attr( [ ++propID, type, list ], v[ 2 ] );
-                                                       this.attr( [ ++propID, type, list ], v[ 1 ] );
-                                                       break;
-                                               case 4 :
-                                                       this.attr( [ propID  , type, list ], v[ 0 ] );
-                                                       this.attr( [ ++propID, type, list ], v[ 1 ] );
-                                                       this.attr( [ ++propID, type, list ], v[ 2 ] );
-                                                       this.attr( [ ++propID, type, list ], v[ 3 ] );
-                                                       break;
-                                               default :
-                                       };
-                                       return this.User;
-                               };
-                               switch( update ){
-                                       case X.Css.Dirty.REFLOW :
-                                               delete this.layoutCssText;
-                                               break;
-                                       case X.Css.Dirty.PAINT :
-                                               delete this.colorCssText;
-                                               break;
-                                       case X.Css.Dirty.FONT :
-                                               delete this.fontCssText;
-                               };
-
-                               if( this.dirty < update ){
-                                       this.dirty = update;
-                                       roots = this.rootList;
-                                       for( i = 0, l = roots.length; i < l; ++i ){
-                                               root = roots[ i ];
-                                               if( root.dirty < update ) root.dirty = update;
-                                       };
-                               };
-                               
-                               if( list ) _v = list.indexOf( v );
-                               data[ propID ] = _v !== -1 ? _v : v;
-                               
-                               switch( propID ){
-                                       case X.Css.AttrNo.left  :
-                                       case X.Css.AttrNo.right :
-                                               this.constraintW = Type.isNumber( data[ X.Css.AttrNo.left ] ) || Type.isNumber( data[ X.Css.AttrNo.right ] );
-                                               break;
-                                       case X.Css.AttrNo.top    :
-                                       case X.Css.AttrNo.bottom :
-                                               this.constraintH = Type.isNumber( data[ X.Css.AttrNo.top ] ) || Type.isNumber( data[ X.Css.AttrNo.bottom ] );
-                                               break;
-                                       case X.Css.AttrNo.width :
-                                               this.autoWidth    = v === AUTO;
-                                               this.percentWidth = v === FULL || v < 1;
-                                               break;
-                                       case X.Css.AttrNo.height :
-                                               this.autoHeight    = v === AUTO;
-                                               this.percentHeight = v === FULL || v < 1;
-                                               break;
-                               };                                      
-                               return this.User;
-                       };
-               /*
-                * Getter
-                */
-                       v = data[ propID ];
-                       // Unit
-                       if( quartet === true ) return [ v, data[ ++propID ], data[ ++propID ], data[ ++propID ] ];
-                       if( combi   === true ) return [ v, data[ ++propID ] ];
-                       if( list && Type.isNumber( v ) === true ) return list[ v ];
-                       return v;
-               },
-               __cssText : function(){
-                       if( this.fontCssText   === null ) this.fontCssText   = this.createFontCssText();
-                       if( this.layoutCssText === null ) this.layoutCssText = this.createLayoutCssText();
-                       if( this.colorCssText  === null ) this.colorCssText  = this.createColorCssText();
-                       return [ this.fontCssText, this.colorCssText, this.layoutCssText ].join( ';' );
-               },
-               createFontCssText : function(){
-                       var data = this.data,
-                               css  = [],
-                               v;
-                       if( v = data[ X.Css.AttrNo.fontFamily    ] ) css[ 0 ] = 'font-family:' + v;
-                       if( v = data[ X.Css.AttrNo.fontSize      ] ) css[ css.length ] = 'font-size:' + v;
-                       if( v = data[ X.Css.AttrNo.bold          ] ) css[ css.length ] = 'font-weight:bold';
-                       if( v = data[ X.Css.AttrNo.italic        ] ) css[ css.length ] = 'font-style:italic';
-                       if( v = data[ X.Css.AttrNo.lineHeight    ] ) css[ css.length ] = 'line-height:' + v;
-                       if( v = data[ X.Css.AttrNo.letterSpacing ] ) css[ css.length ] = 'letter-spacing:' + v;
-                       if( v = data[ X.Css.AttrNo.wordSpacing   ] ) css[ css.length ] = 'word-spacing:' + v;
-                       if( v = data[ X.Css.AttrNo.align         ] ) css[ css.length ] = 'text-align:' + X.Css.Option.ALIGN[ v ];
-                       if( v = data[ X.Css.AttrNo.transform     ] ) css[ css.length ] = 'text-transform:' + X.Css.Option.TEXT_TRANSFORM[ v ];
-                       return css.join( ';' );
-               },
-               createLayoutCssText : function(){
-                       
-               },
-               createColorCssText : function(){
-                       var data = this.data,
-                               css  = [],
-                               v, x, y, c, b;
-                       if( v = data[ X.Css.AttrNo.borderColor ]      ) css[ 0 ] = 'border-color:' + v;
-                       if( v = data[ X.Css.AttrNo.borderStyle + 0 ]  ) css[ css.length ] = 'border-top-style:' + X.Css.Option.BORDER_STYLE[ v ];
-                       if( v = data[ X.Css.AttrNo.borderStyle + 1 ]  ) css[ css.length ] = 'border-right-style:' + X.Css.Option.BORDER_STYLE[ v ];
-                       if( v = data[ X.Css.AttrNo.borderStyle + 2 ]  ) css[ css.length ] = 'border-bottom-style:' + X.Css.Option.BORDER_STYLE[ v ];
-                       if( v = data[ X.Css.AttrNo.borderStyle + 3 ]  ) css[ css.length ] = 'border-left-style:' + X.Css.Option.BORDER_STYLE[ v ];
-                       if( v = data[ X.Css.AttrNo.cornerRadius + 0 ] ) css[ css.length ] = 'corner-radius-top:' + v;
-                       if( v = data[ X.Css.AttrNo.cornerRadius + 1 ] ) css[ css.length ] = 'corner-radius-right:' + v;
-                       if( v = data[ X.Css.AttrNo.cornerRadius + 2 ] ) css[ css.length ] = 'border-radius-bottom:' + v;
-                       if( v = data[ X.Css.AttrNo.cornerRadius + 3 ] ) css[ css.length ] = 'border-radius-left:' + v;
-                       if( v = data[ X.Css.AttrNo.bgColor          ] ) css[ css.length ] = 'background-color:' + v;
-                       // X.Css.AttrNo.bgAlpha
-                       if( v = data[ X.Css.AttrNo.bgImgUrl         ] ) css[ css.length ] = 'background-image:url(' + v + ')';
-                       x = data[ X.Css.AttrNo.bgImgRepeatX ];
-                       y = data[ X.Css.AttrNo.bgImgRepeatY ];
-                       if( x && y ){
-                               css[ css.length ] = 'background-repeat:repeat';
-                       } else
-                       if( x ){
-                               css[ css.length ] = 'background-repeat:repeat-x';
-                       } else 
-                       if( y ){
-                               css[ css.length ] = 'background-repeat:repeat-y';
-                       };
-                       x = data[ X.Css.AttrNo.bgImgPositionX ];
-                       y = data[ X.Css.AttrNo.bgImgPositionY ];
-                       if( x && y ){
-                               css[ css.length ] = 'background-position:' + x + ' ' + y;
-                       } else
-                       if( x ){
-                               css[ css.length ] = 'background-position:' + x + ' 0';
-                       } else 
-                       if( y ){
-                               css[ css.length ] = 'background-position:0 ' + y;
-                       };
-                       if( v = data[ X.Css.AttrNo.color ]      ) css[ css.length ] = 'color:' + v;
-                       if( v = data[ X.Css.AttrNo.decoration ] ) css[ css.length ] = 'text-decoration:' + X.Css.Option.TEXT_DECORATION[ v ];
-                       x = data[ X.Css.AttrNo.textShadowOffsetX ];
-                       y = data[ X.Css.AttrNo.textShadowOffsetY ];
-                       b = data[ X.Css.AttrNo.textShadowBlur ];
-                       c = data[ X.Css.AttrNo.textShadowColor ];
-                       if( c || x || y || b ){
-                               css[ css.length ] = 'text-shadow:' + x + ' ' + y + ' ' + b + ' ' + c;
-                       };
-                       /*
-                       X.Css.AttrNo.shadowColor    = [ X.Css.Dirty.PAINT,  23, X.Css.Type.COLOR     ]; // color
-                       X.Css.AttrNo.shadowAlpha    = [ X.Css.Dirty.PAINT,  24, X.Css.Type.U_DECIMAL ]; // 0 - 1
-                       X.Css.AttrNo.shadowOffsetX  = [ X.Css.Dirty.PAINT,  25, X.Css.Type.LENGTH    ]; // em
-                       X.Css.AttrNo.shadowOffsetY  = [ X.Css.Dirty.PAINT,  26, X.Css.Type.LENGTH    ]; // em
-                       X.Css.AttrNo.shadowBlur     = [ X.Css.Dirty.PAINT,  27, X.Css.Type.LENGTH    ]; // em
-                       X.Css.AttrNo.shadowSpread   = [ X.Css.Dirty.PAINT,  28, X.Css.Type.LENGTH    ]; // em
-                       X.Css.AttrNo.shadowInset    = [ X.Css.Dirty.PAINT,  29, X.Css.Type.BOOLEAN   ]; // true / false
-                       */
-                       return css.join( ';' );
-               },
-               node         : null,
-               nodeData     : null,
-               _name        : '',
-               allow        : null,
-               _cssText     : null,
-               _cssObj      : null
-       }
-);
-
-var DisplayNodeStyle = X.Class.create(
-       'DisplayNodeStyle',
-       X.Class.FINAL,
-       _DisplayNodeStyle,
-       {
-               Constructor : function( node, nodeData ){
-                       X.Class._newPrivate( this, node, nodeData );
-               },
-               addName : function( names ){
-                       return X.Class._getPrivate( this ).addName( names );
-               },
-               removeName : function( names ){
-                       return X.Class._getPrivate( this ).removeName( names );
-               },
-               hasName : function( names ){
-                       return X.Class._getPrivate( this ).hasName( names );
-               },
-               cssText : function( v ){
-                       var data = X.Class._getPrivate( this );
-                       if( v ){
-                               data.cssText( v );
-                               return this;
-                       };
-                       return data._cssText;
-               },
-               css : function( v ){
-                       var data = X.Class._getPrivate( this );
-                       if( v ){
-                               data.css( v );
-                               return this;
-                       };
-                       // return data._css;
-               },
-               
-               borderWidth : function( v ){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.borderWidth, v );
-               },
-               borderColor : function( v ){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.borderColor, v );
-               },
-               borderStyle : function( v ){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.borderStyle, v );
-               },
-               cornerRadius : function( v ){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.cornerRadius, v );
-               },
-               bgColor : function( v ){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.bgColor, v );
-               },
-               bgAlpha : function( v ){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.bgAlpha, v );
-               },
-               bgImgUrl : function( v ){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.bgImgUrl, v );
-               },
-               bgImgRepeatX : function( v ){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.bgImgRepeatX, v );
-               },
-               bgImgRepeatY : function( v ){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.bgImgRepeatY, v );
-               },
-               bgImgPositionX : function( v ){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.bgImgPositionX, v );
-               },
-               bgImgPositionY : function( v ){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.bgImgPositionY, v );
-               },
-               shadowColor : function( v ){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.shadowColor, v );
-               },
-               shadowAlpha : function( v ){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.shadowAlpha, v );
-               },
-               shadowOffsetX : function( v ){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.shadowOffsetX, v );
-               },
-               shadowOffsetY : function( v ){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.shadowOffsetY, v );
-               },
-               shadowBlur : function( v ){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.shadowBlur, v );
-               },
-               shadowSpread : function(){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.shadowSpread, v );
-               },
-               shadowInset : function(){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.shadowInset, v );
-               },
-               color : function( v ){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.color, v );
-               },
-               fontFamily : function( v ){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.fontFamily, v );
-               },
-               fontSize : function( v ){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.fontSize, v );
-               },
-               bold : function( v ){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.bold, v );
-               },
-               italic : function( v ){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.italic, v );
-               },
-               lineHeight : function( v ){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.lineHeight, v );
-               },
-               letterSpacing : function( v ){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.letterSpacing, v );
-               },
-               wordSpacing : function( v ){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.wordSpacing, v );
-               },
-               align : function( v ){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.align, v );
-               },
-               decoration : function( v ){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.decoration, v );
-               },
-               transform : function( v ){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.transform, v );
-               },
-               textShadowColor : function( v ){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.textShadowColor, v );
-               },
-               textShadowOffsetX : function( v ){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.textShadowOffsetX, v );
-               },
-               textShadowOffsetY : function( v ){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.textShadowOffsetY, v );
-               },
-               shadowBlur : function( v ){
-                       return X.Class._getPrivate( this ).attr( X.Css.Attr.shadowBlur, v );
-               }
-       }
-);
index a9fafa9..de3cd63 100644 (file)
@@ -1,75 +1,79 @@
-var VerticalLayoutManager = ( new LayoutManagerBase() ).define( {\r
+X.UI.Layout.Vertical = X.UI.Layout.create( {\r
+       \r
        name : 'VerticalLayout',\r
-       allowForSelf : {\r
-               childX  : false,\r
-               childY  : false,\r
-               childW  : false,\r
-               childH  : true,\r
-               gapX    : false,\r
-               gapY    : true,\r
-               padding : true\r
+       \r
+       overrideAttrsForSelf : {\r
+               selectable  : false,\r
+               role        : [ 0,              X.UI.Dirty.CLEAN,  X.UI.Attr.USER.UINODE, X.UI.Attr.Type.INIT_ONLY | X.UI.Attr.Type.LIST, 'none,chrome,container' ],\r
+               childWidth  : [ 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
+               childHeight : [ 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
+               gapY        : [ 0,              X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LENGTH ]\r
        },\r
-       allowForChild : {\r
-               x  : false,\r
-               y  : false,\r
-               w  : true,\r
-               h  : true\r
+       \r
+       overrideAttrsForChild : {\r
+               left   : true,\r
+               right  : true,\r
+               top    : false,\r
+               bottom : false\r
        },\r
-       calculate : function( data, x, y, w, h ){\r
-               var nodes     = data.nodes,\r
-                       styleData = data.styleData,\r
-                       cssObj    = styleData._cssObj,\r
-                       //childW    = cssObj.childW,\r
-                       childH    = cssObj.childH,\r
-                       gapX      = cssObj.gapX || 0,\r
-                       gapY      = cssObj.gapY || 0,\r
-                       padding   = cssObj.padding || 0,\r
-                       _x        = padding,\r
-                       _y        = padding,\r
-                       i = 0, l = nodes.length, node;\r
+       \r
+       calculate : function( data, isNeedsDetection, x, y, w, h ){\r
+               var attrs   = data.attrObject || data.attrClass.prototype,\r
+                       uinodes = data.uinodes,\r
+                       l       = uinodes && uinodes.length,            \r
+                       childW, childH, gapY,\r
+                       i, _x, _y, _w, node;\r
 \r
-               if( childH || childH === 0 ){\r
-                       for( ; i < l; ++i ){\r
-                               node = nodes[ i ];\r
-                               if( node.instanceOf( _Box ) ){\r
-                                       node.calculate( 0, _y, w - x, childH );\r
-                               } else {\r
-                                       node.styleData.layout( 0, _y, w - x, childH );\r
-                               };\r
-                               _y += childH + gapY;\r
+               data.preMesure( w, h );\r
+               \r
+               contentW       = data.contentWidth;\r
+               contentH       = data.contentHeight;\r
+               autoW          = contentW === X.UI.Attr.AUTO;\r
+               autoH          = contentH === X.UI.Attr.AUTO;\r
+               detectionPhase = autoW || autoH;\r
+               gapY           = _AbstractUINode.calcValue( attrs[ data.supportAttrs.gapY.No ], contentH );\r
+               childW         = _AbstractUINode.calcValue( attrs[ data.supportAttrs.childWidth.No ], contentW );\r
+               childH         = _AbstractUINode.calcValue( attrs[ data.supportAttrs.childHeight.No ], contentH );\r
+               _x             = data.contentL;\r
+               _y             = data.contentT;\r
+\r
+               if( l ){\r
+                       _w = 0;\r
+                       for( i = 0; i < l; ++i ){\r
+                               node = uinodes[ i ];\r
+                               node.calculate( detectionPhase, _x, _y, contentW, childH );\r
+                               _y += node.boxHeight + gapY;\r
+                               // 概算のみ\r
+                               if( autoW ){\r
+                                       w = node.boxWidth !== X.UI.Attr.AUTO ?\r
+                                                       node.boxWidth :\r
+                                               node.minBoxWidth !== X.UI.Attr.AUTO ?\r
+                                                       node.minBoxWidth : 0;\r
+                                       if( _w < w ) _w = w;                            \r
+                               };      \r
                        };\r
+                       _y -= gapY;\r
                } else {\r
-                       for( ; i < l; ++i ){\r
-                               node = nodes[ i ];\r
-                               if( node.instanceOf( _Box ) ){\r
-                                       node.calculate( 0, _y, w - x );\r
-                               } else {\r
-                                       node.styleData.layout( 0, _y, w - x );\r
-                               };\r
-                               //_y += node.rawElement.offsetHeight + gapY;\r
-                               _y += node.rawElement.height() + gapY;\r
-                       };\r
+                       _y = data.minContentHeight !== X.UI.Attr.AUTO ? data.minContentHeight : 0;\r
                };\r
-               data.styleData.layout( x, y, w, _y + gapY + padding );\r
+\r
+               if( detectionPhase ){\r
+                       if( autoW ) data.contentWidth  = _w;\r
+                       if( autoH ) data.conetntHeight = _y;\r
+                       data.postMesure();\r
+               } else {\r
+                       //data.postMesure();\r
+               };\r
+               \r
+               !isNeedsDetection && data.updateLayout( x, y );\r
        }\r
 });\r
 \r
-/*\r
-var VBox = function(){\r
-       var arg = arguments;\r
-       arg[ arg.length ] = VerticalLayoutManager;\r
-       ++arg.length;\r
-       return Box.apply( null, arg );\r
-}; */\r
-\r
-\r
-var VBox = Box.inherits(\r
+var VBox = Box.presets(\r
+       X.UI.Layout.Vertical,\r
        'VBox',\r
-       X.Class.SUPER_ACCESS,\r
        {\r
-               Constructor : function(){\r
-                       this.style = DisplayNodeStyle( this, X.Class._newPrivate( this,  VerticalLayoutManager, arguments ) );\r
-                       this.style.addName( 'VBox' );\r
-               }\r
+               gapY       : '0.2em',\r
+               childWidth : '100%'\r
        }\r
-);
\ No newline at end of file
+);\r
index 70e5e11..28583a1 100644 (file)
@@ -1,74 +1,76 @@
-var HorizontalLayoutManager = ( new LayoutManagerBase() ).define( {\r
-       allowForSelf : {\r
-               childX  : false,\r
-               childY  : false,\r
-               childW  : true,\r
-               childH  : true,\r
-               gapX    : true,\r
-               gapY    : false,\r
-               padding : true\r
+X.UI.Layout.Horizontal = X.UI.Layout.create( { \r
+       name : 'HorizontalLayout',\r
+       \r
+       overrideAttrsForSelf : {\r
+               selectable  : false,\r
+               role        : [ 0,              X.UI.Dirty.CLEAN,  X.UI.Attr.USER.UINODE, X.UI.Attr.Type.INIT_ONLY | X.UI.Attr.Type.LIST, 'none,chrome,container' ],\r
+               childWidth  : [ 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
+               childHeight : [ 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
+               gapX        : [ 0,              X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LENGTH ]\r
        },\r
-       allowForChild : {\r
-               x  : false,\r
-               y  : false,\r
-               w  : true,\r
-               h  : true\r
+       \r
+       overrideAttrsForChild : {\r
+               left   : false,\r
+               right  : false,\r
+               top    : true,\r
+               bottom : true\r
        },\r
-       calculate : function( data, x, y, w, h ){\r
-               var nodes     = data.nodes,\r
-                       styleData = data.styleData,\r
-                       cssObj    = styleData._cssObj,\r
-                       childW    = cssObj.childW,\r
-                       childH    = cssObj.childH,\r
-                       gapX      = cssObj.gapX || 0,\r
-                       gapY      = cssObj.gapY || 0,\r
-                       padding   = cssObj.padding || 0,\r
-                       _x        = padding,\r
-                       _y        = padding,\r
-                       i = 0, l = nodes.length, node;\r
+       \r
+       calculate : function( data, isNeedsDetection, x, y, w, h ){\r
+               var attrs   = data.attrObject || data.attrClass.prototype,\r
+                       uinodes = data.uinodes,\r
+                       l       = uinodes && uinodes.length,            \r
+                       childW, childH, gapX,\r
+                       i, _x, _y, _h, node;\r
 \r
-               if( childW || childW === 0 ){\r
-                       for( ; i < l; ++i ){\r
-                               node = nodes[ i ];\r
-                               if( node.instanceOf( _Box ) ){\r
-                                       node.calculate( _x, NaN, childW, childH );\r
-                               } else {\r
-                                       node.styleData.layout( _x, NaN, childW, childH );\r
+               data.preMesure( w, h );\r
+               \r
+               contentW       = data.contentWidth;\r
+               contentH       = data.contentHeight;\r
+               autoW          = contentW === X.UI.Attr.AUTO;\r
+               autoH          = contentH === X.UI.Attr.AUTO;\r
+               detectionPhase = autoW || autoH;\r
+               _x             = data.contentL;\r
+               _y             = data.contentT;\r
+               childW         = _AbstractUINode.calcValue( attrs[ data.supportAttrs.childWidth.No ], contentW );\r
+               childH         = _AbstractUINode.calcValue( attrs[ data.supportAttrs.childHeight.No ], contentH );\r
+               gapX           = _AbstractUINode.calcValue( attrs[ data.supportAttrs.gapX.No ], contentW );\r
+\r
+               if( l ){\r
+                       _h = 0;\r
+                       for( i = 0; i < l; ++i ){\r
+                               node = uinodes[ i ];\r
+                               node.calculate( detectionPhase, _x, _y, childW, childH );\r
+                               _x += node.boxWidth + gapX;\r
+                               if( autoH ){\r
+                                       h = node.boxHeight !== X.UI.Attr.AUTO ?\r
+                                                       node.boxHeight :\r
+                                               node.minBoxHeight !== X.UI.Attr.AUTO ?\r
+                                                       node.minBoxHeight : 0;\r
+                                       if( _h < h ) _h = h;                            \r
                                };\r
-                               _x += childW + gapX;\r
                        };\r
+                       _x -= gapX;\r
                } else {\r
-                       for( ; i < l; ++i ){\r
-                               node = nodes[ i ];\r
-                               if( node.instanceOf( _Box ) ){\r
-                                       node.calculate( _x, NaN, NaN, childH );\r
-                               } else {\r
-                                       node.styleData.layout( _x, NaN, NaN, childH );\r
-                               };\r
-                               //_x += node.rawElement.offsetWidth + gapX;\r
-                               _x += node.rawElement.width() + gapX;\r
-                       };\r
+                       _h = data.minContentHeight !== X.UI.Attr.AUTO ? data.minContentHeight : 0;\r
+               };\r
+\r
+               if( detectionPhase ){\r
+                       if( autoW ) data.contentWidth  = _x;\r
+                       if( autoH ) data.conetntHeight = _h;\r
+                       data.postMesure();\r
+               } else {\r
+                       //data.postMesure();\r
                };\r
-               data.styleData.layout( x, y, w, h );\r
+               \r
+               !isNeedsDetection && data.updateLayout( x, y );\r
        }\r
 });\r
 \r
-/*\r
-var HBox = function(){\r
-       var arg = arguments;\r
-       arg[ arg.length ] = HorizontalLayoutManager;\r
-       ++arg.length;\r
-       return Box.apply( null, arg );\r
-}; */\r
-\r
-\r
-var HBox = Box.inherits(\r
+var HBox = Box.presets(\r
+       X.UI.Layout.Horizontal,\r
        'HBox',\r
-       X.Class.SUPER_ACCESS,\r
        {\r
-               Constructor : function(){\r
-                       this.style = DisplayNodeStyle( this, X.Class._newPrivate( this,  HorizontalLayoutManager, arguments ) );\r
-                       this.style.addName( 'HBox' );\r
-               }\r
+               gapX : '0.2em'\r
        }\r
-);
\ No newline at end of file
+);\r
index 9887b26..0283fe9 100644 (file)
@@ -1,56 +1,85 @@
-var TileLayoutManager = ( new LayoutManagerBase() ).define( {\r
-       allowForSelf : {\r
-               childW  : true,\r
-               childH  : true,\r
-               gapX    : true,\r
-               gapY    : true,\r
-               padding : true\r
+X.UI.Layout.Tile = X.UI.Layout.create( {       \r
+       name : 'TileLayout',\r
+       \r
+       overrideAttrsForSelf : {\r
+               selectable  : false,\r
+               role        : [ 0,     X.UI.Dirty.CLEAN,  X.UI.Attr.USER.UINODE, X.UI.Attr.Type.INIT_ONLY | X.UI.Attr.Type.LIST, 'none,chrome,container' ],\r
+               childWidth  : [ '8em', X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LENGTH | X.UI.Attr.Type.PERCENT ],\r
+               childHeight : [ '8em', X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LENGTH | X.UI.Attr.Type.PERCENT ],\r
+               gapX        : [ 0,     X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LENGTH ],\r
+               gapY        : [ 0,     X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LENGTH ],\r
+               hCenter     : [ true,  X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.BOOLEAN ],\r
+               vCenter     : [ true,  X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.BOOLEAN ]\r
        },\r
-       allowForChild : {\r
-               x  : false,\r
-               y  : false,\r
-               w  : false,\r
-               h  : false\r
+       \r
+       overrideAttrsForChild : {\r
+               left   : false,\r
+               right  : false,\r
+               top    : false,\r
+               bottom : false,\r
+               width  : false,\r
+               height : false\r
        },\r
-       calculate : function( data, x, y, w, h ){\r
-               var nodes     = data.nodes,\r
-                       styleData = data.styleData,\r
-                       cssObj    = styleData._cssObj,\r
-                       childW    = cssObj.childW,\r
-                       childH    = cssObj.childH,\r
-                       gapX      = cssObj.gapX,\r
-                       gapY      = cssObj.gapY,\r
-                       padding   = cssObj.padding,\r
-                       _x        = padding,\r
-                       _y        = padding,\r
-                       i = 0, l = nodes.length, node;\r
-               if( l === 0 ){\r
-                       styleData.layout( x, y, w, 0 );\r
-                       return;\r
-               };\r
-               for( ; i < l; ++i ){\r
-                       node = nodes[ i ];\r
-                       if( node.instanceOf( _Box ) ){\r
-                               node.calculate( _x, _y, childW, childH );\r
-                       } else {\r
-                               node.styleData.layout( _x, _y, childW, childH );\r
-                       };\r
-                       _x += childW + gapX;\r
-                       if( w < _x ){\r
-                               _y += childH + gapY;\r
+       \r
+       calculate : function( data, isNeedsDetection, x, y, w, h ){\r
+               var attrs   = data.attrObject || data.attrClass.prototype,\r
+                       gapX, gapY, childW, childH,\r
+                       uinodes, l, i, node,\r
+                       _x, _y, _w, _h, numH, numV, n, startX, __x, __y;\r
+\r
+               data.preMesure( w, h );\r
+               \r
+               if( isNeedsDetection && ( data.boxWidth === X.UI.Attr.AUTO || data.boxHeight === X.UI.Attr.AUTO ) ) return;\r
+               \r
+               if( ( uinodes  = data.uinodes ) && ( l = uinodes.length ) ){\r
+                       _x      = data.contentL;\r
+                       _y      = data.contentT;\r
+                       _w      = data.contentWidth;\r
+                       gapX    = _AbstractUINode.calcValue( attrs[ data.supportAttrs.gapX.No ], contentW );\r
+                       gapY    = _AbstractUINode.calcValue( attrs[ data.supportAttrs.gapY.No ], contentH );\r
+                       childW  = _AbstractUINode.calcValue( attrs[ data.supportAttrs.childWidth.No ], contentW );\r
+                       childH  = _AbstractUINode.calcValue( attrs[ data.supportAttrs.childHeight.No ], contentH );\r
+                       numH    = X.UI.Attr.FLOOR( ( _w + gapX ) / ( childW + gapX ) );\r
+                       numV    = l % numH ? X.UI.Attr.FLOOR( l / numH ) + 1 : l / numH;\r
+                       _h      = _y + data.contentB + ( childH + gapY ) * numH - gapY;\r
+                       \r
+                       startX  = attrs[ data.supportAttrs.hCenter.No ] ?\r
+                                               ( _w - ( childW + gapX ) * numH - gapX ) / 2 : _x;\r
+                       __x     = startX;\r
+                       __y     = attrs[ data.supportAttrs.vCenter.No ] && _h <= h ?\r
+                                               ( h - _h ) / 2 + _y : _y;\r
+                       \r
+                       for( i = 0; i < l; ++i ){\r
+                               node = uinodes[ i ];\r
+                               node.calculate( false, __x, __y, childW, childH );\r
+                               \r
+                               if( i % numH === numH - 1 ){\r
+                                       __x  = startX;\r
+                                       __y += childH + gapY;\r
+                               } else {\r
+                                       __x += childW + gapX;\r
+                               };\r
                        };\r
+                       \r
+                       data.contentHeight = _h;\r
+                       \r
+               } else\r
+               if( data.contentHeight === X.UI.Attr.AUTO ){\r
+                       data.contentHeight = data.minContentHeight !== X.UI.Attr.AUTO ? data.minContentHeight : 0;\r
                };\r
-               styleData.layout( x, y, w, _y + childH + padding );\r
+               \r
+               data.postMesure();\r
+               data.updateLayout( x, y );\r
        }\r
 });\r
 \r
-var TileBox = Box.inherits(\r
+var TileBox = Box.presets(\r
        'TileBox',\r
-       X.Class.SUPER_ACCESS,\r
+       X.UI.Layout.Tile,\r
        {\r
-               Constructor : function(){\r
-                       this.style = DisplayNodeStyle( this, X.Class._newPrivate( this, TileLayoutManager, arguments ) );\r
-                       this.style.addName( 'TileBox' );\r
-               }\r
+               gapX    : '0.2em',\r
+               gapY    : '0.2em',\r
+               hCenter : true,\r
+               vCenter : true\r
        }\r
-);
\ No newline at end of file
+);\r
index c0f824d..6dd03f1 100644 (file)
@@ -5,15 +5,16 @@ var _ChromeBox = _Box.inherits(
                chromeNodes   : null,\r
                containerNode : null,\r
                Constructor : function( layout, args ){\r
+                       \r
                        this.SuperConstructor( layout, args );\r
                        \r
                        // xnode の追加が可能\r
                        \r
-                       var nodes = this.nodes,\r
-                               i     = nodes.length,\r
+                       var uinodes = this.uinodes,\r
+                               i     = uinodes.length,\r
                                node;\r
                        for( ; i; ){\r
-                               node = nodes[ --i ];\r
+                               node = uinodes[ --i ];\r
                                if( node.forContainer === true ){\r
                                        if( this.containerNode ){\r
                                                //throw new Error( 'ContainerNode が複数設定されています!ContainerNode はクロームボックスにひとつ、生成時に設定できます ' + node );\r
@@ -37,8 +38,7 @@ var ChromeBox = Box.inherits(
        _ChromeBox,\r
        {\r
                Constructor : function(){\r
-                       this.style = DisplayNodeStyle( this, X.Class._newPrivate( this, BasicLayoutManager, arguments ) );\r
-                       this.style.addName( 'ChromeBox' );\r
+                       X.Class._newPrivate( this, X.UI.Layout.Canvas, arguments );\r
                },\r
                add : function( node /* , node, node ... */ ){\r
                        X.Class._getPrivate( this ).containerNode.addAt( this.numNodes(), Array.prototype.slice.call( arguments ) );\r
@@ -69,7 +69,7 @@ var ChromeBox = Box.inherits(
                        return X.Class._getPrivate( this ).containerNode.User.getNodeByUID();\r
                },\r
                getNodeAt : function( index ){\r
-                       return X.Class._getPrivate( this ).containerNode.User.getNodeByUID( index );\r
+                       return X.Class._getPrivate( this ).containerNode.User.getNodeAt( index );\r
                },\r
                numNodes : function(){\r
                        return X.Class._getPrivate( this ).containerNode.User.numNodes();\r
diff --git a/0.6.x/js/ui/15_ScrollBox.js b/0.6.x/js/ui/15_ScrollBox.js
new file mode 100644 (file)
index 0000000..2538fa2
--- /dev/null
@@ -0,0 +1,1055 @@
+var _ScrollBox;\r
+\r
+(function(){\r
+\r
+var m      = Math,\r
+       ABS    = new Function( 'v', 'return v<0?-v:v' );\r
+\r
+       function Options(){};\r
+       \r
+       X.Class._override( Options.prototype, {\r
+               hScroll         : true,\r
+               vScroll         : true,\r
+               x               : 0,\r
+               y               : 0,\r
+               bounce          : true,\r
+               bounceLock      : false,\r
+               momentum        : true,\r
+               lockDirection   : true,\r
+               useTransform    : true,\r
+               useTransition   : true,\r
+               topOffset       : 0,\r
+               checkDOMChanges : false,                // Experimental\r
+               handleClick     : true,\r
+       \r
+               // Scrollbar\r
+               hScrollbar      : true,\r
+               vScrollbar      : true,\r
+               fixedScrollbar  : X.UA.Android,\r
+               hideScrollbar   : X.UA.iOS,\r
+               fadeScrollbar   : X.UA.iOS && has3d,\r
+               scrollbarClass  : '',\r
+       \r
+               // Zoom\r
+               zoom            : false,\r
+               zoomMin         : 1,\r
+               zoomMax         : 4,\r
+               doubleTapZoom   : 2,\r
+               wheelAction     : 'scroll',\r
+       \r
+               // Snap\r
+               snap            : false,\r
+               snapThreshold   : 1 //,\r
+       });\r
+\r
+       function Scrollbar( owner, dir ){\r
+               this.owner   = owner;\r
+               this.options = owner.options;\r
+               this.dir     = dir;\r
+               if( dir === 'h' ){\r
+                       this.XorY          = 'x';\r
+                       this.widthOrHeight = 'width';\r
+                       this.transrateXorY = 'translateX(';\r
+               };\r
+       };\r
+       X.Class._override( Scrollbar.prototype, {\r
+               owner          : null,\r
+               dir            : null,\r
+               options        : null,\r
+               XorY           : 'y',\r
+               widthOrHeight  : 'height',\r
+               transrateXorY  : 'translateY(',\r
+               active         : false,\r
+               xnodeWrapper   : null,\r
+               xnodeIndicator : null,\r
+               wrapperSize    : 0,\r
+               indicatorSize  : 0,\r
+               maxScroll      : 0,\r
+               scrollPercent  : 0,\r
+               \r
+               update         : function(){\r
+                       // remove scrollbar\r
+                       if( !this.active ){\r
+                               if( this.xnodeWrapper ){\r
+                                       X.Dom.Style.transform && this.xnodeIndicator.css( 'transform', '' );\r
+                                       this.xnodeWrapper.css( 'display', 'none' );\r
+                               };\r
+                               return;\r
+                       };\r
+       \r
+                       // create scrollbar\r
+                       if( !this.xnodeWrapper ){\r
+                               // Create the scrollbar wrapper\r
+                               this.xnodeWrapper = this.owner.xnodeTarget.create( 'div' )\r
+                                       .className(\r
+                                               this.options.scrollbarClass ?\r
+                                                       this.options.scrollbarClass + this.dir.toUpperCase() :\r
+                                               this.dir === 'h' ?\r
+                                                       ( this.vScrollbar && this.vScrollbar.active ? 'ScrollBox-Scrollbar-Wrapper-V-withH' : 'ScrollBox-Scrollbar-Wrapper-H' ) :\r
+                                                       ( this.hScrollbar && this.hScrollbar.active ? 'ScrollBox-Scrollbar-Wrapper-H-withV' : 'ScrollBox-Scrollbar-Wrapper-V' )                                                 \r
+                                       );\r
+       \r
+                               this.options.fadeScrollbar &&\r
+                                       this.xnodeWrapper.css(\r
+                                               {\r
+                                                       opacity            : 0,\r
+                                                       transitionProperty : 'opacity',\r
+                                                       transitionDuration : '350ms'\r
+                                               }\r
+                                       );\r
+       \r
+                               // Create the scrollbar indicator\r
+                               \r
+                               this.xnodeIndicator = this.xnodeWrapper.create( 'div' );\r
+                               \r
+                               !this.options.scrollbarClass &&\r
+                                       this.xnodeIndicator.className(\r
+                                               this.dir === 'h' ?\r
+                                                       'ScrollBox-Scrollbar-Indicator-H' :\r
+                                                       'ScrollBox-Scrollbar-Indicator-V'\r
+                                       );\r
+                               //if (this.options.useTransition) bar.style.cssText += ';' + cssVendor + 'transition-timing-function:cubic-bezier(0.33,0.66,0.66,1)';\r
+                       };\r
+       \r
+                       if( this.dir === 'h' ){\r
+                               this.wrapperSize   = this.hScrollbarWrapper.clientWidth;\r
+                               this.indicatorSize = m.max( m.round( wrapperSize * wrapperSize / this.owner.scrollerW ), 8 );\r
+                               //this.hScrollbarIndicator.style.width = this.hScrollbarIndicatorSize + 'px';\r
+                               this.maxScroll     = wrapperSize - indicatorSize;\r
+                               this.scrollPercent = maxScroll / this.owner.maxScrollX;\r
+                       } else {\r
+                               this.wrapperSize   = this.vScrollbarWrapper.clientHeight;\r
+                               this.indicatorSize = m.max( m.round( wrapperSize * wrapperSize / this.owner.scrollerH ), 8);\r
+                               // this.vScrollbarIndicator.style.height = indicatorSize + 'px';\r
+                               this.maxScroll     = this.vScrollbarSize - indicatorSize;\r
+                               this.scrollPercent = maxScroll / this.owner.maxScrollY;\r
+                       };              \r
+                       this.xnodeIndicator.css( this.widthOrHeight, size + 'px' );\r
+                       // Reset position\r
+                       this.updatePosition( this.owner[ this.XorY ], true );\r
+               },\r
+               \r
+               updatePosition : function( pos, hidden ){\r
+                       var size;\r
+                       pos = this.scrollPercent * pos;\r
+       \r
+                       if( pos < 0 ){\r
+                               if( !this.options.fixedScrollbar ){\r
+                                       size = this.indicatorSize + m.round( pos * 3 );\r
+                                       if( size < 8 ) size = 8;\r
+                                       //this.xnodeIndicator.style[dir == 'h' ? 'width' : 'height'] = size + 'px';\r
+                                       this.xnodeIndicator.css( this.widthOrHeight, size + 'px' );\r
+                               };\r
+                               pos = 0;\r
+                       } else\r
+                       if( this.maxScroll < pos ){\r
+                               if( !this.options.fixedScrollbar ){\r
+                                       size = this.indicatorSize - m.round( ( pos - this.maxScroll ) * 3 );\r
+                                       if( size < 8 ) size = 8;\r
+                                       //this.xnodeIndicator.style[dir == 'h' ? 'width' : 'height'] = size + 'px';\r
+                                       this.xnodeIndicator.css( this.widthOrHeight, size + 'px' );\r
+                                       pos = this.maxScroll + this.indicatorSize - size;\r
+                               } else {\r
+                                       pos = this.maxScroll;\r
+                               };\r
+                       };\r
+       \r
+                       if (this.options.useTransition){\r
+                               this.xnodeWrapper.css( {\r
+                                       transitionDelay : '0',\r
+                                       opacity         : hidden && this.options.hideScrollbar ? '0' : '1'\r
+                               });\r
+                               //this.xnodeIndicator.style[transform] = 'translate(' + (dir == 'h' ? pos + 'px,0)' : '0,' + pos + 'px)') + translateZ;\r
+                               this.xnodeIndicator.anime( this.dir === 'h' ? { x : pos } : { y : pos } );              \r
+                       };\r
+               }\r
+       });\r
+\r
+       // Constructor\r
+       function iScroll( uinodeRoot, uinodeTarget, xnodeTarget, xnodeScroller, options ){\r
+               var i;\r
+               \r
+               this.uinodeRoot     = uinodeRoot;\r
+               this.uinodeTarget   = uinodeTarget;\r
+               this.xnodeTarget    = xnodeTarget;\r
+               this.xnodeScroller  = xnodeScroller;\r
+\r
+               // Default options\r
+               this.options = new Options();\r
+\r
+               // User defined options\r
+               if( options ) for (i in options) this.options[i] = options[i];\r
+               \r
+               this.options.hScroll && ( this.hScrollbar = new Scrollbar( 'h', this ) );\r
+               this.options.vScroll && ( this.vScrollbar = new Scrollbar( 'v', this ) );\r
+               \r
+               // Set starting position\r
+               this.x = this.options.x;\r
+               this.y = this.options.y;\r
+\r
+               // Normalize options\r
+               this.options.useTransform  = X.Dom.Style.transform && this.options.useTransform;\r
+               this.options.hScrollbar    = this.options.hScroll && this.options.hScrollbar;\r
+               this.options.vScrollbar    = this.options.vScroll && this.options.vScrollbar;\r
+               this.options.zoom          = this.options.useTransform && this.options.zoom;\r
+               this.options.useTransition = X.Dom.Style.transition && this.options.useTransition;\r
+\r
+               // Helpers FIX ANDROID BUG!\r
+               // translate3d and scale doesn't work together!\r
+               // Ignoring 3d ONLY WHEN YOU SET this.options.zoom\r
+               //if ( this.options.zoom && X.UA.isAndroid ){\r
+               //      translateZ = '';\r
+               //}\r
+               \r
+               // Set some default styles\r
+\r
+               if (this.options.useTransform){\r
+                       this.scroller.style[X.Dom.Style.transform]       = 'translate(' + this.x + 'px,' + this.y + 'px)' + translateZ;\r
+                       this.scroller.style[X.Dom.Style.transformOrigin] = '0 0';\r
+               } else {\r
+                       this.scroller.style.cssText += ';position:absolute;top:' + this.y + 'px;left:' + this.x + 'px';\r
+               };\r
+\r
+               if (this.options.useTransition){\r
+                       this.scroller.style[X.Dom.Style.transition.Property]       = this.options.useTransform ? X.Dom.Style.cssVendor + 'transform' : 'top left';\r
+                       this.scroller.style[X.Dom.Style.transition.Duration]       = '0';                       \r
+                       this.scroller.style[X.Dom.Style.transition.TimingFunction] = 'cubic-bezier(0.33,0.66,0.66,1)';\r
+                       this.options.fixedScrollbar = true;\r
+               };\r
+\r
+               this.refresh();\r
+\r
+               //this._bind(RESIZE_EV, window);\r
+               X.Dom.Event.add( window, RESIZE_EV, this );\r
+               //this._bind(START_EV);\r
+               uinodeTarget.listen( X.UI.Event.DRAG_START, this );\r
+       };\r
+\r
+// Prototype\r
+iScroll.prototype = {\r
+       uinodeRoot     : null,\r
+       uinodeTarget   : null,\r
+       xnodeTarget    : null,\r
+       xnodeScroller  : null,\r
+       options        : null,\r
+       enabled        : true,\r
+       x              : 0,\r
+       y              : 0,\r
+       steps          : [],\r
+       scale          : 1,\r
+       currPageX      : 0,\r
+       currPageY      : 0,\r
+       pagesX         : [],\r
+       pagesY         : [],\r
+       animeTimerID   : 0,\r
+       wheelZoomCount : 0,\r
+       \r
+       wrapperW       : 0,\r
+       wrapperH       : 0,\r
+       minScrollY     : 0,\r
+       scrollerW      : 0,\r
+       scrollerH      : 0,\r
+       maxScrollX     : 0,\r
+       maxScrollY     : 0,\r
+       dirX           : 0,\r
+       dirY           : 0,\r
+       hScrollbar     : false,\r
+       vScrollbar     : false,\r
+       wrapperOffsetLeft : 0,\r
+       wrapperOffsetTop  : 0,\r
+       \r
+       \r
+       currPageX         : 0,\r
+       currPageY         : 0,\r
+       \r
+       moved             : false,\r
+       animating         : false,\r
+       zoomed            : false,\r
+       distX             : false,\r
+       distY             : false,\r
+       absDistX          : false,\r
+       absDistY          : false,\r
+       absStartX         : false,      // Needed by snap threshold\r
+       absStartY         : false,\r
+       startX            : false,\r
+       startY            : false,\r
+       pointX            : false,\r
+       pointY            : false,\r
+       startTime         : false,\r
+       \r
+       handleEvent: function (e) {\r
+               switch(e.type) {\r
+                       case X.UI.Event.DRAG :\r
+                               return this._move(e);\r
+                       case X.UI.Event.WHEEL :\r
+                               return this._wheel(e);\r
+                       case X.UI.Event.DRAG_START :\r
+                               //if (!hasTouch && e.button !== 0) return;\r
+                               return this._start(e);\r
+                       case X.UI.Event.DRAG_END :\r
+                               return this._end(e);\r
+                       case X.UI.Event.ANIME_END :\r
+                               return this._transitionEnd(e);\r
+                       case RESIZE_EV :\r
+                               return this._resize();                  \r
+               }\r
+       },\r
+       \r
+       _trigger : function( type, e ){\r
+               \r
+               return this.uinodeTarget.dispatch(  );\r
+       },\r
+       \r
+       _resize: function () {\r
+               X.Timer.once( X.UA.Android ? 200 : 0, this, this.refresh );\r
+               // setTimeout( this.refresh(), isAndroid ? 200 : 0);\r
+       },\r
+       \r
+       _updateScrollPosition: function( x, y, time ){\r
+               if (this.zoomed) return;\r
+\r
+               this.xnodeScroller.anime({\r
+                       x : this.x = this.hScrollbar && this.hScrollbar.active ? m.round(x) : 0,\r
+                       y : this.y = this.vScrollbar && this.vScrollbar.active ? m.round(y) : 0\r
+               }, time );\r
+\r
+               this.hScrollbar && this.hScrollbar.active && this.hScrollbar.updatePosition( this.x );\r
+               this.vScrollbar && this.vScrollbar.active && this.vScrollbar.updatePosition( this.y );\r
+       },\r
+       \r
+       _start: function (e) {\r
+               var point = hasTouch ? e.touches[0] : e,\r
+                       matrix, x, y,\r
+                       ret;\r
+                       //c1, c2;\r
+\r
+               if (!this.enabled) return;\r
+\r
+               //if (this.options.onBeforeScrollStart) this.options.onBeforeScrollStart.call(this, e);\r
+               if( ( ret = this._trigger( X.UI.Event.SCROLL_BEFORE_START ) ) & X.Callback.PREVENT_DEFAULT ){\r
+                       return ret;\r
+               };\r
+\r
+               //if (this.options.useTransition || this.options.zoom) this._transitionTime(0);\r
+\r
+               this.moved     = false;\r
+               this.animating = false;\r
+               this.zoomed    = false;\r
+               this.distX     = 0;\r
+               this.distY     = 0;\r
+               this.absDistX  = 0;\r
+               this.absDistY  = 0;\r
+               this.dirX      = 0;\r
+               this.dirY      = 0;\r
+\r
+               if (this.options.momentum) {\r
+                       if (this.options.useTransform) {\r
+                               // Very lame general purpose alternative to CSSMatrix\r
+                               matrix = getComputedStyle(this.scroller, null)[transform].replace(/[^0-9\-.,]/g, '').split(',');\r
+                               x = +(matrix[12] || matrix[4]);\r
+                               y = +(matrix[13] || matrix[5]);\r
+                       } else {\r
+                               x = +getComputedStyle(this.scroller, null).left.replace(/[^0-9-]/g, '');\r
+                               y = +getComputedStyle(this.scroller, null).top.replace(/[^0-9-]/g, '');\r
+                       };\r
+                       \r
+                       if (x !== this.x || y !== this.y) {\r
+                               if (this.options.useTransition){\r
+                                       //this._unbind(TRNEND_EV);\r
+                                       X.Dom.Event.remove( this.scroller, TRNEND_EV, this );\r
+                               } else {\r
+                                       X.Timer.cancelFrame(this.animeTimerID);\r
+                               };\r
+                               this.steps = this.steps ? ( this.steps.length = 0 ) : [];\r
+                               this._updateScrollPosition( x, y, 0 );\r
+                               //if (this.options.onScrollEnd) this.options.onScrollEnd.call(this);\r
+                               return this._trigger( X.UI.Event.SCROLL_END, e );\r
+                       };\r
+               };\r
+\r
+               this.absStartX = this.x;        // Needed by snap threshold\r
+               this.absStartY = this.y;\r
+\r
+               this.startX = this.x;\r
+               this.startY = this.y;\r
+               this.pointX = point.pageX;\r
+               this.pointY = point.pageY;\r
+\r
+               this.startTime = e.timeStamp || X.getTime();\r
+\r
+               this.uinodeRoot.listen( X.UI.Event.DRAG, this );\r
+               this.uinodeRoot.listen( X.UI.Event.DRAG_END, this );\r
+\r
+               return this._trigger( X.UI.Event.SCROLL_START, e );\r
+       },\r
+       \r
+       _move: function (e) {\r
+               var point  = hasTouch ? e.touches[0] : e,\r
+                       deltaX = point.pageX - this.pointX,\r
+                       deltaY = point.pageY - this.pointY,\r
+                       newX   = this.x + deltaX,\r
+                       newY   = this.y + deltaY,\r
+                       c1, c2, scale,\r
+                       timestamp = e.timeStamp ||X.getTime(), ret;\r
+\r
+               //if (this.options.onBeforeScrollMove) this.options.onBeforeScrollMove.call(this, e);\r
+               if( ( ret = this._trigger( X.UI.Event.SCROLL_BEFORE_MOVE ) ) & X.Callback.PREVENT_DEFAULT ){\r
+                       return ret;\r
+               };\r
+\r
+               this.pointX = point.pageX;\r
+               this.pointY = point.pageY;\r
+\r
+               // Slow down if outside of the boundaries\r
+               if (newX > 0 || newX < this.maxScrollX) {\r
+                       newX = this.options.bounce ? this.x + (deltaX / 2) : newX >= 0 || this.maxScrollX >= 0 ? 0 : this.maxScrollX;\r
+               };\r
+               if (newY > this.minScrollY || newY < this.maxScrollY) {\r
+                       newY = this.options.bounce ? this.y + (deltaY / 2) : newY >= this.minScrollY || this.maxScrollY >= 0 ? this.minScrollY : this.maxScrollY;\r
+               };\r
+\r
+               this.distX += deltaX;\r
+               this.distY += deltaY;\r
+               this.absDistX = ABS(this.distX);\r
+               this.absDistY = ABS(this.distY);\r
+\r
+               if (this.absDistX < 6 && this.absDistY < 6) {\r
+                       return;\r
+               };\r
+\r
+               // Lock direction\r
+               if (this.options.lockDirection) {\r
+                       if (this.absDistX > this.absDistY + 5) {\r
+                               newY = this.y;\r
+                               deltaY = 0;\r
+                       } else if (this.absDistY > this.absDistX + 5) {\r
+                               newX = this.x;\r
+                               deltaX = 0;\r
+                       };\r
+               };\r
+\r
+               this.moved = true;\r
+               this._updateScrollPosition(newX, newY, 0);\r
+               this.dirX = deltaX > 0 ? -1 : deltaX < 0 ? 1 : 0;\r
+               this.dirY = deltaY > 0 ? -1 : deltaY < 0 ? 1 : 0;\r
+\r
+               if (timestamp - this.startTime > 300) {\r
+                       this.startTime = timestamp;\r
+                       this.startX = this.x;\r
+                       this.startY = this.y;\r
+               };\r
+               \r
+               //if (this.options.onScrollMove) this.options.onScrollMove.call(this, e);\r
+               return this._trigger( X.UI.Event.SCROLL_MOVE, e );\r
+       },\r
+       \r
+       _end: function (e) {\r
+               if (hasTouch && e.touches.length !== 0) return;\r
+\r
+               var point     = hasTouch ? e.changedTouches[0] : e,\r
+                       momentumX = { dist:0, time:0 },\r
+                       momentumY = { dist:0, time:0 },\r
+                       duration  = ( e.timeStamp ||X.getTime() ) - this.startTime,\r
+                       newPosX   = this.x,\r
+                       newPosY   = this.y,\r
+                       distX, distY,\r
+                       newDuration,\r
+                       snap,\r
+                       scale;\r
+\r
+               this.uinodeRoot.unlisten( X.UI.Event.DRAG, this );\r
+               this.uinodeRoot.unlisten( X.UI.Event.DRAG_END, this );\r
+\r
+               //this._unbind(MOVE_EV, window);\r
+               //this._unbind(END_EV, window);\r
+               //this._unbind(CANCEL_EV, window);\r
+\r
+               //if (this.options.onBeforeScrollEnd) this.options.onBeforeScrollEnd.call(this, e);\r
+               \r
+\r
+               if (!this.moved) {\r
+\r
+\r
+                       this._resetPos(400);\r
+\r
+                       //if (this.options.onTouchEnd) this.options.onTouchEnd.call(this, e);\r
+                       return;\r
+               };\r
+\r
+               if (duration < 300 && this.options.momentum) {\r
+                       momentumX = newPosX ? this._momentum(newPosX - this.startX, duration, -this.x, this.scrollerW - this.wrapperW + this.x, this.options.bounce ? this.wrapperW : 0) : momentumX;\r
+                       momentumY = newPosY ? this._momentum(newPosY - this.startY, duration, -this.y, (this.maxScrollY < 0 ? this.scrollerH - this.wrapperH + this.y - this.minScrollY : 0), this.options.bounce ? this.wrapperH : 0) : momentumY;\r
+\r
+                       newPosX = this.x + momentumX.dist;\r
+                       newPosY = this.y + momentumY.dist;\r
+\r
+                       if ((this.x > 0 && newPosX > 0) || (this.x < this.maxScrollX && newPosX < this.maxScrollX)) momentumX = { dist:0, time:0 };\r
+                       if ((this.y > this.minScrollY && newPosY > this.minScrollY) || (this.y < this.maxScrollY && newPosY < this.maxScrollY)) momentumY = { dist:0, time:0 };\r
+                       \r
+                       if (momentumX.dist || momentumY.dist) {\r
+                               newDuration = m.max(m.max(momentumX.time, momentumY.time), 10);\r
+       \r
+                               this.scrollTo(m.round(newPosX), m.round(newPosY), newDuration);\r
+       \r
+                               //if (this.options.onTouchEnd) this.options.onTouchEnd.call(this, e);\r
+                               return;\r
+                       };                      \r
+               };\r
+\r
+               this._resetPos(200);\r
+               //if (this.options.onTouchEnd) this.options.onTouchEnd.call(this, e);\r
+       },\r
+       \r
+       /*\r
+       _onZoomEndEvent : null,\r
+       _onZoomEndTimerComplete : function(){\r
+               this.options.onZoomEnd.call( this, this._onZoomEndEvent );\r
+       },\r
+       */\r
+       \r
+       /*\r
+       _onDobleTapTimerPoint : null,\r
+       _onDobleTapTimerComplete : function () {\r
+               var point = this._onDobleTapTimerPoint,\r
+                       target, ev;\r
+               this.doubleTapTimer = null;\r
+\r
+               // Find the last touched element\r
+               target = point.target;\r
+               while (target.nodeType !== 1) target = target.parentNode;\r
+\r
+               if (target.tagName != 'SELECT' && target.tagName != 'INPUT' && target.tagName != 'TEXTAREA') {\r
+                       ev = document.createEvent('MouseEvents');\r
+                       ev.initMouseEvent('click', true, true, e.view, 1,\r
+                               point.screenX, point.screenY, point.clientX, point.clientY,\r
+                               e.ctrlKey, e.altKey, e.shiftKey, e.metaKey,\r
+                               0, null);\r
+                       ev._fake = true;\r
+                       target.dispatchEvent(ev);\r
+               }\r
+       },*/\r
+       \r
+       _resetPos: function (time) {\r
+               var resetX =\r
+                               0 <= this.x ?\r
+                                       0 :\r
+                               this.x < this.maxScrollX ?\r
+                                       this.maxScrollX :\r
+                                       this.x,\r
+                       resetY =\r
+                               this.minScrollY <= this.y || 0 < this.maxScrollY ?\r
+                                       this.minScrollY :\r
+                               this.y < this.maxScrollY ?\r
+                                       this.maxScrollY :\r
+                                       this.y;\r
+\r
+               if( resetX === this.x && resetY === this.y ){\r
+                       if( this.moved ){\r
+                               this.moved = false;\r
+                               this._trigger( X.UI.Event.SCROLL_END );\r
+                               //if (this.options.onScrollEnd) this.options.onScrollEnd.call(this);            // Execute custom code on scroll end\r
+                       };\r
+                       if( this.options.hideScrollbar ){\r
+                               this.hScrollbar && this.hScrollbar.active &&\r
+                                       \r
+                                       //if (vendor == 'webkit') this.hScrollbarWrapper.style[transitionDelay] = '300ms';\r
+                                       //this.hScrollbarWrapper.style.opacity = '0';\r
+                                       this.hScrollbar.xnodeWraper.anime( {\r
+                                               opacity : 0\r
+                                       }, 300 );\r
+                               this.vScrollbar && this.vScrollbar.active &&\r
+                                       //if (vendor == 'webkit') this.vScrollbarWrapper.style[transitionDelay] = '300ms';\r
+                                       //this.vScrollbarWrapper.style.opacity = '0';\r
+                                       this.hScrollbar.xnodeWraper.anime( {\r
+                                               opacity : 0\r
+                                       }, 300 );                       \r
+                       };\r
+                       return;\r
+               };\r
+               this.scrollTo(resetX, resetY, time || 0);\r
+       },\r
+       \r
+       _wheel: function (e) {\r
+               var wheelDeltaX, wheelDeltaY,\r
+                       deltaX, deltaY,\r
+                       deltaScale;\r
+/*\r
+               if ('wheelDeltaX' in e) {\r
+                       wheelDeltaX = e.wheelDeltaX / 12;\r
+                       wheelDeltaY = e.wheelDeltaY / 12;\r
+               } else if('wheelDelta' in e) {\r
+                       wheelDeltaX = wheelDeltaY = e.wheelDelta / 12;\r
+               } else if ('detail' in e) {\r
+                       wheelDeltaX = wheelDeltaY = -e.detail * 3;\r
+               } else {\r
+                       return;\r
+               } */\r
+               \r
+               deltaX = this.x + e.wheelDeltaX;\r
+               deltaY = this.y + e.wheelDeltaY;\r
+\r
+               deltaX =\r
+                       0 < deltaX ?\r
+                               0 :\r
+                       deltaX < this.maxScrollX ?\r
+                               this.maxScrollX : deltaX;\r
+\r
+               deltaY =\r
+                       this.minScrollY < deltaY ? \r
+                               this.minScrollY :\r
+                       deltaY < this.maxScrollY ?\r
+                               this.maxScrollY : deltaY;\r
+    \r
+               this.maxScrollY < 0 && this.scrollTo(deltaX, deltaY, 0);\r
+       },\r
+       \r
+       /*\r
+       _wheelTimerCompleteEvent : null,\r
+       _wheelTimerComplete : function() {\r
+               this.wheelZoomCount--;\r
+               if (!this.wheelZoomCount && this.options.onZoomEnd) this.options.onZoomEnd.call(this, this._wheelTimerCompleteEvent );\r
+       },\r
+       */\r
+       \r
+       _transitionEnd: function( e ){\r
+               if( e.target !== this.xnodeScroller ) return;\r
+\r
+               //this._unbind(TRNEND_EV);\r
+               //X.Dom.Event.remove( this.scroller, TRNEND_EV, this );\r
+               this.animating = false;\r
+               \r
+               this._startAnime();\r
+               \r
+               return X.Callback.UN_LISTEN;\r
+       },\r
+\r
+\r
+       /**\r
+       *\r
+       * Utilities\r
+       *\r
+       */\r
+       _startAnime: function () {\r
+               var startX = this.x,\r
+                       startY = this.y,\r
+                       step, animate;\r
+\r
+               if (this.animating) return;\r
+               \r
+               if (!this.steps.length) {\r
+                       this._resetPos(400);\r
+                       return;\r
+               };\r
+               \r
+               step = this.steps.shift();\r
+               \r
+               if( step.x === startX && step.y === startY ) step.time = 0;\r
+\r
+               this.animating = true;\r
+               this.moved = true;\r
+               \r
+               //if (this.options.useTransition) {\r
+                       //this._transitionTime(step.time);\r
+                       this._updateScrollPosition( step.x, step.y, step.time );\r
+                       //this.animating = false;\r
+                       this.xnodeScroller.listenOnce( X.UI.Event.ANIME_END, this );\r
+                       //step.time ? X.Dom.Event.add( this.scroller, TRNEND_EV, this ) /* this._bind(TRNEND_EV) */ : this._resetPos(0);\r
+                       //return;\r
+               //}\r
+               //this._doAnimate( X.getTime(), step, startX, startY );\r
+       },\r
+\r
+/*\r
+       _doAnimate : function( startTime, step, startX, startY ){\r
+               var now =X.getTime(),\r
+                       easeOut, newX, newY;\r
+\r
+               if (now >= startTime + step.time) {\r
+                       this._updateScrollPosition(step.x, step.y);\r
+                       this.animating = false;\r
+                       //if (this.options.onAnimationEnd) this.options.onAnimationEnd.call( this );                    // Execute custom code on animation end\r
+                       this._startAnime();\r
+                       return;\r
+               };\r
+\r
+               now     = (now - startTime) / step.time - 1;\r
+               easeOut = m.sqrt(1 - now * now);\r
+               newX    = (step.x - startX) * easeOut + startX;\r
+               newY    = (step.y - startY) * easeOut + startY;\r
+               this._updateScrollPosition(newX, newY);\r
+               if( this.animating ) this.animeTimerID = X.Timer.requestFrame( this, this._doAnimate, [ startTime, step, startX, startY ] );\r
+       },\r
+*/\r
+\r
+       _momentum: function (dist, time, maxDistUpper, maxDistLower, size) {\r
+               var deceleration = 0.0006,\r
+                       speed   = ABS(dist) / time,\r
+                       newDist = (speed * speed) / (2 * deceleration),\r
+                       newTime = 0, outsideDist = 0;\r
+\r
+               // Proportinally reduce speed if we are outside of the boundaries\r
+               if (dist > 0 && newDist > maxDistUpper) {\r
+                       outsideDist = size / (6 / (newDist / speed * deceleration));\r
+                       maxDistUpper = maxDistUpper + outsideDist;\r
+                       speed = speed * maxDistUpper / newDist;\r
+                       newDist = maxDistUpper;\r
+               } else if (dist < 0 && newDist > maxDistLower) {\r
+                       outsideDist = size / (6 / (newDist / speed * deceleration));\r
+                       maxDistLower = maxDistLower + outsideDist;\r
+                       speed = speed * maxDistLower / newDist;\r
+                       newDist = maxDistLower;\r
+               }\r
+\r
+               newDist = newDist * (dist < 0 ? -1 : 1);\r
+               newTime = speed / deceleration;\r
+\r
+               return { dist: newDist, time: m.round(newTime) };\r
+       },\r
+\r
+       _offset: function (el) {\r
+               var left = -el.offsetLeft,\r
+                       top = -el.offsetTop;\r
+                       \r
+               while (el = el.offsetParent) {\r
+                       left -= el.offsetLeft;\r
+                       top -= el.offsetTop;\r
+               }\r
+               \r
+               if (el != this.wrapper) {\r
+                       left *= this.scale;\r
+                       top *= this.scale;\r
+               }\r
+\r
+               return { left: left, top: top };\r
+       },\r
+\r
+       /*\r
+       _bind: function (type, el, bubble) {\r
+               X.Dom.Event.add( el || this.scroller, type, this );\r
+       },\r
+\r
+       _unbind: function (type, el, bubble) {\r
+               X.Dom.Event.remove( el || this.scroller, type, this );\r
+       },\r
+       */\r
+\r
+       /**\r
+       *\r
+       * Public methods\r
+       *\r
+       */\r
+       destroy: function () {\r
+               this.scroller.style[transform] = '';\r
+\r
+               // Remove the scrollbars\r
+               this.hScrollbar && this.hScrollbar.destroy();\r
+               this.vScrollbar && this.vScrollbar.destroy();\r
+\r
+               // Remove the event listeners\r
+               X.Dom.Event.add( window, RESIZE_EV, this );\r
+               this.uinodeTarget.unlisten( X.UI.Event.DRAG_START, this );\r
+               this.uinodeRoot.unlisten( X.UI.Event.DRAG, this );\r
+               this.uinodeRoot.unlisten( X.UI.Event.DRAG_END, this );\r
+               \r
+               //this._unbind(RESIZE_EV, window);\r
+               //this._unbind(START_EV);\r
+               //this._unbind(MOVE_EV, window);\r
+               //this._unbind(END_EV, window);\r
+               //this._unbind(CANCEL_EV, window);\r
+               \r
+               if (!this.options.hasTouch) {\r
+                       //this._unbind('DOMMouseScroll');\r
+                       //this._unbind('mousewheel');\r
+               }\r
+               \r
+               // if (this.options.useTransition) this._unbind(TRNEND_EV);\r
+               this.options.useTransition && X.Dom.Event.remove( this.scroller, TRNEND_EV, this );\r
+               \r
+               //if (this.options.checkDOMChanges) clearInterval(this.checkDOMTime);\r
+               \r
+               //if (this.options.onDestroy) this.options.onDestroy.call(this);\r
+       },\r
+\r
+       refresh: function () {\r
+               var offset,\r
+                       i, l,\r
+                       els,\r
+                       pos = 0,\r
+                       page = 0;\r
+\r
+               if (this.scale < this.options.zoomMin) this.scale = this.options.zoomMin;\r
+               this.wrapperW = this.wrapper.clientWidth || 1;\r
+               this.wrapperH = this.wrapper.clientHeight || 1;\r
+\r
+               this.minScrollY = -this.options.topOffset || 0;\r
+               this.scrollerW  = m.round(this.scroller.offsetWidth * this.scale);\r
+               this.scrollerH  = m.round((this.scroller.offsetHeight + this.minScrollY) * this.scale);\r
+               this.maxScrollX = this.wrapperW - this.scrollerW;\r
+               this.maxScrollY = this.wrapperH - this.scrollerH + this.minScrollY;\r
+               this.dirX       = 0;\r
+               this.dirY       = 0;\r
+\r
+               // if (this.options.onRefresh) this.options.onRefresh.call(this);\r
+               this._trigger( X.UI.Event.SCROLL_REFRESH, {} );\r
+\r
+               this.hScrollbar && ( this.hScrollbar.active = this.maxScrollX < 0 );\r
+               this.vScrollbar && ( this.vScrollbar.active = !this.options.bounceLock && !this.hScroll || this.scrollerH > this.wrapperH );\r
+               \r
+               offset = this._offset(this.wrapper);\r
+               this.wrapperOffsetLeft = -offset.left;\r
+               this.wrapperOffsetTop = -offset.top;\r
+\r
+               // Prepare snap\r
+               if (typeof this.options.snap == 'string') {\r
+                       this.pagesX = [];\r
+                       this.pagesY = [];\r
+                       els = this.scroller.querySelectorAll(this.options.snap);\r
+                       for (i=0, l=els.length; i<l; i++) {\r
+                               pos = this._offset(els[i]);\r
+                               pos.left += this.wrapperOffsetLeft;\r
+                               pos.top += this.wrapperOffsetTop;\r
+                               this.pagesX[i] = pos.left < this.maxScrollX ? this.maxScrollX : pos.left * this.scale;\r
+                               this.pagesY[i] = pos.top < this.maxScrollY ? this.maxScrollY : pos.top * this.scale;\r
+                       }\r
+               } else if (this.options.snap) {\r
+                       this.pagesX = [];\r
+                       while (pos >= this.maxScrollX) {\r
+                               this.pagesX[page] = pos;\r
+                               pos = pos - this.wrapperW;\r
+                               page++;\r
+                       }\r
+                       if (this.maxScrollX%this.wrapperW) this.pagesX[this.pagesX.length] = this.maxScrollX - this.pagesX[this.pagesX.length-1] + this.pagesX[this.pagesX.length-1];\r
+\r
+                       pos = 0;\r
+                       page = 0;\r
+                       this.pagesY = [];\r
+                       while (pos >= this.maxScrollY) {\r
+                               this.pagesY[page] = pos;\r
+                               pos = pos - this.wrapperH;\r
+                               page++;\r
+                       }\r
+                       if (this.maxScrollY%this.wrapperH) this.pagesY[this.pagesY.length] = this.maxScrollY - this.pagesY[this.pagesY.length-1] + this.pagesY[this.pagesY.length-1];\r
+               }\r
+\r
+               // Prepare the scrollbars\r
+               this._scrollbar('h');\r
+               this._scrollbar('v');\r
+\r
+               if (!this.zoomed) {\r
+                       this.scroller.style[transitionDuration] = '0';\r
+                       this._resetPos(400);\r
+               }\r
+       },\r
+\r
+       scrollTo: function (x, y, time, relative) {\r
+               var step = x,\r
+                       i, l;\r
+\r
+               this.stop();\r
+\r
+               if( !step.length ) step = [{ x: x, y: y, time: time, relative: relative }];\r
+               \r
+               for( i = 0, l = step.length; i < l; ++i ){\r
+                       if( step[ i ].relative ){\r
+                               step[ i ].x = this.x - step[ i ].x;\r
+                               step[ i ].y = this.y - step[ i ].y;\r
+                       };\r
+                       this.steps.push( {\r
+                               x    : step[i].x,\r
+                               y    : step[i].y,\r
+                               time : step[i].time || 0\r
+                       });\r
+               };\r
+\r
+               this._startAnime();\r
+       },\r
+\r
+       disable: function () {\r
+               this.stop();\r
+               this._resetPos(0);\r
+               this.enabled = false;\r
+\r
+               // If disabled after touchstart we make sure that there are no left over events\r
+               //this._unbind(MOVE_EV, window);\r
+               //this._unbind(END_EV, window);\r
+               //this._unbind(CANCEL_EV, window);\r
+               this.uinodeRoot.unlisten( X.UI.Event.DRAG, this );\r
+               this.uinodeRoot.unlisten( X.UI.Event.DRAG_END, this );\r
+       },\r
+       \r
+       enable: function () {\r
+               this.enabled = true;\r
+       },\r
+       \r
+       stop: function () {\r
+               //if (this.options.useTransition) this._unbind(TRNEND_EV);\r
+               //else X.Timer.cancelFrame( this.animeTimerID );\r
+               /*\r
+               if (this.options.useTransition){\r
+                       X.Dom.Event.remove( this.scroller, TRNEND_EV, this );\r
+               } else {\r
+                       X.Timer.cancelFrame(this.animeTimerID);\r
+               };\r
+               */\r
+               this.xnodeScroller.stop();\r
+               if( this.steps ) this.steps.length = 0;\r
+               this.moved = false;\r
+               this.animating = false;\r
+       },\r
+       \r
+       isReady: function () {\r
+               return !this.moved && !this.zoomed && !this.animating;\r
+       }\r
+};\r
+\r
+\r
+\r
+_ScrollBox = _ChromeBox.inherits(\r
+       '_ScrollBox',\r
+       X.Class.PRIVATE_DATA | X.Class.SUPER_ACCESS,\r
+       {\r
+               //elmScroll     : null,\r
+               //elmScroller   : null,\r
+               //elmScrollbar  : null,\r
+               \r
+               scrolling      : false,\r
+               _scrollX       : 0,\r
+               _scrollY       : 0,\r
+               scrollXPercent : 0,\r
+               scrollYPercent : 0,\r
+               scrollingX     : 0,\r
+               scrollingY     : 0,\r
+               \r
+               _containerNode : null,\r
+               scrollManager  : null,\r
+               \r
+               Constructor : function( layout, args ){\r
+                       this.SuperConstructor( layout, args );\r
+                       this._containerNode = _X.Class._getPrivate( this.containerNode );\r
+               },\r
+               \r
+               creationComplete : function(){\r
+                       _AbstractUINode.prototype.creationComplete.call( this, arguments );\r
+                       this.scrollManager = new iScroll( this.root, this.User, this.rawElement, this._containerNode.rawElement );\r
+                       this._check();\r
+               },\r
+               \r
+               calculate : function(){\r
+                       _AbstractUINode.prototype.calculate.call( this, arguments );\r
+                       this._check();\r
+               },\r
+               \r
+               _check : function(){\r
+                       if( this.w < this._containerNode.w || this.h < this._containerNode.h ){\r
+                               // scroll\r
+                               if( this.scrolling ){\r
+                                       // fix scroll position from scrollXPercent, scrollYPercent\r
+                                       \r
+                               } else {\r
+                                       // create scroller\r
+                                       this.listen( X.UI.Event.POINTER_START, this );\r
+                                       \r
+                                       \r
+                                       this._move( 0, 0 );\r
+                                       \r
+                                       this.scrolling = true;\r
+                               };\r
+                       } else\r
+                       // no scroll\r
+                       if( this.scrolling ){\r
+                               // remove scroller\r
+                               \r
+                               ( this._scrollX !== 0 || this._scrollY !== 0 ) && this._move( 0, 0 );\r
+                               \r
+                               delete this.scrolling;\r
+                       };\r
+               },\r
+               \r
+               handleEvent : function( e ){\r
+                       switch( e.type ){\r
+                               case X.UI.Event.POINTER_START :\r
+                                       this.listen( X.UI.Event.POINTER_MOVE, this );\r
+                                       this.listen( X.UI.Event.POINTER_END,  this );\r
+                                       \r
+                                       break;\r
+                               case X.UI.Event.POINTER_MOVE :\r
+                                       \r
+                                       break;\r
+                               case X.UI.Event.POINTER_END :\r
+                                       this.unlisten( X.UI.Event.POINTER_MOVE, this );\r
+                                       this.unlisten( X.UI.Event.POINTER_END,  this );\r
+                                       \r
+                                       break;\r
+                       };\r
+               },\r
+               \r
+               _move : function( x, y ){\r
+                       \r
+               },\r
+               \r
+               _remove : function(){\r
+                       _AbstractUINode.prototype._remove.call( this, arguments );\r
+                       if( this.scrolling ){\r
+                               // remove scroll\r
+                       };\r
+               }\r
+               \r
+       }\r
+);\r
+\r
+})();\r
+\r
+var ScrollBox = ChromeBox.inherits(\r
+       'ScrollBox',\r
+       X.Class.SUPER_ACCESS,\r
+       _ScrollBox,\r
+       {\r
+               Constructor : function(){\r
+                       var args = [],\r
+                               i    = arguments.length,\r
+                               arg, layout;\r
+                       \r
+                       for( ; i; ){\r
+                               arg = arguments[ --i ];\r
+                               if( arg.instanceOf && arg.instanceOf( X.UI.Layout.Base ) ){\r
+                                       layout = arg;\r
+                               } else {\r
+                                       args[ args.length ] = arg;\r
+                               };\r
+                       };\r
+                       \r
+                       this.style = DisplayNodeStyle( this,\r
+                               X.Class._newPrivate(\r
+                                       this,\r
+                                       X.UI.Layout.Canvas,\r
+                                       [\r
+                                               Box(\r
+                                                       layout || VerticalLayoutManager,\r
+                                                       {\r
+                                                               name : 'ScrollBox-Scroller',\r
+                                                               role : 'container'\r
+                                                       },\r
+                                                       args\r
+                                               )\r
+                                       ]\r
+                               )\r
+                       );\r
+                       this.style.addName( 'ScrollBox' );\r
+               },\r
+               scrollX  : function(){\r
+                       \r
+               },\r
+               scrollY  : function(){\r
+                       \r
+               },\r
+               scrollWidth : function(){\r
+                       \r
+               },\r
+               scrollHeight : function(){\r
+                       \r
+               },\r
+               scrollTo : function( nodeOrX, y ){\r
+                       \r
+               }\r
+       }\r
+);
\ No newline at end of file
index 9348182..72eb17a 100644 (file)
@@ -2,19 +2,21 @@ var _Text = _AbstractUINode.inherits(
        '_Text',\r
        X.Class.PRIVATE_DATA,\r
        {\r
-               content    : null,\r
+               content     : null,\r
+               \r
                Constructor : function( content ){\r
                        if( !( this.User.instanceOf( Text ) ) ){\r
                                //throw new Error( 'Text を継承したインスタンスだけが _Text のオーナーになれます' );\r
                        };\r
-                       this.content   = content;\r
+                       this.xnode      = X.Dom.Node.create( 'div' );\r
+                       \r
+                       if( X.Type.isString( content ) ) this.content = content;\r
                },\r
-               afterAddition : function(){\r
-                       this.rawElement.text( this.content );\r
-                       this.styleData.afterAddition();\r
+               creationComplete : function(){\r
+                       this.content && this.xnode.text( this.content );\r
                        \r
                        this.phase = 3;\r
-                       this.User.dispatch( { type : X.UI.Event.CREATION_COMPLETE } );\r
+                       this.dispatch( { type : X.UI.Event.CREATION_COMPLETE } );\r
                }\r
        }\r
 );\r
@@ -24,16 +26,17 @@ var Text = AbstractUINode.inherits(
        X.Class.SUPER_ACCESS,\r
        _Text,\r
        {\r
-               Constructor : function( content, cssObj ){\r
-                       var data = X.Class._newPrivate( this, content );\r
-                       this.style = DisplayNodeStyle( this, data );\r
-                       cssObj && this.style.css( cssObj );\r
-                       if( cssObj ){\r
-                               if( cssObj.role === 'chrome' ) data.forChrome = true;\r
-                       };\r
+               Constructor : function( opt_content, opt_cssObj ){\r
+                       X.Class._newPrivate( this, opt_content );\r
+                       X.Type.isObject( opt_cssObj = opt_cssObj || opt_content ) && this.attr( opt_cssObj );\r
                },\r
-               content : function(){\r
-                       \r
+               content : function( v ){\r
+                       var data = X.Class._getPrivate( this );\r
+                       if( data.content !== v ){\r
+                               data.xnode && data.xnode.text( v );\r
+                               data.rootData.reserveCalc();\r
+                               if( data.dirty < X.UI.Dirty.CONTENT ) data.dirty = X.UI.Dirty.CONTENT;                          \r
+                       };\r
                }\r
        }\r
 );
\ No newline at end of file
similarity index 72%
rename from 0.6.x/js/ui/16_PageRoot.js
rename to 0.6.x/js/ui/20_PageRoot.js
index 21aa91e..c377aad 100644 (file)
@@ -1,12 +1,10 @@
 
-var currentRootData  = null;
-
 function eventRellay( e ){
        var x       = e.clientX,
                y       = e.clientY,
                type    = X.UI.Event.NameToID[ e.type ],
                i       = 0,
-               data    = currentRootData,
+               data    = X.UI.currentRootData,
                sysOnly = false,
                list, ret, parent;
        if( type !== X.UI.Event._POINTER_MOVE && type !== X.UI.Event._MOUSE_MOVE ){
@@ -16,11 +14,11 @@ function eventRellay( e ){
        e.type = type;
 
        if( data && ( data = data.monopolyNodeData ) && ( ret = data.dispatch( e ) ) & X.Callback.MONOPOLY ) return ret;
-       if( currentRootData === null ) return;
-       list = currentRootData.hoverList;
-       data = currentRootData.targetNodeData = currentRootData;
+       if( X.UI.currentRootData === null ) return;
+       list = X.UI.currentRootData.hoverList;
+       data = X.UI.currentRootData.targetNodeData = X.UI.currentRootData;
        data.capcher( x, y );
-       data = currentRootData.targetNodeData;
+       data = X.UI.currentRootData.targetNodeData;
        //console.log( 'absX: ' + data.absoluteX + ', absY:' + data.absoluteY )
        // data.apiuser.updateCoursor( data.targetNodeData._cursor );
        while( data ){
@@ -34,28 +32,24 @@ function eventRellay( e ){
                while( parent.parentData && parent === parent.parentData.hitChildData ){
                        parent = parent.parentData;
                };
-               if( parent !== currentRootData ){
-                       data.isHover === true && data.styleData.removeName( data.hoverStyleName );
-                       delete data.isHover;
+               if( parent !== X.UI.currentRootData ){
+                       data.hoverClassName && data.xnode.removeClass( data.hoverClassName );
                        data._listeners && data._listeners[ X.UI.Event.POINTER_OUT ] && data.dispatch( e, X.UI.Event.POINTER_OUT, false ); // new Event
-                       delete data.hitSelf;
+                       delete data.hovering;
                        list.splice( i, 1 );
                        continue;
                };
-               if( data.hover === true && data.isHover === false ){
-                       data.styleData.addName( data.hoverStyleName );
-                       data.isHover = true;
-               };
-               if( data.hitSelf === false ){
+               if( !data.hovering ){
+                       data.hoverClassName && data.xnode.addClassName( data.hoverClassName );
                        data._listeners && data._listeners[ X.UI.Event.POINTER_IN ] && data.dispatch( e, X.UI.Event.POINTER_IN, true ); // new Event
-                       data.hitSelf = true;
+                       data.hovering = true;
                };
        };
        return false;
 };
 
 /*
- * body が存在したら要素を作成、style も指定
+ * body が存在したら要素を作成、css も指定
  * 背景画像を読み終える onload で活動開始
  */
 
@@ -63,14 +57,16 @@ var _PageRoot = _Box.inherits(
        '_PageRoot',
        X.Class.FINAL | X.Class.PRIVATE_DATA | X.Class.SUPER_ACCESS,
        {
+               layout           : X.UI.Layout.Canvas,
+               
                calcReserved     : false,
                hoverList        : null,
                targetNodeData   : null,
                monopolyNodeData : null,
                
-               elmMouseCatch  : null, // rootData only
-               eventCounter   : null, // rootData only
-               cursorStyle    : null, // rootData only
+               elmMouseCatch    : null,
+               eventCounter     : null,
+               cursorStyle      : null,
                
                Constructor : function( layout, args ){
                        this.SuperConstructor( layout, args );
@@ -84,7 +80,7 @@ var _PageRoot = _Box.inherits(
                        this.hoverList    = [];
                        this.eventCounter = {};
                        
-                       currentRootData   = this;
+                       X.UI.currentRootData = this;
                },
                
                start : function(){
@@ -124,23 +120,28 @@ var _PageRoot = _Box.inherits(
                        X.Timer.once( 0, this, this.afterAddToView );
                },
                afterAddToView : function(){
-                       this.afterAddition();
+                       //this.afterAddition();
+                       this.xnode.className( 'PageRoot' );
+                       
                        this.creationComplete();
                        X.Timer.once( 0, this, this.doFirstCalc );
                },
                
                doFirstCalc : function(){
-                       this.doCalculate();
-                       X.Dom.listen( X.Dom.Event.VIEW_RESIZED, this, this.doCalculate );
+                       this.calculate();
+                       this.phase = 4;
+                       X.Dom.listen( X.Dom.Event.VIEW_RESIZED, this, this.calculate );
                },
+               
                reserveCalc : function(){
                        if( this.calcReserved === false ){
                                this.calcReserved = true;
-                               X.Timer.once( 0, this, this.doCalculate );
+                               X.Timer.once( 0, this, this.calculate );
                        };
                },
-               doCalculate : function( e ){
-                       var size, w, h;
+               calculate : function( e ){
+                       var font = X.Dom.baseFontSize,
+                               size, w, h;
                        if( !e ){
                                size = X.Dom.getSize();
                                w    = size[ 0 ];
@@ -149,7 +150,7 @@ var _PageRoot = _Box.inherits(
                                w = e.w;
                                h = e.h;
                        };
-                       this.layout.calculate( this, 0, 0, w, h );
+                       this.layout.calculate( this, false, 0, 0, w / font, h / font );
                        this.calcReserved = false;
                },
                
@@ -157,21 +158,18 @@ var _PageRoot = _Box.inherits(
                        
                },
                
-               beforeRemove : function(){
+               _remove : function(){
                        this.elmMouseCatch.unlisten();
+                       _Box.prototype._remove.call( this );
                }
        }
 );
 
-var PageRoot = Box.inherits(
+var PageRoot = Box.presets(
        'PageRoot',
-       X.Class.FINAL | X.Class.SUPER_ACCESS,
-       _PageRoot,
-       {
-               Constructor : function( /* opt_manager */ ){
-                       var data = X.Class._newPrivate( this, BasicLayoutManager, arguments );
-                       this.style = DisplayNodeStyle( this, data );
-                       this.style.addName( 'PageRoot' );
-               }
+       _PageRoot, {
+               width  : '100%',
+               height : '100%'
        }
 );
+