ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Net-XMPP2/samples/devcl/DevCL/Browser.pm
Revision: 1.1
Committed: Wed Jul 11 13:34:55 2007 UTC (19 years, 2 months ago) by elmex
Branch: MAIN
Log Message:
added development client example

File Contents

# User Rev Content
1 elmex 1.1 package DevCL::Browser;
2     use strict;
3     use Gtk2;
4     use POSIX qw/strftime/;
5     use Gtk2::SimpleList;
6    
7     sub new {
8     my $this = shift;
9     my $class = ref($this) || $this;
10     my $self = { @_ };
11     bless $self, $class
12     }
13    
14     sub start {
15     my ($self) = @_;
16    
17     my $w = Gtk2::Window->new ('toplevel');
18     $w->set_default_size (300, 400);
19     $w->signal_connect (destroy => $self->{on_destroy});
20    
21     $w->add (my $hb = Gtk2::HPaned->new);
22     $hb->add1 (my $lsw = Gtk2::ScrolledWindow->new);
23     $lsw->add (my $ll = $self->{log} = Gtk2::SimpleList->new (ID => 'int', request => 'text'));
24     $lsw->set_policy (automatic => 'automatic');
25     $ll->signal_connect (row_activated => sub {
26     my ($ll, $path, $column) = @_;
27     my $row_ref = $ll->get_row_data_from_path ($path);
28     $self->select_page ($row_ref->[0]);
29     });
30     $hb->add2 (my $vb = Gtk2::VBox->new);
31     $vb->pack_start (my $e = Gtk2::Entry->new, 0, 1, 0);
32     $e->signal_connect (activate => sub {
33     $self->do_browse ($e->get_text);
34     });
35     $vb->pack_start ($self->{view_title} = Gtk2::Label->new, 0, 1, 0);
36     $vb->pack_start (my $sw = $self->{view} = Gtk2::ScrolledWindow->new, 1, 1, 0);
37     $sw->set_policy ('automatic', 'automatic');
38     $sw->add ($self->{viewp} = Gtk2::Viewport->new);
39     $w->show_all;
40     }
41    
42     sub do_browse {
43     my ($self, $txt, $node) = @_;
44     $::DISCO->request_items (::get_con (), $txt, $node, sub {
45     my ($disco, $i, $e) = @_;
46     if ($e) {
47     $self->add_page (
48     "items <error> [$txt]" . ($node ? " ($node)" : ""),
49     Gtk2::Label->new ($e->string)
50     );
51     } else {
52     my $sl = Gtk2::SimpleList->new ('JID' => 'text', 'Name' => 'text', Node => 'text');
53     @{$sl->{data}} =
54     map {
55     [ $_->{jid}, $_->{name}, $_->{node} ]
56     } $i->items;
57    
58     $sl->signal_connect (row_activated => sub {
59     my ($sl, $path, $column) = @_;
60     my $row_ref = $sl->get_row_data_from_path ($path);
61     $self->do_browse ($row_ref->[0], $row_ref->[2] ne '' ? $row_ref->[2] : undef);
62     });
63     my $id = $self->add_page ("items [".$i->jid."]" . ($i->node ? " (".$i->node.")" : ""), $sl);
64     $self->select_page ($id);
65     }
66     });
67     $::DISCO->request_info (::get_con (), $txt, undef, sub {
68     my ($disco, $i, $e) = @_;
69     if ($e) {
70     $self->add_page (
71     "info <error> [$txt]" . ($node ? " ($node)" : ""),
72     Gtk2::Label->new ($e->string)
73     );
74     } else {
75     my $vb = Gtk2::VBox->new;
76     $vb->pack_start (
77     my $sl1 = Gtk2::SimpleList->new (
78     Category => 'text', Type => 'text', Name => 'text'
79     ),
80     0, 1, 0
81     );
82     @{$sl1->{data}} =
83     map {
84     [ $_->{category}, $_->{type}, $_->{name} ]
85     } sort { $a->{category} cmp $b->{category} } $i->identities;
86     $vb->pack_start (
87     my $sl2 = Gtk2::SimpleList->new (Feature => 'text'),
88     0, 1, 0
89     );
90     @{$sl2->{data}} = sort keys %{$i->features || {}};
91     $self->add_page ("info [".$i->jid."]" . ($i->node ? " (".$i->node.")" : ""), $vb);
92     }
93     });
94     }
95    
96     sub select_page {
97     my ($self, $id) = @_;
98     my $p = $self->{page}->{$id} or return;
99     for ($self->{viewp}->get_children) {
100     $_->hide_all;
101     $self->{viewp}->remove ($_);
102     }
103     $self->{view_title}->set_text ($p->[0]);
104     $self->{viewp}->add ($p->[1]);
105     $p->[1]->show_all;
106     }
107    
108     sub add_page {
109     my ($self, $title, $chld) = @_;
110     my $id = 1 * $self->{page_id}++;
111     $self->{page}->{$id} = [$title, $chld];
112     push @{$self->{log}->{data}}, [$id, $title];
113     $id
114     }
115     1