9 public class Introspect.El : Object
23 public class Roo : Palete {
25 Gee.ArrayList<string> top_classes;
26 public static Gee.HashMap<string,GirObject>? classes_cache = null;
27 public static Gee.ArrayList<string>? top_classes_cache = null;
29 public Roo(Project.Project project)
36 this.top_classes = new Gee.ArrayList<string>();
39 this.load(); // ? initialize the roodata?
43 Gee.HashMap<string,GirObject> propsFromJSONArray(string type, Json.Array ar, GirObject cls)
46 var ret = new Gee.HashMap<string,GirObject>();
48 for (var i =0 ; i < ar.get_length(); i++) {
49 var o = ar.get_object_element(i);
50 var name = o.get_string_member("name");
51 var prop = new GirObject(type, name );
53 prop.type = o.get_string_member("type");
54 prop.doctxt = o.get_string_member("desc");
55 prop.propertyof = o.has_member("memberOf") ? o.get_string_member("memberOf") : "";
56 if (prop.propertyof.length < 1) {
57 prop.propertyof = cls.name;
60 // this is the function default.
61 prop.sig = o.has_member("sig") ? o.get_string_member("sig") : "";
63 if (o.has_member("optvals") ) {
64 var oar = o.get_array_member("optvals");
66 for (var oi = 0; oi < oar.get_length(); oi++) {
67 prop.optvalues.add(oar.get_string_element(oi));
72 //print(type + ":" + name +"\n");
79 public override void load () {
81 if (this.classes != null) {
84 if (Roo.classes_cache != null) {
85 this.classes = Roo.classes_cache;
86 this.top_classes = Roo.top_classes_cache ;
92 this.classes = new Gee.HashMap<string,GirObject>();
93 var add_to = new Gee.HashMap<string,Gee.ArrayList<string>>();
95 var f = GLib. File.new_for_path(BuilderApplication.configDirectory() + "/resources/roodata.json");
96 if (!f.query_exists(null)) {
97 f = GLib. File.new_for_uri("resources:///data/roodata.json");
102 var pa = new Json.Parser();
105 f.load_contents( null, out data, null );
106 pa.load_from_data((string) data);
107 } catch(GLib.Error e) {
108 GLib.error("Could not load %s",f.get_uri());
110 var node = pa.get_root();
112 var clist = node.get_object(); /// was in data... .get_object_member("data");
113 clist.foreach_member((o , key, value) => {
114 //print("cls:" + key+"\n");
116 var cls = new GirObject("class", key);
117 cls.props = this.propsFromJSONArray("prop", value.get_object().get_array_member("props"),cls);
118 cls.signals = this.propsFromJSONArray("signal", value.get_object().get_array_member("events"),cls);
121 if (value.get_object().has_member("methods")) {
122 cls.methods = this.propsFromJSONArray("method", value.get_object().get_array_member("methods"),cls);
124 if (value.get_object().has_member("implementations")) {
125 var vcn = value.get_object().get_array_member("implementations");
126 for (var i =0 ; i < vcn.get_length(); i++) {
127 cls.implementations.add(vcn.get_string_element(i));
133 if (value.get_object().has_member("tree_children")) {
134 var vcn = value.get_object().get_array_member("tree_children");
135 for (var i =0 ; i < vcn.get_length(); i++) {
136 var ad_c = vcn.get_string_element(i);
137 if (!cls.valid_cn.contains(ad_c)) {
138 cls.valid_cn.add( ad_c );
140 if (!add_to.has_key(ad_c)) {
141 add_to.set(ad_c, new Gee.ArrayList<string>());
143 if (!add_to.get(ad_c).contains(cls.name)) {
144 add_to.get(ad_c).add(cls.name);
154 if (value.get_object().has_member("tree_parent")) {
155 var vcn = value.get_object().get_array_member("tree_parent");
156 for (var i =0 ; i < vcn.get_length(); i++) {
157 if ("builder" == vcn.get_string_element(i)) {
158 // this class can be added to the top level.
159 GLib.debug("Add %s to *top", cls.name);
161 this.top_classes.add(cls.name);
168 this.classes.set(key, cls);
171 // look for properties of classes, that are atually clasess
172 // eg. Roo.data.Store has proxy and reader..
175 foreach(var cls in this.classes.values) {
176 foreach(var gir_obj in cls.props.values) {
177 var types = gir_obj.type.split("|");
178 for(var i =0; i < types.length; i++) {
181 if (/^Roo\./.match(type) && classes.has_key(type)) {
184 cls.valid_cn.add(type + ":" + gir_obj.name );
185 // Roo.bootstrap.panel.Content:east
186 // also means that Roo.bootstrap.panel.Grid:east works
187 var prop_type = classes.get(type);
188 foreach(var imp_str in prop_type.implementations) {
189 //GLib.debug("addChild for %s - child= %s:%s", cls.name, imp_str, gir_obj.name);
190 cls.valid_cn.add(imp_str + ":" + gir_obj.name);
191 if (!add_to.has_key(imp_str)) {
192 add_to.set( imp_str, new Gee.ArrayList<string>());
194 if (!add_to.get( imp_str).contains(cls.name)) {
195 add_to.get( imp_str ).add(cls.name );
201 if (!add_to.has_key( type)) {
202 add_to.set( type, new Gee.ArrayList<string>());
204 if (!add_to.get(type).contains(cls.name)) {
205 add_to.get( type ).add(cls.name );
212 foreach(var cls in this.classes.values) {
213 if (add_to.has_key(cls.name)) {
214 cls.can_drop_onto = add_to.get(cls.name);
217 Roo.classes_cache = this.classes;
218 Roo.top_classes_cache = this.top_classes;
222 public string doc(string what) {
224 /*var ns = what.split(".")[0];
229 var gir = Gir.factory(ns);
230 return gir.doc(what);
233 //return typeof(this.comments[ns][what]) == 'undefined' ? '' : this.comments[ns][what];
236 // does not handle implements...
237 public override GirObject? getClass(string ename)
240 return this.classes.get(ename);
246 public override Gee.HashMap<string,GirObject> getPropertiesFor(string ename, JsRender.NodePropType ptype)
248 //print("Loading for " + ename);
252 // if (typeof(this.proplist[ename]) != 'undefined') {
253 //print("using cache");
254 // return this.proplist[ename][type];
256 // use introspection to get lists..
259 var cls = this.classes.get(ename);
260 var ret = new Gee.HashMap<string,GirObject>();
262 print("could not find class: %s\n", ename);
264 //throw new Error.INVALID_VALUE( "Could not find class: " + ename);
269 //cls.parseSignals(); // ?? needed for add handler..
270 //cls.parseMethods(); // ?? needed for ??..
271 //cls.parseConstructors(); // ?? needed for ??..
273 //cls.overlayParent();
278 case JsRender.NodePropType.PROP:
279 return this.filterProps(cls.props);
280 case JsRender.NodePropType.LISTENER:
282 case JsRender.NodePropType.METHOD:
284 case JsRender.NodePropType.CTOR:
287 GLib.error( "getPropertiesFor called with: " + ptype.to_string());
288 //var ret = new Gee.HashMap<string,GirObject>();
294 //cls.overlayInterfaces(gir);
300 // removes all the properties where the type contains '.' ?? << disabled now..
302 public Gee.HashMap<string,GirObject> filterProps(Gee.HashMap<string,GirObject> props)
304 // we shold probably cache this??
306 var outprops = new Gee.HashMap<string,GirObject>();
308 foreach(var k in props.keys) {
309 var val = props.get(k);
320 //if (!val.type.contains(".")) {
327 // do nothing? - classes not allowed?
338 public string[] getInheritsFor(string ename)
341 var es = ename.split(".");
342 var gir = Gir.factory(null, es[0]);
344 var cls = gir.classes.get(es[1]);
348 return cls.inheritsToStringArray();
355 * Pulldown options for type
357 public override bool typeOptions(string fqn, string key, string type, out string[] opts)
360 print("get typeOptions %s (%s)%s", fqn, type, key);
361 if (type.up() == "BOOL" || type.up() == "BOOLEAN") {
362 opts = { "true", "false" };
366 var props = this.getPropertiesFor(fqn, JsRender.NodePropType.PROP);
367 if (!props.has_key(key)) {
368 print("prop %s does not have key %s\n", fqn, key);
371 var pr = props.get(key);
372 if (pr.optvalues.size < 1) {
373 print("prop %s no optvalues for %s\n", fqn, key);
377 for(var i = 0; i < pr.optvalues.size; i++) {
378 ret += pr.optvalues.get(i);
381 print("prop %s returning optvalues for %s\n", fqn, key);
388 public override Gee.ArrayList<string> getChildList(string in_rval, bool with_prop)
390 if (this.top_classes.size < 1) {
396 var ar = this.top_classes;
397 if (in_rval != "*top") {
398 if (this.classes.has_key(in_rval)) {
399 // some of these children will be eg: Roo.bootstrap.layout.Region:center
400 ar = this.classes.get(in_rval).valid_cn;
402 ar = new Gee.ArrayList<string>();
407 var ret = new Gee.ArrayList<string>();
408 foreach(var v in ar) {
409 if (v.contains(":")) {
417 GLib.debug("getChildList for %s returns %d items", in_rval, ar.size);
420 //return this.original_getChildList( in_rval);
425 public override Gee.ArrayList<string> getDropList(string rval)
428 if (this.dropCache.has_key(rval)) {
429 return this.dropCache.get(rval);
431 // we might be dragging Roo.bootstrap.layout.Region:center
432 // in which case we need to lookup Roo.bootstrap.layout.Region
433 // and see if it's has can_drop_onto
434 var ret = new Gee.ArrayList<string>();
435 var cls = this.classes.get(rval);
437 if (cls == null && rval.contains(":")) {
438 var rr = rval.substring(0,rval.index_of(":"));
439 GLib.debug("Converted classname to %s", rr);
440 cls = this.classes.get(rr);
443 return ret; //nothing..
446 foreach(var str in cls.can_drop_onto) {
450 //GLib.debug("getDropList for %s return[] %s", rval, string.joinv(", ", ret));
451 this.dropCache.set(rval,ret);
456 //return this.default_getDropList(rval);
458 public override JsRender.Node fqnToNode(string fqn)
460 var ret = new JsRender.Node();
462 // any default requred proerties?