File: events/LEventDispatcher.js
/** @language japanese
* <p>LEventDispatcher クラスは、イベントを送出するすべてのクラスの基本クラスです。</p>
* @class LEventDispatcher
* @extends LObject
* @constructor
* @since 1.8.0
* @public
*/
var LEventDispatcher = (function () {
function LEventDispatcher () {
var s = this;
LExtends(s, LObject, []);
s._eventList = new Array();
}
var p = {
/** @language japanese
* <p>イベントリスナーオブジェクトを LEventDispatcher オブジェクトに登録し、リスナーがイベントの通知を受け取るようにします。イベントリスナーは、特定のタイプのイベント、段階、および優先度に関する表示リスト内のすべてのノードに登録できます。</p>
* <p>イベントリスナーが正常に登録された後に、addEventListener() をさらに呼び出して優先度を変更することはできません。リスナーの優先度を変更するには、最初に removeListener() を呼び出す必要があります。その後、同じリスナーを新しい優先度レベルで再度登録できます。</p>
* <p>イベントリスナーが不要になった場合は、removeEventListener() を呼び出して、イベントリスナーを削除します。削除しない場合、メモリの問題が発生する可能性があります。</p>
* @method addEventListener
* @param {String} type イベントのタイプです。
* @param {Function} listener イベントを処理するリスナー関数です。
* @public
* @since 1.8.0
*/
addEventListener : function (type, listener) {
this._eventList.push({listener : listener, type : type});
},
/** @language japanese
* <p>LEventDispatcher オブジェクトからリスナーを削除します。対応するリスナーが LEventDispatcher オブジェクトに登録されていない場合は、このメソッドを呼び出しても効果はありません。</p>
* @method removeEventListener
* @param {String} type イベントのタイプです。
* @param {Function} listener 削除するリスナーオブジェクトです。
* @public
* @since 1.8.0
*/
removeEventListener : function (type, listener) {
var s = this, i, length;
length = s._eventList.length;
for (i = 0; i < length; i++) {
if (!s._eventList[i]) {
continue;
}
if (type == s._eventList[i].type && s._eventList[i].listener == listener) {
s._eventList.splice(i, 1);
return;
}
}
},
/** @language japanese
* <p>LEventDispatcher オブジェクトから全部のリスナーを削除します。</p>
* @method removeAllEventListener
* @public
* @since 1.8.0
*/
removeAllEventListener : function () {
this._eventList = [];
},
/** @language japanese
* <p>イベントをイベントフローに送出します。イベントターゲットは LEventDispatcher オブジェクトです。これに対して dispatchEvent() メソッドが呼び出されます。</p>
* @method dispatchEvent
* @param {LEvent | String} event イベントフローに送出されるイベントオブジェクトです。イベントが再度送出されると、イベントのクローンが自動的に作成されます。イベントが送出された後にそのイベントの target プロパティは変更できないため、再送出処理のためにはイベントの新しいコピーを作成する必要があります。
* @return {Boolean} 値が true の場合、イベントは正常に送出されました。
* function MyEventObject(){
* var self = this;
* LExtends(self,LSprite,[]);
* self.graphics.drawRect(1,"#000000",[0,0,100,100],true,"#000000");
* self.graphics.drawRect(1,"#FF0000",[100,0,100,100],true,"#FF0000");
* self.addEventListener(LMouseEvent.MOUSE_UP,self.onclick);
* self.addEventListener(MyEventObject.CLICK_LEFT,function(event){
* trace("dispatchEvent");
* });
* self.addEventListener(MyEventObject.CLICK_RIGHT,function(event){
* trace("dispatchEvent event.name = " + event.name);
* });
* }
* MyEventObject.CLICK_LEFT = "click_left";
* MyEventObject.CLICK_RIGHT = "click_right";
* MyEventObject.prototype.onclick = function(event){
* var self = event.clickTarget;
* if(event.selfX < 100){
* self.dispatchEvent(MyEventObject.CLICK_LEFT);
* }else{
* var event = new LEvent(MyEventObject.CLICK_RIGHT);
* event.name = "LEvent Test";
* self.dispatchEvent(event);
* }
* }
* @examplelink <p><a href="../../../api/LEventDispatcher/dispatchEvent.html" target="_blank">実際のサンプルを見る</a></p>
* @public
* @since 1.8.0
*/
dispatchEvent : function (event) {
var s = this, i, length = s._eventList.length, ctype = (typeof event == "string") ? event : event.eventType;
for (i = 0; i < length; i++) {
if (!s._eventList[i]) {
continue;
}
if (ctype == s._eventList[i].type) {
if (typeof event == "string") {
s.currentTarget = s.target = s;
s.eventType = s.event_type = ctype;
s._eventList[i].listener(s);
}else{
if (!event.target) {
event.target = s;
}
if (!event.currentTarget) {
event.currentTarget = event.target;
}
event._ll_preventDefault = false;
s._eventList[i].listener(event);
if (event._ll_preventDefault) {
return false;
}
}
return true;
}
}
return false;
},
/** @language japanese
* <p>LEventDispatcher オブジェクトに、特定のイベントタイプに対して登録されたリスナーがあるかどうかを確認します。これにより、LEventDispatcher オブジェクトがイベントタイプの処理をイベントフロー階層のどこで変更したかを判断できます。</p>
* @method hasEventListener
* @param {String} type イベントのタイプです。
* @return {Boolean} 指定したタイプのリスナーが登録されている場合は true、それ以外の場合は false です。
* @public
* @since 1.8.0
*/
hasEventListener : function (type, listener) {
var s = this, i, length = s._eventList.length;
for (i = 0; i < length; i++) {
if (!s._eventList[i]) {
continue;
}
if (type == s._eventList[i].type) {
if (typeof listener == UNDEFINED || listener == s._eventList[i].listener) {
return true;
}
}
}
return false;
}
};
for (var k in p) {
LEventDispatcher.prototype[k] = p[k];
}
return LEventDispatcher;
})();