6 public errordomain Error {
13 public class Usage : Object
15 public Gee.ArrayList<string> left;
16 public Gee.ArrayList<string> right;
17 public Usage(Gee.ArrayList<string> ileft, Gee.ArrayList<string> iright)
22 public bool leftHas(string s)
24 for(var i = 0 ; i < this.left.size; i++) {
25 var m = this.left.get(i);
29 if (!m.contains(":")) {
32 var ar = m.split(":");
46 static Gee.HashMap<string,Palete>? cache = null;
48 public static Palete factory(string xtype)
51 cache = new Gee.HashMap<string,Palete>();
53 if (cache.get(xtype) != null) {
54 return cache.get(xtype);
58 cache.set(xtype, new Gtk());
61 cache.set(xtype, new Roo());
64 throw new Error.INVALID_TYPE("invalid argument to Palete factory");
66 return cache.get(xtype);
70 public abstract class Palete : Object
76 public Gee.ArrayList<Usage> map;
85 //map : false, // array of mappings left: [] , right : []
87 //items : false, // the tree of nodes.
92 string guessName(JsRender.Node ar) throws Error // turns the object into full name.
94 throw new Error.NEED_IMPLEMENTING("xxx. guessName needs implimenting");
100 * gather a list of potentional objects that can be added..
104 listChildren: function (existing) {
105 existing = existing || [];
106 // existing.push('*top'); // always have top
108 console.log("GATHER LIST? " + this.map.length);
111 function addRight(right) {
112 right.forEach(function(r) {
113 if (ret.indexOf(r) > -1) {
120 this.map.forEach(function(m) {
122 m.left.forEach( function(left) {
125 var l = left.replace(/:.*$/, '');
126 // print("chk:" + l + " in " + existing.join(','));
127 if (existing.indexOf(l) > -1) {
130 //return true; // no more needed..
137 // console.dump(ret);
147 public string[] getChildList(string in_rval)
150 if (this.map == null) {
155 var rval = in_rval == "" ? "*top" : in_rval;
157 // should be a bit more than this..
158 // -> it should look for all elements that inherit
160 var rt = new Gee.ArrayList<string>();
161 for (var i = 0; i < this.map.size; i++) {
162 var m = this.map.get(i);
164 if (!m.leftHas(rval)) {
167 print("found LEFT, adding right\n");
169 for(var ii =0; ii < m.right.size; ii++) {
170 var l = m.right.get(ii);
172 if (rt.index_of(l) > -1) {
175 //print("ADD " + string.joinv(", ", ret) + "\n");
182 print ("drop list for %s is:\n%s\n", rval, string.joinv("\n", ret));
183 //console.log("DROP LIST:");
190 public string[] getDropList(string rval)
193 if (this.map == null) {
198 // should be a bit more than this..
199 // -> it should look for all elements that inherit
201 var rt = new Gee.ArrayList<string>();
202 for (var i = 0; i < this.map.size; i++) {
203 var m = this.map.get(i);
205 if (m.right.index_of(rval) < 0) {
208 //print("found RIGHT, adding left\n");
210 for(var ii =0; ii < m.left.size; ii++) {
211 var l = m.left.get(ii);
213 if (rt.index_of(l) > -1) {
216 //print("ADD " + string.joinv(", ", ret) + "\n");
223 print ("drop list for %s is:\n%s\n", rval, string.joinv("\n", ret));
224 //console.log("DROP LIST:");
233 findType : function (data, prop, value)
235 if (prop[0] == '|') {
238 return typeof(value);
242 findOptions : function(ename)
244 switch(ename.toLowerCase()) {
246 return [ 'true', 'false' ];
247 // everything else does not have options.
255 console.log("OOPS: = unknown type: " + ename);
259 confirmCanAdd: function(parent, child) {
260 // confirms that one obj can be added to another.
261 // returns true, for items, or list of properties that can hold it..
265 getDefaultPack: function(pname, cname) {
269 public void saveTemplate (string name, JsRender.Node data)
273 // store it in user's directory..
274 var appdir = GLib.Environment.get_home_dir() + "/.Builder";
277 if (!GLib.FileUtils.test(appdir+ "/" + gn, GLib.FileTest.IS_DIR)) {
278 GLib.File.new_for_path (appdir+ "/" + gn).make_directory ();
281 GLib.FileUtils.set_contents(appdir+ "/" + gn + "/" + name + ".json", data.toJsonString());
286 * list templates - in home directory (and app dir in future...)
287 * @param {String} name - eg. Gtk.Window..
288 * @return {Array} list of templates available..
291 public GLib.List<string> listTemplates (JsRender.Node node)
296 var ret = new GLib.List<string>();
297 var dir= GLib.Environment.get_home_dir() + "/.Builder/" + gn;
298 if (!GLib.FileUtils.test(dir, GLib.FileTest.IS_DIR)) {
305 var f = File.new_for_path(dir);
307 var file_enum = f.enumerate_children(GLib.FileAttribute.STANDARD_DISPLAY_NAME, GLib.FileQueryInfoFlags.NONE, null);
310 while ((next_file = file_enum.next_file(null)) != null) {
311 var n = next_file.get_display_name();
312 if (!Regex.match_simple ("\\.json$", n)) {
315 ret.append( dir + "/" + n);
321 public JsRender.Node? loadTemplate(string path)
324 var pa = new Json.Parser();
325 pa.load_from_file(path);
326 var node = pa.get_root();
328 if (node.get_node_type () != Json.NodeType.OBJECT) {
331 var obj = node.get_object ();
333 var ret = new JsRender.Node();
336 ret.loadFromJson(obj, 1);
337 ret.ref(); // not sure if needed -- but we had a case where ret became uninitialized?
341 public void loadUsageFile (string fname) {
346 print("Palete Load called\n");
348 if (!FileUtils.test (fname, FileTest.EXISTS)) {
349 throw new Error.MISSING_FILE(fname + " not found");
352 FileUtils.get_contents(fname, out raw);
354 var data = raw.split("\n");
356 var cfg = new Gee.ArrayList<Usage>();
357 var left = new Gee.ArrayList<string>();
358 var right = new Gee.ArrayList<string>();
360 for (var i = 0; i < data.length; i++) {
361 var d = data[i].strip();
362 //print("READ " + d + "\n");
366 Regex.match_simple ("^\\s+$", d)
368 Regex.match_simple ("^\\s*/", d)
373 if (Regex.match_simple ("^left:", d)) {
376 cfg.add(new Usage( left, right));
378 left = new Gee.ArrayList<string>();
379 right = new Gee.ArrayList<string>();
382 if (Regex.match_simple ("^right:", d)) {
387 //print("add left: " + d + "\n");
391 //print("add Right: " + d + "\n");
397 cfg.add(new Usage( left, right));
405 public Gee.HashMap<int,string> validateCode(
409 JsRender.JsRender file,
414 //print("validate code (%s) %s\n", file.language, code);
417 if (file.language == "js" && (ptype == "listener" || property[0] == '|')) {
418 var ret = new Gee.HashMap<int,string>();
420 //var cd = new JSCore.ClassDefinitionEmpty();
422 var line = Javascript.singleton().validate(
423 "var __aaa___ = " + code, out errmsg);
428 ret.set(line, errmsg);
431 if (file.language == "vala" ) { // not sure if we need to validate property
433 var vs = new ValaSource(file);
434 //var cd = new JSCore.ClassDefinitionEmpty();
435 var ret = vs.checkFileWithNodePropChange(
443 var ret = new Gee.HashMap<int,string>();
445 //print ("not javascript\n");
452 public abstract void fillPack(JsRender.Node node,JsRender.Node parent);
453 public abstract void load();
454 public abstract Gee.HashMap<string,GirObject> getPropertiesFor(string ename, string type);
455 public abstract GirObject? getClass(string ename);