Author: bdonlan
Date: 2004-05-28 18:22:44 -0400 (Fri, 28 May 2004)
New Revision: 182

Added:
   trunk/haver-gtk/lib/Haver/Client/Gtk/Pages.pm
Modified:
   trunk/haver-gtk/bin/haver-gtk.pl
   trunk/haver-gtk/lib/Haver/Client/Gtk/Page/Text.pm
Log:
Refactored pages system to separate Perl lib.
Fixed /query


Modified: trunk/haver-gtk/bin/haver-gtk.pl
===================================================================
--- trunk/haver-gtk/bin/haver-gtk.pl    2004-05-28 20:38:21 UTC (rev 181)
+++ trunk/haver-gtk/bin/haver-gtk.pl    2004-05-28 22:22:44 UTC (rev 182)
@@ -40,6 +40,7 @@
 use Haver::OS;
 use Haver::Config;
 use Haver::Client::Command::Callback;
+use Haver::Client::Gtk::Pages;
 # XXX: Implement config files
 use Data::Dumper;
 use Carp;
@@ -57,90 +58,20 @@
         return POE::Kernel->call(POE::Kernel->get_active_session(), @_);
 }
 
-my %pages;
-my @pages;
+my $pages;
 
-sub get_page ($) {
-       my $id = $_[0];
-       if(ref($id)) {
-               return $id;
-       } elsif($id =~ /^[0-9]+$/) {
-               return $pages[$id];
-       } else {
-               return $pages{$id};
-       }
-}
-
-sub set_page ($) {
-       my $hash = get_page $_[0];
-       $gui{notebook}->set_page($hash->{pagenum});
-}
-
-sub add_page ($) {
-       my ($hash) = @_;
-       my $name = $hash->{name};
-       if(exists $pages{$name}) {
-               croak "Page already exists: $name with ", Dumper $pages{$name};
-       }
-       $hash->{string} = $name;
-       $hash->{pagenum} = @pages;
-       push @pages, $hash;
-       $pages{$name} = $hash;
-       $gui{notebook}->append_page($hash->{frame}, $hash->{label});
-       $hash->{frame}->show;
-       set_page $hash;
-       return $hash;
-}
-
-sub create_page ($@) {
-       my ($type, @args) = @_;
-       require "Haver/Client/Gtk/Page/$type.pm";
-       my $page = "Haver::Client::Gtk::Page::$type"->new(@args);
-       return $page;
-}
-
-sub new_page ($@) {
-       my ($type, @args) = @_;
-       return add_page create_page($type, @args);
-}
-
-sub get_current_page () {
-       my $page = $gui{notebook}->get_current_page();
-       return get_page $page;
-}
-
-sub renumber_pages () {
-       for(0..$#pages) {
-               $pages[$_]->{pagenum} = $_;
-       }
-}
-
-sub del_page ($) {
-       my $id = $_[0];
-       my $pagestruct = get_page $id;
-       if(!defined $pagestruct) {
-               carp "Warning: page $id not found";
-               return;
-       }
-       $gui{notebook}->remove_page($pagestruct->{pagenum});
-       delete $pages{$pagestruct->{string}};
-       splice @pages, $pagestruct->{pagenum}, 1;
-       renumber_pages();
-}
-
 sub get_query_page ($) {
-       my $page = get_page "=$_[0]";
+       my $page = $pages->get_page("=$_[0]");
+       print "g_q_p $_[0] got $page\n";
        if(!$page) {
-               $page = new_page 'Query', $_[0];
+               print "404, opening\n";
+               $page = $pages->new_page('Query', $_[0]);
+               print "got $page\n";
                $page->print_page("Starting query with $_[0]");
        }
        return $page;
 }
 
-sub print_current (@) {
-       return get_current_page()->print_page(@_);
-}
-
 my ($user, $confdir, $config);
 
 eval {
@@ -265,12 +196,9 @@
        );
        
        my $vbox = Gtk::VBox->new(0,0);
