OSDN Git Service

Version 0.6.153, fix layout @X.UI.
authoritozyun <itozyun@user.sourceforge.jp>
Fri, 22 May 2015 02:10:34 +0000 (11:10 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Fri, 22 May 2015 02:10:34 +0000 (11:10 +0900)
14 files changed:
0.6.x/js/01_core/02_XUA.js
0.6.x/js/02_dom/02_XNode.js
0.6.x/js/02_dom/08_XNodeSelector.js
0.6.x/js/02_dom/10_XNodeAnime.js
0.6.x/js/06_net/00_XNet.js
0.6.x/js/06_net/01_XNetXHR.js
0.6.x/js/06_net/10_XOAuth2.js
0.6.x/js/07_audio/00_XAudio.js
0.6.x/js/07_audio/02_XHTMLAudio.js
0.6.x/js/07_audio/10_XAudioSprite.js
0.6.x/js/20_ui/06_AbstractUINode.js
0.6.x/js/20_ui/08_Box.js
0.6.x/js/20_ui/11_VBox.js
0.6.x/js/20_ui/15_ScrollBox.js

index eda4818..948f78b 100644 (file)
@@ -541,10 +541,10 @@ var X_UA = X[ 'UA' ] = {},
                \r
                i = parseFloat(dua.split('WebKit\/')[1]);\r
                /**\r
-                * @alias X.UA.AndroidBrowserWebkit\r
+                * @alias X.UA.AndroidWebkit\r
                 * @type {number}\r
                 */\r
-               X_UA[ 'AndroidBrowserWebkit' ] = i;\r
+               X_UA[ 'AndroidWebkit' ] = i;\r
                alert( 'AudioSprite調査:Android標準ブラウザ Webkit Version ' + i );\r
                \r
        } else\r
