\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
},\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
},\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
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
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