#include  </root/mysql/gtk+-1.2.8/gtk/gtk.h> 
GtkWidget *frm_trees; 
GtkWidget *tree_left, *ctree_right; 
GtkWidget *subtree_item2; 
GtkWidget *subtree_item3;
GtkWidget *subtree_widgets;
void destroy_main(); 
void cmd_cycle_line_style_clicked(); 
void cmd_cycle_expander_clicked() ; gint main(gint argc,gchar *argv[])
{
GtkWidget *hbox_main, *vbox_left, *vbox_right; 
GtkWidget *lvl1_item1, *lvl1_item2; 
GtkWidget *widgets_item; 
GtkWidget *label_widget,*button_widget,*check_box_widget; 
GtkWidget *item2_item1, *item2_item1_item1; 
GtkWidget *label_item, *button_item, *check_box_item; 
GtkWidget *cmd_cycle_line_style,*cmd_cycle_expander;GtkCTreeNode *root_node_1;
GtkCTreeNode *root_node_2;
GtkCTreeNode *root_node_3; 
 
/* The following sets the titles for the CTree widget. 
* The width of the columns will be determined by 
• the column headers, not the data in the columns. 
*/ 
gchar *column_titles[2] = {"position","info"};gchar *root1_data[2] = {"root1", "test"};  
gchar *root2_data[2] = {"root2", "This one has subnodes." };
gchar *root3_data[2] = {"subnodel", "Subnode. "};
 
gtk_init(&argc, &argv); frm_trees = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW (frm_trees), "Tree Widgets Demo");
 
gtk_signal_connect(GTK_OBJECT(frm_trees),
"destroy", 
GTK_SIGNAL_FUNC(destroy_main), 
NULL) ; 
hbox_main = gtk_hbox_new(TRUE, 0); 
vbox_left = gtk_vbox_new(TRUE, 0); 
vbox_right = gtk_vbox_new(FALSE, 0); /* The fundamental differences between GtkTree and GtkCTree 
* are similar to the differences between GtkList and GtkCList. 
* That is, GtkTree can accept any widget as a tree item, 
* whereas GtkCTree can accept only pixmaps or text
*/ 
tree_left = gtk_tree_new();
 
/* A tree isn't much good if it doesn't have叩hing in it. 
* Fortunately, adding a "tree item" widget is quite simple...
*/lvl1_item1 = gtk_tree_item_new_with_label ("Level 1,Item 1");  
lvl1_item2 = gtk_tree_item_new_with_label ("Level 1,Item 2"); gtk_tree_append(GTK_TREE(tree_left), lvl1_item1); 
gtk_tree_append (GTK_TREE (tree_left), lvl1_item2); /* unfortuaate1y,this creates a tree that imitates a list
* box.The tree Widget is not useful unless {and until}YOU Start 
* adding aubtrees.NOte that this is different from adding nodes 
* and POinters,Which is taken care OE for you by the subtree 
* structure • 
• 
* You don't add a tree to a treeF You add a tree to a "tree 
*. item. " 
*/ 
subtree_item2 = gtk_tree_new(); 
item2_item1=gtk_tree_item_new_with_label("Level2,item 1"); 
gtk_tree_append(GTK_TREE(subtree_item2),item2_item1); 
gtk_tree_item_set_subtree(GTK_TREE_ITEM(lvl1_item2), subtree_item2); /* You have to explicitly show the subtree tree items • 
• 
* NOte that if the user haa selected items in a aubtree and then 
* collapses that branch of the tree, the items remain selected
*/ 
gtk_widget_show(item2_item1);
 
subtree_item3 = gtk_tree_new(); 
item2_item1_item1=gtk_tree_item_new_with_label ("Level 3,Item 1"); 
gtk_tree_append(GTK_TREE(subtree_item3),item2_item1_item1); gtk_tree_item_set_subtree(GTK_TREE_ITEM(item2_item1), subtree_item3);
 
gtk_widget_show(item2_item1_item1);
 
