/** @language japanese
* <p>LDisplayObjectContainer クラスは、表示リストで表示オブジェクトコンテナとして機能するすべてのオブジェクトの基本クラスです。表示リストでは、ランタイムに表示されるすべてのオブジェクトを管理します。LDisplayObjectContainer クラスは、表示リスト内で表示オブジェクトを配置するために使用します。各 LDisplayObjectContainer オブジェクトは、オブジェクトの z 順序を編成するために独自の子リストを持っています。z 順序は、どのオブジェクトを前面、背面、その他に描画するかを決定する、前から後ろへの順序です。</p>
* <p>LDisplayObjectContainer は抽象基本クラスであるため、LDisplayObjectContainer を直接呼び出すことはできません。</p>
* <p>LDisplayObjectContainer クラスは、子オブジェクトを持つすべてのオブジェクトの抽象基本クラスです。これは直接インスタンス化することはできません。</p>
* @class LDisplayObjectContainer
* @extends LInteractiveObject
* @constructor
* @since 1.9.0
* @public
*/
var LDisplayObjectContainer = (function () {
function LDisplayObjectContainer () {
var s = this;
LExtends(s, LInteractiveObject, []);
/** @language japanese
* 子表示オブジェクトのリスト
* @property childList
* @type Array
* @since 1.0.0
* @public
*/
s.childList = new Array();
/** @language japanese
* このオブジェクトの子の数を返します。
* @property numChildren
* @type int
* @since 1.9.0
* @example
* var container1 = new LSprite();
* var container2 = new LSprite();
* var circle1 = new LSprite();
* circle1.graphics.drawRect(1,"#000000",[0,0,50,50]);
* var circle2 = new LSprite();
* circle2.graphics.drawRect(1,"#000000",[100,100,50,50]);
* container2.addChild(container1);
* container1.addChild(circle1);
* container1.addChild(circle2);
* trace(container1.numChildren); // 2
* trace(container2.numChildren); // 1
* trace(circle1.numChildren); // 0
* trace(circle2.numChildren); // 0
* @examplelink <p><a href="../../../api/LDisplayObjectContainer/numChildren.html" target="_blank">実際のサンプルを見る</a></p>
* @public
*/
s.numChildren = 0;
/** @language japanese
* オブジェクトの子がマウスに対応しているかどうかを判断します。
* @property mouseChildren
* @type Boolean
* @since 1.9.0
* @example
* LGlobal.setDebug(true);
* var container1 = new LSprite();
* container1.x = container1.y = 20;
* var container2 = new LSprite();
* container2.x = 20;
* container2.y = 100;
* container2.mouseChildren = false;
* addChild(container1);
* addChild(container2);
* var button01 = new LButtonSample1("mouseChildren=true");
* container1.addChild(button01);
* button01.addEventListener(LMouseEvent.MOUSE_DOWN,function(e){
* trace("button01 click");
* });
* var button02 = new LButtonSample1("mouseChildren=false");
* container2.addChild(button02);
* button02.addEventListener(LMouseEvent.MOUSE_DOWN,function(e){
* trace("button02 click");
* });
* @examplelink <p><a href="../../../api/LDisplayObjectContainer/mouseChildren.html" target="_blank">実際のサンプルを見る</a></p>
* @public
*/
s.mouseChildren = true;
}
var p = {
/** @language japanese
* <p>この DisplayObjectContainer インスタンスに子 LDisplayObjectContainer インスタンスを追加します。子インスタンスは、この LDisplayObjectContainer インスタンスにある他のすべての子の前(上)に追加されます(特定のインデックス位置に子を追加する場合は、addChildAt() メソッドを使用します)。</p>
* <p>既に異なる表示オブジェクトコンテナを親に持つ子オブジェクトを追加する場合は、もう一方の表示オブジェクトコンテナの子リストからそのオブジェクトが削除されます。</p>
* @method addChild
* @param {LDisplayObject} child この LDisplayObjectContainer インスタンスの子として追加する LDisplayObject インスタンスです。
* @return {LDisplayObject} child パラメーターで渡す LDisplayObject インスタンスです。
* @since 1.0.0
* @public
* @example
* var bitmapdata = new LBitmapData("#FF0000",0,0,100,100);
* var bitmap = new LBitmap(bitmapdata);
* var layer = new LSprite();
* addChild(layer);
* layer.addChild(bitmap);
* @examplelink <p><a href="../../../api/LDisplayObjectContainer/addChild.html" target="_blank">実際のサンプルを見る</a></p>
*/
addChild : function (d) {
var s = this,t;
if (d.parent) {
t = LGlobal.destroy;
LGlobal.destroy = false;
d.parent.removeChild(d);
LGlobal.destroy = t;
}
d.parent = s;
s.childList.push(d);
s.numChildren = s.childList.length;
return d;
},
/** @language japanese
* <p>この DisplayObjectContainer インスタンスに子 LDisplayObject インスタンスを追加します。子インスタンスは、指定されたインデックス位置に追加されます。インデックス 0 は、この LDisplayObjectContainer オブジェクトの表示リストの背景または一番下を表します。</p>
* <p>例えば、a、b、c というラベルの 3 個の表示オブジェクトをインデックス位置 0、2、1 にそれぞれ配置すると、以下のようになります。</p>
* <p><img src="../../../api/LDisplayObjectContainer/LDisplayObjectContainer_layers.jpg" /></p>
* <p>既に異なる表示オブジェクトコンテナを親に持つ子オブジェクトを追加する場合は、もう一方の表示オブジェクトコンテナの子リストからそのオブジェクトが削除されます。</p>
* @method addChildAt
* @param {LDisplayObject} child この LDisplayObjectContainer インスタンスの子として追加する LDisplayObject インスタンスです。
* @param {int} index 子を追加するインデックス位置です。既にオブジェクトが置かれているインデックス位置を指定すると、その位置にあるオブジェクトとその上に位置するすべてのオブジェクトが、子リスト内で 1 つ上の位置に移動します。
* @return {LDisplayObject} child パラメーターで渡す LDisplayObject インスタンスです。
* @since 1.8.0
* @public
* @example
* var container = new LSprite();
* var circle1 = new LSprite();
* var circle2 = new LSprite();
* container.addChild(circle1);
* container.addChildAt(circle2, 0);
* trace(container.getChildAt(0) == circle2); // true
* trace(container.getChildAt(1) == circle1); // true
* @examplelink <p><a href="../../../api/LDisplayObjectContainer/addChildAt.html" target="_blank">実際のサンプルを見る</a></p>
*/
addChildAt : function (d, i) {
var s = this,t;
if (i < 0 || i > s.childList.length) {
return;
}
if (typeof d.remove == "function") {
t = LGlobal.destroy;
LGlobal.destroy = false;
d.remove();
LGlobal.destroy = t;
}
d.parent = s;
s.childList.splice(i, 0, d);
s.numChildren = s.childList.length;
return d;
},
/** @language japanese
* <p>LDisplayObjectContainer インスタンスの子リストから指定の child LDisplayObject インスタンスを削除します。削除された子の parent プロパティは null に設定されます。その子に対する参照が存在しない場合、そのオブジェクトはガベージコレクションによって収集されます。LDisplayObjectContainer の子より上位にある表示オブジェクトのインデックス位置は 1 つ下がります。</p>
* @method removeChild
* @param {LDisplayObject} child 削除する LDisplayObject インスタンスです。
* @return {LDisplayObject} child パラメーターで渡す LDisplayObject インスタンスです。
* @since 1.0.0
* @public
* @example
* function main () {
* var container = new LSprite();
* addChild(container);
* var circle1 = new LSprite();
* circle1.graphics.drawRect(1,"#000000",[0,0,50,50]);
* var circle2 = new LSprite();
* circle2.graphics.drawRect(1,"#000000",[100,100,50,50]);
* container.addChild(circle1);
* container.addChild(circle2);
* container.addEventListener(LMouseEvent.MOUSE_DOWN, clicked);
* }
* function clicked (event) {
* event.currentTarget.removeChild(event.target);
* }
* @examplelink <p><a href="../../../api/LDisplayObjectContainer/removeChild.html" target="_blank">実際のサンプルを見る</a></p>
*/
removeChild : function (d) {
var s = this, c = s.childList, i, l;
for (i = 0, l = c.length; i < l; i++) {
if (d.objectIndex == c[i].objectIndex) {
if (LGlobal.destroy && d.die) {
d.die();
}
s.childList.splice(i, 1);
break;
}
}
s.numChildren = s.childList.length;
delete d.parent;
},
/** @language japanese
* 指定のインデックス位置にある子表示オブジェクトインスタンスを返します。
* @method getChildAt
* @param {int} index 子オブジェクトのインデックス位置です。
* @return {LDisplayObject} 指定されたインデックス位置にある子表示オブジェクトです。
* @since 1.8.0
* @public
* @example
* var container = new LSprite();
* addChild(container);
* var sprite1 = new LSprite();
* var sprite2 = new LSprite();
* var sprite3 = new LSprite();
* container.addChild(sprite1);
* container.addChild(sprite2);
* container.addChildAt(sprite3, 0);
* trace(container.getChildAt(0) == sprite3); // true
* trace(container.getChildAt(1) == sprite1); // true
* trace(container.getChildAt(2) == sprite2); // true
* @examplelink <p><a href="../../../api/LDisplayObjectContainer/getChildAt.html" target="_blank">実際のサンプルを見る</a></p>
*/
getChildAt : function (i) {
var s = this, c = s.childList;
if (c.length == 0 || c.length <= i) {
return null;
}
return c[i];
},
/** @language japanese
* <p>指定された名前に一致する子表示オブジェクトを返します。指定された名前を持つ子表示オブジェクトが複数存在する場合、メソッドは子リストの最初のオブジェクトを返します。</p>
* <p>getChildAt() メソッドは、getChildByName() メソッドよりも処理が高速です。getChildAt() メソッドはキャッシュ配列の子にアクセスしますが、getChildByName() メソッドでは子にアクセスするためにリンクされたリストを移動する必要があります。</p>
* @method getChildByName
* @param {String} name 返される子の名前です。
* @return {LDisplayObject} 指定された名前を持つ子表示オブジェクトです。
* @since 1.9.0
* @public
* @example
* var container = new LSprite();
* var sprite1 = new LSprite();
* sprite1.name = "sprite1";
* var sprite2 = new LSprite();
* sprite2.name = "sprite2";
* container.addChild(sprite1);
* container.addChild(sprite2);
* var target = container.getChildByName("sprite1");
* trace(container.getChildIndex(target)); // 0
* @examplelink <p><a href="../../../api/LDisplayObjectContainer/getChildByName.html" target="_blank">実際のサンプルを見る</a></p>
*/
getChildByName : function (n) {
var s = this, c = s.childList;
for (i = 0, l = c.length; i < l; i++) {
if (!c[i]) {
continue;
}
if (c[i].name == n) {
return c[i];
}
}
return null;
},
/** @language japanese
* LDisplayObjectContainer の子リストの指定された index 位置から子 LDisplayObject を削除します。削除された子の parent プロパティは null に設定されます。その子に対する参照が存在しない場合、そのオブジェクトはガベージコレクションによって収集されます。LDisplayObjectContainer の子より上位にある表示オブジェクトのインデックス位置は 1 つ下がります。
* @method removeChildAt
* @param {int} index 削除する LDisplayObject の子インデックスです。
* @return {LDisplayObject} 削除された LDisplayObject インスタンスです。
* @since 1.8.0
* @public
* @example
* var container = new LSprite();
* addChild(container);
* var sprite1 = new LSprite();
* sprite1.name = "sprite1";
* var sprite2 = new LSprite();
* sprite2.name = "sprite2";
* container.addChild(sprite1);
* container.addChild(sprite2);
* trace(container.numChildren) // 2
* container.removeChildAt(0);
* trace(container.numChildren) // 1
* trace(container.getChildAt(0).name); // sprite2
* @examplelink <p><a href="../../../api/LDisplayObjectContainer/removeChildAt.html" target="_blank">実際のサンプルを見る</a></p>
*/
removeChildAt : function (i) {
var s = this, c = s.childList;
if (c.length <= i) {
return;
}
if (LGlobal.destroy && c[i].die) {
c[i].die();
}
var d = s.childList.splice(i, 1);
s.numChildren = s.childList.length;
return d;
},
/** @language japanese
* child LDisplayObject インスタンスのインデックス位置を返します
* @method getChildIndex
* @param {LDisplayObject} 特定する LDisplayObject インスタンスです。
* @return {int} 特定する子表示オブジェクトのインデックス位置です。
* @since 1.8.0
* @public
* @example
* var container = new LSprite();
* addChild(container);
* var sprite1 = new LSprite();
* sprite1.name = "sprite1";
* var sprite2 = new LSprite();
* sprite2.name = "sprite2";
* container.addChild(sprite1);
* container.addChild(sprite2);
* trace(container.getChildIndex(sprite1)); // 0
* @examplelink <p><a href="../../../api/LDisplayObjectContainer/getChildIndex.html" target="_blank">実際のサンプルを見る</a></p>
*/
getChildIndex : function (child) {
if (!child) {
return -1;
}
var s = this, c = s.childList, i, l = c.length;
for (i = 0; i < l; i++) {
if (c[i].objectIndex == child.objectIndex) {
return i;
}
}
return -1;
},
/** @language japanese
* <p>表示オブジェクトコンテナの既存の子の位置を変更します。これは、子オブジェクトのレイヤーに影響します。例えば、a、b、c というラベルの 3 個の表示オブジェクトをインデックス位置 0、1、2 にそれぞれ配置すると、以下のようになります。</p>
* <p><img src="../../../api/LDisplayObjectContainer/DisplayObjectContainerSetChildIndex1.jpg" /></p>
* <p>setChildIndex() を使用し、既に占有されているインデックス位置を指定した場合、表示オブジェクトの前の位置と新しい位置の間にある位置だけが変化します。その他は変化しません。現在のインデックスよりも小さいインデックスに子を移動すると、その間のすべての子が、それぞれのインデックス参照について 1 増加します。現在のインデックスよりも大きいインデックスに子を移動すると、その間のすべての子が、それぞれのインデックス参照について 1 減少します。例えば、上記の例の表示オブジェクトコンテナの名前が container である場合、次に示すコードを呼び出すことによって、a および b というラベルが付けられた表示オブジェクトの位置を入れ替えることができます。</p>
* <p>container.setChildIndex(container.getChildAt(1), 0);</p>
* <p>このコードによって、次に示すようなオブジェクトの配置になります。</p>
* <p><img src="../../../api/LDisplayObjectContainer/DisplayObjectContainerSetChildIndex2.jpg" /></p>
* @method setChildIndex
* @param {LDisplayObject} child インデックス番号を変更する子 LDisplayObject インスタンスです。
* @param {int} index 表示オブジェクトの結果のインデックス番号です。
* @return {int} child 表示オブジェクトの結果のインデックス番号です。
* @since 1.8.0
* @public
* @example
* LInit(50, "legend", 800, 480, main);
* var container;
* function main () {
* container = new LSprite();
* addChild(container);
* var circle1 = new LSprite();
* circle1.graphics.drawRect(1,"#000000",[0,0,100,100],true,"#000000");
* circle1.addEventListener(LMouseEvent.MOUSE_DOWN, clicked);
* var circle2 = new LSprite();
* circle2.graphics.drawRect(1,"#FF0000",[40,80,100,100],true,"#FF0000");
* circle2.addEventListener(LMouseEvent.MOUSE_DOWN, clicked);
* var circle3 = new LSprite();
* circle3.graphics.drawRect(1,"#008800",[80,0,100,100],true,"#008800");
* circle3.addEventListener(LMouseEvent.MOUSE_DOWN, clicked);
* container.addChild(circle1);
* container.addChild(circle2);
* container.addChild(circle3);
* }
* function clicked (event) {
* var circle = event.target;
* var topPosition = container.numChildren - 1;
* container.setChildIndex(circle, topPosition);
* }
* @examplelink <p><a href="../../../api/LDisplayObjectContainer/setChildIndex.html" target="_blank">実際のサンプルを見る</a></p>
*/
setChildIndex : function (child, index) {
var s = this, c = s.childList, i, l = c.length;
if (child.parent == "root" || child.parent.objectIndex != s.objectIndex || index < 0 || index >= l) {
return -1;
}
for (i = 0; i < l; i++) {
if(c[i].objectIndex == child.objectIndex){
break;
}
}
s.childList.splice(i,1);
s.childList.splice(index, 0, child);
return index;
},
resize : function () {
var s = this;
s.width = s.getWidth();
s.height = s.getHeight();
},
/** @language japanese
* <p>LDisplayObjectContainer インスタンスの子リストから全部の child LDisplayObject インスタンスを削除します。</p>
* @method removeAllChild
*/
removeAllChild : function () {
var s = this, c = s.childList, i, l;
for (i = 0, l = c.length; i < l; i++) {
if (LGlobal.destroy && c[i].die) {
c[i].die();
}
}
s.childList.length = 0;
s.width = 0;
s.height = 0;
s.numChildren = 0;
}
};
for (var k in p) {
LDisplayObjectContainer.prototype[k] = p[k];
}
return LDisplayObjectContainer;
})();