The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
Gtk2-Ex-Geo
========================

Gtk2::Ex::Geo is a namespace for modules, classes, and widgets for
geospatial applications. This package contains the modules:

Gtk2::Ex::Geo

The main module to 'use'.

Gtk2::Ex::Geo::Canvas

A subclass of Gtk2::Gdk::Pixbuf. Constructs a pixbuf from a stack of
geospatial layer objects by calling the 'render' method for each
$layer. Embedded in Gtk2::Ex::Geo::Overlay.

Gtk2::Ex::Geo::Overlay

A subclass of Gtk2::ScrolledWindow. A canvas in a scrolled
window. Contains a list of layer objects. Functionality includes
redraw, support for selections (point, line, path, rectangle, polygon,
or many of them), zoom, pan, and conversion between event and world
(layer) coordinates.

Gtk2::Ex::Geo::Layer

The root class for geospatial layers. A geospatial layer is a
typically a subclass of a geospatial data (raster, vector features, or
something else) and of this class. The idea is that this class
contains visualization information (transparency, palette, colors,
symbology, label placement, etc) for the data. Contains many callbacks
that are fired as a result of user using context menu, making a
selection, etc. Uses layer dialogs.

Gtk2::Ex::Geo::DialogMaster

A class which maintains a set of Glade dialogs taken from XML in DATA
section.

Gtk2::Ex::Geo::Dialogs

A subclass of Gtk2::Ex::Geo::DialogMaster. Contains dialogs for
Gtk2::Ex::Geo::Layer.

Gtk2::Ex::Geo::Glue

Typically a singleton class for an object, which manages a
Gtk2::Ex::Geo::Overlay widget, a Gtk2::TreeView widgets, and other
widgets of a geospatial application. The object also takes care of
popping up context menus and other things.

Gtk2::Ex::Geo::History

Embedded in Gtk2::Ex::Geo::Glue. Input history a'la (at least
attempting) GNU history that is used by Glue object with Gtk2::Entry.

Gtk2::Ex::Geo::TreeDumper

From http://www.asofyet.org/muppet/software/gtk2-perl/treedumper.pl-txt
For inspecting layer and other objects.

INSTALLATION

To install this module type the following:

   perl Makefile.PL
   make
   make test
   make install

USAGE

use Glib qw/TRUE FALSE/;
use Gtk2::Ex::Geo;
# use any geospatial layer classes you wish
use Gtk2 '-init';

# it is a good thing to catch errors and show them to user
# instead of dying
Glib->install_exception_handler(\&my_exception_handler);

# the main window for your application
my $window = Gtk2::Window->new;

# the geospatial application (layer container + controller)
my $app = Gtk2::Ex::Geo::Glue->new(%params);  

# extend the controller with the geospatial layer capabilities
for (qw/your_geospatial_layer_classes/) {
    $app->register_class($_);
}

# visible layer list
my $list = Gtk2::ScrolledWindow->new();
$list->set_policy("never", "automatic");
$list->add($app->{tree_view});
    
# a panel with the layer list and the map
my $hbox = Gtk2::HPaned->new();
$hbox->add1($list);
$hbox->add2($app->{overlay});
    
# stack all GUI elements vertically
my $vbox = Gtk2::VBox->new(FALSE, 0);
$vbox->pack_start($app->{toolbar}, FALSE, FALSE, 0);
$vbox->pack_start($hbox, TRUE, TRUE, 0);
$vbox->pack_start($app->{entry}, FALSE, FALSE, 0);
$vbox->pack_start($app->{statusbar}, FALSE, FALSE, 0);

$window->add($vbox);
$window->signal_connect("destroy", \&my_destroy);
$window->set_default_size(900,600);
$window->set_position('center');
$window->show_all;

Gtk2->main;

sub my_exception_handler {
    my $msg = shift;
    my $dialog = Gtk2::MessageDialog->new(undef,
					  'destroy-with-parent',
					  'info',
					  'close',
					  $msg);
    $dialog->signal_connect(response => sub {
    				     	my($dialog) = @_;
    					$dialog->destroy;
					});
    $dialog->show_all;
    return 1;
}

# break circular references before exiting
sub my_destroy {
    $app->close();
    $window->destroy;
    undef $app;
    undef $window;
    Gtk2->main_quit;
    exit(0);
}

DEPENDENCIES

This module requires these other modules and libraries:

Gtk2
Gtk2::GladeXML
Graphics::ColorUtils
Geo::OGC::Geometry

COPYRIGHT AND LICENCE

Copyright (C) 2008-2012 Ari Jolma

This library is free software; you can redistribute it and/or modify
it under the terms of Artistic License 2.0 (included as LICENCE).