The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w
#
# Entry Completion
#
# GtkEntryCompletion provides a mechanism for adding support for
# completion in GtkEntry.
#
#

package entry_completion;

use strict;
use Glib qw(TRUE FALSE);
use Gtk2;

my $window = undef;

# Creates a tree model containing the completions
sub create_completion_model {
  my $store = Gtk2::ListStore->new (Glib::String::);

  # Append one word
  $store->set ($store->append, 0, "GNOME");

  # Append another word
  $store->set ($store->append, 0, "total");

  # And another word
  $store->set ($store->append, 0, "totally");
  
  return $store;
}


sub do {
  my $do_widget = shift;

  if (!$window) {
    $window = Gtk2::Dialog->new ("GtkEntryCompletion",
				 $do_widget,
				 [],
				 "gtk-close" => 'none');
    $window->set_resizable (FALSE);

    $window->signal_connect (response => sub {$window->destroy});
    $window->signal_connect (destroy => sub {$window = undef});

    my $vbox = Gtk2::VBox->new (FALSE, 5);
    $window->vbox->pack_start ($vbox, TRUE, TRUE, 0);
    $vbox->set_border_width (5);

    my $label = Gtk2::Label->new;
    $label->set_markup ("Completion demo, try writing <b>total</b> or <b>gnome</b> for example.");
    $vbox->pack_start ($label, FALSE, FALSE, 0);

    # Create our entry
    my $entry = Gtk2::Entry->new;
    $vbox->pack_start ($entry, FALSE, FALSE, 0);

    # Create the completion object
    my $completion = Gtk2::EntryCompletion->new;

    # Assign the completion to the entry
    $entry->set_completion ($completion);
    
    # Create a tree model and use it as the completion model
    $completion->set_model (create_completion_model ());
    
    # Use model column 0 as the text column
    $completion->set_text_column (0);
  }

  if (!$window->visible) {
    $window->show_all;
  } else {
    $window->destroy;
  }

  return $window;
}


1;