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

# Copyright 2007, 2008, 2010 Kevin Ryde

# This file is part of Gtk2-Ex-ListModelConcat.
#
# Gtk2-Ex-ListModelConcat is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as published
# by the Free Software Foundation; either version 3, or (at your option) any
# later version.
#
# Gtk2-Ex-ListModelConcat is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
# Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with Gtk2-Ex-ListModelConcat.  If not, see <http://www.gnu.org/licenses/>.


use strict;
use warnings;
use Gtk2 '-init';

use Gtk2::Ex::ListModelConcat;

sub exception_handler {
  my ($msg) = @_;
  print __FILE__,": ", $msg;
  if (eval { require Devel::StackTrace; }) {
    my $trace = Devel::StackTrace->new;
    print $trace->as_string;
  } else {
    print "\n";
  }
  return 1; # stay installed
}
Glib->install_exception_handler (\&exception_handler);


my $toplevel = Gtk2::Window->new('toplevel');
$toplevel->set_default_size (500, -1);
$toplevel->signal_connect (destroy => sub { Gtk2->main_quit; });

my $hbox = Gtk2::HBox->new (0, 0);
$toplevel->add ($hbox);

my $vbox1 = Gtk2::VBox->new (0, 0);
$hbox->pack_start ($vbox1, 0,0,0);

my $vbox2 = Gtk2::VBox->new (0, 0);
$hbox->pack_start ($vbox2, 1,1,0);

my $vbox3 = Gtk2::VBox->new (0, 0);
$hbox->pack_start ($vbox3, 1,1,0);


my $store = Gtk2::ListStore->new ('Glib::String');
foreach my $str ('yy', 'zz-bb', '<b>xx</b>', 'fjdks', '32492', "abc\ndef") {
  $store->set_value ($store->append, 0, $str);
}

my $store2 = Gtk2::ListStore->new ('Glib::String');
foreach my $str ('2aaa', '2bbb', '2ccc') {
  $store2->set_value ($store2->append, 0, $str);
}

my $concat = Gtk2::Ex::ListModelConcat->new
  (models => [ $store, $store, $store2 ]);

$concat->signal_connect
  (row_changed => sub {
     my ($concat, $path, $iter) = @_;
     print __FILE__,": row changed path=",$path->to_string,
       " '",$concat->get_value($iter,0),"'\n";
   });
$concat->signal_connect
  (row_inserted => sub {
     my ($concat, $path, $iter) = @_;
     print __FILE__,": row inserted path=",$path->to_string;
     my $data = $concat->get_value($iter,0);
     print " data='",defined $data ? $data : 'undef', "'\n";
   });
$concat->signal_connect
  (row_deleted => sub {
     my ($concat, $path, $iter) = @_;
     print __FILE__,": row deleted path=",$path->to_string,"\n";
   });
$concat->signal_connect
  (rows_reordered => sub {
     my ($concat, $path, $iter, $aref) = @_;
     print __FILE__,": reordered ", join(' ',@$aref),"\n";
   });

# {
#   my $button = Gtk2::CheckButton->new_with_label ('Model');
#   $button->set_active ($ticker->get('model'));
#   $button->signal_connect (toggled => sub {
#                              $ticker->set (model => ($button->get_active
#                                                      ? $model : undef));
#                            });
#   $vbox1->pack_start ($button, 0, 0, 0);
# }
{
  my $button = Gtk2::Button->new_with_label ('Redraw');
  $button->signal_connect (clicked => sub { $toplevel->queue_draw; });
  $vbox1->pack_start ($button, 0, 0, 0);
}
# {
#   my $button = Gtk2::Button->new_with_label ('Destroy');
#   $button->signal_connect (clicked => sub { $ticker->destroy; });
#   $vbox1->pack_start ($button, 0, 0, 0);
# }
{
  my $button = Gtk2::Button->new_with_label ('Reorder Reverse');
  $button->signal_connect (clicked => sub {
                             my $rows = $concat->iter_n_children (undef);
                             $concat->reorder (reverse 0 .. $rows-1);
                           });
  $vbox1->pack_start ($button, 0, 0, 0);
}
{
  my $button = Gtk2::Button->new_with_label ('Delete First');
  $button->signal_connect (clicked => sub {
                             $concat->remove ($concat->get_iter_first);
                           });
  $vbox1->pack_start ($button, 0, 0, 0);
}
{
  my $button = Gtk2::Button->new_with_label ('Delete Last');
  $button->signal_connect (clicked => sub {
                             my $rows = $concat->iter_n_children (undef);
                             $concat->remove ($concat->get_iter_from_string
                                             ($rows-1));
                           });
  $vbox1->pack_start ($button, 0, 0, 0);
}
my $insert_count = 1;
{
  my $button = Gtk2::Button->new_with_label ('Insert First');
  $button->signal_connect (clicked => sub {
                             $concat->insert_with_values (0, 0,
                                                         "x$insert_count");
                             $insert_count++;
                           });
  $vbox1->pack_start ($button, 0, 0, 0);
}
{
  my $button = Gtk2::Button->new_with_label ('Insert Last');
  $button->signal_connect (clicked => sub {
                             my $rows = $concat->iter_n_children (undef);
                             $concat->insert_with_values ($rows, 0,
                                                          "x$insert_count");
                             $insert_count++;
                           });
  $vbox1->pack_start ($button, 0, 0, 0);
}
{
  my $button = Gtk2::Button->new_with_label ('Clear');
  $button->signal_connect (clicked => sub {
                             $concat->clear;
                           });
  $vbox1->pack_start ($button, 0, 0, 0);
}
{
  my $button = Gtk2::Button->new_with_label ('Quit');
  $button->signal_connect (clicked => sub { $toplevel->destroy; });
  $vbox1->pack_start ($button, 0, 0, 0);
}



{
  my $treeview = Gtk2::TreeView->new_with_model ($concat);
  $treeview->set (reorderable => 1);
  $vbox2->pack_start ($treeview, 1,1,0);

  my $renderer = Gtk2::CellRendererText->new;
  my $column = Gtk2::TreeViewColumn->new_with_attributes
    ("Item", $renderer, text => 0);
  $column->set (resizable => 1);
  $treeview->append_column ($column);
}
{
  my $treeview = Gtk2::TreeView->new_with_model ($store);
  $treeview->set (reorderable => 1);
  $vbox3->pack_start ($treeview, 1,1,0);

  my $renderer = Gtk2::CellRendererText->new;
  my $column = Gtk2::TreeViewColumn->new_with_attributes
    ("Item", $renderer, text => 0);
  $column->set (resizable => 1);
  $treeview->append_column ($column);
}
{
  my $treeview = Gtk2::TreeView->new_with_model ($store2);
  $treeview->set (reorderable => 1);
  $vbox3->pack_start ($treeview, 1,1,0);

  my $renderer = Gtk2::CellRendererText->new;
  my $column = Gtk2::TreeViewColumn->new_with_attributes
    ("Item", $renderer, text => 0);
  $column->set (resizable => 1);
  $treeview->append_column ($column);
}

{
  my $label = Gtk2::Label->new ('TextView');
  $vbox3->pack_start ($label, 0,0,0);
}
{
  my $textbuf = Gtk2::TextBuffer->new;
  $textbuf->set_text ('blah blah');
  my $textview = Gtk2::TextView->new_with_buffer ($textbuf);
  $vbox3->pack_start ($textview, 1,1,0);
}

$toplevel->show_all;
Gtk2->main;
exit 0;