*
* use XObject.debug = 1 to turn on debugging
*
- * If XObject/[xns]/[xtype].js exists, it will use this to override properties..
+ * If XObjectBase/[xns]/[xtype].js exists, it will use this to override properties..
*
*
* He's some questions.
* @cfg listeners {Object} (optional) map Gobject signals to functions
* @cfg pack {Function|String|Array} (optional) how this object gets added to it's parent
* @cfg el {Object} (optional) premade GObject
- *
- *
- *
- *
- *
- *
+ *
*/
function XObject (cfg) {
//print ("XObject ctr");
- this.config = {};
- this.cfg = XObject.extend({}, cfg);
+ this.config = {}; // used to initialize GObject
- this.constructor = XObject;
+ this.cfg = XObject.extend({}, cfg); // used to store original configuration.. for referencing..
+ // used by baseobject to create fake child elements on init..
+ if (cfg.el) {
+ this.el = cfg.el;
+ }
+ // we could use this to determine if
+ // we are actually inside a inherited class...
+ // as define() should actually set this up..
- // start by seeing if we have a base class....
- try {
- // loocks for XObject/Gtk/TreeView.js [ TreeView = { .... } ]
- // xns is not a string!!!?
- var gname = false;
- if (typeof(cfg.xtype) == 'object') {
- gname = GObject.type_name(cfg.xtype.type);
- // print("GNAME:" +gname + " GTYPE:"+cfg.xtype.type);
- }
+ if (!this.constructor) {
- var base = gname ? imports.XObjectBase[gname][gname] : false;
+ this.constructor = XObject;
+ var base = XObject.baseXObject(cfg);
if (base) {
- // print("Overlaying XOBJBECT-BASE." + cfg.xtype);
- XObject.extend(this,base);
+ XObject.extend(this, base.prototype);
}
- } catch (e) {
- // if debug?
- XObject.log("error finding " + gname + " - " + e.toString());
}
-
// copy down all elements into self..
// make an extra copy in this.config?? - which is the one used in the constructor later
// interesting question should we call constructor on items here...
// as the real work is done in init anyway..
var _this= this;
-
- var items = [];
- this.items.forEach(function(i) {
- items.push(i);
- });
+
+ var items = []
+ for(var i = 0; i < this.items.length;i++) {
+ items.push(this.items[i]);
+ }
+
+
+
this.items = [];
// create XObject for all the children.
- items.forEach(function(i,n) {
-
- var item = (i.constructor == XObject) ? o : new XObject(i);
+ for(var i = 0; i < items.length;i++) {
+
+ var base = XObject.baseXObject(items[i]);
+ base = base || XObject;
+ var item = (items[i].constructor == XObject) ? items[i] : new base(items[i]);
item.parent = _this;
_this.items.push(item);
//_this.addItem(i);
- });
- if (this.onConstruct) {
- this.onConstruct.call(this);
- }
+ };
+
}
* XObject.prototype.init.call(this);
*
*/
- init : function()
+ init : function(parent)
{
// var items = [];
XObject.log("add children to " + type);
var _this=this;
- this.items.forEach(function(i,n) {
- _this.addItem(i,n);
- })
+ for (var i = 0; i < this.items.length;i++) {
+ _this.addItem(this.items[i],i);
+ }
for (var i in this.listeners) {
/**
- * @method addItem
* Adds an item to the object using a new XObject
* uses pack property to determine how to add it.
* @arg cfg {Object} same as XObject constructor.
}
// what about extended items!?!?!?
- item.init();
+ item.init(this);
//print("CTR:PROTO:" + ( item.id ? item.id : '??'));
// print("addItem - call init [" + item.pack.join(',') + ']');
if (!item.el) {
imports.console.dump(item);
Seed.quit();
}
- print(this.cfg.xtype + ":pack=" + item.pack);
+ XObject.log(XObject.type(this.xtype) + ":pack=" + item.pack);
if (item.pack===false) { // no packing.. various items have this ..
return;
},
/**
- * @method addListener
- * Connects a method to a signal. (gjs/Seed aware)
- *
- * @arg sig {String} name of signal
- * @arg fn {Function} handler.
- */
+ * Connects a method to a signal. (gjs/Seed aware)
+ *
+ * @param {String} sig name of signal
+ * @param {Function} fn handler.
+ */
addListener : function(sig, fn)
{
* prefix with multiple '..' to look further up..
* prefix with '/' to look from the top, eg. '^LeftTree.model'
*
- * @arg name {String} name of signal
- * @return {XObject|false} the object if found.
+ * @param {String} name name of signal
+ * @return {XObject|false} the object if found.
*/
get : function(xid)
{
XObject.log("SEARCH FOR " + xid + " in " + this.id);
+ return this.getBySearch(xid);
+ },
+ getBySearch : function(xid) {
+
var ret= false;
var oid = '' + xid;
if (!xid.length) {
}
if (xid[0] == '.') {
- return this.parent.get(xid.substring(1));
+ return this.parent.getBySearch(xid.substring(1));
}
if (xid[0] == '/') {
child = child.join('.');
if (typeof(XObject.cache[nxid]) != 'undefined') {
- return XObject.cache[nxid].get(child);
+ return XObject.cache[nxid].getBySearch(child);
}
}
try {
- ret = e.get(xid.substring(1));
+ ret = e.getBySearch(xid.substring(1));
} catch (ex) { }
if (!ret) {
}
if (xid == this.id) {
try {
- return child === false ? this : this.get(child);
+ return child === false ? this : this.getBySearch(child);
} catch (ex) {
throw {
name: "ArgumentError",
})
if (ret) {
try {
- return child === false ? ret : ret.get(child);
+ return child === false ? ret : ret.getBySearch(child);
} catch (ex) {
throw {
name: "ArgumentError",
Seed.quit();
}
try {
- ret = ch.get(xid);
+ ret = ch.getBySearch(xid);
} catch (ex) { }
}
}
try {
- return child === false ? ret : ret.get(child);
+ return child === false ? ret : ret.getBySearch(child);
} catch (ex) {
throw {
name: "ArgumentError",
{
print("ERROR: " + output);
},
-
+ /**
+ * fatal error
+ * @param {String|Object} output String to print.
+ */
+ fatal : function(output)
+ {
+
+ throw {
+ name: "ArgumentError",
+ message : output
+
+ }
+ },
/**
* Copies all the properties of config to obj, if the do not exist.
return o;
},
-
+ /**
+ * Deep clone..
+ * @param {Object} o the object to clone..
+ * @return {Object} returns clone of object
+ * @member Object xclone
+ */
+ xclone : function(o)
+ {
+ var cp = function(e) {
+
+ if (typeof(e) != 'object') {
+ return e;
+ }
+
+ if (typeof(e) == 'object' && Array.isArray(e)) {
+ var ar = [];
+ for (var i =0; i < e.length;i++) {
+ ar.push(cp(e[i]));
+ }
+ return ar;
+ }
+
+ return XObject.xclone(e);
+
+ };
+
+ var r = {};
+ for(var p in o){
+ //print (p + ': ' + typeof(o[p]));
+ r[p] = cp(o[p])
+ }
+ return r;
+ },
+
/**
* Extends one class with another class and optionally overrides members with the passed literal. This class
}
return ret;
},
-
+ /**
+ * return the Gobject name of a constructor - does not appear to work on structs..
+ * @param {Object} gobject ctr
+ * @return {String} returns name
+ * @member XObject type
+ */
+ type : function(o)
+ {
+ if (typeof(o) == 'object') {
+ return GObject.type_name(o.type);
+ // print("GNAME:" +gname + " GTYPE:"+cfg.xtype.type);
+ }
+ return 'unknown';
+ },
+ /**
+ * return the XObjectBase class for a cfg (which includes an xtype)
+ * @param {Object} configuration.
+ * @return {function} constructor
+ * @member XObject baseXObject
+ */
+ baseXObject : function(cfg)
+ {
+ try {
+ // loocks for XObject/Gtk/TreeView.js [ TreeView = { .... } ]
+ // xns is not a string!!!?
+ var gname = false;
+ if (typeof(cfg.xtype) == 'object') {
+ gname = XObject.type(cfg.xtype);
+
+ }
+ if (typeof(cfg.xtype) == 'string') {
+ gname = cfg.xtype;
+ }
+
+ XObject.log("TRYING BASE OBJECT : " + gname);
+ // in the situation where we have been called and there is a base object
+ // defining the behavior..
+ // then we should copy the prototypes from the base object into this..
+
+ // see if file exists???
+
+ var base = gname ? imports.XObjectBase[gname][gname] : false;
+ return base;
+
+ } catch (e) {
+ // if debug?
+ XObject.log("error finding " + gname + " - " + e.toString());
+ return false;
+ }
+
+
+ },
+
/**
* @member XObject createDelegate
* creates a delage metdhod
};
}
-});
\ No newline at end of file
+});