#! /usr/bin/perl -w

use strict;
use Gtk2 '-init';
use Glib qw/TRUE FALSE/; 
 
#standard window creation, placement, and signal connecting
my $window = Gtk2::Window->new('toplevel');
$window->signal_connect('delete_event' => sub { Gtk2->main_quit; });
$window->set_border_width(5);
$window->set_position('center_always');

#this vbox will geturn the bulk of the gui
my $vbox = &ret_vbox();

#add and show the vbox
$window->add($vbox);
$window->show();

#our main event-loop
Gtk2->main();


sub ret_vbox {

my $vbox = Gtk2::VBox->new(FALSE,5);

	#create a scrolled window that will host the treeview
	my $sw = Gtk2::ScrolledWindow->new (undef, undef);
    		$sw->set_shadow_type ('etched-out');
		$sw->set_policy ('automatic', 'automatic');
		#This is a method of the Gtk2::Widget class,it will force a minimum 
		#size on the widget. Handy to give intitial size to a 
		#Gtk2::ScrolledWindow class object
		$sw->set_size_request (300, 300);
		#method of Gtk2::Container
		$sw->set_border_width(5);
	
	#this is one of the provided base Gtk2::TreeModel classes.
	my $tree_store = Gtk2::TreeStore->new(qw/Glib::String/);

	#fill it with arbitry data
	foreach (1..3) {
	
		my $parent_nr = $_;
		#the iter is a pointer in the treestore. We
		#use to add data.
                my $iter = $tree_store->append(undef);
		$tree_store->set ($iter,0 => "Parent $parent_nr");
		
                 foreach (1..3){
		 	#here we append child iters to the parent iter
			#and add data to those chils iters.
                      my $iter_child = $tree_store->append($iter);
		      $tree_store->set ($iter_child,0 => "Child $_ of Parent $parent_nr");
		}
	}
	
	#this will create a treeview, specify $tree_store as its model
	my $tree_view = Gtk2::TreeView->new($tree_store);

		
		#create a Gtk2::TreeViewColumn to add to $tree_view
		my $tree_column = Gtk2::TreeViewColumn->new();
		
		$tree_column->set_title ("Click to sort");
			
			#create a renderer that will be used to display info
			#in the model
			my $renderer = Gtk2::CellRendererText->new;
		#add this renderer to $tree_column. This works like a Gtk2::Hbox
		# so you can add more than one renderer to $tree_column			
		$tree_column->pack_start ($renderer, FALSE);
		
		 # set the cell "text" attribute to column 0   
		 #- retrieve text from that column in treestore 
		 # Thus, the "text" attribute's value will depend on the row's value
		 # of column 0 in the model($treestore),
		 # and this will be displayed by $renderer,
		 # which is a text renderer
		$tree_column->add_attribute($renderer, text => 0);
	
	#add $tree_column to the treeview
	$tree_view->append_column ($tree_column);
	
	 # make it searchable
   	$tree_view->set_search_column(0);
	
		# Allow sorting on the column
		$tree_column->set_sort_column_id(0);
   
	# Allow drag and drop reordering of rows
        $tree_view->set_reorderable(TRUE);
	
	$sw->add($tree_view);
	
$vbox->pack_start($sw,TRUE,TRUE,0);
$vbox->show_all();
return $vbox;
}