widgets_item=gtk_tree_item_new_with_label("Widgets");
gtk_tree_append(GTK_TREE(tree_left ),widgets_item);subtree_widgets = gtk_tree_new();
gtk_tree_item_set_subtree(GTK_TREE_ITEM(widgets_item),subtree_widgets); /* add some widgets to the tree
*
* First, construct a label widget and add it to the tree.
*/ 
label_item = gtk_tree_item_new(); 
label_widget = gtk_label_new ("This is a label widget."); 
gtk_container_add(GTK_CONTAINER(label_item), label_widget);
gtk_widget_show(label_widget);
gtk_widget_show(label_item);
/* Next , add a command button to the trss.
*/
button_item =gtk_tree_item_new();
button_widget = gtk_button_new_with_label ("This is a button widget."); 
gtk_container_add(GTK_CONTAINER(button_item), button_widget);
gtk_tree_append(GTK_TREE(subtree_widgets), button_item); 
gtk_widget_show(button_widget) ; 
gtk_widget_show(button_item); /* And now a check box 
*/ 
check_box_item = gtk_tree_item_new() ; 
check_box_widget = gtk_check_button_new_with_label ("This is a check box widget."); 
gtk_container_add(GTK_CONTAINER(check_box_item), check_box_widget); 
gtk_tree_append(GTK_TREE(subtree_widgets), check_box_item); 
gtk_widget_show(check_box_widget) ; 
gtk_widget_show(check_box_item) ; /* Now look at the CTree widget for comparison. 
*/ ctree_right = gtk_ctree_new_with_titles(2, 0, column_titles); 
root_node_1 = gtk_ctree_insert_node(GTK_CTREE(ctree_right), NULL, NULL, root1_data, 
0, NULL, NULL, NULL, NULL, FALSE, TRUE); 
root_node_2 = gtk_ctree_insert_node (GTK_CTREE(ctree_right), NULL, NULL, root2_data, 
0, NULL, NULL, NULL, NULL, FALSE, TRUE); 
root_node_3 = gtk_ctree_insert_node(GTK_CTREE(ctree_right), root_node_2, NULL,
root3_data, 
0, NULL, NULL, NULL, NULL, FALSE, TRUE); /* As you can see, the construction of a CTree is much simpler. 
* Once you have the CTree widget instantiated, you essentially 
* create new nodes and attach themto existing nodes. The 
* parameters for the gtk_ctree_insert_node are as follows: 
*. ctree_The ctree object in question. 
* • parent__The parent node to attach to; NULL for ro口t level. 
*. sibling__The sibling node; NULL for end of branch. 
*. text__A text array of values for the ctree columns; must 
*  contain the same number of values as the ctree 
*  contains columns. 
*. spaclng--number of pixels between the tree_structure 

*   pixmap and the text. 
* • pixmap_closed \ 
* • bi tmask_closed \Pixmap and bitmap pointers to display when * • pixmap_opened / the node is expanded or collapsed. 
* • bitmask_opened I 
*. is_leaf一_Boolean indicating whether or not this node is a 

*    leaf; if TRUE, it doesn't contain subnodes, and you won't be able to add subnodes. 

*. expanded__Boolean indicating the default expanded/non_expanded 

state of the node. 
*/ 
cmd_cycle_line_style = gtk_button_new_with_label ("Cycle Line Style"); 
gtk_signal_connect(GTK_OBJECT (cmd_cycle_line_style), 
"clicked", 
GTK_SIGNAL_FUNC(cmd_cycle_line_style_clicked), NULL) ; cmd_cycle_expander = gtk_button_new_with_label ("Cycle Expander Style"); 
gtk_signal_connect(GTK_OBJECT (cmd_cycle_expander), 
"clicked", 
GTK_SIGNAL_FUNC(cmd_cycle_expander_clicked),NULL) ; 
gtk_box_pack_start(GTK_BOX(vbox_left), tree_left, TRUE, TRUE, 0); 
gtk_box_pack_start(GTK_BOX (vbox_right), ctree_right, TRUE, TRUE, 0); 
gtk_box_pack_start(GTK_BOX(vbox_right), cmd_cycle_line_style, TRUE, FALSE, 0); 
gtk_box_pack_start(GTK_BOX(vbox_right), cmd_cycle_expander, TRUE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox_main), vbox_left, TRUE, TRUE, 0); 
gtk_box_pack_start(GTK_BOX(hbox_main), vbox_right, TRUE, TRUE, 0);
gtk_container_add (GTK_CONTAINER (frm_trees), hbox_main);
gtk_widget_show_all (frm_trees); 
gtk_main (); 
return 0 ; 
}
void destroy_main() 

gtk_main_quit ();

void cmd_cycle_line_style_clicked()
{
   static gint line_style = 1;if (line_style == 4) 
line_style = 1; 
else line_style++; switch (line_style)
{
case 1: gtk_ctree_set_line_style(GTK_CTREE(ctree_right), 
GTK_CTREE_LINES_NONE) ; 
break; 
case 2: gtk_ctree_set_line_style(GTK_CTREE(ctree_right), 
GTK_CTREE_LINES_SOLID) ; 
break; 
case 3: gtk_ctree_set_line_style(GTK_CTREE(ctree_right), 
GTK_CTREE_LINES_DOTTED); 
break; 
case 4: gtk_ctree_set_line_style(GTK_CTREE(ctree_right), 
GTK_CTREE_LINES_TABBED); 
break; 
default: g_print ("Should not see this line!!" ) ; 
break; 
}
}
void cmd_cycle_expander_clicked() 
{
static gint expander_style = 1; if (expander_style == 4) 
expander_style = 1; 
else expander_style++;
switch (expander_style)

case 1: gtk_ctree_set_expander_style(GTK_CTREE(ctree_right), 
GTK_CTREE_EXPANDER_NONE) ; 
break; 
case 2: gtk_ctree_set_expander_style(GTK_CTREE(ctree_right), 
GTK_CTREE_EXPANDER_SQUARE) ; 
break; 
case 3: gtk_ctree_set_expander_style(GTK_CTREE(ctree_right), 
GTK_CTREE_EXPANDER_TRIANGLE) ; 
break; 
case 4: gtk_ctree_set_expander_style(GTK_CTREE(ctree_right), 
GTK_CTREE_EXPANDER_CIRCULAR) ; 
break; 
default: g_print("Should not see this line!!");
 break;
}
}