TRUE = 1; FALSE = 0; /* The GTK_TREE_ITEM_SUBTREE() macro isn't supported in Gamma/GTK. * This resouce takes its place, and must be assigned whenever the * GtkTreeItem.set_subtree() method is used. */ class_add_ivar (GtkTreeItem, #subtree); /* Information from SetTree Parameters window for creating the tree. */ class TreeInfo { select_mode; draw_line; view_line; no_root_item; num_items; depth_items; } /* Status of Tree Sample buttons: sensitive or not. */ class TreeButtons { add_button; remove_button; subtree_button; } /* A list of all items in a Tree Sample, and a total number of items added to the sample. */ class SampleInfo { item_list = list(); added = 0; } /* Returns a list of selected items in the tree sample. * This takes the place of GTK_TREE_SELECTION(), and allows * for multiple selections.*/ method SampleInfo.selected() { local select_list; with item in self.item_list select_list=tcollect if ((instance_p(item)) && (item.state == GTK_STATE_SELECTED)) item; else nil; select_list; } /* creates an adjustment */ function make_adj (low, up, step, pg_inc, pg_size) { adj = new(GtkAdjustment); adj.lower = low; adj.upper = up; adj.step_increment = step; adj.page_increment = pg_inc; adj.page_size = pg_size; adj; } function cb_tree_changed(buttons, s_info) { local change_list; if (change_list = s_info.selected()) { buttons.add_button.set_sensitive(TRUE); buttons.remove_button.set_sensitive(TRUE); buttons.subtree_button.set_sensitive(TRUE); } else { buttons.add_button.set_sensitive(FALSE); buttons.remove_button.set_sensitive(FALSE); buttons.subtree_button.set_sensitive(FALSE); } } function cb_add_new_item(tree, s_info) { local item_subtree, add_list, item_new; if (add_list = s_info.selected()) { with selected_item in add_list do { item_new = gtk_tree_item_new_with_label (string("added-item-", s_info.added)); if (!selected_item.subtree) { item_subtree = gtk_tree_new(); selected_item.set_subtree(item_subtree); selected_item.subtree = item_subtree; } s_info.added++; s_info.item_list = cons(item_new, s_info.item_list); selected_item.subtree.append(item_new); item_new.show(); } } } function cb_remove_item(tree, s_info) { local clear_list; if (clear_list = s_info.selected()) tree.remove_items (clear_list); } function cb_remove_subtree(tree, s_info) { local clear_list; if (clear_list = s_info.selected()) with selected_item in clear_list do if ((selected_item.subtree) && (!destroyed_p(selected_item.subtree))) selected_item.remove_subtree(); } function tree_info_cb(wgt) { if (class_name(wgt) == #GtkSpinButton) wgt.get_value_as_int(); else if (wgt.get_active() == TRUE) 1; else 0; } function create_subtree(item, level, item_max, recurse_max) { local item_subtree, item_new, nb_item, no_root_item; if (level != recurse_max) { if (level == -1) { /* query with no root item */ level = 0; item_subtree = item; princ(class_name(item), "\n"); no_root_item = 1; } else { /* create subtree and associate it with current item */ item_subtree = gtk_tree_new(); no_root_item = 0; } /* create new item(s) */ for (nb_item = 0; nb_item < item_max; nb_item++) { item_new = gtk_tree_item_new_with_label(string("item-", level, "-", nb_item)); s_info.item_list = cons(item_new, s_info.item_list); item_subtree.append(item_new); create_subtree(item_new, level+1, item_max, recurse_max); item_new.show(); } if (no_root_item == 0) { item.set_subtree(item_subtree); item.subtree = item_subtree; } } } function create_tree_sample(t_info) { local window, box1, box2, separator, button, scrolled_win, root_tree, root_item, tree_buttons, max; if ((max = pow (t_info.num_items, t_info.depth_items)) > 10000) princ(format(string("%1.3g total items? That will take a very", " long time. Try less.\n"), max)); else { /* create top level window */ window = new(GtkWindow); window.signal ("destroy", #window = nil); window.title = "Tree Sample"; /* instantiate a TreeButtons */ tree_buttons = new(TreeButtons); /* instantiate a SampleInfo */ s_info = new(SampleInfo); box1 = new(GtkVBox); window.add(box1); box1.show(); /* create tree box */ box2 = new(GtkVBox); box1.pack_start(box2, TRUE, TRUE, 0); box2.border_width = 5; box2.show(); /* create scrolled window */ scrolled_win = new(GtkScrolledWindow); scrolled_win.set_policy(GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); box2.pack_start(scrolled_win, TRUE, TRUE, 0); scrolled_win.set_usize(200, 200); scrolled_win.show(); tree_item = new(GtkTreeItem); /* create root tree widget */ root_tree = new(GtkTree); root_tree.signal("selection_changed", `cb_tree_changed(@tree_buttons, @s_info)); scrolled_win.add_with_viewport(root_tree); root_tree.set_selection_mode(t_info.select_mode); root_tree.set_view_lines(t_info.draw_line); root_tree.set_view_mode(t_info.view_line); root_tree.show(); if (t_info.no_root_item == 1) { /* set root tree to subtree function with root item variable */ root_item = root_tree; } else { /* create root tree item widget */ root_item = gtk_tree_item_new_with_label("root item"); root_tree.append(root_item); root_item.show(); s_info.item_list = cons(root_item, s_info.item_list); } create_subtree(root_item, -(t_info.no_root_item), t_info.num_items, t_info.depth_items); box2 = new(GtkVBox); box1.pack_start(box2, FALSE, FALSE, 0); box2.border_width = 5; box2.show(); button = new(GtkButton); button.label = "add Item"; button.set_sensitive(FALSE); button.signal("clicked", `cb_add_new_item(@root_tree, @s_info)); box2.pack_start(button, TRUE, TRUE, 0); button.show(); tree_buttons.add_button = button; button = new(GtkButton); button.label = "Remove Item(s)"; button.set_sensitive(FALSE); button.signal("clicked", `cb_remove_item(@root_tree, @s_info)); box2.pack_start(button, TRUE, TRUE, 0); button.show(); tree_buttons.remove_button = button; button = new(GtkButton); button.label = "Remove Subtree"; button.set_sensitive(FALSE); button.signal("clicked", `cb_remove_subtree(@root_tree, @s_info)); box2.pack_start(button, TRUE, TRUE, 0); button.show(); tree_buttons.subtree_button = button; /* create separator */ separator = new(GtkHSeparator); box2.pack_start(separator, FALSE, FALSE, 0); separator.show(); /* create button box */ box2 = new(GtkVBox); box2.border_width = 5; box1.pack_start(box2, FALSE, FALSE, 0); box2.show(); button = new(GtkButton); button.label = "Close"; box2.pack_start(button, TRUE, TRUE, 0); button.signal("clicked", `(@window).destroy()); button.show(); window.show(); } } function create_tree_mode_window () { local box1, box2, box3, box4, box5, button, frame, separator, label, spinner, adj; win_tree_mode_window = new (GtkWindow); win_tree_mode_window.signal ("destroy", #win_tree_mode_window = nil); win_tree_mode_window.title = "SetTree Parameters"; win_tree_mode_window.border_width = 0; box1 = new(GtkVBox); win_tree_mode_window.add(box1); /* create upper box - selection box */ box2 = new(GtkVBox); box2.spacing = 5; box2.border_width = 5; box1.pack_start(box2, TRUE, TRUE, 0); box3 = new(GtkHBox); box3.spacing = 5; box2.pack_start(box3, TRUE, TRUE, 0); /* create selection mode frame */ frame = new(GtkFrame); frame.label = "Selection Mode"; box3.pack_start(frame, TRUE, TRUE, 0); box4 = new(GtkVBox); frame.add(box4); box4.border_width = 5; /* instantiate a TreeInfo */ tree_info = new(TreeInfo); /* create radio buttons.*/ button1 = gtk_radio_button_new_with_label(nil, "SINGLE"); button1.signal("clicked", `(@tree_info).select_mode = GTK_SELECTION_SINGLE); button1.set_active(TRUE); box4.pack_start(button1, TRUE, TRUE, 0); button2 = gtk_radio_button_new_with_label(list(button1), "BROWSE"); button2.signal("clicked", `(@tree_info).select_mode = GTK_SELECTION_BROWSE); button2.set_active(TRUE); box4.pack_start(button2, TRUE, TRUE, 0); button3 = gtk_radio_button_new_with_label(list(button1, button2), "MULTIPLE"); button3.signal("clicked", `(@tree_info).select_mode = GTK_SELECTION_MULTIPLE); button1.set_active(TRUE); box4.pack_start(button3, TRUE, TRUE, 0); /* create option mode frame */ frame = new(GtkFrame); frame.label = "Options"; box3.pack_start(frame, TRUE, TRUE, 0); box4 = new(GtkVBox); frame.add(box4); box4.border_width = 5; /* create check buttons */ button = gtk_check_button_new_with_label("Draw line"); box4.pack_start(button, TRUE, TRUE, 0); button.signal("toggled", `(@tree_info).draw_line = tree_info_cb(@button)); button.set_active(TRUE); button = gtk_check_button_new_with_label("View Line mode"); box4.pack_start(button, TRUE, TRUE, 0); button.signal("toggled", `(@tree_info).view_line = tree_info_cb(@button)); button.set_active(TRUE); button = gtk_check_button_new_with_label("Without Root item"); box4.pack_start(button, TRUE, TRUE, 0); button.signal("toggled", `(@tree_info).no_root_item = tree_info_cb(@button)); button.set_active(FALSE); tree_info.no_root_item = 0; /* create size parameters frame */ frame = new(GtkFrame); frame.label = "Size Parameters"; box2.pack_start(frame, TRUE, TRUE, 0); box4 = new(GtkHBox); box4.spacing = 5; frame.add(box4); box4.border_width = 5; /* create number of item spin button */ box5 = new(GtkHBox); box5.spacing = 5; box4.pack_start(box5, FALSE, FALSE, 0); label = new(GtkLabel); label.set_text("Number of items : "); label.set_alignment(0, 0.5); box5.pack_start(label, FALSE, TRUE, 0); adj = make_adj(1.0, 255.0, 1.0, 5.0, 0.0); spinner = new(GtkSpinButton); spinner.configure(adj, 0, 0); spinner.signal("changed", `(@tree_info).num_items = tree_info_cb(@spinner)); spinner.set_value(3); box5.pack_start(spinner, FALSE, TRUE, 0); /* create recursion level spin button */ box5 = new(GtkHBox); box5.spacing = 5; box4.pack_start(box5, FALSE, FALSE, 0); label = new(GtkLabel); label.set_text("Depth : "); label.set_alignment(0, 0.5); box5.pack_start(label, FALSE, TRUE, 0); adj = make_adj(0.0, 255.0, 1.0, 5.0, 0.0); spinner = new(GtkSpinButton); spinner.configure(adj, 0, 0); spinner.signal("changed", `(@tree_info).depth_items = tree_info_cb(@spinner)); spinner.set_value(3); box5.pack_start(spinner, FALSE, TRUE, 0); /* create horizontal separator */ separator = new(GtkHSeparator); box1.pack_start(separator, FALSE, FALSE, 0); /* create bottom button box */ box2 = new(GtkHBox); box2.homogeneous = (TRUE); box2.spacing = 10; box1.pack_start(box2, FALSE, FALSE, 0); box2.border_width = 5; button = new(GtkButton); button.label = "Create Tree"; button.signal("clicked",`create_tree_sample(@tree_info)); box2.pack_start(button, TRUE, TRUE, 0); button = new(GtkButton); button.label = "Close"; button.signal("clicked", `(@win_tree_mode_window).destroy()); box2.pack_start(button, TRUE, TRUE, 0); win_tree_mode_window.show_all(); win_tree_mode_window; } function main () { local window, win_tree_mode_window; TRUE=1; FALSE=0; window = create_tree_mode_window (); window.signal ("destroy", #exit_program(0)); init_ipc("tree_mode_win", "tree_mode_winq"); gtk_main (); }
Copyright © 1995-2010 by Cogent Real-Time Systems, Inc. All rights reserved.