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;