X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F20_ui%2F08_Box.js;h=613400a7537c30a88e6cc2bf011893de72b1cd6c;hb=3d352d8bf476ab57cc333e8d02d0e6ea5efa69b7;hp=c1a3cbe5374ad6839e9a371523a47768c671aa76;hpb=dc5a75639232882249108b4f708916e9690e42b3;p=pettanr%2FclientJs.git diff --git a/0.6.x/js/20_ui/08_Box.js b/0.6.x/js/20_ui/08_Box.js index c1a3cbe..613400a 100644 --- a/0.6.x/js/20_ui/08_Box.js +++ b/0.6.x/js/20_ui/08_Box.js @@ -1,15 +1,15 @@ -X.UI.Layout.Canvas = X.UI.Layout.create( { +var XUI_Layout_Canvas = X[ 'UI' ][ 'Layout' ][ 'Canvas' ] = XUI_createLayout( { name : 'CanvasLayout', overrideAttrsForSelf : { selectable : false, - 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' ], + role : [ 0, XUI_Dirty.CLEAN, XUI_Attr_USER.UINODE, XUI_Attr_Type.INIT_ONLY | XUI_Attr_Type.LIST, 'none,chrome,container' ], - width : [ '100%', X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LENGTH | X.UI.Attr.Type.PERCENT ], - maxWidth : [ X.UI.Attr.AUTO, X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LENGTH | X.UI.Attr.Type.PERCENT ], - height : [ 0, X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LENGTH | X.UI.Attr.Type.PERCENT ], - maxHeight : [ X.UI.Attr.AUTO, X.UI.Dirty.LAYOUT, X.UI.Attr.USER.LAYOUT, X.UI.Attr.Type.LENGTH | X.UI.Attr.Type.PERCENT ] + width : [ '100%', XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT ], + maxWidth : [ XUI_Attr_AUTO, XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT ], + height : [ 0, XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT ], + maxHeight : [ XUI_Attr_AUTO, XUI_Dirty.LAYOUT, XUI_Attr_USER.LAYOUT, XUI_Attr_Type.LENGTH | XUI_Attr_Type.PERCENT ] }, overrideAttrsForChild : { @@ -24,7 +24,10 @@ X.UI.Layout.Canvas = X.UI.Layout.create( { data.preMesure( w, h ); - if( isNeedsDetection && ( data.boxWidth === X.UI.Attr.AUTO || data.boxHeight === X.UI.Attr.AUTO ) ) return false; + console.log( w + ' > ' + data.boxWidth ); + + // data.boxWidth と data.boxHeight のどちらかでも Infinity + if( isNeedsDetection && data.boxWidth + data.boxHeight === XUI_Attr_AUTO ) return false; _x = data.contentL; _y = data.contentT; @@ -32,27 +35,33 @@ X.UI.Layout.Canvas = X.UI.Layout.create( { _h = data.contentHeight; if( ( uinodes = data.uinodes ) && ( l = uinodes.length ) ){ + console.log( _w + ' x ' + _h + ' l:' + l ); for( i = 0; i < l; ++i ){ node = uinodes[ i ]; node.calculate( false, _x, _y, _w, _h ); }; } else - if( data.contentHeight === X.UI.Attr.AUTO ){ - data.contentHeight = data.minContentHeight !== X.UI.Attr.AUTO ? data.minContentHeight : 0; + if( data.contentHeight === XUI_Attr_AUTO ){ + data.contentHeight = data.contentHeightMin !== XUI_Attr_AUTO ? data.contentHeightMin : 0; }; data.postMesure(); - data.updateLayout( x + data.boxX, y + data.boxY ); - + + if( !isNeedsDetection ){ + data.boxX += x; + data.boxY += y; + }; return true; } }); -X.UI._Box = X.UI._AbstractUINode.inherits( +var XUI_Box = XUI_AbstractUINode.inherits( 'X.UI._Box', - X.Class.PRIVATE_DATA | X.Class.SUPER_ACCESS, // 現状 super 指定がないとconstructor未定擬時に親のconstructor が使われない + X_Class.NONE, { + usableAttrs : XUI_Attr_createAttrDef( XUI_AbstractUINode.prototype.usableAttrs, XUI_Layout_Canvas.overrideAttrsForSelf ), + layout : null, uinodes : null, xnodes : null, @@ -61,39 +70,41 @@ X.UI._Box = X.UI._AbstractUINode.inherits( pointerChildren : true, through : false, - scrollingX : 0, - scrollingY : 0, + scrollingX : 0, // TODO 現在のスクロール位置 + scrollingY : 0, // TODO - Constructor : function( layout, args ){ + Constructor : function( user, layout, args ){ var i = 0, - l = args.length, + l = args && args.length, j = -1, - uinodes, arg, _data, attrs, support; + uinodes, arg, _data, attrs, attrDef, p; + + //if( !args.length ) args = [ args ]; - if( !this.User.instanceOf( X.UI.Box ) ){ + if( !user[ 'instanceOf' ]( X.UI.Box ) ){ //throw new Error( 'Box を継承したインスタンスだけが _Box のオーナーになれます' ); - }; + }; + + this.User = user; + // TODO デフォルトの attr 指定の中から XNODE に指定するものを集めて適用。 this.xnode = X_Doc_create( 'div' ); // すでに定義されていればそちらを採用 - // supportAttrs や attrClass が、layout を元に上書きされているため + // usableAttrs や attrClass が、layout を元に上書きされているため this.layout = this.layout || layout; for( ; i < l; ++i ){ arg = args[ i ]; - if( arg.instanceOf && arg.instanceOf( X.UI.AbstractUINode ) ){ - _data = X_Class_getPrivate( arg ); + if( arg[ 'instanceOf' ] && arg[ 'instanceOf' ]( X.UI.AbstractUINode ) ){ + _data = X_Pair_get( arg ); if( !uinodes ) this.uinodes = uinodes = []; uinodes[ ++j ] = _data; if( _data.parent ){ //throw new Error( 'インスタンスはすでに親に追加されています ' + arg ); }; } else - if( arg.instanceOf && arg.instanceOf( X.UI.Layout.Base ) ){ - //this.layout = arg; - } else - if( X.Type.isObject( arg ) ){ + if( X_Type_isObject( arg ) ){ if( attrs ){ attrs = X_Class_override( attrs, arg ); } else { @@ -106,18 +117,13 @@ X.UI._Box = X.UI._AbstractUINode.inherits( for( p in attrs ){ if( X_EMPTY_OBJECT[ p ] ) continue; - ( support = this.supportAttrs[ p ] ) && this.setAttr( p, support, attrs[ p ] ); + ( attrDef = this.usableAttrs[ p ] ) && this.setAttr( p, attrDef, attrs[ p ] ); }; }, /* Rellay */ initialize : function( root, rootData, parent, parentData ){ var uinodes = this.uinodes, i = uinodes && uinodes.length; - this.root = root; - this.rootData = rootData; - this.parent = parent; - this.parentData = parentData; - //this.xnode = X_Doc_create( 'div' ); if( i ){ for( ; i; ){ @@ -125,8 +131,7 @@ X.UI._Box = X.UI._AbstractUINode.inherits( }; }; - this.phase = 1; - this.User.dispatch( { type : X.UI.Event.INIT } ); + XUI_AbstractUINode.prototype.initialize.apply( this, arguments ); }, addToParent : function( parentXNode ){ @@ -134,16 +139,13 @@ X.UI._Box = X.UI._AbstractUINode.inherits( l = uinodes && uinodes.length, i; - parentXNode && parentXNode.append( this.xnode ); - if( l ){ for( i = 0; i < l; ++i ){ uinodes[ i ].addToParent( this.xnode ); }; }; - this.phase = 2; - this.User.dispatch( { type : X.UI.Event.ADDED } ); + XUI_AbstractUINode.prototype.addToParent.apply( this, arguments ); }, /* Rellay */ @@ -156,7 +158,7 @@ X.UI._Box = X.UI._AbstractUINode.inherits( }; }; - X.UI._AbstractUINode.prototype.creationComplete.apply( this, arguments ); + XUI_AbstractUINode.prototype.creationComplete.apply( this, arguments ); }, calculate : function( isNeedsDetection, x, y, w, h ){ @@ -164,6 +166,17 @@ X.UI._Box = X.UI._AbstractUINode.inherits( this.phase = 4; return ret; }, + + updateLayout : function(){ + var uinodes = this.uinodes, i, l; + + if( uinodes && ( l = uinodes.length ) ){ + for( i = 0; i < l; ++i ){ + uinodes[ i ].updateLayout(); + }; + }; + XUI_AbstractUINode.prototype.updateLayout.call( this ); + }, capcher : function( x, y ){ var uinodes, child, _x, _y, hit, i; @@ -195,7 +208,7 @@ X.UI._Box = X.UI._AbstractUINode.inherits( addAt : function( index, _uinodes ){ //console.log( '# AddAt ' + this.phase ) - var uinodes = this.uinodes, + var uinodes = this.uinodes || ( this.uinodes = [] ), num = uinodes.length, p1 = 1 <= this.phase, p2 = 2 <= this.phase, @@ -206,18 +219,17 @@ X.UI._Box = X.UI._AbstractUINode.inherits( //console.log( '### AddAt ' + this.phase ) for( l = _uinodes.length; i < l; ++i ){ - data = X_Class_getPrivate( _uinodes[ i ] ); + data = X_Pair_get( _uinodes[ i ] ); _p1 = p1 && data.phase < 1; _p2 = p2 && data.phase < 2; _p1 && data.initialize( this.root, this.rootData, this.User, this ); - if( index <= num ){ - // _p2 && this.xnode.insertBefore( data.xnode, uinodes[ index + i ].xnode ); - _p2 && uinodes[ index + i ].xnode.before( data.xnode ); + if( index < num ){ + _p2 && uinodes[ index + i ].xnode[ 'prev' ]( data.xnode ); _p2 && data.addToParent( this.xnode ); uinodes.splice( index + i, 0, data ); } else { _p2 && data.addToParent( this.xnode ); - uinodes[ uinodes.length ] = data; + uinodes[ uinodes.length ] = data; }; p3 && data.phase < 3 && data.creationComplete(); }; @@ -232,7 +244,7 @@ X.UI._Box = X.UI._AbstractUINode.inherits( //console.log( '### AddAt ' + this.phase ) for( ; i; ){ - data = X_Class_getPrivate( _uinodes[ --i ] ); + data = X_Pair_get( _uinodes[ --i ] ); if( ( n = uinodes.indexOf( data ) ) !== -1 ){ uinodes.splice( n, 1 ); data._remove(); @@ -244,7 +256,7 @@ X.UI._Box = X.UI._AbstractUINode.inherits( removeAt : function( from, length ){ var uinodes = this.uinodes, i = uinodes.length, - to = from + ( X.Type.isNumber( length ) && 1 <= length ? length : 1 ), + to = from + ( X_Type_isNumber( length ) && 1 <= length ? length : 1 ), node; for( ; i; ){ node = uinodes[ --i ]; @@ -265,7 +277,7 @@ X.UI._Box = X.UI._AbstractUINode.inherits( case 4: case 3: case 2: - this.xnode.remove(); + this.xnode[ 'remove' ](); case 1: delete this.root; delete this.rootData; @@ -280,38 +292,39 @@ X.UI._Box = X.UI._AbstractUINode.inherits( X.UI.Box = X.UI.AbstractUINode.inherits( 'Box', - X.Class.SUPER_ACCESS, - X.UI._Box, + X_Class.NONE, { Constructor : function(){ - X_Class_newPrivate( this, X.UI.Layout.Canvas, arguments ); + X_Pair_create( this, XUI_Box( this, XUI_Layout_Canvas, arguments ) ); }, - add : function( node /* , node, node ... */ ){ - X_Class_getPrivate( this ).addAt( this.numNodes() + 1, Array.prototype.slice.call( arguments ) ); + add : function( /* node, node, node ... */ ){ + X_Pair_get( this ).addAt( this.numNodes() + 1, X_Array_copy( arguments ) ); return this; }, - addAt : function( index, node /* , node, node ... */ ){ + addAt : function( index /* , node , node, node ... */ ){ + var nodes; if( index < 0 ) index = 0; - X_Class_getPrivate( this ).addAt( arguments[ 0 ], Array.prototype.slice.call( arguments, 1 ) ); + nodes = X_Array_copy( arguments ); + X_Pair_get( this ).addAt( nodes.shift(), nodes ); return this; }, - remove : function( node /* , node, node ... */ ){ - X_Class_getPrivate( this ).remove( Array.prototype.slice.call( arguments ) ); + remove : function( /* node, node, node ... */ ){ + X_Pair_get( this )[ 'remove' ]( X_Array_copy( arguments ) ); return this; }, removeAt : function( from, length ){ - X_Class_getPrivate( this ).removeAt( from, length ); + X_Pair_get( this ).removeAt( from, length ); return this; }, getNodesByClass : function( klass ){ var ret = [], - uinodes = X_Class_getPrivate( this ).uinodes, + uinodes = X_Pair_get( this ).uinodes, i, l, node; if( !uinodes || uinodes.length === 0 ) return ret; for( i = 0, l = uinodes.length; i < l; ++i ){ node = uinodes[ i ].User; - if( node.instanceOf( klass ) ) ret[ ret.length ] = node; + if( node[ 'instanceOf' ]( klass ) ) ret[ ret.length ] = node; }; return ret; }, @@ -319,17 +332,31 @@ X.UI.Box = X.UI.AbstractUINode.inherits( return this.getNodeAt( 0 ); }, getLastChild : function(){ - var uinodes = X_Class_getPrivate( this ).uinodes; + var uinodes = X_Pair_get( this ).uinodes; return uinodes && uinodes.length && uinodes[ uinodes.length - 1 ].User || null; }, getNodeAt : function( index ){ if( index < 0 ) return null; - var uinodes = X_Class_getPrivate( this ).uinodes; + var uinodes = X_Pair_get( this ).uinodes; return uinodes && uinodes[ index ].User || null; }, numNodes : function(){ - var uinodes = X_Class_getPrivate( this ).uinodes; + var uinodes = X_Pair_get( this ).uinodes; return uinodes && uinodes.length || 0; + }, + + clone : function( opt_cloneListener ){ + var clone = XUI_AbstractUINode.prototype.clone.call( this, opt_cloneListener ), + uinodes = X_Pair_get( this ).uinodes, + i = 0, + l = uinodes && uinodes.length, + copies = []; + + for( ; i < l; ++i ){ + copies[ i ] = uinodes[ i ].clone( opt_cloneListener ); + }; + + return l ? clone.add.apply( clone, copies ) : clone; } } ); @@ -350,41 +377,44 @@ X.UI.Box.presets = function(){ arg = args[ i ]; if( !arg ) continue; // レイアウトの preset ができるのは layout が未定義な Box だけ - if( !shadow.prototype.layout && arg.instanceOf && arg.instanceOf( X.UI.Layout.Base ) ){ + if( !shadow.prototype.layout && arg[ 'instanceOf' ] && arg[ 'instanceOf' ]( XUI_LayoutBase ) ){ layout = arg; } else if( ( klassDef = X_Class_getClassDef( arg ) ) && klassDef.isPrivate ){ privateKlass = arg; layout = privateKlass.prototype.layout; } else - if( X.Type.isObject( arg ) ){ + if( X_Type_isObject( arg ) ){ if( attrs ){ X_Class_override( attrs, arg, true ); } else { attrs = arg; }; } else - if( X.Type.isString( arg ) ){ + if( X_Type_isString( arg ) ){ boxName = arg; }; }; if( privateKlass ){ - supports = X.UI.Attr.createAttrDef( privateKlass.prototype.supportAttrs, layout.overrideAttrsForSelf ); + /* + * スーパークラスの属性定義リストをレイアウトの持つ属性定義で上書きした新しい属性定義リストを作る。 + */ + supports = XUI_Attr_createAttrDef( privateKlass.prototype.usableAttrs, layout.overrideAttrsForSelf ); klass = this.inherits( privateKlass ); - privateKlass.prototype.supportAttrs = supports, - privateKlass.prototype.attrClass = X.UI.Attr.preset( privateKlass.prototype.attrClass, supports, attrs ); + privateKlass.prototype.usableAttrs = supports; + privateKlass.prototype.attrClass = XUI_Attr_preset( privateKlass.prototype.attrClass, supports, attrs ); } else { - supports = X.UI.Attr.createAttrDef( shadow.prototype.supportAttrs, layout.overrideAttrsForSelf ); + supports = XUI_Attr_createAttrDef( shadow.prototype.usableAttrs, layout.overrideAttrsForSelf ); klass = this.inherits( boxName, shadow.inherits( { layout : layout, - supportAttrs : supports, - attrClass : X.UI.Attr.preset( shadow.prototype.attrClass, supports, attrs ) + usableAttrs : supports, + attrClass : XUI_Attr_preset( shadow.prototype.attrClass, supports, attrs ) } ) );