OSDN Git Service

Version 0.6.57, fixed NS of X.UI & X.Class for __proto__.
[pettanr/clientJs.git] / 0.6.x / js / ui / 08_Box.js
index 791afee..d089886 100644 (file)
 \r
-var _Box = _AbstractUINode.inherits(\r
-       '_Box',\r
-       X.Class.PRIVATE_DATA,\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, i, _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 + data.boxX, y + data.boxY );\r
+       }\r
+});\r
+\r
+\r
+X.UI._Box = X.UI._AbstractUINode.inherits(\r
+       'X.UI._Box',\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
+               scrollingX      : 0,\r
+               scrollingY      : 0,\r
+\r
                Constructor : function( layout, args ){\r
-                       if( !this.User.instanceOf( Box ) ){\r
+                       var i = 0,\r
+                               l = args.length,\r
+                               j = -1,\r
+                               uinodes, arg, _data, attrs, support;\r
+                       \r
+                       if( !this.User.instanceOf( X.UI.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
+                               if( arg.instanceOf && arg.instanceOf( X.UI.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.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
@@ -72,84 +144,108 @@ var _Box = _AbstractUINode.inherits(
                },\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
+                       X.UI._AbstractUINode.prototype.creationComplete.apply( this, arguments );\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.boxX;\r
+                       y -= this.boxY;\r
+                       if( this.pointerChildren && ( uinodes = this.uinodes ) && ( i = uinodes.length ) ){\r
+                               _x = x - this.scrollingX;\r
+                               _y = y - this.scrollingY;\r
+                               for( ; i; ){\r
+                                       child = uinodes[ --i ];\r
+                                       if( !child.pointerDisabled && child.boxX <= _x && _x < child.boxX + child.boxWidth && child.boxY <= _y && _y < child.boxY + child.boxHeight && child.capcher( _x, _y ) ){\r
+                                               //console.log( 'hit child ' + _x + ' ' + _y + ' boxX:' + child.boxX + ' boxY:' + child.boxY );\r
+                                               this.hitChildData = child;\r
+                                               break;\r
+                                       };\r
+                               };\r
+                       };\r
+                       if( this.through ){\r
+                               this.hitChildData && !this.hovering && ( this.rootData.hoverList[ this.rootData.hoverList.length ] = this );\r
+                               return !!this.hitChildData;\r
+                       };\r
+                       hit = 0 <= x && x < this.boxWidth && 0 <= y && y < this.boxHeight;\r
+                       ( this.hitChildData || hit ) && !this.hovering && ( this.rootData.hoverList[ this.rootData.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 < 4 && data.creationComplete();\r
+                               p3 && data.phase < 3 && 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
@@ -157,66 +253,34 @@ var _Box = _AbstractUINode.inherits(
                },\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
+X.UI.Box = X.UI.AbstractUINode.inherits(\r
        'Box',\r
        X.Class.SUPER_ACCESS,\r
-       _Box,\r
+       X.UI._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
@@ -237,12 +301,12 @@ var Box = AbstractUINode.inherits(
                        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
@@ -251,21 +315,78 @@ var Box = AbstractUINode.inherits(
                        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
+X.UI.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 || X.UI.Box.presets;\r
+       \r
+       return klass;\r
+};\r