NAME

Gtk2::GladeXML::Simple - A clean object-oriented interface to Gtk2::GladeXML

SYNOPSIS

package MyApp;
use base qw( Gtk2::GladeXML::Simple );

sub new {
   my $class = shift;
   my $self = $class->SUPER::new( $gladefile );
   return $self;
}

...

# Signal handlers are methods of your class
sub on_button_clicked {
   my $self = shift;
   # You have access to your widgets directly
   my $button = $self->{button1};
}

DESCRIPTION

Gtk2::Glade::XML::Simple is a module that provides a clean and easy interface for Gnome/Gtk2 and Glade applications using an object-oriented syntax. You just make Gtk2::GladeXML::Simple your application's base class, have your new call SUPER::new, and the module will do the hard work for you.

Gtk2::GladeXML::Simple offers:

  • Signal-handler callbacks as methods of your class.

    sub on_button1_clicked {
       my $self = shift; # $self always received as first parameter
       ...
       # do anything you want in a OO fashioned way
    }
  • Autoconnection of signal handlers.

  • Autoconnection of custom widget-creation functions.

  • Access to the widgets as instance attributes.

    my $btn = $self->{button1}; # fetch widgets as instance attributes by its name
    my $window = $self->{main_window};
    my $custom = $self->{custom_widget};

METHODS

This class provides the following public methods:

$app = SomeSubClass->new( $gladefile [, $root, $domain ] );

This method creates a new object of your subclass of Gtk2::GladeXML::Simple, representing an application main-window. The $gladefile parameter is the name of the file created by the Glade Visual Editor. The $root is an optional parameter that tells libglade the name of the widget to start building from. The optional $domain parameter that specifies the translation domain for the glade xml file ( undef by default ).

$app->glade_object()

This method returns the Gtk2::GladeXML object in play.

EXTENDED EXAMPLE

This example shows the usage of the module by creating a small Yahoo search engine using WWW::Search::Yahoo.

   package YahooApp;

   use strict;
   use warnings;
   use Gtk2 '-init';
   use Gtk2::Html2; #not part of the Gtk2 default widgets
   use Gtk2::GladeXML::Simple;
   use WWW::Search;

   use base qw( Gtk2::GladeXML::Simple );

   my $header =<<HEADER;
   <html>
   <meta HTTP-EQUIV="content-type" CONTENT="text/html; charset=UTF-8">
   <header><title>Yahoo Gtk2 App</title>
   <style type="text/css">
   .title {font-family: Georgia; color: blue; font-size: 13px}
   .description {padding-left: 3px; font-family: Georgia; font-size:10px}
   .url {padding-left: 3px; font-family: Georgia; font-size:10px; color: green}
   </style>
   </head>
   <body>
   <h2 style="font-family: Georgia, Arial; font-weight: bold">
   Found:
   </h2>
   HEADER

   my $footer =<<FOOTER;
   </body>
   </html>
   FOOTER

   sub new {
       my $class = shift;
       #Calling Gtk2::GladeXML::Simple->new()
       my $self = $class->SUPER::new( 'yahoo.glade' );
       #Initialize the search engine
       $self->{_yahoo} = WWW::Search->new( 'Yahoo' );
       return $self;
   }

   sub do_search {
       my $self = shift;
       $self->{_yahoo}->native_query( shift );
       my $buf = $header;
       for( 1..10 ) {
	   my $rv = $self->{_yahoo}->next_result || last;
	   $buf .= qq{<p><div class="title">} . $rv->title;
	   $buf .= qq{</div><br /><div class="description">} . $rv->description;
	   $buf .= qq{</div><br /><div class="url">} . $rv->url . q{</div></p><br />};
       }
       $buf .= $footer;
       $self->{buf} = $buf;
   }

   ### Signal handlers, now they're methods of the class ###
   sub on_Clear_clicked {
       my $self = shift;
       my $html = $self->{custom1}; #fetch widgets by their names
       $html->{document}->clear;
       my $statusbar = $self->{statusbar1}; #another widget
       $statusbar->pop( $statusbar->get_context_id( "Yahoo" ) );
   }

   sub on_Search_clicked {
       my $self = shift;
       my $text = $self->{text_entry}->get_text;
       return unless $text ne '';
       my $statusbar = $self->{statusbar1};
       $statusbar->push( $statusbar->get_context_id( "Yahoo" ), "Searching for: $text" );
       $self->do_search( $text );
       my $html = $self->{custom1};
       $html->{document}->clear;
       $html->{document}->open_stream( "text/html" );
       $html->{document}->write_stream( $self->{buf} );
       $html->{document}->close_stream;
   }

   ### Creation function for the custom widget, method of the class as well ###
   sub create_htmlview {
       my $self = shift;
       my $view = Gtk2::Html2::View->new;
       my $document = Gtk2::Html2::Document->new;
       $view->set_document( $document );
       $view->{document} = $document;
       $view->show_all;
       return $view;
   }

   sub gtk_main_quit { Gtk2->main_quit }

   sub run { Gtk2->main }

   1;

   package main;

   YahooApp->new->run; #Go!

   1;

The yahoo.glade file needed for this example is in the examples directory, along with other example programs.

SEE ALSO

Gtk2::GladeXML, Gtk2

The Libglade Reference Manual at http://developer.gnome.org/doc/API/2.0/libglade/

The gtk2 API Reference at http://developer.gnome.org/doc/API/2.0/gtk/index.html

TODO

Tests.

More examples?

Add Gtk2::GladeXML::Simple->new_from_buffer()?

AUTHOR

Marco Antonio Manzo <marcoam@perl.org.mx>

Special thanks in no order to Scott Arrington "muppet" <scott at asofyet dot org> who provided lots of great ideas to improve this module. Sandino "tigrux" Flores <tigrux at ximian dot com> who is the author of SimpleGladeApp which is the main source of this module's core idea. Sean M. Burke <sburke at cpan dot org> for constantly helping me with ideas and cleaning my POD.

LICENSE

Copyright (C) 2005 by Marco Antonio Manzo

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.6 or, at your option, any later version of Perl 5 you may have available.