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

NAME

Gtk2::Ex::TreeMap - Implementation of TreeMap.

SYNOPSIS

        use Gtk2::Ex::TreeMap;
        my $values = [6,6,4,3,2,2,1];
        my $treemap = Gtk2::Ex::TreeMap->new([600,400]);
        $treemap->draw_map_simple($values);
        my $window = Gtk2::Window->new;
        $window->signal_connect(destroy => sub { Gtk2->main_quit; });
        $window->add($treemap->get_image);
        $window->show_all;
        Gtk2->main;

DESCRIPTION

Treemap is a space-constrained visualization of hierarchical structures. It is very effective in showing attributes of leaf nodes using size and color coding. http://www.cs.umd.edu/hcil/treemap/

The popular treemaps are;

        http://www.marumushi.com/apps/newsmap/newsmap.cfm
        http://codecubed.com/map.html the del.icio.us most popular treemap
        http://www.smartmoney.com/marketmap/

This module implements the TreeMap functionality in pure perl. Currently I have implemented only the Squarified TreeMap algorithm. Details of this algorithm can be found at http://www.win.tue.nl/~vanwijk/stm.pdf This algorithm was chosen because it produces aesthetically pleasing rectangles.

All the drawing is done using GD. But Gtk2 adds plenty of life, bells and whistles to the otherwise passive TreeMap png image.

METHODS

Gtk2::Ex::TreeMap->new([$width, $height]);

Just a plain old constructor. Accepts two arguments, $width and $height of the TreeMap.

        my $treemap = Gtk2::Ex::TreeMap->new([600,400]);

Gtk2::Ex::TreeMap->draw_map_simple($values);

Use this API to quickly build a treemap from a flat list of values. The colors of the rectangles are chosen internally. If you want to do anything serious, like specify colors, description etc, then use the draw_map($tree) api.

        my $values = [6,6,4,3,2,2,1];
        $treemap->draw_map_simple($values);

Gtk2::Ex::TreeMap->draw_map($tree);

This is the api that you will use most of the time. This one accepts a hierarchical tree structure as its input. I have chosen the tree format that is used by the XML::Simple module. This approach so that the tree can be easily constructed from an xml document.

Here is an example definition of the XML

        <Node>
                <Node>
                        <Node size="9" color="0,0,80" description="0 0"/>
                        <Node size="7" color="0,120,80" description="0 1"/>
                        <Node>
                                <Node size="9" color="0,0,100" description="0 2 0"/>
                                <Node size="9" color="0,0,110" description="0 2 1"/>
                                <Node>
                                        <Node size="8" color="0,0,100" description="0 2 2 0"/>
                                        <Node size="2" color="0,0,110" description="0 2 2 1"/>
                                </Node>
                        </Node>
                </Node>
                <Node>
                        <Node size="7" color="0,170,200" description="1 0"/>
                        <Node size="5" color="0,170,210" description="1 1"/>
                        <Node size="9" color="0,170,220" description="1 2"/>
                </Node>
        </Node> 

Now read this string using XML::Simple to derive the tree.

        my $tree = XMLin($xmlstr, ForceArray => 1);
        $treemap->draw_map($tree);

Note: It is very important to use the ForceArray option. Else you will end up with a variety of errors.

Gtk2::Ex::TreeMap->get_image

Returns the TreeMap image as a Gtk2::Image wrapped in a Gtk2::EventBox. You can add this to your own Gtk2 container

        my $window = Gtk2::Window->new;
        $window->add($treemap->get_image);
        $window->show_all;
        Gtk2->main;

TODO

  * Implement callback for mouse-over and clicked events
  * Implement popup box as a default option
  * Implement text in the rectangles
  * The boxes should probably be drawn with a black border
  * Build a new example using WWW::Google::News perhaps !
  * Once the module is done, may be I'll split it into a two; a pure GD module which 
    will be "used" by a Gtk2 module. That way, non-Gtk2 folks can use it, of course 
    without the popups and callbacks and all those bells and whistles.
  * More tests, more documentation.

AUTHOR

Ofey Aikon, <ofey_aikon at gmail dot com>

ACKNOWLEDGEMENTS

To the wonderful gtk-perl list.

COPYRIGHT & LICENSE

Copyright 2005 Ofey Aikon, All Rights Reserved.

This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.

This library 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 Library General Public License for more details.

You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307 USA.