92 lines
2.7 KiB
JavaScript
92 lines
2.7 KiB
JavaScript
|
"use strict";
|
||
|
var Class = require("../utils/class");
|
||
|
var Handler = require("./handler");
|
||
|
var DefaultHandler = require("./defaulthandler");
|
||
|
var Address = require("../wType/address");
|
||
|
var AbstractMap = require("../wContainer/abstractmap");
|
||
|
var AbstractOrder = require("../wContainer/abstractorder");
|
||
|
|
||
|
var HandlerOrder = AbstractOrder.template(Handler);
|
||
|
var DefaultHandlerOrder = AbstractOrder.template(DefaultHandler);
|
||
|
var HandlerMap = AbstractMap.template(Address, HandlerOrder);
|
||
|
|
||
|
var Dispatcher = Class.inherit({
|
||
|
"className": "Dispatcher",
|
||
|
"constructor": function() {
|
||
|
Class.fn.constructor.call(this);
|
||
|
|
||
|
this._handlers = new HandlerMap();
|
||
|
this._defautHandlers = new DefaultHandlerOrder(false);
|
||
|
},
|
||
|
"destructor": function() {
|
||
|
this._handlers.destructor();
|
||
|
|
||
|
Class.fn.destructor.call(this);
|
||
|
},
|
||
|
"registerHandler": function(handler) {
|
||
|
var itr = this._handlers.find(handler.address);
|
||
|
var order;
|
||
|
|
||
|
|
||
|
if (itr["=="](this._handlers.end())) {
|
||
|
order = new HandlerOrder(false);
|
||
|
this._handlers.insert(handler.address.clone(), order);
|
||
|
} else {
|
||
|
order = itr["*"]();
|
||
|
}
|
||
|
|
||
|
order.push_back(handler);
|
||
|
},
|
||
|
"unregisterHandler": function(handler) {
|
||
|
var itr = this._handlers.find(handler.address);
|
||
|
|
||
|
if (!itr["=="](this._handlers.end())) {
|
||
|
|
||
|
var ord = itr["*"]().second;
|
||
|
ord.erase(handler);
|
||
|
|
||
|
if (ord.size() === 0) {
|
||
|
this._handlers.erase(itr);
|
||
|
}
|
||
|
|
||
|
} else {
|
||
|
throw new Error("Can't unregister hander");
|
||
|
}
|
||
|
},
|
||
|
"registerDefaultHandler": function(dh) {
|
||
|
this._defautHandlers.push_back(dh);
|
||
|
},
|
||
|
"unregisterDefaultHandler": function(dh) {
|
||
|
this._defautHandlers.erase(dh);
|
||
|
},
|
||
|
"pass": function(event) {
|
||
|
var itr = this._handlers.find(event.getDestination());
|
||
|
|
||
|
if (!itr["=="](this._handlers.end())) {
|
||
|
var ord = itr["*"]().second;
|
||
|
|
||
|
var o_beg = ord.begin();
|
||
|
var o_end = ord.end();
|
||
|
var hands = [];
|
||
|
|
||
|
for (; !o_beg["=="](o_end); o_beg["++"]()) {
|
||
|
hands.push(o_beg["*"]());
|
||
|
}
|
||
|
|
||
|
for (var i = 0; i < hands.length; ++i) {
|
||
|
hands[i].pass(event)
|
||
|
}
|
||
|
} else {
|
||
|
var dhitr = this._defautHandlers.begin();
|
||
|
var dhend = this._defautHandlers.end();
|
||
|
for (; !dhitr["=="](dhend); dhitr["++"]()) {
|
||
|
if (dhitr["*"]().call(event)) {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
|
||
|
module.exports = Dispatcher;
|