\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
* @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, '<span>Hello,</span>', 'world.' );\r
*/\r
function X_Node_append( v ){\r
var i, l, xnodes, frg;\r
};\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
* 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
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
* <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
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
( 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
\r
};\r
\r
-/**\r
+/*\r
* https://gist.github.com/mmazer/5404301\r
* \r
* XmlHttpRequest's getAllResponseHeaders() method returns a string of response\r
* <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',
// 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;
this[ 'asyncDispatch' ]( { type : X_EVENT_PROGRESS, message : 'Start to auth.' } );
},
+ /**
+ * 認可プロセスのキャンセル。ポップアップを閉じて認可用の通信は中断する。
+ */
'cancelAuth' : function(){
var pair = X_Pair_get( this );
this[ 'asyncDispatch' ]( X_EVENT_CANCELED );
},
+ /**
+ * アクセストークンのリフレッシュ。
+ */
'refreshToken' : function(){
/* TODO 自動リフレッシュ
* var expires_at = this._getAccessTokenExpiry();
\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
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
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
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
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
* 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
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
* 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
};\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
} 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
};\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
} 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
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
};\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
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
};\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
\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
\r
if( !isNeedsDetection ){\r
data.boxX += x;\r
- data.boxY += y; \r
+ data.boxY += y;\r
};\r
return true;\r
}\r
\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
\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
{\r
Constructor : function(){\r
var args = [\r
- XUI_Layout_Canvas, \r
+ XUI_Layout_Vertical, \r
{\r
name : 'ScrollBox-Scroller',\r
role : 'container',\r