/** * Remove fake root folder if not needed (that is if the UI * is completely enclosed in one folder) */ Tree Compiler::prepareUserInterfaceTree(Tree t) { Tree root, elems; if (isUiFolder(t, root, elems) && isList(elems) && isNil(tl(elems)) ) { Tree folder = right(hd(elems)); return (isUiFolder(folder)) ? folder : t; } return t; }
void Description::addGroup(int level, Tree t) { Tree label, elements, varname, sig; const char* groupnames[] = { "vgroup", "hgroup", "tgroup" }; if(isUiFolder(t, label, elements)) { const int orient = tree2int(left(label)); addLayoutLine(level, subst("<group type=\"$0\">", groupnames[orient])); addLayoutLine(level + 1, subst("<label>$0</label>", checkNullLabel(t, xmlize(tree2str(right(label))), false))); while(!isNil(elements)) { addGroup(level + 1, right(hd(elements))); elements = tl(elements); } addLayoutLine(level, "</group>"); } else if(isUiWidget(t, label, varname, sig)) { int w = addWidget(label, varname, sig); addLayoutLine(level, subst("<widgetref id=\"$0\" />", T(w))); } else { fprintf(stderr, "error in user interface generation 2\n"); exit(1); } }
// place un item dans un folder. Sans Remplacement Tree addToFolder(Tree folder, Tree item) { Tree label, content; if ( ! isUiFolder(folder, label, content)) { fprintf(stderr, "ERROR in addFolder : not a folder\n"); } return uiFolder(label, addKey(content, uiLabel(item), item)); }
/** * Generate user interface macros corresponding * to user interface element t */ void Compiler::generateMacroInterfaceTree(const string& pathname, Tree t) { Tree label, elements, varname, sig; if(isUiFolder(t, label, elements)) { string pathname2 = pathname; // string str = unquote(tree2str(right(label))); string str = tree2str(right(label)); if(str.length() > 0) pathname2 += str + "/"; generateMacroInterfaceElements(pathname2, elements); } else if(isUiWidget(t, label, varname, sig)) { generateWidgetMacro(pathname, label, varname, sig); } else { fprintf(stderr, "error in user interface macro generation 2\n"); exit(1); } }
// get an item from a folder (or return NIL) Tree getFolder (Tree folder, Tree ilabel) { Tree flabel, content, item; if (!isUiFolder(folder, flabel, content)) { fprintf(stderr, "ERROR in getFolder : not a folder\n"); } if (findKey(content, ilabel, item)) { return item; } else { return nil; } }
/** * Generate buildUserInterface C++ lines of code corresponding * to user interface element t */ void Compiler::generateUserInterfaceTree(Tree t) { Tree label, elements, varname, sig; if (isUiFolder(t, label, elements)) { const int orient = tree2int(left(label)); // Empty labels will be renamed with a 0xABCD (address) kind of name that is ignored and not displayed by UI architectures const char* str = tree2str(right(label)); const char* model; // extract metadata from group label str resulting in a simplifiedLabel // and metadata declarations for fictive zone at address 0 string simplifiedLabel; map<string, set<string> > metadata; extractMetadata(str, simplifiedLabel, metadata); // add metadata if any for (map<string, set<string> >::iterator i = metadata.begin(); i != metadata.end(); i++) { const string& key = i->first; const set<string>& values = i->second; for (set<string>::const_iterator j = values.begin(); j != values.end(); j++) { fClass->addUICode(subst("interface->declare($0, \"$1\", \"$2\");", "0", wdel(key) ,wdel(*j))); fJSON.declare(NULL, wdel(key).c_str(), wdel(*j).c_str()); } } //----------------- switch (orient) { case 0 : model = "interface->openVerticalBox(\"$0\");"; fJSON.openVerticalBox(checkNullLabel(t, simplifiedLabel).c_str()); break; case 1 : model = "interface->openHorizontalBox(\"$0\");"; fJSON.openHorizontalBox(checkNullLabel(t, simplifiedLabel).c_str()); break; case 2 : model = "interface->openTabBox(\"$0\");"; fJSON.openTabBox(checkNullLabel(t, simplifiedLabel).c_str()); break; default : fprintf(stderr, "error in user interface generation 1\n"); exit(1); } fClass->addUICode(subst(model, checkNullLabel(t, simplifiedLabel))); generateUserInterfaceElements(elements); fClass->addUICode("interface->closeBox();"); fJSON.closeBox(); } else if (isUiWidget(t, label, varname, sig)) { generateWidgetCode(label, varname, sig); } else { fprintf(stderr, "error in user interface generation 2\n"); exit(1); } }
Tree putSubFolder(Tree folder, Tree path, Tree item) { if (isNil(path)) { //return putFolder(folder, item); return addToFolder(folder, item); } else { Tree subfolder = getFolder(folder, hd(path)); if (isUiFolder(subfolder)) { return putFolder(folder, putSubFolder(subfolder, tl(path), item)); } else { return putFolder(folder, makeSubFolderChain(path, item)); } } }