-       
-       my $notebook = $gui{notebook} = Gtk::Notebook->new();
-       $notebook->set_tab_pos("bottom");
-       
-       $vbox->pack_start($notebook, 1, 1, 0);
-       $notebook->show;
+       $pages = new Haver::Client::Gtk::Pages;
+       $vbox->pack_start($pages->get_gui(), 1, 1, 0);
+       $pages->get_gui()->show;
 
        my $entrybox = $gui{entrybox} = Gtk::HBox->new(FALSE, 0);
        $vbox->pack_start($entrybox, 0, 1, 0);
@@ -291,14 +219,14 @@
 
        $gui{main_window}->show;
 
-       new_page("Text", "Server");
-       new_page("Text", "!rawlog");
-       set_page 0;
+       $pages->new_page("Text", "Server");
+       $pages->new_page("Text", "!rawlog");
+       $pages->set_page(0);
 
        $kernel->yield('connect_win');
 
 
-       foreach my $c (qw(say msg me close users join part quit)) {
+       foreach my $c (qw(say msg me close users join part quit query)) {
                $cmd->register($c, handler => $session->postback("cmd_$c"));
        }
        $cmd->register('alias',
@@ -324,8 +252,13 @@
        my ($kernel, $heap) = @_[KERNEL,HEAP];
        my $text = $gui{entry}->get_text;
        $gui{entry}->set_text('');
-       $cmd->input($text);
-
+       eval {
+               $cmd->input($text);
+       };
+       if($@) {
+               # XXX: proper error handling
+               get_current_page()->print_page("!!! ERROR: $@");
+       }
        
 #      if($text =~ m|^/(\w+)\s*(.*)$|) {
 #              _call("cmd_$1", $2);
@@ -420,7 +353,7 @@
                UID  => $info->{UID},
                Password => $info->{Password},
        );
-       get_page(0)->print_page("Connecting to $info->{Address}...");
+       $pages->get_page(0)->print_page("Connecting to $info->{Address}...");
        $gui{connect_win}{window}->destroy;
        delete $gui{connect_win};
        %globals = %$info;
@@ -436,7 +369,7 @@
 
        
 sub haver_connected {
-       get_page(0)->print_page("Connected, logging in.");
+       $pages->get_page(0)->print_page("Connected, logging in.");
 }
 
 sub haver_connect_fail {
@@ -444,7 +377,7 @@
        my ($args, $scope) = @_[ARG0,ARG1];
        my ($enum, $estr) = @$args;
        
-       get_page(0)->print_page("Connection error: $estr");
+       $pages->get_page(0)->print_page("Connection error: $estr");
        $kernel->yield('connect_win');
 }
 
@@ -452,35 +385,35 @@
        my ($kernel, $args) = @_[KERNEL,ARG0];
        my $elong = $args->[2];
 
-       get_page(0)->print_page("Login failure: $elong");
+       $pages->get_page(0)->print_page("Login failure: $elong");
        $kernel->post('haver', 'disconnect');
 }
 
 sub haver_disconnected {
        my ($kernel, $heap) = @_[KERNEL,HEAP];
-       get_page(0)->print_page("Disconnected");
-       for(keys %pages) {
-               next unless ($_ =~ /^\#/);
-               del_page $_;
+       $pages->get_page(0)->print_page("Disconnected");
+       for($pages->get_pages()) {
+               next unless ($_->get_name() =~ /^\#/);
+               $pages->del_page($_);
        }
        $heap->{clist} = {};
        $kernel->yield('connect_win');
 }
 sub haver_raw_in {
        my @data = @{$_[ARG0]};
-       get_page('!rawlog')->print_page("S: " . join "\t", @data);
+       $pages->get_page('!rawlog')->print_page("S: " . join "\t", @data);
 }
 sub haver_raw_out {
        my @data = @{$_[ARG0]};
-       get_page('!rawlog')->print_page("C: " . join "\t", @data);
+       $pages->get_page('!rawlog')->print_page("C: " . join "\t", @data);
 }
 sub haver_login_request {
        my $kernel = $_[KERNEL];
-       get_page(0)->print_page("Login failed.");
+       $pages->get_page(0)->print_page("Login failed.");
        $kernel->post('haver', 'disconnect');
 }
 sub haver_login {
-       get_page(0)->print_page("Logged in.");
+       $pages->get_page(0)->print_page("Logged in.");
        $_[HEAP]->{ready} = 1;
 }
 sub haver_msg {
@@ -488,9 +421,9 @@
        my ($type, $from, $text) = (@$args)[0,1,2];
        my @lines = split "\n", $text;
        if($type eq q{"}) {
-               get_page("#$chan")->print_page(map { "$from: $_" } @lines);
+               $pages->get_page("#$chan")->print_page(map { "$from: $_" } 
@lines);
        } elsif ($type eq q{:}) {
-               get_page("#$chan")->print_page(map { "* $from $_" } @lines);
+               $pages->get_page("#$chan")->print_page(map { "* $from $_" } 
@lines);
        }
 }
 
@@ -508,13 +441,13 @@
 sub haver_joined {
        my ($kernel, $heap, $channel) = @_[KERNEL,HEAP,ARG1];
        unless(exists $heap->{clist}->{$channel}) {
-               get_page(0)->print_page("Joined $channel but didn't want to!");
+               $pages->get_page(0)->print_page("Joined $channel but didn't 
want to!");
                $kernel->post('haver', 'part', $channel);
                return;
        }
        return if(defined $heap->{clist}->{$channel});
-       $heap->{clist}->{$channel} = new_page("Channel", "$channel");
-       get_page("#$channel")->print_page("Joined $channel.");
+       $heap->{clist}->{$channel} = $pages->new_page("Channel", "$channel");
+       $pages->get_page("#$channel")->print_page("Joined $channel.");
        $kernel->post('haver', 'users', $channel);
 }      
 
@@ -522,7 +455,7 @@
        my ($kernel, $heap, $args, $channel) = @_[KERNEL,HEAP,ARG0,ARG1];
        my $uid = $args->[0];
 
-       my $page = get_page("#$channel");
+       my $page = $pages->get_page("#$channel");
        return unless $page;
        $page->add_ulist($uid);
        $page->print_page("$uid has joined $channel.");
@@ -532,7 +465,7 @@
        my ($kernel, $heap, $args, $channel) = @_[KERNEL,HEAP,ARG0,ARG1];
        my $uid = $args->[0];
 
-       my $page = get_page("#$channel");
+       my $page = $pages->get_page("#$channel");
        return unless $page;
        $page->del_ulist($uid);
        $page->print_page("$uid has left $channel.");
@@ -542,31 +475,30 @@
        my ($kernel, $heap, $args) = @_[KERNEL,HEAP,ARG0];
        my ($uid, $why) = @$args;
 
-       for(keys %pages) {
-               next unless $_ =~ /^\#/;
-               my $page = $pages{$_};
-               my $present = $page->del_ulist($uid);
-               $page->print_page("$uid has quit: $why") if($present);
+       for($pages->get_pages()) {
+               next unless $_->get_name() =~ /^\#/;
+               my $present = $_->del_ulist($uid);
+               $_->print_page("$uid has quit: $why") if($present);
        }
 }
 
 sub haver_users {
        my ($kernel, $heap, $args, $chan) = @_[KERNEL,HEAP,ARG0,ARG1];
        my @users = @$args;
-       get_page("#$chan")->set_ulist(@users);
-       get_page("#$chan")->print_page("Users for channel $chan:", join(" - ", 
@users)); # XXX: Split into multiple lines
+       $pages->get_page("#$chan")->set_ulist(@users);
+       $pages->get_page("#$chan")->print_page("Users for channel $chan:", 
join(" - ", @users)); # XXX: Split into multiple lines
 }
 
 sub haver_parted {
        my ($kernel, $heap, $chan) = @_[KERNEL,HEAP,ARG1];
        my $page = delete $heap->{clist}->{$chan};
        return unless defined $page;
-       del_page $page;
+       $pages->del_page($page);
 }
 
 sub cmd_say {
        my ($kernel, $heap, $args) = @_[KERNEL, HEAP, ARG1];
-       get_current_page()->send_msg(q{"}, $args->[0]);
+       $pages->get_current_page()->send_msg(q{"}, $args->[0]);
 }
 
 
@@ -581,7 +513,7 @@
        my ($chan) = @$args;
 
        if(exists $heap->{clist}->{$chan}) {
-               set_page "#$chan" if get_page "#$chan";
+               $pages->set_page("#$chan") if $pages->get_page("#$chan");
                return;
        }
        $kernel->post("haver", "join", $chan);
@@ -596,9 +528,10 @@
        if($args->[0] =~ /^(\w+)/) {
                $chan = $1;
        } else {
-               $chan = get_current_page()->{string};
+               # XXX: ->can
+               $chan = $pages->get_current_page()->{string};
                unless($chan =~ s/^\#//) {
-                       print_current "That command can only be used in a 
channel window.";
+                       $pages->get_page(0)->print_page("That command can only 
be used in a channel window.");
                        return;
                }
        }
@@ -611,13 +544,14 @@
        
        unless($chan =~ s/^\#?(\w+)$/$1/) {
                if($chan eq '') {
-                       $chan = get_current_page()->{string};
+                       # XXX: ->can
+                       $chan = $pages->get_current_page()->{string};
                        unless($chan =~ s/^\#//) {
-                               print_current "This is not a channel tab";
+                               $pages->get_page(0)->print_page("This is not a 
channel tab");
                                return;
                        }
                } else {
-                       print_current "Syntax: /part [channel]";
+                       $pages->get_page(0)->print_page("Syntax: /part 
[channel]");
                }
        }               
        if(!defined $heap->{clist}->{$chan}) {
@@ -630,7 +564,7 @@
 sub cmd_msg {
        my ($kernel, $heap, $args) = @_[KERNEL,HEAP,ARG1];
 #      unless($args =~ /^\s*(\S+)\s*(.+)$/) {
-#              print_current "Syntax: /msg UID text";
+#              $pages->get_page(0)->print_page "Syntax: /msg UID text";
 #              return;
 #      }
        get_query_page($args->[0])->send_msg(q{"}, $args->[1]);
@@ -639,7 +573,7 @@
 sub cmd_act {
        my ($kernel, $heap, $args) = @_[KERNEL,HEAP,ARG1];
        unless($args =~ /^\s*(\S+)\s*(.+)$/) {
-               print_current "Syntax: /msg UID text";
+               $pages->get_page(0)->print_page("Syntax: /msg UID text");
                return;
        }
        get_query_page($1)->send_msg(q{:}, $2);
@@ -647,31 +581,31 @@
 
 sub cmd_me {
        my ($kernel, $heap, $args) = @_[KERNEL,HEAP,ARG1];
-       return unless(get_current_page()->can('send_msg'));
-       get_current_page()->send_msg(q{:}, $args->[0]);
+       return unless($pages->get_current_page()->can('send_msg'));
+       $pages->get_current_page()->send_msg(q{:}, $args->[0]);
 }
 
 sub cmd_query {
        my ($kernel, $heap, $args) = @_[KERNEL,HEAP,ARG1];
-       set_page get_query_page($args->[0]);
+       $pages->set_page(get_query_page($args->[0]));
 }
 
 sub cmd_close {
        my ($kernel, $heap, $args) = @_[KERNEL,HEAP,ARG1];
-       my $page = get_current_page();
+       my $page = $pages->get_current_page();
        unless($args->[0] =~ /^\s*$/) {
-               $page = get_page($args->[0]);
+               $page = $pages->get_page($args->[0]);
                if(!$page) {
-                       print_current "No such page $args->[0]";
+                       $pages->get_page(0)->print_page("No such page 
$args->[0]");
                        return;
                }
        }
        if($page->can("close")) {
                if($page->close()) {
-                       del_page $page;
+                       $pages->del_page($page);
                }
        } else {
-               print_current "Can't close that kind of page, sorry :(";
+               $pages->get_page(0)->print_page("Can't close that kind of page, 
sorry :(");
        }
 }
 

Modified: trunk/haver-gtk/lib/Haver/Client/Gtk/Page/Text.pm
===================================================================
--- trunk/haver-gtk/lib/Haver/Client/Gtk/Page/Text.pm   2004-05-28 20:38:21 UTC 
(rev 181)
+++ trunk/haver-gtk/lib/Haver/Client/Gtk/Page/Text.pm   2004-05-28 22:22:44 UTC 
(rev 182)
@@ -75,4 +75,9 @@
        $text->insert(undef, undef, undef, join("", map { "$_\n" } @lines));
 }
 
+sub get_name ($) {
+       # XXX: probably belongs in a superclass
+       return $_[0]->{name};
+}
+
 1;

Added: trunk/haver-gtk/lib/Haver/Client/Gtk/Pages.pm
===================================================================
--- trunk/haver-gtk/lib/Haver/Client/Gtk/Pages.pm       2004-05-28 20:38:21 UTC 
(rev 181)
+++ trunk/haver-gtk/lib/Haver/Client/Gtk/Pages.pm       2004-05-28 22:22:44 UTC 
(rev 182)
@@ -0,0 +1,126 @@
+# vim: set ft=perl ts=4 sw=4:
+# Haver::Client::Gtk::Pages - tabbed window support
+# 
+# Copyright (C) 2004 Bryan Donlan, Dylan William Hardison.
+# 
+# This module 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 2 of the License, or
+# (at your option) any later version.
+#
+# This module 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 this module; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+package Haver::Client::Gtk::Pages;
+use warnings;
+use strict;
+
+use Gtk;
+use Data::Dumper;
+use Carp;
+
+sub new ($) {
+       my $class = $_[0];
+       $class = ref $class || $class || __PACKAGE__;
+       my $self = {
+               pagenum => [],
+               pagenam => {},
+               notebook => Gtk::Notebook->new(),
+       };
+       $self->{notebook}->set_tab_pos('bottom');
+       bless $self, $class;
+       return $self;
+}
+
+sub get_gui ($) {
+       return $_[0]->{notebook};
+}
+
+sub get_page ($$) {
+       my ($self, $id) = @_;
+       if(ref($id)) {
+               return $id;
+       } elsif($id =~ /^[0-9]+$/) {
+               return $self->{pagenum}[$id];
+       } else {
+               return $self->{pagenam}{$id};
+       }
+}
+
+sub set_page ($$) {
+       my ($self, $page) = @_;
+       $page = $self->get_page($page);
+       $self->{notebook}->set_page($page->{pagenum});
+}
+
+sub add_page ($$) {
+       my ($self, $hash) = @_;
+       my $name = $hash->{name};
+       if(exists $self->{pagenam}{$name}) {
+               croak "Page already exists: $name with ", Dumper 
$self->{pagenum}{$name};
+       }
+       $hash->{parent} = $self;
+       $hash->{string} = $name;
+       $hash->{pagenum} = scalar @{$self->{pagenum}};
+       push @{$self->{pagenum}}, $hash;
+       $self->{pagenam}{$name} = $hash;
+       $self->{notebook}->append_page($hash->{frame}, $hash->{label});
+       $hash->{frame}->show;
+       $self->set_page($hash);
+       return $hash;
+}
+
+sub create_page ($$@) {
+       ### XXX: Should be deprecated
+       my ($self, $type, @args) = @_;
+       require "Haver/Client/Gtk/Page/$type.pm";
+       my $page = "Haver::Client::Gtk::Page::$type"->new(@args);
+       return $page;
+}
+
+sub new_page ($@) {
+       my ($self, $type, @args) = @_;
+       return $self->add_page($self->create_page($type, @args));
+}
+
+sub get_current_page ($) {
+       my $self = shift;
+       my $page = $self->{notebook}->get_current_page();
+       return $self->get_page($page);
+}
+
+sub renumber_pages ($) {
+       my $self = shift;
+       for(0..$#{$self->{pagenum}}) {
+               $self->{pagenum}[$_]{pagenum} = $_;
+       }
+}
+
+sub del_page ($$) {
+       my ($self, $id) = @_;
+       my $pagestruct = $self->get_page($id);
+       if(!defined $pagestruct) {
+               carp "Warning: page $id not found";
+               return;
+       }
+       $self->{notebook}->remove_page($pagestruct->{pagenum});
+       delete $self->{pagenam}{$pagestruct->{string}};
+       splice @{$self->{pagenum}}, $pagestruct->{pagenum}, 1;
+       $self->renumber_pages();
+}
+
+sub get_pages ($) {
+       my $pages = $_[0]->{pagenum};
+       if(wantarray) {
+               return @$pages;
+       } else {
+               return [$pages];
+       }
+}
+
+1;


Reply via email to