index d71a866..185074d 100644 (file)
@@ -580,8 +580,9 @@ function X_Node_clone( opt_clone_children ){
  * @alias Node.prototype.append\r
  * @param {Node|string|HTMLElement|TextNode} [v] HTMLElement と TextNode は内部のみ。\r
  * @return {Node} 自身。チェインメソッド\r
- * @example myNode.append( node );\r
- * myNode.append( nodeSprite, '<div>A</div>', 'B' );\r
+ * @example //\r
+ * myNode.append( node );\r
+ * myNode.append( node, '&lt;span&gt;Hello,&lt;/span&gt;', 'world.' );\r
  */\r
 function X_Node_append( v ){\r
        var i, l, xnodes, frg;\r
index 00b0013..4b735e0 100644 (file)
@@ -226,13 +226,29 @@ function X_Node_Selector__parse( query, last ){
 };\r
 \r
        /**\r
-        * selector を使って Node を取得する\r
+        * selector を使って Node, NodeList を取得する\r
         * @alias X.Doc.find\r
         * @function\r
         * @param {string} セレクター文字列\r
         * @return {Node|NodeList}\r
         */\r
-       X[ 'Doc' ][ 'find' ] = X_shortcutFunction = Node.prototype[ 'find' ] = X_NodeList.prototype[ 'find' ] = function ( queryString ){\r
+       X[ 'Doc' ][ 'find' ] = X_shortcutFunction =\r
+       /**\r
+        * selector を使って Node, NodeList を取得する\r
+        * @alias Node.prototype.find\r
+        * @function\r
+        * @param {string} セレクター文字列\r
+        * @return {Node|NodeList}\r
+        */\r
+       Node.prototype[ 'find' ] =\r
+       /**\r
+        * selector を使って Node, NodeList を取得する\r
+        * @alias NodeList.prototype.find\r
+        * @function\r
+        * @param {string} セレクター文字列\r
+        * @return {Node|NodeList}\r
+        */\r
+       X_NodeList.prototype[ 'find' ] = function ( queryString ){\r
                var HTML      = X_Node_html,\r
                        scope     = this.constructor === X_NodeList && this.length ? this : [ this.constructor === Node ? this : X_Node_body ],\r
                        parents   = scope, // 探索元の親要素 XNodeList の場合あり\r
index 3913195..325b955 100644 (file)
@@ -88,6 +88,17 @@ var X_Node_ANIMATIONS            = [],
  * TODO 前回位置からの継続\r
  * TODO scrollLeft, scrollTop\r
  */\r
+/**\r
+ * GPU サポートの効いたアニメーションの設定 X.Event.ANIME_START, X.Event.ANIME_END, X.Event.GPU_RELEASED\r
+ * \r
+ * @alias Node.prototype.animate\r
+ * @param {object} start { x : 0, y : 0, opacity : 1 }\r
+ * @param {object} dest  { x : 100, y : 100, opacity : 0 }\r
+ * @param {number=} duartion アニメーション時間 ms\r
+ * @param {string=} easing 'quadratic', 'circular', 'back', 'bounce', 'elastic'\r
+ * @param {number=} wait GPU レイヤーの遅延解除 ms\r
+ * @return {Node} メソッドチェーン\r
+ */\r
 Node.prototype[ 'animate' ] = function( start, dest, duration, easing, wait ){\r
        var isNew = !this[ '_anime' ],\r
                obj   = this[ '_anime' ] || ( this[ '_anime' ] = {} );\r
@@ -146,6 +157,11 @@ Node.prototype[ 'animate' ] = function( start, dest, duration, easing, wait ){
        return this;\r
 };\r
 \r
+/**\r
+ * アニメーションの停止。\r
+ * @alias Node.prototype.stop\r
+ * @return {Node} メソッドチェーン\r
+ */\r
 Node.prototype[ 'stop' ] = function(){\r
        var obj = this[ '_anime' ];\r
        \r
index e400763..30a3034 100644 (file)
@@ -41,6 +41,7 @@
  * <dt>dataType<dd>'text', 'json', 'xml', 'blob', 'arraybuffer' 等。xhr.responseType に指定する値\r
  * <dt>mimeType<dd>'text/xml', 'audio/mpeg' 等。xhr.overrideMimeType する値\r
  * <dt>auth<dd>X.OAuth2 インスタンス(OAuth2 サービスの定義)\r
+ * <dt>getFullHeaders<dd>getAllResponseHeaders() をパースしたハッシュを返す。値は配列になっている。\r
  * </dl>\r
  * \r
  * @alias X.Net\r
index 2a12df8..efe8c94 100644 (file)
@@ -409,8 +409,12 @@ X_TEMP.X_Net_XHR_init = function(){
                                                status        = raw.status;\r
                                                \r
                                                // TODO GET_FULL_HEADERS\r
+                                               // https://msdn.microsoft.com/en-us/library/ms766595%28v=vs.85%29.aspx\r
                                                // Implemented in: MSXML 3.0 and MSXML 6.0\r
-                                               if( !X_NET_XHRWrapper._isXDR && ( ( !X_NET_XHRWrapper._isMsXML && raw.getAllResponseHeaders ) || 3 <= X_Net_XHR_msXMLVer ) && ( headers = raw.getAllResponseHeaders() ) ){\r
+                                               if( X_NET_XHRWrapper._isXDR ){\r
+                                                       headers = { 'Content-Type' : raw.contentType };\r
+                                               } else\r
+                                               if( ( X_NET_XHRWrapper._isMsXML ? 3 <= X_Net_XHR_msXMLVer : raw.setRequestHeader ) && ( headers = raw.getAllResponseHeaders() ) ){\r
                                                        headers = X_NET_XHR_parseResponseHeaders( headers );\r
                                                };\r
                                                \r
@@ -422,7 +426,7 @@ X_TEMP.X_Net_XHR_init = function(){
                                            ( 200 <= status && status < 400 ) ||\r
                                            //status === 304 ||\r
                                            ( status === 1223 && ( status = 204 ) ) ||\r
-                                           ( X_UA[ 'Webkit' ]  && status === undefined ) // safari: /webkit/.test(userAgent)\r
+                                           ( X_UA[ 'Webkit' ] && status === undefined && ( status = 200 ) ) // safari: /webkit/.test(userAgent)\r
                                                ){\r
                                                        /*\r
                                                         * opera8, safari2, khtml3 で utf8 日本語文字列の文字化け\r
@@ -511,7 +515,7 @@ X_TEMP.X_Net_XHR_init = function(){
 \r
 };\r
 \r
-/**\r
+/*\r
  * https://gist.github.com/mmazer/5404301\r
  * \r
  * XmlHttpRequest's getAllResponseHeaders() method returns a string of response\r
index 43a34d6..55c40ea 100644 (file)
@@ -13,17 +13,33 @@ var X_NET_OAUTH2_detection      = new Function( 'w', 'try{return w.location.sear
  * <dt>X.Event.PROGRESS<dd>コードを window から受け取った、リフレッシュトークンの開始、コードの認可を header -> params に切替
  * </dl>
  * 
- * OAuth2 state
- * <dl>
- * <dt>0 : <dd>disconnected
- * <dt>1 : <dd>now authentication ...
- * <dt>2 : <dd>authorization_code
- * <dt>3 : <dd>refresh_token
- * <dt>4 : <dd>hasAccessToken
- * </dl>
- * 
  * original :
  *  oauth2.js , <opendata@oucs.ox.ac.uk>
+ * 
+ * @alias X.OAuth2
+ * @class OAuth2 サービスを定義し接続状況をモニタする。適宜にトークンのアップデートなどを行う
+ * @constructs OAuth2
+ * @extends {EventDispatcher}
+ * @example // OAuth2 サービスの定義
+oauth2 = X.OAuth2({
+       'clientID'          : 'xxxxxxxx.apps.googleusercontent.com',
+       'clientSecret'      : 'xxxxxxxx',
+       'authorizeEndpoint' : 'https://accounts.google.com/o/oauth2/auth',
+       'tokenEndpoint'     : 'https://accounts.google.com/o/oauth2/token',
+       'redirectURI'       : X.URL.cleanup( document.location.href ), // 専用の軽量ページを用意してもよいが、現在のアドレスでも可能
+       'scopes'            : [ 'https://www.googleapis.com/auth/blogger' ],
+       'authorizeWindowWidth'  : 500,
+       'authorizeWindowHeight' : 500
+}).listen( [ X.Event.NEED_AUTH, X.Event.CANCELED, X.Event.SUCCESS, X.Event.ERROR, X.Event.PROGRESS ], updateOAuth2State );
+
+// XHR 時に oauth2 を渡す
+X.Net( {
+       xhr      : 'https://www.googleapis.com/blogger/v3/users/self/blogs',
+       dataType : 'json',
+       auth     : oauth2,
+       test     : 'gadget' // http -> https:xProtocol なリクエストのため、google ガジェットを proxy に使用
+       } )
+       .listen( [ X.Event.SUCCESS, X.Event.ERROR, X.Event.PROGRESS ], updateOAuth2State );
  */
 X[ 'OAuth2' ] = X_EventDispatcher[ 'inherits' ](
                'X.OAuth2',
@@ -50,12 +66,25 @@ X[ 'OAuth2' ] = X_EventDispatcher[ 'inherits' ](
                                // TODO kill の cancel
                        },
 
+                       /**
+                        * OAuth2 の状態。
+                        * <dl>
+                        * <dt>0 : <dd>未接続
+                        * <dt>1 : <dd>認可用 window がポップアップ中
+                        * <dt>2 : <dd>コードを認可中
+                        * <dt>3 : <dd>トークンのリフレッシュ中
+                        * <dt>4 : <dd>接続
+                        * </dl>
+                        * @return {number}
+                        */
                        'state' : function(){
                                return X_Pair_get( this ).oauth2State || 0;
                        },
                        
+                       /**
+                        * 認可用 window をポップアップする。ポップアップブロックが働かないように必ず pointer event 内で呼ぶこと。
+                        */
                        'requestAuth' : function(){
-                               // pointer event 内で呼ぶこと
                                // 二つ以上の popup を作らない
                                if( X_NET_OAUTH2_authorizationWindow ) return;
                                
@@ -85,6 +114,9 @@ X[ 'OAuth2' ] = X_EventDispatcher[ 'inherits' ](
                                this[ 'asyncDispatch' ]( { type : X_EVENT_PROGRESS, message : 'Start to auth.' } );
                        },
                        
+                       /**
+                        * 認可プロセスのキャンセル。ポップアップを閉じて認可用の通信は中断する。
+                        */
                        'cancelAuth' : function(){
                                var pair = X_Pair_get( this );
                                
@@ -103,6 +135,9 @@ X[ 'OAuth2' ] = X_EventDispatcher[ 'inherits' ](
                                this[ 'asyncDispatch' ]( X_EVENT_CANCELED );
                        },
                        
+                       /**
+                        * アクセストークンのリフレッシュ。
+                        */
                        'refreshToken' : function(){
                                /* TODO 自動リフレッシュ
                                 *                              var expires_at = this._getAccessTokenExpiry();
index e923109..1e6d9e5 100644 (file)
 \r
 var X_Audio_BACKENDS     = []; // Array.<Hash>\r
 \r
-/*\r
- * X_EVENT_BACKEND_READY\r
- * X_EVENT_BACKEND_NONE\r
- * \r
- * X_EVENT_READY   再生可能、実際の状態は canplay から loadeddata まで様々、、、\r
- * X_EVENT_ERROR\r
- *   1 : ユーザーによってメディアの取得が中断された\r
- *   2 : ネットワークエラー\r
- *   3 : メディアのデコードエラー\r
- *   4 : メディアがサポートされていない\r
+/**\r
+ * <p>複数のバックエンドから、与えられた音声を再生可能なものを見つけ、音声を再生します。\r
+ * <p>HTMLAudio の動作・機能がブラウザ毎にバラバラなのに業を煮やし、メソッドやイベントは独自に定義しています。\r
+ * <h4>バックエンドの種類</h4>\r
+ * <p>HTMLAudio, WebAudio, Silverlight\r
+ * <h4>イベント</h4>\r
+ * <dl>\r
+ * <dt>X.Event.BACKEND_READY <dd>音声(src リスト)を再生可能なバックエンドが見つかった。\r
+ * <dt>X.Event.BACKEND_NONE  <dd>音声を再生可能なバックエンドが見つからなかった。\r
+ * <dt>X.Event.READY         <dd>再生可能、実際の状態は canplay から loadeddata まで様々、、、\r
+ * <dt>X.Event.ERROR         <dd><ul>\r
+ *   <li> 1 : ユーザーによってメディアの取得が中断された\r
+ *   <li> 2 : ネットワークエラー\r
+ *   <li> 3 : メディアのデコードエラー\r
+ *   <li> 4 : メディアがサポートされていない\r
+ * </ul>\r
+ * <dt>X.Event.MEDIA_PLAYING <dd>再生中に1秒以下のタイミングで発生.currentTime が取れる?\r
+ * <dt>X.Event.MEDIA_LOOP    <dd>ループ直前に発生、キャンセル可能\r
+ * <dt>X.Event.MEDIA_LOOPED  <dd>ループ時に発生\r
+ * <dt>X.Event.MEDIA_ENDED   <dd>再生位置の(音声の)最後についた\r
+ * <dt>X.Event.MEDIA_PAUSED  <dd>ポーズした\r
+ * <dt>X.Event.MEDIA_WAITING <dd>再生中に音声が待機状態に。間もなく X.Event.MEDIA_PLAYING に移行。\r
+ * <dt>X.Event.MEDIA_SEEKING <dd>シーク中に音声が待機状態に。間もなく X.Event.MEDIA_PLAYING に移行。\r
+ * </dl>\r
  * \r
- * X_EVENT_MEDIA_PLAYING 再生中に1秒以下のタイミングで発生.currentTime が取れる?\r
- * X_EVENT_MEDIA_LOOP    ループ直前に発生、キャンセル可能\r
- * X_EVENT_MEDIA_LOOPED  ループ時に発生\r
- * X_EVENT_MEDIA_ENDED   再生位置の(音声の)最後についた\r
- * X_EVENT_MEDIA_PAUSED  ポーズした\r
- * X_EVENT_MEDIA_WAITING 再生中に音声が待機状態に。間もなく X_EVENT_MEDIA_PLAYING に移行。\r
- * X_EVENT_MEDIA_SEEKING シーク中に音声が待機状態に。間もなく X_EVENT_MEDIA_PLAYING に移行。\r
+ * @alias X.Audio\r
+ * @class 各種オーディオ機能をラップしインターフェイスを共通化する。\r
+ * @constructs Audio\r
+ * @extends {EventDispatcher}\r
+ * @param {array|string} sourceList\r
+ * @param {object=} opt_option\r
+ * @example //\r
+ * var audio = X.Audio( [ 'etc/special.mp3', 'etc/special.ogg', 'etc/special.wav' ] )\r
+                                       .listenOnce( X.Event.READY, onReady );\r
  */\r
-\r
-// TODO この内容は、AudioBackend の Abstract クラスにする。AudioSprite は Audio ではなく AudioBackend をマネージする\r
 X[ 'Audio' ] = X_EventDispatcher[ 'inherits' ](\r
        'X.Audio',\r
        X_Class.POOL_OBJECT,\r
        {\r
+               /**\r
+                * 音声の url。X.Event.BACKEND_READY で設定される。\r
+                * @alias Audio.prototype.source\r
+                * @type {string}\r
+                */\r
                'source'      : '',\r
+               /**\r
+                * 音声再生バックエンドの名前。X.Event.BACKEND_READY で設定される。\r
+                * @alias Audio.prototype.backendName\r
+                * @type {string}\r
+                */\r
                'backendName' : '',\r
                \r
                'Constructor' : function( sourceList, opt_option ){\r
@@ -48,24 +72,37 @@ X[ 'Audio' ] = X_EventDispatcher[ 'inherits' ](
                        this[ 'listenOnce' ]( [ X_EVENT_BACKEND_READY, X_EVENT_BACKEND_NONE, X_EVENT_KILL_INSTANCE ], X_Audio_handleEvent );\r
                },\r
                \r
+               /**\r
+                * 再生。開始位置・終了位置、ループの有無、ループ以降の開始位置、ループ以降の終了位置\r
+                * @alias Audio.prototype.play\r
+                */\r
                'play' : function( startTime, endTime, loop, loopStartTime, loopEndTime ){\r
                        var pair = X_Pair_get( this );\r
                        pair && pair.play( startTime, endTime, loop, loopStartTime, loopEndTime );\r
                        return this;\r
                },\r
-               \r
+               /**\r
+                * シーク\r
+                * @alias Audio.prototype.seek\r
+                */\r
                'seek' : function( seekTime ){\r
                        var pair = X_Pair_get( this );\r
                        pair && pair.seek( seekTime );\r
                        return this;\r
                },\r
-               \r
+               /**\r
+                * ポーズ\r
+                * @alias Audio.prototype.pause\r
+                */\r
                'pause' : function(){\r
                        var pair = X_Pair_get( this );\r
                        pair && pair.pause();\r
                        return this;\r
                },\r
-               \r
+               /**\r
+                * 状態の getter と setter\r
+                * @alias Audio.prototype.state\r
+                */\r
                'state' : function( obj ){\r
                        var pair = X_Pair_get( this );\r
                        if( obj === undefined ){\r
@@ -87,25 +124,37 @@ X[ 'Audio' ] = X_EventDispatcher[ 'inherits' ](
                        pair && pair.setState( obj );\r
                        return this;\r
                },              \r
-               \r
+               /**\r
+                * ループの getter と setter\r
+                * @alias Audio.prototype.loop\r
+                */\r
                'loop' : function( v ){\r
                        var pair = X_Pair_get( this );\r
                        pair && pair.loop( v );\r
                        return this;\r
                },\r
-\r
+               /**\r
+                * ボリュームの getter と setter 実装不十分!\r
+                * @alias Audio.prototype.volume\r
+                */\r
                'volume' : function( v ){\r
                        var pair = X_Pair_get( this );\r
                        pair && pair.volume( v );\r
                        return this;\r
                },\r
-\r
+               /**\r
+                * 再生位置。\r
+                * @alias Audio.prototype.currentTime\r
+                */\r
                'currentTime' : function( v ){\r
                        var pair = X_Pair_get( this );\r
                        pair && pair.currentTime( v );\r
                        return this;\r
                },\r
-\r
+               /**\r
+                * 再生中か?\r
+                * @alias Audio.prototype.isPlaying\r
+                */\r
                'isPlaying' : function(){\r
                        var pair = X_Pair_get( this );\r
                        return pair && pair.playing;\r
@@ -164,7 +213,6 @@ function X_Audio_onEndedDetection( e, xaudio, sourceList, option, source, ext, s
        var i = X_Audio_BACKENDS.indexOf( this ), backend;\r
        \r
        if( e.canPlay ){\r
-               xaudio._backend = i;\r
                xaudio[ 'asyncDispatch' ]( {\r
                        type          : X_EVENT_BACKEND_READY,\r
                        'option'      : option,\r
index fcf91f4..c1258a3 100644 (file)
@@ -30,8 +30,7 @@ var X_Audio_HTMLAudio_playTrigger =
        X_Audio_HTMLAudioWrapper_ieMobile9Fix    = ( X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ] ),\r
        X_Audio_HTMLAudioWrapper_durationFix     = ( !X_Audio_HTMLAudioWrapper_currentTimeFix && 12 <= X_UA[ 'Opera' ] ),\r
        \r
-       X_Audio_HTMLAudioWrapper_shortPlayFix    = //X_UA[ 'AndroidBrowser2' ],\r
-                                                                                               X_UA[ 'AndroidBrowser' ] && X_UA[ 'AndroidBrowserWebkit' ] < 534.3, // Android 4.1.1 でも遭遇\r
+       X_Audio_HTMLAudioWrapper_shortPlayFix    = X_UA[ 'AndroidBrowser' ] && X_UA[ 'AndroidWebkit' ] <= 534.3, // Android 4.1.1 でも遭遇\r
        \r
        X_Audio_codecs;\r
 \r
index 45790ae..d6a40b6 100644 (file)
@@ -5,10 +5,10 @@
  * iframe 内で生成して、Audio Sprite の preset で再生できないか?\r
  */\r
 var X_Audio_Sprite_shouldUse        = window.HTMLAudioElement && ( X_UA[ 'iOS' ] || X_UA[ 'AndroidBrowser' ] || X_UA[ 'OperaMobile' ] || X_UA[ 'OperaTablet' ] ), // Flash がない\r
-       X_Audio_Sprite_useVideoForMulti = 4 <= X_UA[ 'AndroidBrowser' ] && 534.3 < X_UA[ 'AndroidBrowserWebkit' ], // ドスパラパッドはビデオのインライン再生が不可 \r
+       X_Audio_Sprite_useVideoForMulti = 4 <= X_UA[ 'AndroidBrowser' ] && 534.3 < X_UA[ 'AndroidWebkit' ], // ドスパラパッドはビデオのインライン再生が不可 \r
        X_Audio_Sprite_needTouchAndroid = X_Audio_Sprite_useVideoForMulti,      \r
        X_Audio_Sprite_needTouchFirst   = X_UA[ 'iOS' ] || X_Audio_Sprite_needTouchAndroid || ( X_UA[ 'WinPhone' ] && X_UA[ 'IE9' ] ),\r
-       X_Audio_Sprite_enableMultiTrack = !( X_UA[ 'iOS' ] && !X_Audio_WebAudio_context ) && !( X_UA[ 'AndroidBrowser4' ] && X_UA[ 'AndroidBrowserWebkit' ] <= 534.3 ),\r
+       X_Audio_Sprite_enableMultiTrack = !( X_UA[ 'iOS' ] && !X_Audio_WebAudio_context ) && !( X_UA[ 'AndroidBrowser4' ] && X_UA[ 'AndroidWebkit' ] <= 534.3 ),\r
        X_Audio_Sprite_enableVolume     = window.HTMLAudioElement && ( !X_UA[ 'iOS' ] && !X_UA[ 'AndroidBrowser' ] && !X_UA[ 'OperaMobile' ] && !X_UA[ 'OperaTablet' ] ), // TODO fennec は 25以上\r
        X_Audio_Sprite_maxTracks        = !X_Audio_Sprite_enableMultiTrack ? 1 : X_Audio_Sprite_useVideoForMulti ? 2 : 9,\r
        X_Audio_Sprite_lengthSilence    = 10000, // 一番最初の無音部分の長さ\r
index 5bfc6c9..b2dfe24 100644 (file)
@@ -42,6 +42,10 @@ var XUI_AbstractUINode = X_EventDispatcher[ 'inherits' ](
                contentT          : 0,\r
                contentR          : 0,\r
                contentB          : 0,\r
+               paddingL          : 0,\r
+               paddingT          : 0,\r
+               borderL           : 0,\r
+               borderT           : 0,\r
                boxSizingOffsetLR : 0,\r
                boxSizingOffsetTB : 0,          \r
                contentWidth      : XUI_Attr_AUTO,\r
@@ -352,14 +356,16 @@ var XUI_AbstractUINode = X_EventDispatcher[ 'inherits' ](
                 * X_Node_BoxModel の情報を引きながら top,left,width,height,padding,border の設定\r
                 */\r
                updateLayout : function(){\r
-                       var x = this.boxX,\r
-                               y = this.boxY;\r
+                       var x = this.boxX + ( this.parentData ? this.parentData.paddingL : 0 ),\r
+                               y = this.boxY + ( this.parentData ? this.parentData.paddingT : 0 ),\r
+                               w = X_UA[ 'IE5x' ] ? this.boxWidth  : this.contentWidth,\r
+                               h = X_UA[ 'IE5x' ] ? this.boxHeight : this.contentHeight;\r
 \r
                        this.xnode\r
-                               [ 'css' ]( 'left',        x ? x + 'em' : 0 )\r
-                               [ 'css' ]( 'top',         y ? y + 'em' : 0 )\r
-                               [ 'css' ]( 'width',       this.noWidth  ? 'auto' : this.contentWidth  ? this.contentWidth  + 'em' : 0 )\r
-                               [ 'css' ]( 'height',      this.noHeight ? 'auto' : this.contentHeight ? this.contentHeight + 'em' : 0 )\r
+                               [ 'css' ]( 'left',        x ? x + 'em' : 0 ) // 親の padding 分ずらす\r
+                               [ 'css' ]( 'top',         y ? y + 'em' : 0 ) // 親の padding 分ずらす\r
+                               [ 'css' ]( 'width',       this.noWidth  ? 'auto' : w ? w + 'em' : 0 )\r
+                               [ 'css' ]( 'height',      this.noHeight ? 'auto' : h ? h + 'em' : 0 )\r
                                [ 'css' ]( 'padding',     XUI_AbstractUINode_createCssText( this, 'padding' ) )\r
                                [ 'css' ]( 'borderWidth', XUI_AbstractUINode_createCssText( this, 'borderWidth' ) );\r
                },\r
@@ -394,6 +400,8 @@ var XUI_AbstractUINode = X_EventDispatcher[ 'inherits' ](
                        };\r
                        this.contentL = borderL + paddingL;\r
                        this.contentR = borderR + paddingR;\r
+                       this.paddingL = paddingL;\r
+                       this.borderL  = borderL;\r
                        \r
                        if( this.constraintW ? allowedW !== XUI_Attr_AUTO : !this.autoWidth && ( allowedW !== XUI_Attr_AUTO || !this.percentWidth ) ){\r
                                if( this.constraintW ){ // 制約レイアウト\r
@@ -401,24 +409,21 @@ var XUI_AbstractUINode = X_EventDispatcher[ 'inherits' ](
                                } else {\r
                                        contentW = XUI_AbstractUINode_calcFinalValue( attrs[ XUI_Attr_Support.width.No ], attrs[ XUI_Attr_Support.minWidth.No ], attrs[ XUI_Attr_Support.maxWidth.No ], allowedW );                                     \r
                                };\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.contentWidth      = contentW + boxMinus;\r
+                               this.boxWidth          = this.contentWidth + 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 = XUI_AbstractUINode_ceil( XUI_AbstractUINode_calcValue( attrs[ XUI_Attr_Support.minWidth.No ], allowedW ) + boxMinus );\r
-                               this.maxContentWidth = XUI_AbstractUINode_ceil( XUI_AbstractUINode_calcValue( attrs[ XUI_Attr_Support.maxWidth.No ], allowedW ) + 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
+                               this.minContentWidth   = XUI_AbstractUINode_ceil( XUI_AbstractUINode_calcValue( attrs[ XUI_Attr_Support.minWidth.No ], allowedW ) + boxMinus );\r
+                               this.maxContentWidth   = XUI_AbstractUINode_ceil( XUI_AbstractUINode_calcValue( attrs[ XUI_Attr_Support.maxWidth.No ], allowedW ) + boxMinus );\r
+                               this.minBoxWidth       = this.minContentWidth + this.contentL + this.contentR;\r
+                               this.maxBoxWidth       = this.maxContentWidth + this.contentL + this.contentR;\r
+                               this.contentWidth      = this.minContentWidth;\r
+                               this.boxWidth          = this.minBoxWidth;\r
+                               this.boxSizingOffsetLR = boxMinus;\r
                        };\r
                        \r
                        paddingT  = XUI_AbstractUINode_calcValue( attrs[ XUI_Attr_Support.padding.No + 0 ], allowedH );// paddingTRBL の % 指定は 最大幅に対して TB でも幅に対して\r
@@ -435,6 +440,8 @@ var XUI_AbstractUINode = X_EventDispatcher[ 'inherits' ](
                        };\r
                        this.contentT = borderT + paddingT;\r
                        this.contentB = borderB + paddingB;\r
+                       this.paddingT = paddingT;\r
+                       this.borderT  = borderT;\r
                        \r
                        // Height\r
                        if( this.constraintH ? allowedH !== XUI_Attr_AUTO : !this.autoHeight && ( allowedH !== XUI_Attr_AUTO || !this.percentHeight ) ){\r
@@ -443,24 +450,21 @@ var XUI_AbstractUINode = X_EventDispatcher[ 'inherits' ](
                                } else {\r
                                        contentH = XUI_AbstractUINode_calcFinalValue( attrs[ XUI_Attr_Support.height.No ], attrs[ XUI_Attr_Support.minHeight.No ], attrs[ XUI_Attr_Support.maxHeight.No ], allowedH );\r
                                };                      \r
-                               this.contentHeight = contentH + boxMinus;\r
-                               //this.scrollHeight  = this.contentHeight + this.contentT + this.contentB;\r
-                               this.boxHeight     = contentH - boxMinus + this.contentT + this.contentB; // padding-box の場合 border だけ足される\r
+                               this.contentHeight     = contentH + boxMinus;\r
+                               this.boxHeight         = this.contentHeight + this.contentT + this.contentB; // padding-box の場合 border だけ足される\r
                                this.boxSizingOffsetTB = boxMinus;\r
                                delete this.minContentHeight;\r
                                delete this.maxContentHeight;\r
                                delete this.minBoxHeight;\r
                                delete this.maxBoxHeight;\r
                        } else {\r
-                               this.minContentHeight = XUI_AbstractUINode_ceil( XUI_AbstractUINode_calcValue( attrs[ XUI_Attr_Support.minHeight.No ], allowedH ) + boxMinus );\r
-                               this.maxContentHeight = XUI_AbstractUINode_ceil( XUI_AbstractUINode_calcValue( attrs[ XUI_Attr_Support.maxHeight.No ], allowedH ) + boxMinus );                         \r
-                               this.minBoxHeight = this.minContentHeight - boxMinus + this.contentT + this.contentB;\r
-                               this.maxBoxHeight = this.maxContentHeight - boxMinus + this.contentT + this.contentB;\r
-               \r
-                               //delete this.contentHeight;\r
-                               //delete this.scrollHeight;\r
-                               //delete this.boxHeight;\r
-                               //delete this.boxSizingOffsetTB;\r
+                               this.minContentHeight  = XUI_AbstractUINode_ceil( XUI_AbstractUINode_calcValue( attrs[ XUI_Attr_Support.minHeight.No ], allowedH ) + boxMinus );\r
+                               this.maxContentHeight  = XUI_AbstractUINode_ceil( XUI_AbstractUINode_calcValue( attrs[ XUI_Attr_Support.maxHeight.No ], allowedH ) + boxMinus );                                \r
+                               this.minBoxHeight      = this.minContentHeight + this.contentT + this.contentB;\r
+                               this.maxBoxHeight      = this.maxContentHeight + this.contentT + this.contentB;\r
+                               this.contentHeight     = this.minContentHeight;\r
+                               this.boxHeight         = this.minBoxHeight;\r
+                               this.boxSizingOffsetTB = boxMinus;\r
                        };\r
                        \r
                        if( this.parentData && this.parentData.layout.overrideAttrsForChild.left ){\r
@@ -623,17 +627,17 @@ var XUI_AbstractUINode = X_EventDispatcher[ 'inherits' ](
                                borderL  = XUI_AbstractUINode_calcValue( attrs[ XUI_Attr_Support.borderWidth.No + 3 ], contentW );\r
                                contentPlus = 0;\r
                                switch( box ){\r
-                                       case 3 : // border-box\r
-                                                contentPlus  = borderR + borderL;\r
+                                       case 1 : // content-box\r
+                                                contentPlus  = paddingR + paddingL;\r
                                        case 2 : // padding-box\r
-                                                contentPlus += paddingR + paddingL;\r
-                                       // case 1 : // content-box\r
+                                                contentPlus += borderR + borderL;\r
+                                       // case 3 : // border-box\r
                                };\r
                                \r
                                if( !this.constraintW ){\r
                                        contentW += contentPlus;\r
-                                       min = XUI_AbstractUINode_calcValue( attrs[ XUI_Attr_Support.minWidth.No ], contentW );\r
-                                       max = XUI_AbstractUINode_calcValue( attrs[ XUI_Attr_Support.maxWidth.No ], contentW );\r
+                                       min = this.minBoxWidth = XUI_AbstractUINode_calcValue( attrs[ XUI_Attr_Support.minWidth.No ], contentW );\r
+                                       max = this.maxBoxWidth = XUI_AbstractUINode_calcValue( attrs[ XUI_Attr_Support.maxWidth.No ], contentW );\r
                                        if( contentW < min && contentPlus < min ){\r
                                                this.contentWidth = min - contentPlus;\r
                                        } else\r
@@ -643,6 +647,8 @@ var XUI_AbstractUINode = X_EventDispatcher[ 'inherits' ](
                                };\r
                                this.contentL = borderL + paddingL;\r
                                this.contentR = borderR + paddingR;\r
+                               this.paddingL = paddingL;\r
+                               this.borderL  = borderL;\r
                                this.boxWidth = this.contentWidth + this.contentL + this.contentR;\r
                        };\r
                        // Height\r
@@ -654,16 +660,16 @@ var XUI_AbstractUINode = X_EventDispatcher[ 'inherits' ](
                                borderB     = XUI_AbstractUINode_calcValue( attrs[ XUI_Attr_Support.borderWidth.No  + 2 ], contentH );\r
                                contentPlus = 0;\r
                                switch( box ){\r
-                                       case 3 : // border-box\r
-                                                contentPlus  = borderT + borderB;\r
+                                       case 1 : // content-box\r
+                                                contentPlus  = paddingT + paddingB;\r
                                        case 2 : // padding-box\r
-                                                contentPlus += paddingT + paddingB;\r
-                                       // case 1 : // content-box\r
+                                                contentPlus += borderT + borderB;\r
+                                       // case 3 : // border-box\r
                                };\r
                                if( !this.constraintH ){\r
                                        contentH += contentPlus;\r
-                                       min = XUI_AbstractUINode_calcValue( attrs[ XUI_Attr_Support.minHeight.No ], contentH );\r
-                                       max = XUI_AbstractUINode_calcValue( attrs[ XUI_Attr_Support.maxHeight.No ], contentH );\r
+                                       min = this.minBoxHeight = XUI_AbstractUINode_calcValue( attrs[ XUI_Attr_Support.minHeight.No ], contentH );\r
+                                       max = this.maxBoxHeight = XUI_AbstractUINode_calcValue( attrs[ XUI_Attr_Support.maxHeight.No ], contentH );\r
                                        if( contentH < min && contentPlus < min ){\r
                                                this.contentHeight = min - contentPlus;\r
                                        } else\r
@@ -673,6 +679,8 @@ var XUI_AbstractUINode = X_EventDispatcher[ 'inherits' ](
                                };\r
                                this.contentT  = borderT + paddingT;\r
                                this.contentB  = borderB + paddingB;\r
+                               this.paddingT  = paddingT;\r
+                               this.borderT   = borderT;\r
                                this.boxHeight = this.contentHeight + this.contentT + this.contentB;\r
                        };\r
                },\r
index 1d01e5e..0725fc3 100644 (file)
@@ -28,10 +28,11 @@ var XUI_Layout_Canvas = X[ 'UI' ][ 'Layout' ][ 'Canvas' ] = XUI_createLayout( {
                \r
                _x = data.contentL;\r
                _y = data.contentT;\r
-               _w = data.contentWidth;\r
-               _h = data.contentHeight;\r
+               _w = data.contentWidth//  !== XUI_Attr_AUTO ? data.contentWidth  : data.minContentWidth;\r
+               _h = data.contentHeight// !== XUI_Attr_AUTO ? data.contentHeight : data.minContentHeight;\r
 \r
                if( ( uinodes = data.uinodes ) && ( l = uinodes.length ) ){\r
+                       console.log( _w + ' x ' + _h + ' l:' + l );\r
                        for( i = 0; i < l; ++i ){\r
                                node = uinodes[ i ];\r
                                node.calculate( false, _x, _y, _w, _h );\r
@@ -45,7 +46,7 @@ var XUI_Layout_Canvas = X[ 'UI' ][ 'Layout' ][ 'Canvas' ] = XUI_createLayout( {
 \r
                if( !isNeedsDetection ){\r
                        data.boxX += x;\r
-                       data.boxY += y;                 \r
+                       data.boxY += y;\r
                };\r
                return true;\r
        }\r
index d56665b..2a6be63 100644 (file)
@@ -49,10 +49,12 @@ var XUI_Layout_Vertical = X[ 'UI' ][ 'Layout' ][ 'Vertical' ] = XUI_createLayout
 \r
                if( l ){\r
                        _w = 0;\r
+                       console.log( '-----------' );\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
+                               console.dir( node );\r
                                // 概算のみ\r
                                if( autoW ){\r
                                        if( node.boxWidth !== XUI_Attr_AUTO ){\r
@@ -74,7 +76,7 @@ var XUI_Layout_Vertical = X[ 'UI' ][ 'Layout' ][ 'Vertical' ] = XUI_createLayout
 \r
                if( detectionPhase ){\r
                        if( autoW ) data.contentWidth  = _w;\r
-                       if( autoH ) data.contentHeight = _y;\r
+                       if( autoH ) data.contentHeight = _y - data.contentT;\r
                        _y = data.contentT;\r
                        for( i = 0; i < l; ++i ){\r
                                node = uinodes[ i ];\r
index 1fe9486..73f62b6 100644 (file)
@@ -515,7 +515,7 @@ X.UI.ScrollBox = X.UI.ChromeBox.inherits(
        {\r
                Constructor : function(){\r
                        var args = [\r
-                                               XUI_Layout_Canvas,                      \r
+                                               XUI_Layout_Vertical,                    \r
                                                {\r
                                                        name      : 'ScrollBox-Scroller',\r
                                                        role      : 'container',\r