User interface programming / Tree views |
Once the program array is defined according to the screen-array of the tree-view table, fill the array with the tree-view definition.
You can directly fill the program array before the dialog execution. Once the dialog has started, you must use the methods DIALOG.insertNode(), DIALOG.appendNode() and DIALOG.deleteNode(), if you want to modify the tree, otherwise information like multi-range selection flags and cell attributes will not be synchronized.
Fill the rows in the correct order defining the structure of the tree, to reflect the parent/child relationship of the tree nodes. If a row defines a tree-view node with a parent identifier that does not exist, or if the child row is inserted under the wrong parent row, the orphan row will become a new node at the root of the tree.
In order to fill the program array with database rows defining the tree structure, you will need to write a recursive function, keeping track of the current level of the nodes to be created for a given parent.
CREATE TABLE dbtree ( id SERIAL NOT NULL, parentid INTEGER NOT NULL, name VARCHAR(20) NOT NULL )
TYPE tree_t RECORD id INTEGER, parentid INTEGER, name VARCHAR(20) END RECORD DEFINE tree_arr tree_t FUNCTION fetch_tree(pid) DEFINE pid, i, j, n INTEGER DEFINE a DYNAMIC ARRAY OF tree_t DEFINE t tree_t DECLARE cu1 CURSOR FOR SELECT * FROM dbtree WHERE parentid = pid LET n = 0 FOREACH cu1 INTO t.* LET n = n + 1 LET a[n].* = t.* END FOREACH FOR i = 1 TO n LET j = tree_arr.getLength() + 1 LET tree_arr[j].name = a[i].name LET tree_arr[j].id = a[i].id LET tree_arr[j].parentid = a[i].parentid CALL fetch_tree(a[i].id) END FOR END FUNCTION