0
1
Fork 0
hedera-web-mindshore/package/usr/share/hedera-web/js/vn/object.js

140 lines
2.8 KiB
JavaScript
Raw Normal View History

/**
* The main base class. Manages the signal system.
*
* @param signals Map with all connected signal handlers
**/
Vn.Object = new Class
({
Tag: 'vn-object'
,Properties: {}
,signals: {}
,initialize: function (props)
{
for (var prop in props)
this[prop] = props[prop];
}
,loadXml: function (builder, node)
{
return null;
}
/**
* Conects a signal with a function.
*
* @param {String} id The signal identifier
* @param {Function} callback The callback
* @param {Object} instance The instance
**/
,on: function (id, callback, instance)
2015-07-17 14:34:42 +00:00
{
if (!(callback instanceof Function))
{
console.warn ('Vn.Object: Invalid callback for signal \'%s\'', id);
return;
}
if (!this.signals[id])
this.signals[id] = [];
this.signals[id].push
({
blocked: false
,callback: callback
,instance: instance
});
}
/**
* Locks/Unlocks a signal emission to the specified object.
*
* @param {String} id The signal identifier
* @param {Function} callback The callback
* @param {Boolean} block %true for lock the signal, %false for unlock
**/
,blockSignal: function (id, callback, block)
{
var callbacks = this.signals[id];
if (!callbacks)
return;
for (var i = 0; i < callbacks.length; i++)
if (callbacks[i].callback == callback)
callbacks[i].blocked = block;
}
/**
* Emits a signal in the current object.
*
* @param {String} id The signal identifier
**/
,signalEmit: function (id)
{
var callbacks = this.signals[id];
if (!callbacks)
return;
var callbackArgs = [];
callbackArgs.push (this);
for (var i = 1; i < arguments.length; i++)
callbackArgs.push (arguments[i]);
for (var i = 0; i < callbacks.length; i++)
if (!callbacks[i].blocked)
callbacks[i].callback.apply (callbacks[i].instance, callbackArgs);
}
/**
* Disconnects a signal from current object.
*
* @param {String} id The signal identifier
* @param {Function} callback The connected callback
* @param {Object} instance The instance
**/
,disconnect: function (id, callback, instance)
{
var callbacks = this.signals[id];
if (!callbacks)
return;
for (var i = 0; i < callbacks.length; i++)
if (callbacks[i].callback == callback
&& callbacks[i].instance == instance)
callbacks.splice (i--, 1);
}
/**
* Destroys the object, this method should only be called before losing
* the last reference to the object.
**/
,destroy: function ()
{
delete this.signals;
}
,link: function (prop, handlers)
{
for (var key in prop)
{
var newObject = prop[key];
var oldObject = this[key];
if (oldObject)
for (var signal in handlers)
oldObject.disconnect (signal, handlers[signal], this);
this[key] = newObject;
if (newObject)
for (var signal in handlers)
newObject.on (signal, handlers[signal], this);
}
}
});