namespace Palete { public class Introspect.El : Object { public enum eltype { NS, CLASS, METHOD, PROP } public eltype type; } public class Gtk : Palete { public Gee.ArrayList package_cache; public Gtk() { base(); this.name = "Gtk"; this.loadPackages(); //this.load(); // various loader methods.. //this.map = []; //this.load(); //this.proplist = {}; //this.comments = { }; // no parent... } public override void load () { this.loadUsageFile(Builder4.Application.configDirectory() + "/resources/GtkUsage.txt"); } public string doc(string what) { var ns = what.split(".")[0]; var gir = Gir.factory(ns); return gir.doc(what); //return typeof(this.comments[ns][what]) == 'undefined' ? '' : this.comments[ns][what]; } // does not handle implements... public override GirObject? getClass(string ename) { var es = ename.split("."); var gir = Gir.factory(es[0]); return gir.classes.get(es[1]); } public override Gee.HashMap getPropertiesFor(string ename, string type) { //print("Loading for " + ename); // if (typeof(this.proplist[ename]) != 'undefined') { //print("using cache"); // return this.proplist[ename][type]; //} // use introspection to get lists.. var es = ename.split("."); var gir = Gir.factory(es[0]); var cls = gir.classes.get(es[1]); if (cls == null) { var ret = new Gee.HashMap(); return ret; //throw new Error.INVALID_VALUE( "Could not find class: " + ename); } //cls.parseProps(); //cls.parseSignals(); // ?? needed for add handler.. //cls.parseMethods(); // ?? needed for ??.. //cls.parseConstructors(); // ?? needed for ??.. cls.overlayParent(); switch (type) { case "props": return cls.props; case "signals": return cls.signals; case "methods": return cls.methods; case "ctors": return cls.ctors; default: throw new Error.INVALID_VALUE( "getPropertiesFor called with: " + type); //var ret = new Gee.HashMap(); //return ret; } //cls.overlayInterfaces(gir); } public string[] getInheritsFor(string ename) { string[] ret = {}; var cls = Gir.factoryFqn(ename); if (cls == null || cls.nodetype != "Class") { print("getInheritsFor:could not find cls: %s\n", ename); return ret; } return cls.inheritsToStringArray(); } public override void fillPack(JsRender.Node node,JsRender.Node parent) { string inherits = string.joinv(" ", this.getInheritsFor (node.fqn())) + " "; inherits += node.fqn() + " "; //print ("fillPack:Inherits : %s\n", inherits); // parent.fqn() method ( node.fqn() var methods = this.getPropertiesFor (parent.fqn(), "methods"); var res = new Gee.HashMap(); var map = methods.map_iterator(); while (map.next()) { var n = map.get_key(); //print ("fillPack:checking method %s\n", n); var meth = map.get_value(); if (meth.paramset == null || meth.paramset.params.size < 1) { print ("fillPack:c -- no params\n"); continue; } var fp = meth.paramset.params.get(0); var type = Gir.fqtypeLookup(fp.type, meth.ns); print ("fillPack:first param type is %s\n", type); if (!inherits.contains(" " + type + " ")) { continue; } var pack = meth.name; for(var i =1; i < meth.paramset.params.size; i++) { var ty = Gir.fqtypeLookup(meth.paramset.params.get(i).type, meth.ns); pack += "," + Gir.guessDefaultValueForType(ty); } print ("fillPack:add pack: -- %s\n",pack ); res.set(meth.name, pack); } if (res.size < 1) { return ; } if (res.has_key("pack_start")) { node.props.set("* pack", res.get("pack_start")); return; } if (res.has_key("add")) { node.props.set("* pack", res.get("add")); return; } var riter = res.map_iterator(); while(riter.next()) { node.props.set("* pack", riter.get_value()); return; } } public Gee.ArrayList packages() { return this.package_cache; } public void loadPackages() { this.package_cache = new Gee.ArrayList(); var context = new Vala.CodeContext (); var dirname = Path.get_dirname (context.get_vapi_path("glib-2.0")); var dir = File.new_for_path(dirname); try { var file_enum = dir.enumerate_children( GLib.FileAttribute.STANDARD_DISPLAY_NAME, GLib.FileQueryInfoFlags.NONE, null ); FileInfo next_file; while ((next_file = file_enum.next_file(null)) != null) { var fn = next_file.get_display_name(); if (!Regex.match_simple("\\.vapi$", fn)) { continue; } this.package_cache.add(Path.get_basename(fn).replace(".vapi", "")); } } catch(Error e) { print("oops - something went wrong scanning the packages\n"); } } } }