\r
-X.UI.Layout.Canvas = X.UI.Layout.create( {\r
+var XUI_Layout_Canvas = X[ 'UI' ][ 'Layout' ][ 'Canvas' ] = XUI_createLayout( {\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
+ role : [ 0, XUI_Dirty.CLEAN, XUI_Attr_USER.UINODE, XUI_Attr_Type.INIT_ONLY | XUI_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
+ width : [ '100%', XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT ],\r
+ maxWidth : [ XUI_Attr_AUTO, XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT ],\r
+ height : [ 0, XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT ],\r
+ maxHeight : [ XUI_Attr_AUTO, XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT ]\r
},\r
\r
overrideAttrsForChild : {\r
\r
data.preMesure( w, h );\r
\r
- if( isNeedsDetection && ( data.boxWidth === X.UI.Attr.AUTO || data.boxHeight === X.UI.Attr.AUTO ) ) return false;\r
+ console.log( w + ' > ' + data.boxWidth );\r
+ \r
+ // data.boxWidth と data.boxHeight のどちらかでも Infinity\r
+ if( isNeedsDetection && data.boxWidth + data.boxHeight === XUI_Attr_AUTO ) return false;\r
\r
_x = data.contentL;\r
_y = data.contentT;\r
_h = data.contentHeight;\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
} else\r
- if( data.contentHeight === X.UI.Attr.AUTO ){\r
- data.contentHeight = data.minContentHeight !== X.UI.Attr.AUTO ? data.minContentHeight : 0;\r
+ if( data.contentHeight === XUI_Attr_AUTO ){\r
+ data.contentHeight = data.contentHeightMin !== XUI_Attr_AUTO ? data.contentHeightMin : 0;\r
};\r
\r
data.postMesure();\r
- data.updateLayout( x + data.boxX, y + data.boxY );\r
- \r
+\r
+ if( !isNeedsDetection ){\r
+ data.boxX += x;\r
+ data.boxY += y;\r
+ };\r
return true;\r
}\r
});\r
\r
\r
-X.UI._Box = X.UI._AbstractUINode.inherits(\r
+var XUI_Box = XUI_AbstractUINode.inherits(\r
'X.UI._Box',\r
- X_Class.PRIVATE_DATA | X_Class.SUPER_ACCESS, // 現状 super 指定がないとconstructor未定擬時に親のconstructor が使われない\r
+ X_Class.NONE,\r
{\r
+ usableAttrs : XUI_Attr_createAttrDef( XUI_AbstractUINode.prototype.usableAttrs, XUI_Layout_Canvas.overrideAttrsForSelf ),\r
+ \r
layout : null,\r
uinodes : null,\r
xnodes : null,\r
pointerChildren : true,\r
through : false,\r
\r
- scrollingX : 0,\r
- scrollingY : 0,\r
+ scrollingX : 0, // TODO 現在のスクロール位置\r
+ scrollingY : 0, // TODO \r
\r
- Constructor : function( layout, args ){\r
+ Constructor : function( user, layout, args ){\r
var i = 0,\r
- l = args.length,\r
+ l = args && args.length,\r
j = -1,\r
- uinodes, arg, _data, attrs, support;\r
+ uinodes, arg, _data, attrs, attrDef, p;\r
+ \r
+ //if( !args.length ) args = [ args ];\r
\r
- if( !this.User[ 'instanceOf' ]( X.UI.Box ) ){\r
+ if( !user[ 'instanceOf' ]( X.UI.Box ) ){\r
//throw new Error( 'Box を継承したインスタンスだけが _Box のオーナーになれます' );\r
- }; \r
+ };\r
\r
+ this.User = user;\r
+ \r
+ // TODO デフォルトの attr 指定の中から XNODE に指定するものを集めて適用。\r
this.xnode = X_Doc_create( 'div' );\r
\r
// すでに定義されていればそちらを採用\r
- // supportAttrs や attrClass が、layout を元に上書きされているため\r
+ // usableAttrs や attrClass が、layout を元に上書きされているため\r
this.layout = this.layout || layout;\r
\r
for( ; i < l; ++i ){\r
arg = args[ i ];\r
if( arg[ 'instanceOf' ] && arg[ 'instanceOf' ]( X.UI.AbstractUINode ) ){\r
- _data = X_Class_getPrivate( arg );\r
+ _data = X_Pair_get( arg );\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' ]( Node ) ){\r
- //this.layout = arg;\r
- } else\r
- if( arg[ 'instanceOf' ] && arg[ 'instanceOf' ]( X.UI.Layout.Base ) ){\r
- //this.layout = arg;\r
- } else\r
if( X_Type_isObject( arg ) ){\r
if( attrs ){\r
attrs = X_Class_override( attrs, arg );\r
\r
for( p in attrs ){\r
if( X_EMPTY_OBJECT[ p ] ) continue;\r
- ( support = this.supportAttrs[ p ] ) && this.setAttr( p, support, attrs[ p ] );\r
+ ( attrDef = this.usableAttrs[ p ] ) && this.setAttr( p, attrDef, attrs[ p ] );\r
};\r
},\r
/* Rellay */\r
initialize : function( root, rootData, parent, parentData ){\r
var uinodes = this.uinodes,\r
i = uinodes && uinodes.length;\r
- this.root = root;\r
- this.rootData = rootData;\r
- this.parent = parent;\r
- this.parentData = parentData;\r
- //this.xnode = X_Doc_create( 'div' );\r
\r
if( i ){\r
for( ; i; ){\r
}; \r
};\r
\r
- this.phase = 1;\r
- this.User[ 'dispatch' ]( { type : X.UI.Event.INIT } );\r
+ XUI_AbstractUINode.prototype.initialize.apply( this, arguments );\r
},\r
\r
addToParent : function( parentXNode ){\r
l = uinodes && uinodes.length,\r
i;\r
\r
- parentXNode && parentXNode[ 'append' ]( this.xnode );\r
- \r
if( l ){\r
for( i = 0; i < l; ++i ){\r
uinodes[ i ].addToParent( this.xnode );\r
};\r
};\r
\r
- this.phase = 2;\r
- this.User[ 'dispatch' ]( { type : X.UI.Event.ADDED } );\r
+ XUI_AbstractUINode.prototype.addToParent.apply( this, arguments );\r
},\r
\r
/* Rellay */\r
}; \r
};\r
\r
- X.UI._AbstractUINode.prototype.creationComplete.apply( this, arguments );\r
+ XUI_AbstractUINode.prototype.creationComplete.apply( this, arguments );\r
},\r
\r
calculate : function( isNeedsDetection, x, y, w, h ){\r
this.phase = 4;\r
return ret;\r
},\r
+ \r
+ updateLayout : function(){\r
+ var uinodes = this.uinodes, i, l;\r
+\r
+ if( uinodes && ( l = uinodes.length ) ){\r
+ for( i = 0; i < l; ++i ){\r
+ uinodes[ i ].updateLayout();\r
+ }; \r
+ };\r
+ XUI_AbstractUINode.prototype.updateLayout.call( this );\r
+ },\r
\r
capcher : function( x, y ){\r
var uinodes, child, _x, _y, hit, i;\r
\r
addAt : function( index, _uinodes ){\r
//console.log( '# AddAt ' + this.phase )\r
- var uinodes = this.uinodes,\r
+ var uinodes = this.uinodes || ( this.uinodes = [] ),\r
num = uinodes.length,\r
p1 = 1 <= this.phase,\r
p2 = 2 <= this.phase,\r
\r
//console.log( '### AddAt ' + this.phase )\r
for( l = _uinodes.length; i < l; ++i ){\r
- data = X_Class_getPrivate( _uinodes[ i ] );\r
+ data = X_Pair_get( _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.xnode.insertBefore( data.xnode, uinodes[ index + i ].xnode );\r
+ if( index < num ){\r
_p2 && uinodes[ index + i ].xnode[ 'prev' ]( data.xnode );\r
_p2 && data.addToParent( this.xnode );\r
uinodes.splice( index + i, 0, data );\r
} else {\r
_p2 && data.addToParent( this.xnode );\r
- uinodes[ uinodes.length ] = data; \r
+ uinodes[ uinodes.length ] = data;\r
};\r
p3 && data.phase < 3 && data.creationComplete();\r
};\r
\r
//console.log( '### AddAt ' + this.phase )\r
for( ; i; ){\r
- data = X_Class_getPrivate( _uinodes[ --i ] );\r
+ data = X_Pair_get( _uinodes[ --i ] );\r
if( ( n = uinodes.indexOf( data ) ) !== -1 ){\r
uinodes.splice( n, 1 );\r
data._remove();\r
\r
X.UI.Box = X.UI.AbstractUINode.inherits(\r
'Box',\r
- X_Class.SUPER_ACCESS,\r
- X.UI._Box,\r
+ X_Class.NONE,\r
{\r
Constructor : function(){\r
- X_Class_newPrivate( this, X.UI.Layout.Canvas, arguments );\r
+ X_Pair_create( this, XUI_Box( this, XUI_Layout_Canvas, arguments ) );\r
},\r
\r
- add : function( node /* , node, node ... */ ){\r
- X_Class_getPrivate( this ).addAt( this.numNodes() + 1, Array.prototype.slice.call( arguments ) );\r
+ add : function( /* node, node, node ... */ ){\r
+ X_Pair_get( this ).addAt( this.numNodes() + 1, X_Array_copy( arguments ) );\r
return this;\r
},\r
- addAt : function( index, node /* , node, node ... */ ){\r
+ addAt : function( index /* , node , node, node ... */ ){\r
+ var nodes;\r
if( index < 0 ) index = 0;\r
- X_Class_getPrivate( this ).addAt( arguments[ 0 ], Array.prototype.slice.call( arguments, 1 ) );\r
+ nodes = X_Array_copy( arguments );\r
+ X_Pair_get( this ).addAt( nodes.shift(), nodes );\r
return this;\r
},\r
- remove : function( node /* , node, node ... */ ){\r
- X_Class_getPrivate( this )[ 'remove' ]( Array.prototype.slice.call( arguments ) );\r
+ remove : function( /* node, node, node ... */ ){\r
+ X_Pair_get( this )[ 'remove' ]( X_Array_copy( arguments ) );\r
return this;\r
},\r
removeAt : function( from, length ){\r
- X_Class_getPrivate( this ).removeAt( from, length );\r
+ X_Pair_get( this ).removeAt( from, length );\r
return this;\r
},\r
getNodesByClass : function( klass ){\r
var ret = [],\r
- uinodes = X_Class_getPrivate( this ).uinodes,\r
+ uinodes = X_Pair_get( this ).uinodes,\r
i, l, node;\r
if( !uinodes || uinodes.length === 0 ) return ret;\r
for( i = 0, l = uinodes.length; i < l; ++i ){\r
return this.getNodeAt( 0 );\r
},\r
getLastChild : function(){\r
- var uinodes = X_Class_getPrivate( this ).uinodes;\r
+ var uinodes = X_Pair_get( 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 uinodes = X_Class_getPrivate( this ).uinodes;\r
+ var uinodes = X_Pair_get( this ).uinodes;\r
return uinodes && uinodes[ index ].User || null;\r
},\r
numNodes : function(){\r
- var uinodes = X_Class_getPrivate( this ).uinodes;\r
+ var uinodes = X_Pair_get( this ).uinodes;\r
return uinodes && uinodes.length || 0;\r
+ },\r
+ \r
+ clone : function( opt_cloneListener ){\r
+ var clone = XUI_AbstractUINode.prototype.clone.call( this, opt_cloneListener ),\r
+ uinodes = X_Pair_get( this ).uinodes,\r
+ i = 0,\r
+ l = uinodes && uinodes.length,\r
+ copies = [];\r
+ \r
+ for( ; i < l; ++i ){\r
+ copies[ i ] = uinodes[ i ].clone( opt_cloneListener );\r
+ };\r
+\r
+ return l ? clone.add.apply( clone, copies ) : clone;\r
}\r
}\r
);\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
+ if( !shadow.prototype.layout && arg[ 'instanceOf' ] && arg[ 'instanceOf' ]( XUI_LayoutBase ) ){\r
layout = arg;\r
} else\r
if( ( klassDef = X_Class_getClassDef( arg ) ) && klassDef.isPrivate ){\r
};\r
\r
if( privateKlass ){\r
- supports = X.UI.Attr.createAttrDef( privateKlass.prototype.supportAttrs, layout.overrideAttrsForSelf );\r
+ /*\r
+ * スーパークラスの属性定義リストをレイアウトの持つ属性定義で上書きした新しい属性定義リストを作る。\r
+ */\r
+ supports = XUI_Attr_createAttrDef( privateKlass.prototype.usableAttrs, layout.overrideAttrsForSelf );\r
\r
klass = this.inherits( privateKlass );\r
- privateKlass.prototype.supportAttrs = supports,\r
- privateKlass.prototype.attrClass = X.UI.Attr.preset( privateKlass.prototype.attrClass, supports, attrs );\r
+ privateKlass.prototype.usableAttrs = supports;\r
+ privateKlass.prototype.attrClass = XUI_Attr_preset( privateKlass.prototype.attrClass, supports, attrs );\r
} else {\r
- supports = X.UI.Attr.createAttrDef( shadow.prototype.supportAttrs, layout.overrideAttrsForSelf );\r
+ supports = XUI_Attr_createAttrDef( shadow.prototype.usableAttrs, layout.overrideAttrsForSelf );\r
\r
klass = this.inherits(\r
boxName,\r
shadow.inherits(\r
{\r
layout : layout,\r
- supportAttrs : supports,\r
- attrClass : X.UI.Attr.preset( shadow.prototype.attrClass, supports, attrs )\r
+ usableAttrs : supports,\r
+ attrClass : XUI_Attr_preset( shadow.prototype.attrClass, supports, attrs )\r
}\r
)\r
); \r