# $Id: Search.pm,v 1.7 2001/07/23 18:02:32 muhri Exp $
# -*- perl -*-
package Pronto::Search;
use strict;
use SelfLoader;
my $progress = undef;
my $stop = undef;
1;
__DATA__
sub search_win {
my ($search_win, $combo,$tooltips);
$tooltips = new Gtk::Tooltips();
if ($main::prefs{'ToolTips'}) {
$tooltips->enable();
} else {
$tooltips->disable();
}
$tooltips->set_delay(750);
$search_win = new Gtk::Window("toplevel");
$search_win->set_policy(1,1,0);
$search_win->set_title(_("Pronto! Search .."));
$search_win->set_default_size('275','195');
$search_win->signal_connect("destroy", sub { $search_win->destroy} );
$search_win->signal_connect("delete_event" => \&Gtk::false);
$search_win->position(-mouse);
$search_win->show;
$search_win->{'vbox'} = new Gtk::VBox(0,5);
$search_win->add($search_win->{'vbox'});
$search_win->{'vbox'}->show;
$search_win->{'hbox'} = new Gtk::HBox(0,5);
$search_win->{'hbox'}->show;
$search_win->{'vbox'}->pack_start($search_win->{'hbox'},0,0,0);
$search_win->{'label'} = new Gtk::Label(_("Search by:"));
$search_win->{'label'}->set_usize(85,10);
$search_win->{'label'}->show;
$combo->{'1'} = new Gtk::Combo;
$tooltips->set_tip($combo->{'1'}->entry,_("Choose a field to search by"),"");
my (@combo1) = ("SentFrom", "Subject", "Date","SentTo","CC","Replyf","NewMsg","Score","All");
$combo->{'1'}->set_popdown_strings(@combo1);
$combo->{'1'}->show;
$combo->{'1'}->popwin->signal_connect("hide",sub {
if ($combo->{'1'}->entry->get_text eq "All") {
$search_win->{'entry'}->set_sensitive(0);
if ($main::prefs{'DatabaseDriver'} ne "CSV") {
$search_win->{'limit'}->set_sensitive(0);
}
$search_win->{'body'}->set_active(1);
} else {
$search_win->{'body'}->set_active(0);
if ($main::prefs{'DatabaseDriver'} ne "CSV") {
$search_win->{'limit'}->set_sensitive(1)
}
$search_win->{'entry'}->set_sensitive(1)
}
if ($combo->{'1'}->entry->get_text eq "SentTo") {
${$main::message_clist->{'labels'}}[4] = "To";
&main::set_labels($main::message_clist);
} else {
${$main::message_clist->{'labels'}}[4] = "From";
&main::set_labels($main::message_clist);
}
});
$search_win->{'for'} = new Gtk::Label(_("For"));
$search_win->{'for'}->set_usize(85,10);
$search_win->{'for'}->show;
$search_win->{'entry'} = new Gtk::Entry;
$search_win->{'entry'}->set_usize(170,20);
$tooltips->set_tip($search_win->{'entry'},_("Enter your search expression here if you are looking for something after a certain word enter as %word"),"");
$search_win->{'entry'}->show;
$search_win->{'entry'}->signal_connect("activate" => \&do_search, $search_win, $combo);
$search_win->{'chk1'} = new Gtk::CheckButton;
$search_win->{'chk1'}->set_usize(16,17);
$search_win->{'chk1'}->show;
$search_win->{'chk1'}->signal_connect("toggled", sub {
if ($search_win->{'chk1'}->active == 1) {
$search_win->{'chk2'}->set_active(0);
$combo->{'2'}->set_sensitive(1);
$search_win->{'entry2'}->set_sensitive(1);
} else {
if ($search_win->{'chk2'}->active == 1) {
return 1;
} else {
$combo->{'2'}->set_sensitive(0);
$search_win->{'entry2'}->set_sensitive(0)
}
}});
$search_win->{'and'} = new Gtk::Label(_("And"));
$search_win->{'and'}->show;
$search_win->{'chk2'} = new Gtk::CheckButton;
$search_win->{'chk2'}->signal_connect("toggled", sub {
if ($search_win->{'chk2'}->active == 1) {
$search_win->{'chk1'}->set_active(0); $combo->{'2'}->set_sensitive(1);
$combo->{'2'}->set_sensitive(1);
$search_win->{'entry2'}->set_sensitive(1);
} else {
if ($search_win->{'chk1'}->active == 1) {
return 1;
} else {
$combo->{'2'}->set_sensitive(0);
$search_win->{'entry2'}->set_sensitive(0);
}
}});
$search_win->{'chk2'}->set_usize(16,17);
$search_win->{'chk2'}->show;
$search_win->{'or'} = new Gtk::Label(_("Or "));
$search_win->{'or'}->show;
my (@combo2) = ("SentFrom","Sentto","CC","Date","Subject","BoxName","ReplyF","Score","NewMsg");
$combo->{'2'} = new Gtk::Combo;
$combo->{'2'}->set_popdown_strings(@combo2);
$combo->{'2'}->show;
$combo->{'2'}->popwin->signal_connect("hide", sub {
if ($combo->{'2'}->entry->get_text eq "BoxName") {
$search_win->{'entry2'}->hide;
$search_win->{'for2'}->set_text("Is");
$combo->{'3'}->show;
} else {
$search_win->{'entry2'}->show;
$search_win->{'for2'}->set_text("For");
$combo->{'3'}->hide;
}
});
$combo->{'2'}->set_sensitive(0);
$search_win->{'for2'} = new Gtk::Label(_("For"));
$search_win->{'for2'}->set_usize(85,10);
$search_win->{'for2'}->show;
$search_win->{'entry2'} = new Gtk::Entry;
$search_win->{'entry2'}->set_sensitive(0);
$search_win->{'entry2'}->set_usize(170,20);
$search_win->{'entry2'}->signal_connect("activate" =>\&do_search, $search_win, $combo);
$search_win->{'entry2'}->show;
$combo->{'3'} = new Gtk::Combo;
my @boxlist = sort(keys(%main::foldernametoid));
$combo->{'3'}->set_popdown_strings(@boxlist);
$combo->{'3'}->hide;
$search_win->{'limitlbl'} = new Gtk::Label(_("Limit"));
$search_win->{'limitlbl'}->set_usize(85,10);
$search_win->{'limitlbl'}->show;
$search_win->{'limit'} = new Gtk::Combo;
$tooltips->set_tip($search_win->{'limit'}->entry,_("Set the limit to number of results - not supported for CSV"),"");
my (@limits) = ("Unlimited", "10", "20","30","40","50");
$search_win->{'limit'}->set_popdown_strings(@limits);
$search_win->{'limit'}->show;
if ($main::prefs{'DatabaseDriver'} eq "CSV") {
$search_win->{'limit'}->set_sensitive(0);
}
$search_win->{'bodylabel'} = new Gtk::Label(_("Search body for"));
$search_win->{'bodylabel'}->show;
$search_win->{'body'} = new Gtk::CheckButton;
$search_win->{'body'}->set_usize(16,17);
$search_win->{'body'}->show;
$search_win->{'body'}->set_active(0);
$search_win->{'body'}->signal_connect("toggled", sub {
if ($search_win->{'body'}->active) {
$search_win->{'bodytext'}->set_sensitive(1);
} else {
$search_win->{'bodytext'}->set_sensitive(0);
}
});
$search_win->{'bodytext'} = new Gtk::Entry;
$tooltips->set_tip($search_win->{'bodytext'},_("Enter words to search for in the message body"));
$search_win->{'bodytext'}->set_editable(1);
$search_win->{'bodytext'}->set_sensitive(0);
$search_win->{'bodytext'}->show;
$search_win->{'bodytext'}->signal_connect("activate" => \&do_search, $search_win, $combo);
$search_win->{'button'} = new Gtk::Button(_("Go"));
$tooltips->set_tip($search_win->{'button'},_("Execute Search"),"");
$search_win->{'button'}->signal_connect("clicked" => \&do_search, $search_win, $combo);
$search_win->{'button'}->show;
$search_win->{'save'} = new Gtk::Button(_("Save into a vfolder"));
$tooltips->set_tip($search_win->{'save'},_("If you are satisfied with your search results, you can save it as a VFolder for immediate retrival later on"),"");
$search_win->{'save'}->show;
$search_win->{'save'}->signal_connect("clicked" => \&save_vf, $search_win, $combo);
$search_win->{'hbox'}->pack_start($search_win->{'label'},0,0,0);
$search_win->{'hbox'}->pack_start($combo->{'1'},0,0,0);
$search_win->{'hbox2'} = new Gtk::HBox(0,5);
$search_win->{'hbox2'}->show;
$search_win->{'hbox2'}->pack_start($search_win->{'for'},0,0,0);
$search_win->{'hbox2'}->pack_start($search_win->{'entry'},0,0,0);
$search_win->{'vbox'}->pack_start($search_win->{'hbox2'},0,0,0);
$search_win->{'andorbox'} = new Gtk::HBox(0,5);
$search_win->{'andorbox'}->show;
$search_win->{'vbox'}->pack_start($search_win->{'andorbox'},0,0,0);
$search_win->{'andorbox'}->pack_start($search_win->{'chk1'},0,0,0);
$search_win->{'andorbox'}->pack_start($search_win->{'and'},0,0,0);
$search_win->{'andorbox'}->pack_start($search_win->{'chk2'},0,0,0);
$search_win->{'andorbox'}->pack_start($search_win->{'or'},0,0,0);
$search_win->{'andorbox'}->pack_start($combo->{'2'},0,0,0);
$search_win->{'entry2box'} = new Gtk::HBox(0,5);
$search_win->{'entry2box'}->show;
$search_win->{'vbox'}->pack_start($search_win->{'entry2box'},0,0,0);
$search_win->{'entry2box'}->pack_start($search_win->{'for2'},0,0,0);
$search_win->{'entry2box'}->pack_start($search_win->{'entry2'},0,0,0);
$search_win->{'entry2box'}->pack_start($combo->{'3'},0,0,0);
$search_win->{'hbox3'}=new Gtk::HBox(0,5);
$search_win->{'hbox3'}->show;
$search_win->{'hbox3'}->pack_start($search_win->{'limitlbl'},0,0,0);
$search_win->{'hbox3'}->pack_start($search_win->{'limit'},0,0,0);
$search_win->{'vbox'}->pack_start($search_win->{'hbox3'},0,0,0);
$search_win->{'hbox4'} = new Gtk::HBox(0,5);
$search_win->{'hbox4'}->show;
$search_win->{'vbox'}->pack_start($search_win->{'hbox4'},0,0,0);
$search_win->{'hbox4'}->pack_start($search_win->{'body'},0,0,0);
$search_win->{'hbox4'}->pack_start($search_win->{'bodylabel'},0,0,0);
$search_win->{'hbox4'}->pack_start($search_win->{'bodytext'},0,0,0);
$search_win->{'hbox5'} = new Gtk::HBox(0,5);
$search_win->{'hbox5'}->show;
$search_win->{'hbox5'}->pack_start($search_win->{'button'},1,1,0);
$search_win->{'hbox5'}->pack_start($search_win->{'save'},1,1,0);
$search_win->{'vbox'}->pack_start($search_win->{'hbox5'},0,0,0);
}
sub do_search {
my ($widget,$search_win, $combo) = @_;
my ($entry,$select,$limit,@field);
my ($sql, $query, $box,@row, @selection, $row, @msg_sel, %selected, $background, $style, $paperclip, $paperclip_mask, $exclamation, $exclamation_mask, $replyf, $replyf_mask, $forwardf, $forwardf_mask,$newm,$newm_mask);
unless ($combo->{'1'}->entry->get_text eq "All") {
$entry = $search_win->{'entry'}->get_text;
if ($entry eq "") { &main::err_dialog(_("Please type something in the entry box")); return 1;}
if ($search_win->{'chk1'}->active or $search_win->{'chk2'}->active) {
if ($combo->{'2'}->entry->get_text ne "BoxName" and $search_win->{'entry2'}->get_text eq "") {
&main::err_dialog(_("Please type something in the and/or condition box or uncheck it !"));
return 1;
}
}
if ($search_win->{'body'}->get_active == 1 and $search_win->{'bodytext'}->get_text eq "") {
&main::err_dialog(_("Enter some text in the body search entry"));
return 1;
}
$select = $combo->{'1'}->entry->get_text;
$select = lc($select);
$limit = $search_win->{'limit'}->entry->get_text;
$box = &Pronto::FolderTree::get_folder_id();
}
if (!$box or $box !=1000) {
$main::folder_tree->select($main::ft_node[1000]);
$main::root_window->{'button'}->show;
}
$main::message_clist->freeze;
$row=0;
$main::message_clist->clear;
if(-f "$main::prefs{'PixmapDir'}/paperclip.xpm") {
($paperclip,$paperclip_mask)=Gtk::Gdk::Pixmap->create_from_xpm($main::message_clist->clist_window,$main::message_clist->style->bg('normal'),"$main::prefs{'PixmapDir'}/paperclip.xpm");
}
else {
($paperclip,$paperclip_mask)=Gtk::Gdk::Pixmap->create_from_xpm_d($main::message_clist->clist_window,$main::message_clist->style->bg('normal'),@main::dummy_pixmap);
}
if(-f "$main::prefs{'PixmapDir'}/exclamation.xpm") {
($exclamation,$exclamation_mask)=Gtk::Gdk::Pixmap->create_from_xpm($main::message_clist->clist_window,$main::message_clist->style->bg('normal'),"$main::prefs{'PixmapDir'}/exclamation.xpm");
}
else {
($exclamation,$exclamation_mask)=Gtk::Gdk::Pixmap->create_from_xpm_d($main::message_clist->clist_window,$main::message_clist->style->bg('normal'),@main::dummy_pixmap);
}
if(-f "$main::prefs{'PixmapDir'}/reply_flag.xpm") {
($replyf,$replyf_mask)=Gtk::Gdk::Pixmap->create_from_xpm($main::message_clist->clist_window,$main::message_clist->style->bg('normal'),"$main::prefs{'PixmapDir'}/reply_flag.xpm");
}
else {
($replyf,$replyf_mask)=Gtk::Gdk::Pixmap->create_from_xpm_d($main::message_clist->clist_window,$main::message_clist->style->bg('normal'),@main::dummy_pixmap);
}
if(-f "$main::prefs{'PixmapDir'}/forward_flag.xpm") {
($forwardf,$forwardf_mask)=Gtk::Gdk::Pixmap->create_from_xpm($main::message_clist->clist_window,$main::message_clist->style->bg('normal'),"$main::prefs{'PixmapDir'}/forward_flag.xpm");
}
else {
($forwardf,$forwardf_mask)=Gtk::Gdk::Pixmap->create_from_xpm_d($main::message_clist->clist_window,$main::message_clist->style->bg('normal'),@main::dummy_pixmap);
}
if(-f "$main::prefs{'PixmapDir'}/newm.xpm") {
($newm,$newm_mask)=Gtk::Gdk::Pixmap->create_from_xpm($main::message_clist->clist_window,$main::message_clist->style->bg('normal'),"$main::prefs{'PixmapDir'}/newm.xpm");
}
else {
($newm,$newm_mask)=Gtk::Gdk::Pixmap->create_from_xpm_d($main::message_clist->clist_window,$main::message_clist->style->bg('normal'),@main::dummy_pixmap);
}
${$main::message_clist->{'labels'}}[4] = "From";
if ($combo->{'1'}->entry->get_text eq "All") {
if ($main::prefs{'messageview'} eq "clist") {
$sql = "select id,friendly,subject,date,newmsg,localdate,contenttype,priority,replyf,score from messages";
} elsif ($main::prefs{'messageview'} eq "ctree") {
$sql = "select msgid,inreplyto,subject,friendly,localdate,id,newmsg,replyf,priority,contenttype,score,ref from messages order by localdate";
}
}
unless ($combo->{'1'}->entry->get_text eq "All") {
if ($limit eq "Unlimited") {
if ($main::prefs{'messageview'} eq "clist") {
$sql = "select id,friendly,subject,date,newmsg,localdate,contenttype,priority,replyf,score,serverstat from messages where $select like '$entry%'";
} elsif ($main::prefs{'messageview'} eq "ctree") {
$sql = "select msgid,inreplyto,subject,friendly,localdate,id,newmsg,replyf,priority,contenttype,score,ref,serverstat from messages where $select like '$entry%' order by localdate";
}
} else {
if ($main::prefs{'messageview'} eq "clist") {
$sql = "select id,friendly,subject,date,newmsg,localdate,contenttype,priority,replyf,score,serverstat from messages where $select like '$entry%' limit $limit";
} elsif ($main::prefs{'messageview'} eq "ctree") {
$sql = "select msgid,inreplyto,subject,friendly,localdate,id,newmsg,replyf,priority,contenttype,score,ref,serverstat from messages where $select like '$entry%' order by localdate limit $limit";
}
}
}
if ($search_win->{'chk1'}->active) {
my $fromcombo = $combo->{'2'}->entry->get_text;
if ($fromcombo ne "BoxName") {
$fromcombo = lc($fromcombo);
my $condentry = $search_win->{'entry2'}->get_text;
if ($combo->{'1'}->entry->get_text ne "All"){
$sql = $sql . " and $fromcombo like '$condentry%'";
} else {
$sql = $sql . " where $fromcombo like '$condentry%'";
}
} else {
my $boxname = $combo->{'3'}->entry->get_text;
if ($combo->{'1'}->entry->get_text ne "All"){
$sql = $sql . " and boxid = " . $main::foldernametoid{$boxname};
} else {
$sql = $sql . " where boxid = " . $main::foldernametoid{$boxname};
}
}
if ($main::prefs{'messageview'} eq "ctree") { $sql =~ s/order by localdate//; $sql = $sql . " order by localdate";}
if ($search_win->{'limit'}->entry->get_text ne "Unlimited") { $sql =~ s/limit $limit//; $sql = $sql . " limit $limit" }
}
if ($search_win->{'chk2'}->active) {
my $fromcombo = $combo->{'2'}->entry->get_text;
if ($fromcombo ne "BoxName") {
$fromcombo = lc($fromcombo);
my $condentry = $search_win->{'entry2'}->get_text;
if ($combo->{'1'}->entry->get_text ne "All"){
$sql = $sql . " or $fromcombo like '$condentry%'";
} else {
$sql = $sql . " where $fromcombo like '$condentry%'";
}
} else {
my $boxname = $combo->{'3'}->entry->get_text;
if ($combo->{'1'}->entry->get_text ne "All"){
$sql = $sql . " or boxid = " . $main::foldernametoid{$boxname};
} else {
$sql = $sql . " where boxid = " . $main::foldernametoid{$boxname};
}
}
if ($main::prefs{'messageview'} eq "ctree") { $sql =~ s/order by localdate//; $sql = $sql . " order by localdate";}
if ($search_win->{'limit'}->entry->get_text ne "Unlimited") { $sql =~ s/limit $limit//; $sql = $sql . " limit $limit" }
}
&main::set_labels($main::message_clist);
$query = $main::conn->prepare($sql);
$query->execute();
my $rows = $query->rows;
if ($rows == 0) { &main::err_dialog(_("Your search returned no results!")); }
my $new = 0;
if ($search_win->{'body'}->get_active == 0) {
$main::folder_tree->node_set_text($main::ft_node[1000], 1, $rows);
}
my $i = 0;
my $count = 0;
if ($main::prefs{'messageview'} eq "clist") {
while (@row=$query->fetchrow_array) {
if ($stop) { undef $stop; undef $progress; last; }
if ($search_win->{'body'}->active and $search_win->{'bodytext'} ne "") {
if (not defined $progress && !$stop) { progress();}
$progress->{'bar'}->configure($count,0,$rows) if defined $progress;
my $text = $search_win->{'bodytext'}->get_text;
#my $tmp = &main::filename_to_tree("$main::prefs{'MailDir'}/$row[0]");
#open(TMP, $tmp);
my $add = 0;
my $io = &Pronto::Data::Message::get_source_io_handle($row[0]);
while ( $_ = $io->getline() ) {
$progress->{'bar'}->set_value($i++) if defined $progress;
if (/$text/i) { $add = 1; $count++;last;}
while (Gtk->events_pending) { Gtk->main_iteration }
}
if ($add != 1) { $io->close(); next }
$io->close();
}
if (not defined $row[9]) { $row[9] = 0; }
if ($row[9] == 0) { $row[9] = " "; }
if (defined $row[10] && $row[10] == 1) {
$row[10] = _("Not Fetched"); # Message is still on server and has NOT been fetched.
#
} elsif (defined $row[10] && ($row[10] == 2 || $row[10] == 6)) {
$row[10] = _("On Server"); # Message is still on server and has been fetched.
#
} elsif (defined $row[10] && $row[10] == 3) {
$row[10] = _("To Be Deleted"); # Message is flagged for deletion.
#
} elsif (defined $row[10] && $row[10] == 4) {
$row[10] = _("To Be Fetched & Deleted"); # Message is flagged for deletion.
#
} else {
$row[10] = " "; # Message is not on server.
#
}
$main::message_clist->insert($row,'','','',$row[9],$row[1],$row[2],&main::localdate_to_displaydate($row[5]),$row[10],$row[5]);
if ($row[6] && ($row[6] !~ /text/i && $row[6] !~ /alternative/i && $row[6] !~ /multipart\/report/i)) {
$main::message_clist->set_pixmap($row, 1, $paperclip, $paperclip_mask);
}
if (($row[7]) and ($row[7] =~ /high/i)) {
$main::message_clist->set_pixmap($row, 0, $exclamation, $exclamation_mask);
}
if ($row[8]) {
if ($row[8] == 1) {
$main::message_clist->set_pixtext($row, 4, $row[1],1,$replyf, $replyf_mask);
} elsif ($row[8] == 2) {
$main::message_clist->set_pixtext($row, 4, $row[1],1,$forwardf, $forwardf_mask);
}
}
if (($row[4]) and ($row[4] eq "y")) {
$main::message_clist->set_pixmap($row, 2, $newm, $newm_mask);
if ($main::prefs{'BoldMsg'}) {
$main::message_clist->set_row_style($row,$main::bold);
}
#$style = $main::message_clist->style->copy;
#$style->font($fontbold);
$new++
} else {
if ($main::prefs{'BoldMsg'}) {
$main::message_clist->set_row_style($row,$main::normal);
}
}
if ($selected{$row[0]}) {
$main::message_clist->select_row($row,1);
}
$main::message_clist->set_row_data($row, \$row[0]);
$row++;
}
} elsif ($main::prefs{'messageview'} eq "ctree") {
my ($node);
my (%nodes, %not_found) = ((), ());
while (my($msgid, $inreplyto, $subject, $sentfrom, $date,$id,$newmsg,$reply,$priority,$contenttype,$score,$ref,$serverstat) = $query->fetchrow_array()) {
if ($stop) { undef $stop; undef $progress; last; }
if ($search_win->{'body'}->active and $search_win->{'bodytext'} ne "") {
if (not defined $progress && !$stop) { progress() }
$progress->{'bar'}->configure($count,0,$rows) if defined $progress;
my $text = $search_win->{'bodytext'}->get_text;
#my $tmp = &main::filename_to_tree("$main::prefs{'MailDir'}/$id");
#open(TMP, $tmp);
my $add = 0;
my $io = &Pronto::Data::Message::get_source_io_handle($id);
while ( $_ = $io->getline() ) {
$progress->{'bar'}->set_value($i++) if defined $progress;
if (/$text/i) { $add = 1; $count++; last;}
while (Gtk->events_pending) { Gtk->main_iteration }
}
if ($add != 1) { $io->close(); next }
$io->close();
}
my $sub = $subject;
$sub =~ s!\bre(:|\b)\s+!!gi;
if (!$score) { $score = 0 }
if ($score == 0) { $score = " "; }
#shut CSV up
if ($main::prefs{'DatabaseDriver'} eq "CSV") {
if (not defined $reply or $reply eq "") {
$reply = 0;
}
}
if (defined $serverstat && $serverstat == 1) {
$serverstat = _("Not Fetched"); # Message is still on server and has NOT been fetched.
#
} elsif (defined $serverstat && ($serverstat == 2 || $serverstat == 6)) {
$serverstat = _("On Server"); # Message is still on server and has been fetched.
#
} elsif (defined $serverstat && $serverstat == 3) {
$serverstat = _("To Be Deleted"); # Message is flagged for deletion.
#
} elsif (defined $serverstat && $serverstat == 4) {
$serverstat = _("To Be Fetched & Deleted");# Message is flagged for deletion.
#
} else {
$serverstat = " "; # Message is not on server.
#
}
if (!$ref && !$inreplyto) { #toplevel mail
my $title = ["",,"","",$score,$sentfrom,$subject,&main::localdate_to_displaydate($date),$serverstat,$date];
if (defined $reply and $reply ne "" and $reply == 1) {
$node = $main::message_clist->insert_node(undef,undef,$title,5,$replyf,$replyf_mask,$replyf,$replyf_mask,0,1);
} elsif (defined $reply and $reply ne "" and $reply == 2) {
$node = $main::message_clist->insert_node(undef,undef,$title,5,$forwardf,$forwardf_mask,$forwardf,$forwardf_mask,0,1);
} else {
$node = $main::message_clist->insert_node(undef,undef,$title,5,undef,undef,undef,undef,0,1);
}
$nodes{$msgid} = $node;
$nodes{$sentfrom . $date} = $node;
$nodes{$sub} = $node;
} else {
if (!$ref && $inreplyto =~ /^(.+)\'s message of \"([^\"]+)\"/) {
$inreplyto = "$1$2";
$inreplyto =~ s/\"//g;
} elsif ($ref =~ /(<[^>]+>)$/ || $inreplyto =~ /(<[^>]+>)/) {
$inreplyto = $1;
}
if ($nodes{$inreplyto}) {
my $title = ["","","",$score,$sentfrom,$subject,&main::localdate_to_displaydate($date),$serverstat,$date];
if (defined $reply and $reply ne "" and $reply == 1) {
$node = $main::message_clist->insert_node($nodes{$inreplyto},undef,$title,5,$replyf,$replyf_mask,$replyf,$replyf_mask,0,1);
} elsif (defined $reply and $reply ne "" and $reply == 2) {
$node = $main::message_clist->insert_node($nodes{$inreplyto},undef,$title,5,$forwardf,$forwardf_mask,$forwardf,$forwardf_mask,0,1);
} else {
$node = $main::message_clist->insert_node($nodes{$inreplyto},undef,$title,5,undef,undef,undef,undef,0,1);
}
$nodes{$msgid} = $node;
$nodes{$sentfrom . $date} = $node;
$nodes{$sub} = $node;
} elsif ($nodes{$sub} && $main::prefs{'GuessRejectThreads'} eq "y") {
my $title = ["","","",$score,$sentfrom,$subject,&main::localdate_to_displaydate($date),$serverstat,$date];
if (defined $reply and $reply == 1) {
$node = $main::message_clist->insert_node($nodes{$sub},undef,$title,5,$replyf,$replyf_mask,$replyf,$replyf_mask,0,1);
} elsif (defined $reply and $reply == 2) {
$node = $main::message_clist->insert_node($nodes{$sub},undef,$title,5,$forwardf,$forwardf_mask,$forwardf,$forwardf_mask,0,1);
} else {
$node = $main::message_clist->insert_node($nodes{$sub},undef,$title,5,undef,undef,undef,undef,0,1);
}
$nodes{$msgid} = $node;
$nodes{$sentfrom . $date} = $node;
$nodes{$sub} = $node;
} else {
my $title = ["","","",$score,$sentfrom,$subject,&main::localdate_to_displaydate($date),$serverstat,$date];
if (defined $reply and $reply ne "" and $reply == 1) {
$node = $main::message_clist->insert_node(undef,undef,$title,5,$replyf,$replyf_mask,$replyf,$replyf_mask,0,1);
} elsif (defined $reply and $reply ne "" and $reply == 2) {
$node = $main::message_clist->insert_node(undef,undef,$title,5,$forwardf,$forwardf_mask,$forwardf,$forwardf_mask,0,1);
} else {
$node = $main::message_clist->insert_node(undef,undef,$title,5,undef,undef,undef,undef,0,1);
}
$nodes{$msgid} = $node;
$nodes{$sentfrom . $date} = $node;
$nodes{$sub} = $node;
}
}
$main::message_clist->node_set_row_data($node,\$id);
if ($contenttype && ($contenttype !~ /text/i && $contenttype !~ /alternative/i && $contenttype !~ /multipart\/report/i)) {
$main::message_clist->node_set_pixmap($node, 1, $paperclip, $paperclip_mask);
}
if (($priority) and ($priority =~ /high/i)) {
$main::message_clist->node_set_pixmap($node, 0, $exclamation, $exclamation_mask);
}
if (defined $newmsg and $newmsg eq "y") {
$main::message_clist->node_set_pixmap($node,2,$newm,$newm_mask);
if ($main::prefs{'BoldMsg'}) {
$main::message_clist->node_set_row_style($node,$main::bold);
}
$new++;
} else {
if ($main::prefs{'BoldMsg'}) {
$main::message_clist->node_set_row_style($node,$main::normal);
}
}
}
}
if ($main::prefs{'messageview'} eq "clist") {
$main::message_clist->sort;
} elsif ($main::prefs{'messageview'} eq "ctree") {
$main::message_clist->sort_recursive( undef );
if ($main::prefs{'threadpref'} eq "collapsed") { $main::message_clist->collapse_recursive(undef)}
}
@msg_sel = $main::message_clist->selection;
if (@msg_sel) {
if ($main::prefs{'messageview'} eq "clist") {
$main::message_clist->moveto($msg_sel[0],0,'0.5','0.5');
$main::message_clist->set_focus_row($msg_sel[0]);
}
}
#if (($new !=0) and ($main::prefs{'FolderNewBold'} eq "y")) {
#$style = $main::folder_tree->style->copy;
#$style->font($fontbold);
#$main::folder_tree->node_set_row_style($ft_node[100], $style);
#}
if (defined $progress) {
$progress->signal_handlers_destroy();
$progress->destroy;
undef $progress;
}
if ($count > 0) {
$main::folder_tree->node_set_text($main::ft_node[1000],1,$count);
}
$main::folder_tree->node_set_text($main::ft_node[1000],2,$new);
$main::message_clist->thaw;
&main::set_win_title;
return 1;
}
sub view_virtual_folder {
my ($vfolder) = @_;
my ($body,$sql, $query, $box,@row, @selection, $row, @msg_sel, %selected, $background, $style, $paperclip, $paperclip_mask, $exclamation, $exclamation_mask, $replyf, $replyf_mask, $forwardf, $forwardf_mask,$newm,$newm_mask,$toselect,$vpos);
my $msg = &Pronto::MessageList::get_selected_msgid();
if ($msg) {
$selected{$msg} = 1;
$vpos = $main::root_window->{'sw'}->get_vadjustment if $main::HTMLWIDGET ne "XmHTML";
}
$main::message_clist->freeze;
$row=0;
$main::message_clist->clear;
if(-f "$main::prefs{'PixmapDir'}/paperclip.xpm") {
($paperclip,$paperclip_mask)=Gtk::Gdk::Pixmap->create_from_xpm($main::message_clist->clist_window,$main::message_clist->style->bg('normal'),"$main::prefs{'PixmapDir'}/paperclip.xpm");
}
else {
($paperclip,$paperclip_mask)=Gtk::Gdk::Pixmap->create_from_xpm_d($main::message_clist->clist_window,$main::message_clist->style->bg('normal'),@main::dummy_pixmap);
}
if(-f "$main::prefs{'PixmapDir'}/exclamation.xpm") {
($exclamation,$exclamation_mask)=Gtk::Gdk::Pixmap->create_from_xpm($main::message_clist->clist_window,$main::message_clist->style->bg('normal'),"$main::prefs{'PixmapDir'}/exclamation.xpm");
}
else {
($exclamation,$exclamation_mask)=Gtk::Gdk::Pixmap->create_from_xpm_d($main::message_clist->clist_window,$main::message_clist->style->bg('normal'),@main::dummy_pixmap);
}
if(-f "$main::prefs{'PixmapDir'}/reply_flag.xpm") {
($replyf,$replyf_mask)=Gtk::Gdk::Pixmap->create_from_xpm($main::message_clist->clist_window,$main::message_clist->style->bg('normal'),"$main::prefs{'PixmapDir'}/reply_flag.xpm");
}
else {
($replyf,$replyf_mask)=Gtk::Gdk::Pixmap->create_from_xpm_d($main::message_clist->clist_window,$main::message_clist->style->bg('normal'),@main::dummy_pixmap);
}
if(-f "$main::prefs{'PixmapDir'}/forward_flag.xpm") {
($forwardf,$forwardf_mask)=Gtk::Gdk::Pixmap->create_from_xpm($main::message_clist->clist_window,$main::message_clist->style->bg('normal'),"$main::prefs{'PixmapDir'}/forward_flag.xpm");
}
else {
($forwardf,$forwardf_mask)=Gtk::Gdk::Pixmap->create_from_xpm_d($main::message_clist->clist_window,$main::message_clist->style->bg('normal'),@main::dummy_pixmap);
}
if(-f "$main::prefs{'PixmapDir'}/newm.xpm") {
($newm,$newm_mask)=Gtk::Gdk::Pixmap->create_from_xpm($main::message_clist->clist_window,$main::message_clist->style->bg('normal'),"$main::prefs{'PixmapDir'}/newm.xpm");
}
else {
($newm,$newm_mask)=Gtk::Gdk::Pixmap->create_from_xpm_d($main::message_clist->clist_window,$main::message_clist->style->bg('normal'),@main::dummy_pixmap);
}
${$main::message_clist->{'labels'}}[3] = "From";
if ($main::root_window->{'button'}->visible()) { $main::root_window->{'button'}->hide(); }
&main::set_labels($main::message_clist);
$sql = "select query,body from boxlist where id = '$vfolder'";
$query = $main::conn->prepare($sql);
$query->execute();
($sql,$body) = $query->fetchrow_array();
if ($main::prefs{'messageview'} eq "ctree") { #convert from default clist query to ctree.
$sql =~ s/id,/msgid,inreplyto,/g;
$sql =~ s/localdate,//;
$sql =~ s/friendly,subject,date/subject,friendly,localdate,id/g;
$sql =~ s/newmsg,/newmsg,replyf,/g;
$sql =~ s/contenttype,priority,replyf/priority,contenttype/g;
$sql =~ s/,score/,score,ref/g;
$sql =~ s/limit(.+)//;
if ($1) {
$sql = $sql . " order by localdate limit $1";
} else { $sql = $sql . " order by localdate"; }
}
$query = $main::conn->prepare($sql);
$query->execute();
my $rows = $query->rows;
my $i=0;
my $new = 0;
my $count = 0;
if ($main::prefs{'messageview'} eq "clist") {
while (@row=$query->fetchrow_array) {
if ($stop) { undef $stop; undef $progress; last; }
if ($body ne "") {
if (not defined $progress && !$stop) { progress() }
$progress->{'bar'}->configure($count,0,$rows) if defined $progress;
#my $tmp = &main::filename_to_tree("$main::prefs{'MailDir'}/$row[0]");
#open(TMP, $tmp);
my $add = 0;
my $io = &Pronto::Data::Message::get_source_io_handle($row[0]);
while ( $_ = $io->getline() ) {
$progress->{'bar'}->set_value($i++) if defined $progress;
if (/$body/i) { $add = 1; $count++; last;}
while (Gtk->events_pending) { Gtk->main_iteration }
}
if ($add != 1) { $io->close(); next }
$io->close();
}
if (not defined $row[9]) { $row[9] = 0; }
if ($row[9] == 0) { $row[9] = " "; }
if (defined $row[10] && $row[10] == 1) {
$row[10] = _("Not Fetched"); # Message is still on server and has NOT been fetched.
#
} elsif (defined $row[10] && ($row[10] == 2 || $row[10] == 6)) {
$row[10] = _("On Server"); # Message is still on server and has been fetched.
#
} elsif (defined $row[10] && $row[10] == 3) {
$row[10] = _("To Be Deleted"); # Message is flagged for deletion.
#
} elsif (defined $row[10] && $row[10] == 4) {
$row[10] = _("To Be Fetched & Deleted"); # Message is flagged for deletion.
#
} else {
$row[10] = " "; # Message is not on server.
#
}
$main::message_clist->insert($row,'','','',$row[9],$row[1],$row[2],&main::localdate_to_displaydate($row[5]),$row[10],$row[5]);
if ($row[6] && ($row[6] !~ /text/i && $row[6] !~ /alternative/i && $row[6] !~ /multipart\/report/i)) {
$main::message_clist->set_pixmap($row, 1, $paperclip, $paperclip_mask);
}
if (($row[7]) and ($row[7] =~ /high/i)) {
$main::message_clist->set_pixmap($row, 0, $exclamation, $exclamation_mask);
}
if ($row[8]) {
if ($row[8] == 1) {
$main::message_clist->set_pixtext($row, 4, $row[1],1,$replyf, $replyf_mask);
} elsif ($row[8] == 2) {
$main::message_clist->set_pixtext($row, 4, $row[1],1,$forwardf, $forwardf_mask);
}
}
if (($row[4]) and ($row[4] eq "y")) {
$main::message_clist->set_pixmap($row, 2, $newm, $newm_mask);
if ($main::prefs{'BoldMsg'}) {
$main::message_clist->set_row_style($row,$main::bold);
}
$new++
} else {
if ($main::prefs{'BoldMsg'}) {
$main::message_clist->set_row_style($row,$main::normal);
}
}
if ($selected{$row[0]}) {
$main::message_clist->select_row($row,1);
}
$main::message_clist->set_row_data($row, \$row[0]);
$row++;
}
} elsif ($main::prefs{'messageview'} eq "ctree") {
my ($node);
my (%nodes, %not_found) = ((), ());
while (my($msgid, $inreplyto, $subject, $sentfrom, $date,$id,$newmsg,$reply,$priority,$contenttype,$score,$ref,$serverstat) = $query->fetchrow_array()) {
if ($stop) { undef $stop; undef $progress; last; }
if ($body ne "") {
if (not defined $progress && !$stop) { progress() }
$progress->{'bar'}->configure($count,0,$rows) if defined $progress;
#my $tmp = &main::filename_to_tree("$main::prefs{'MailDir'}/$id");
#open(TMP, $tmp);
my $add = 0;
my $io = &Pronto::Data::Message::get_source_io_handle($id);
while ( $_ = $io->getline() ) {
$progress->{'bar'}->set_value($i++) if defined $progress;
if (/$body/i) { $add = 1; $count++; last;}
while (Gtk->events_pending) { Gtk->main_iteration }
}
if ($add != 1) { $io->close(); next }
$io->close();
}
my $sub = $subject;
$sub =~ s!\bre(:|\b)\s+!!gi;
if (!$score) { $score = 0 }
if ($score == 0) { $score = " "; }
#shut CSV up
if ($main::prefs{'DatabaseDriver'} eq "CSV") {
if (not defined $reply or $reply eq "") {
$reply = 0;
}
}
if (defined $serverstat && $serverstat == 1) {
$serverstat = _("Not Fetched"); # Message is still on server and has NOT been fetched.
#
} elsif (defined $serverstat && ($serverstat == 2 || $serverstat == 6)) {
$serverstat = _("On Server"); # Message is still on server and has been fetched.
#
} elsif (defined $serverstat && $serverstat == 3) {
$serverstat = _("To Be Deleted"); # Message is flagged for deletion.
#
} elsif (defined $serverstat && $serverstat == 4) {
$serverstat = _("To Be Fetched & Deleted");# Message is flagged for deletion.
#
} else {
$serverstat = " "; # Message is not on server.
#
}
if (!$ref && !$inreplyto) { #toplevel mail
my $title = ["",,"","",$score,$sentfrom,$subject,&main::localdate_to_displaydate($date),$serverstat,$date];
if (defined $reply and $reply ne "" and $reply == 1) {
$node = $main::message_clist->insert_node(undef,undef,$title,5,$replyf,$replyf_mask,$replyf,$replyf_mask,0,1);
} elsif (defined $reply and $reply ne "" and $reply == 2) {
$node = $main::message_clist->insert_node(undef,undef,$title,5,$forwardf,$forwardf_mask,$forwardf,$forwardf_mask,0,1);
} else {
$node = $main::message_clist->insert_node(undef,undef,$title,5,undef,undef,undef,undef,0,1);
}
$nodes{$msgid} = $node;
$nodes{$sentfrom . $date} = $node;
$nodes{$sub} = $subject;
} else {
if (!$ref && $inreplyto =~ /^(.+)\'s message of \"([^\"]+)\"/) {
$inreplyto = "$1$2";
$inreplyto =~ s/\"//g;
} elsif ($ref =~ /(<[^>]+>)$/ || $inreplyto =~ /(<[^>]+>)/) {
$inreplyto = $1;
}
if ($nodes{$inreplyto}) {
my $title = ["","","",$score,$sentfrom,$subject,&main::localdate_to_displaydate($date),$serverstat,$date];
if (defined $reply and $reply ne "" and $reply == 1) {
$node = $main::message_clist->insert_node($nodes{$inreplyto},undef,$title,5,$replyf,$replyf_mask,$replyf,$replyf_mask,0,1);
} elsif (defined $reply and $reply ne "" and $reply == 2) {
$node = $main::message_clist->insert_node($nodes{$inreplyto},undef,$title,5,$forwardf,$forwardf_mask,$forwardf,$forwardf_mask,0,1);
} else {
$node = $main::message_clist->insert_node($nodes{$inreplyto},undef,$title,5,undef,undef,undef,undef,0,1);
}
$nodes{$msgid} = $node;
$nodes{$sentfrom . $date} = $node;
$nodes{$sub} = $node;
} elsif ($nodes{$sub} && $main::prefs{'GuessRejectThreads'} eq "y") {
my $title = ["","","",$score,$sentfrom,$subject,&main::localdate_to_displaydate($date),$serverstat,$date];
if (defined $reply and $reply == 1) {
$node = $main::message_clist->insert_node($nodes{$sub},undef,$title,5,$replyf,$replyf_mask,$replyf,$replyf_mask,0,1);
} elsif (defined $reply and $reply == 2) {
$node = $main::message_clist->insert_node($nodes{$sub},undef,$title,5,$forwardf,$forwardf_mask,$forwardf,$forwardf_mask,0,1);
} else {
$node = $main::message_clist->insert_node($nodes{$sub},undef,$title,5,undef,undef,undef,undef,0,1);
}
$nodes{$msgid} = $node;
$nodes{$sentfrom . $date} = $node;
$nodes{$sub} = $node;
} else {
my $title = ["","","",$score,$sentfrom,$subject,&main::localdate_to_displaydate($date),$serverstat,$date];
if (defined $reply and $reply ne "" and $reply == 1) {
$node = $main::message_clist->insert_node(undef,undef,$title,5,$replyf,$replyf_mask,$replyf,$replyf_mask,0,1);
} elsif (defined $reply and $reply ne "" and $reply == 2) {
$node = $main::message_clist->insert_node(undef,undef,$title,5,$forwardf,$forwardf_mask,$forwardf,$forwardf_mask,0,1);
} else {
$node = $main::message_clist->insert_node(undef,undef,$title,5,undef,undef,undef,undef,0,1);
}
$nodes{$msgid} = $node;
$nodes{$sentfrom . $date} = $node;
$nodes{$sub} = $subject;
}
}
$main::message_clist->node_set_row_data($node,\$id);
if ($msg && $msg == $id) { $toselect = $node }
if ($contenttype && ($contenttype !~ /text/i && $contenttype !~ /alternative/i && $contenttype !~ /multipart\/report/i)) {
$main::message_clist->node_set_pixmap($node, 1, $paperclip, $paperclip_mask);
}
if (($priority) and ($priority =~ /high/i)) {
$main::message_clist->node_set_pixmap($node, 0, $exclamation, $exclamation_mask);
}
if (defined $newmsg and $newmsg eq "y") {
if ($main::prefs{'BoldMsg'}) {
$main::message_clist->node_set_row_style($node,$main::bold);
}
$main::message_clist->node_set_pixmap($node,2,$newm,$newm_mask);
$new++;
} else {
if ($main::prefs{'BoldMsg'}) {
$main::message_clist->node_set_row_style($node,$main::normal);
}
}
}
}
if ($main::prefs{'messageview'} eq "clist") {
$main::message_clist->sort;
} elsif ($main::prefs{'messageview'} eq "ctree") {
$main::message_clist->sort_recursive( undef );
if ($main::prefs{'threadpref'} eq "collapsed") { $main::message_clist->collapse_recursive(undef) }
}
@msg_sel = $main::message_clist->selection;
if (@msg_sel) {
if ($main::prefs{'messageview'} eq "clist") {
$main::message_clist->moveto($msg_sel[0],0,'0.5','0.5');
$main::message_clist->set_focus_row($msg_sel[0]);
}
}
if ($toselect) { #node
$main::message_clist->node_moveto($toselect,2,0.5,0.5);
my $row = $main::message_clist->get_node_position($toselect);
if ($row != -1) {
Gtk::CList::select_row($main::message_clist,$row,1);
Gtk::CList::set_focus_row($main::message_clist,$row);
}
}
if ($vpos) {
$main::root_window->{'sw'}->set_vadjustment($vpos);
}
if (defined $progress) {
$progress->signal_handlers_destroy();
$progress->destroy;
undef $progress;
}
if ($body eq "") {
$main::folder_tree->node_set_text($main::ft_node[$vfolder], 1, $rows);
}
if ($count > 0) {
$main::folder_tree->node_set_text($main::ft_node[$vfolder],1,$count);
}
$main::folder_tree->node_set_text($main::ft_node[$vfolder],2,$new);
$main::message_clist->thaw;
&main::set_win_title;
return 1;
}
sub save_vf {
my ($widget,$search_win,$combo) = @_;
my ($entry,$select,$body,$limit,$sql);
unless ($combo->{'1'}->entry->get_text eq "All") {
$entry = $search_win->{'entry'}->get_text;
if ($entry eq "") { &main::err_dialog(_("Please type something in the entry box")); return 1;}
if ($search_win->{'chk1'}->active or $search_win->{'chk2'}->active) {
if ($combo->{'2'}->entry->get_text ne "BoxName" and $search_win->{'entry2'}->get_text eq "") {
&main::err_dialog(_("Please type something in the and/or condition box or uncheck it !"));
return 1;
}
}
if ($search_win->{'body'}->get_active == 1 and $search_win->{'bodytext'}->get_text eq "") {
&main::err_dialog(_("Enter some text in the body search entry"));
return 1;
}
}
$select = $combo->{'1'}->entry->get_text;
$select = lc($select);
$limit = $search_win->{'limit'}->entry->get_text;
if ($combo->{'1'}->entry->get_text eq "All") {
$sql = "select id,friendly,subject,date,newmsg,localdate,contenttype,priority,replyf,score,serverstat from messages";
}
unless ($combo->{'1'}->entry->get_text eq "All") {
if ($limit eq "Unlimited") {
$sql = "select id,friendly,subject,date,newmsg,localdate,contenttype,priority,replyf,score,serverstat from messages where $select like '$entry%'";
} else {
$sql = "select id,friendly,subject,date,newmsg,localdate,contenttype,priority,replyf,score,serverstat from messages where $select like '$entry%' limit $limit";
}
}
if ($search_win->{'chk1'}->active) {
my $fromcombo = $combo->{'2'}->entry->get_text;
if ($fromcombo ne "BoxName") {
$fromcombo = lc($fromcombo);
my $condentry = $search_win->{'entry2'}->get_text;
if ($combo->{'1'}->entry->get_text ne "All"){
$sql = $sql . " and $fromcombo like '$condentry%'";
} else {
$sql = $sql . " where $fromcombo like '$condentry%'";
}
} else {
my $boxname = $combo->{'3'}->entry->get_text;
if ($combo->{'1'}->entry->get_text ne "All"){
$sql = $sql . " and boxid = " . $main::foldernametoid{$boxname};
} else {
$sql = $sql . " where boxid = " . $main::foldernametoid{$boxname};
}
}
if ($search_win->{'limit'}->entry->get_text ne "Unlimited") { $sql =~ s/limit $limit//; $sql = $sql . " limit $limit" }
}
if ($search_win->{'chk2'}->active) {
my $fromcombo = $combo->{'2'}->entry->get_text;
if ($fromcombo ne "BoxName") {
$fromcombo = lc($fromcombo);
my $condentry = $search_win->{'entry2'}->get_text;
if ($combo->{'1'}->entry->get_text ne "All"){
$sql = $sql . " or $fromcombo like '$condentry%'";
} else {
$sql = $sql . " where $fromcombo like '$condentry%'";
}
} else {
my $boxname = $combo->{'3'}->entry->get_text;
if ($combo->{'1'}->entry->get_text ne "All"){
$sql = $sql . " or boxid = " . $main::foldernametoid{$boxname};
} else {
$sql = $sql . " where boxid = " . $main::foldernametoid{$boxname};
}
}
if ($search_win->{'limit'}->entry->get_text ne "Unlimited") { $sql =~ s/limit $limit//; $sql = $sql . " limit $limit" }
}
if ($search_win->{'body'}->active and $search_win->{'bodytext'} ne "") {
$body = $search_win->{'bodytext'}->get_text;
} else {
$body = "";
}
&Pronto::FolderTree::new_folder("y",$sql,$body);
return 1;
}
sub progress
{
$progress = new Gtk::Dialog();
$progress->set_modal(1);
$progress->set_position(-mouse);
# $progress->signal_connect("destroy" => \&progress);
$progress->signal_connect("destroy", sub { $stop = 1;undef $progress;});
$progress->set_title(_("Searching..."));
$progress->{'bar'} = new Gtk::ProgressBar();
$progress->{'bar'}->configure(0,0,0);
$progress->{'bar'}->set_activity_mode(1);
$progress->{'stop'} = new Gtk::Button(_("Stop!"));
$progress->{'stop'}->signal_connect("clicked", sub { $progress->destroy; });
$progress->vbox->pack_start($progress->{'bar'},1,1,0);
$progress->action_area->pack_start($progress->{'stop'},1,1,0);
show_all $progress;
while (Gtk->events_pending) { Gtk->main_iteration }
}
1;
syntax highlighted by Code2HTML, v. 0.9.1