The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w

=doc

Gtk2::Table's horizontal and vertical packing options can be a little confusing
at first.  This example gives you a way to get a feel for them interactively.

Hint: resize the window and stretch the hpaned's gutter.

This program also illustrates using container child properties, making a
hpaned's second child sticky, using named colors, vectorization of operations,
and using multiple columns in a combo box model but not in the view.

Originally from the thread "Alignment of labels in table",
http://mail.gnome.org/archives/gtk-perl-list/2005-November/msg00029.html

=cut

use strict;
use Glib qw(:constants);
use Gtk2 -init;

#
# Create a basic window, with a table on the left and some controls on the
# right, separated by a draggable gutter.
#
my $window = Gtk2::Window->new;
$window->signal_connect (destroy => sub {Gtk2->main_quit});
my $hpaned = Gtk2::HPaned->new;
$window->add ($hpaned);
my $table = Gtk2::Table->new (2, 2);
$hpaned->add1 ($table);

my $vbox = Gtk2::VBox->new;
$hpaned->add2 ($vbox);

# Now that we have children in the HPaned, tell it to keep child2 at its
# current size when resizing the window.
$hpaned->child1_resize (TRUE);
$hpaned->child2_resize (FALSE);

# Initialize the model we'll use for all of the combo boxes, below.
my $combo_model = Gtk2::ListStore->new ('Gtk2::AttachOptions', 'Glib::String');
foreach ({name => 'expand', value => ['expand'] },
	 {name => 'fill', value => ['fill'] },
	 {name => 'shrink', value => ['shrink'] },
	 {name => 'expand+fill', value => ['expand', 'fill']}) {
	$combo_model->set ($combo_model->append,
			   0, $_->{value},
			   1, $_->{name});
}

# Set up each cell of the table and its corresponding row of controls.
foreach ([0, 1, 0, 1, "red"],
	 [0, 1, 1, 2, "green"],
	 [1, 2, 0, 1, "blue"],
	 [1, 2, 1, 2, "orange"]) {
	my ($left, $right, $top, $bottom, $color_name) = @$_;
	my $color = Gtk2::Gdk::Color->parse ($color_name);

	my $event_box = Gtk2::EventBox->new;
	my $label = Gtk2::Label->new ("$left $right $top $bottom");
	$event_box->modify_bg (normal => $color);
	$event_box->add ($label);
	$label->show;

	$table->attach_defaults ($event_box, $left, $right, $top, $bottom);

	my $hbox = Gtk2::HBox->new;
	$vbox->pack_start ($hbox, FALSE, FALSE, 0);

	$label = Gtk2::Label->new ("$left $right $top $bottom");
	$label->modify_fg (normal => $color);
	$hbox->pack_start ($label, FALSE, FALSE, 0);

	my $combo_box = Gtk2::ComboBox->new ($combo_model);
	my $cell = Gtk2::CellRendererText->new;
	$combo_box->pack_start ($cell, TRUE);
	$combo_box->add_attribute ($cell, text => 1);
	$combo_box->signal_connect (changed => sub {
		my ($combo_box, $child) = @_;
		my $new_x_options =
			$combo_box->get_model->get
				($combo_box->get_active_iter, 0);
		$table->child_set ($child, x_options => $new_x_options);
	}, $event_box);
	$combo_box->set_active (0);
	$hbox->pack_start ($combo_box, FALSE, FALSE, 0);

	$combo_box = Gtk2::ComboBox->new ($combo_model);
	$cell = Gtk2::CellRendererText->new;
	$combo_box->pack_start ($cell, TRUE);
	$combo_box->add_attribute ($cell, text => 1);
	$combo_box->signal_connect (changed => sub {
		my ($combo_box, $child) = @_;
		my $new_y_options =
			$combo_box->get_model->get
				($combo_box->get_active_iter, 0);
		$table->child_set ($child, y_options => $new_y_options);
	}, $event_box);
	$combo_box->set_active (0);
	$hbox->pack_start ($combo_box, FALSE, FALSE, 0);
}


$window->show_all;
Gtk2->main;