# $Id: FolderTree.pm,v 1.10 2002/05/14 08:36:11 muhri Exp $
# -*- perl -*-
package Pronto::FolderTree;
use strict;
use vars qw( @new_count @msg_count %parent );
use SelfLoader;
sub insert_a_folder_node {
my(@row)=@_;
my ($cp_menuitem,$mv_menuitem, $cp_menuitem2, $mv_menuitem2 ,$title);
$main::foldernametoid{$row[0]} = $row[1];
$main::folderidtoname{$row[1]} = $row[0];
$parent{$row[1]} = $row[3];
$title = [ $row[0] , "" , "" ];
if (($row[2] == 65535) and (not defined $row[3] or $row[3] == -1)) {
$main::ft_node[$row[1]] = $main::folder_tree->insert_node(undef,undef,$title,5,undef,undef,undef,undef,0,1);
} elsif ($row[2] == 65535) {
$main::ft_node[$row[1]] = $main::folder_tree->insert_node($main::ft_node[$row[3]],undef,$title,5,undef,undef,undef,undef,0,1);
} elsif (not defined $row[3] or $row[3] == -1) {
$main::ft_node[$row[1]] = $main::folder_tree->insert_node(undef,$main::ft_node[$row[2]],$title,5,undef,undef,undef,undef,0,1);
} else {
$main::ft_node[$row[1]] = $main::folder_tree->insert_node($main::ft_node[$row[3]],$main::ft_node[$row[2]],$title,5,undef,undef,undef,undef,0,1);
}
if(defined $row[4] && $row[4] eq "n") {
$main::folder_tree->collapse($main::ft_node[$row[1]]);
}
$main::ft_id{$main::ft_node[$row[1]]} = $row[1];
}
sub insert_folder_nodes {
my($parent,$sibling)=@_;
my($sql,$query,@row);
if(not defined $sibling) {
$sibling = 65535;
}
if(not defined $parent) {
$sql = "select name,id,sibling,parent from boxlist where ((sibling=?) and ((parent=-1) or (parent is NULL)))";
$query = $main::conn->prepare($sql);
$query->execute($sibling);
}
else {
$sql = "select name,id,sibling,parent from boxlist where ((sibling=?) and (parent=?))";
$query = $main::conn->prepare($sql);
$query->execute($sibling,$parent);
}
if(@row=$query->fetchrow_array()) {
&insert_a_folder_node(@row);
&insert_folder_nodes($row[1]);
if(not defined $parent) {
&insert_folder_nodes(undef,$row[1]);
}
else {
&insert_folder_nodes($parent,$row[1]);
}
}
}
sub pack_box_onto_column_widget
{
my ($hbox, $button, $label);
$hbox = new Gtk::HBox(0,0);
$button = new Gtk::Button("^");
$button->set_usize(10,10);
$button->signal_connect("clicked",
sub {
if ($Pronto::MainWindow::FTDetach->sensitive()) {
&Pronto::MainWindow::DetachFolderTree();
} else {
&Pronto::MainWindow::ReAttachFolderTree();
}
}
);
$label = new Gtk::Label(_("New"));
$hbox->pack_start($label,0,0,0);
$hbox->pack_start($button,0,0,0);
$hbox->show_all();
$main::folder_tree->set_column_widget(2,$hbox);
return;
}
sub fix_boxlist
{
my($parent) = @_;
my($sql,$query,$query2,@row,$lastid);
if(defined $parent) {
$sql = "select id,sibling,parent from boxlist where parent=? order by id desc";
$query=$main::conn->prepare($sql);
$query->execute($parent);
}
else {
$sql = "select id,sibling,parent from boxlist where (parent=-1 or parent is NULL) order by id desc";
$query=$main::conn->prepare($sql);
$query->execute();
}
$lastid=65535;
while(@row=$query->fetchrow_array()) {
$sql = "update boxlist set sibling=? where id=?";
$query2=$main::conn->prepare($sql);
$query2->execute($lastid,$row[0]);
$lastid=$row[0];
&fix_boxlist($row[0]);
}
}
sub init_folder_tree {
my ($sql, $query, @row);
my @titles = ( _("Folder"), _("Msg"), _("New") );
# $sql = "select name,id,sibling,parent from boxlist order by id";
# $query = $main::conn->prepare($sql);
# $query->execute();
$main::folder_tree = new_with_titles Gtk::CTree(0,@titles);
$main::folder_tree->set_expander_style($main::prefs{'expander'});
$main::folder_tree->set_line_style($main::prefs{'threadstyle'});
if (not defined $main::prefs{'FolderTreeColWidth0'}) { $main::folder_tree->set_column_width(0,130); }
if (not defined $main::prefs{'FolderTreeColWidth1'}) { $main::folder_tree->set_column_width(1,30); }
pack_box_onto_column_widget();
if($main::prefs{'msgcolumn'} eq "n") {
$main::folder_tree->set_column_visibility(1,0);
}
else {
$main::folder_tree->set_column_visibility(1,1);
}
if (not defined $main::prefs{'FolderTreeColWidth2'}) { $main::folder_tree->set_column_width(2,20); }
if($main::prefs{'newcolumn'} eq "n") {
$main::folder_tree->set_column_visibility(2,0);
}
else {
$main::folder_tree->set_column_visibility(2,1);
}
for (my $i = 0; $i < 3; $i++) {
if (defined $main::prefs{'FolderTreeColWidth' . $i}) {
$main::folder_tree->set_column_width($i, $main::prefs{'FolderTreeColWidth' . $i});
}
}
$main::folder_tree->signal_connect("select_row", sub {
if ($main::prefs{'messageview'} eq "clist") {
&Pronto::MessageList::refresh_messages;
} else {
&Pronto::MessageList::refresh_ctree("switch")
}
if($main::prefs{'onfolderchange'} eq 'top') {
&Pronto::MessageList::goto_top;
}
elsif($main::prefs{'onfolderchange'} eq 'next unread') {
&Pronto::MessageList::goto_next_unread_msg;
}
&Pronto::Read::clear_widget;
});
$main::folder_tree->signal_connect("unselect_row", sub {
# CHANGE $main::message_list->refresh()
$main::message_clist->clear;
if ($main::root_window->{'button'}->visible) {
foreach(keys(%main::folderidtoname)) {
if ($_ >= 1000) {
$main::folder_tree->node_set_text($main::ft_node[$_],1,"");
$main::folder_tree->node_set_text($main::ft_node[$_],2,"");
}
}
$main::root_window->{'button'}->hide;}
&Pronto::Read::clear_widget;});
if (!$main::prefs{'Drag'}) {
$main::folder_tree->set_reorderable(1);
$main::folder_tree->signal_connect("tree_move", \&folder_moved);
} else {
&main::set_folder_tree_drag_signals();
}
$main::folder_tree->signal_connect("resize-column" => sub {my ($d, $c, $w)=@_; $main::prefs{'FolderTreeColWidth'. $c}=$w;});
%main::foldernametoid = ();
%main::folderidtoname = ();
# while (@row=$query->fetchrow_array()) {
# my ($cp_menuitem,$mv_menuitem, $cp_menuitem2, $mv_menuitem2 ,$title);
# $main::foldernametoid{$row[0]} = $row[1];
# $main::folderidtoname{$row[1]} = $row[0];
# $parent{$row[1]} = $row[3];
# $title = [ $row[0] , "" , "" ];
# if (($row[2] == 65535) and ($row[3] == -1)) {
# $main::ft_node[$row[1]] = $main::folder_tree->insert_node(undef,undef,$title,5,undef,undef,undef,undef,0,1);
# } elsif ($row[2] == 65535) {
# $main::ft_node[$row[1]] = $main::folder_tree->insert_node($main::ft_node[$row[3]],undef,$title,5,undef,undef,undef,undef,0,1);
# } else {
# $main::ft_node[$row[1]] = $main::folder_tree->insert_node($main::ft_node[$row[3]],$main::ft_node[$row[2]],$title,5,undef,undef,undef,undef,0,1);
# }
# if(defined $row[4] && $row[4] eq "n") {
# $main::folder_tree->collapse($main::ft_node[$row[1]]);
# }
# $main::ft_id{$main::ft_node[$row[1]]} = $row[1];
# }
&insert_folder_nodes();
#check that the boxlist table is correct, and all folders were inserted
$sql = "select name,id,sibling,parent from boxlist order by parent,sibling";
$query = $main::conn->prepare($sql);
$query->execute();
while(@row=$query->fetchrow_array()) {
if(not defined $main::ft_node[$row[1]]) {
print _("oops, $row[0] folder was missed, make sure boxlist table is correct\n");
$main::folder_tree->destroy();
&fix_boxlist();
&init_folder_tree();
# &insert_a_folder_node(@row);
}
}
$main::folder_tree->signal_connect('button_press_event', \&rightclick, 1);
$main::folder_tree->{'popup'} = new Gtk::Menu;
$main::folder_tree->{'popup'}->{'sep'} = new Gtk::MenuItem;
$main::folder_tree->{'popup'}->{'sep'}->show;
$main::folder_tree->{'popup'}->append($main::folder_tree->{'popup'}->{'sep'});
$main::folder_tree->{'popup'}->{'new'} = new Gtk::MenuItem(_("New Folder"));
$main::folder_tree->{'popup'}->{'new'}->signal_connect("activate" => \&Pronto::FolderTree::new_folder);
$main::folder_tree->{'popup'}->{'new'}->show;
$main::folder_tree->{'popup'}->append($main::folder_tree->{'popup'}->{'new'});
$main::folder_tree->{'popup'}->{'refilter'} = new Gtk::MenuItem(_("Refilter Folder"));
$main::folder_tree->{'popup'}->{'refilter'}->signal_connect("activate" => \&Pronto::FolderTree::refilter_folder);
$main::folder_tree->{'popup'}->{'refilter'}->show;
$main::folder_tree->{'popup'}->append($main::folder_tree->{'popup'}->{'refilter'});
$main::folder_tree->{'popup'}->{'delete'} = new Gtk::MenuItem(_("Delete Folder"));
$main::folder_tree->{'popup'}->{'delete'}->signal_connect("activate" => \&Pronto::FolderTree::delete_folder);
$main::folder_tree->{'popup'}->{'delete'}->show;
$main::folder_tree->{'popup'}->append($main::folder_tree->{'popup'}->{'delete'});
$main::folder_tree->{'popup'}->{'rename'} = new Gtk::MenuItem(_("Rename Folder"));
$main::folder_tree->{'popup'}->{'rename'}->signal_connect("activate" => \&Pronto::FolderTree::rename_folder);
$main::folder_tree->{'popup'}->{'rename'}->show;
$main::folder_tree->{'popup'}->append($main::folder_tree->{'popup'}->{'rename'});
$main::folder_tree->{'popup'}->{'sep2'} = new Gtk::MenuItem;
$main::folder_tree->{'popup'}->{'sep2'}->show;
$main::folder_tree->{'popup'}->{'markasread'} = new Gtk::MenuItem(_("Mark as Read"));
$main::folder_tree->{'popup'}->{'markasread'}->show();
$main::folder_tree->{'popup'}->{'markasread'}->signal_connect("activate" => \&mark_folder_as_read);
$main::folder_tree->{'popup'}->{'new_view'} = new Gtk::MenuItem(_("Open in a new View"));
$main::folder_tree->{'popup'}->{'new_view'}->show();
$main::folder_tree->{'popup'}->{'new_view'}->signal_connect("activate", sub { &Pronto::CListView::new() });
$main::folder_tree->{'popup'}->append($main::folder_tree->{'popup'}->{'sep2'});
$main::folder_tree->{'popup'}->append($main::folder_tree->{'popup'}->{'markasread'});
$main::folder_tree->{'popup'}->append($main::folder_tree->{'popup'}->{'new_view'});
$main::folder_tree->{'popup'}->{'sep3'} = new Gtk::MenuItem();
$main::folder_tree->{'popup'}->{'sep3'}->show();
$main::folder_tree->{'popup'}->append($main::folder_tree->{'popup'}->{'sep3'});
$main::folder_tree->{'popup'}->{'import'} = new Gtk::MenuItem(_("Import into Folder"));
$main::folder_tree->{'popup'}->{'import'}->signal_connect("activate" => \&Pronto::FolderTree::init_import_folder);
$main::folder_tree->{'popup'}->{'import'}->show;
$main::folder_tree->{'popup'}->append($main::folder_tree->{'popup'}->{'import'});
$main::folder_tree->{'popup'}->{'export'} = new Gtk::MenuItem(_("Export Folder"));
$main::folder_tree->{'popup'}->{'export'}->signal_connect("activate" => \&Pronto::FolderTree::init_export_folder);
$main::folder_tree->{'popup'}->{'export'}->show;
$main::folder_tree->{'popup'}->append($main::folder_tree->{'popup'}->{'export'});
$main::folder_tree->{'popup'}->{'sep3'} = new Gtk::MenuItem;
$main::folder_tree->{'popup'}->{'sep3'}->show;
$main::folder_tree->{'popup'}->append($main::folder_tree->{'popup'}->{'sep3'});
$main::folder_tree->{'popup'}->{'emptydeleted'} = new Gtk::MenuItem(_("Empty Deleted Items"));
$main::folder_tree->{'popup'}->{'emptydeleted'}->signal_connect("activate"=>\&Pronto::FolderTree::empty_trash);
$main::folder_tree->{'popup'}->{'emptydeleted'}->show;
$main::folder_tree->{'popup'}->append($main::folder_tree->{'popup'}->{'emptydeleted'});
$main::folder_tree->{'popup'}->{'emptyfolder'} = new Gtk::MenuItem(_("Empty Selected folder"));
$main::folder_tree->{'popup'}->{'emptyfolder'}->signal_connect("activate" => \&Pronto::FolderTree::empty_folder);
$main::folder_tree->{'popup'}->{'emptyfolder'}->show;
$main::folder_tree->{'popup'}->append($main::folder_tree->{'popup'}->{'emptyfolder'});
}
sub get_folder_id
{
my (@selection) = $main::folder_tree->selection();
if (!@selection) { return undef }
my $id = $main::ft_id{$selection[0]};
return $id;
}
sub refresh_folder_tree {
my ($play) = @_;
my ($sql, $query, @row, $style);
my ($oldnewcount) = $main::folder_tree->node_get_text($main::ft_node[0],2);
@new_count = ();
@msg_count = ();
$sql = "select newmsg, boxid from messages";
$query = $main::conn->prepare($sql);
$query->execute();
while (@row=$query->fetchrow_array()) {
if (($row[0]) and ($row[0] eq "y")) {
$new_count[$row[1]]++;
$new_count[0]++;
}
$msg_count[$row[1]]++;
$msg_count[0]++;
}
if($main::prefs{'RecMsgCount'} eq 'y') {
$new_count[0]=0;
$msg_count[0]=0;
&main::message_count(0,\@msg_count,\@new_count);
}
$main::folder_tree->freeze;
foreach (keys(%main::folderidtoname)) {
if ($_ >= 1000) { next }
if (!$msg_count[$_]) { $msg_count[$_] = 0;}
if (!$new_count[$_]) { $new_count[$_] = 0;}
$main::folder_tree->node_set_text($main::ft_node[$_], 1, $msg_count[$_]);
$main::folder_tree->node_set_text($main::ft_node[$_], 2, $new_count[$_]);
if ($new_count[$_] != 0 or ($msg_count[$_] != 0 and $_ == 2)) {
if($main::prefs{'FolderNewBold'} eq "y" && $_ != 2) {
$main::folder_tree->node_set_row_style($main::ft_node[$_], $main::bold);
}
if($main::prefs{'newcolumn'} eq 'n' and $main::prefs{'msgcolumn'} eq 'y') {
my $temp = $main::folder_tree->node_get_text($main::ft_node[$_],1);
$temp =~ s/\(*\)//g;
$main::folder_tree->node_set_text($main::ft_node[$_],1,"$temp\($new_count[$_]\)");
}
if($main::prefs{'newcolumn'} eq 'n' and $main::prefs{'msgcolumn'} eq 'n') {
if($_ == 2) {
$main::folder_tree->node_set_text($main::ft_node[$_], 0,$main::folderidtoname{$_} . "($msg_count[$_])");
}
else {
$main::folder_tree->node_set_text($main::ft_node[$_], 0,$main::folderidtoname{$_} . "($new_count[$_])");
}
}
} else {
$main::folder_tree->node_set_row_style($main::ft_node[$_], $main::normal);
my $temp = $main::folder_tree->node_get_text($main::ft_node[$_],1);
$temp =~ s/\(*\)//g;
$main::folder_tree->node_set_text($main::ft_node[$_],1,$temp);
$main::folder_tree->node_set_text($main::ft_node[$_],0,$main::folderidtoname{$_});
}
}
$main::folder_tree->thaw;
my $newcount = $main::folder_tree->node_get_text($main::ft_node[0],2);
if ($oldnewcount ne "" && defined $play && $play == 1) {
if (($main::prefs{'PlaySound'} eq "y") && ($newcount > $oldnewcount)) {
system("$main::prefs{'SndCmd'} $main::prefs{'SndFl'}");
}
}
&main::set_win_title;
return 1;
}
sub numerically { $a <=> $b; }
1;
__DATA__
sub new_folder {
my ($virtual,$querycontent,$body) = @_;
my ($fldr_dlg, $fd_hbox, $fd_label, $fd_button, $fd_ok, $fd_entry,
$fldr_ctree, $fldr_scroll, $fd_label2, %lparent, @nf_node, $sql,
$query, %lft_id, @row, $title,$selected,$selected_node);
my @fldr_sel = $main::folder_tree->selection;
if (@fldr_sel) { $selected = $main::ft_id{$fldr_sel[0]} }
$fldr_dlg = new Gtk::Dialog;
$fldr_dlg->set_default_size(&main::get_win_size("fldrdlg",300,300));
$fldr_dlg->position(-mouse);
$fldr_dlg->signal_connect("destroy" => sub { $fldr_dlg->destroy; });
$fldr_dlg->signal_connect("delete_event" => \&Gtk::false);
$fldr_dlg->set_title(_("Enter Folder Name..."));
$fldr_dlg->border_width(0);
$fd_hbox=new Gtk::HBox(0,0);
$fd_hbox->border_width(10);
$fldr_dlg->vbox->pack_start($fd_hbox,0,1,0);
$fd_hbox->show;
$fd_label=new Gtk::Label _("Folder Name: ");
$fd_label->set_alignment(0.5,0.5);
$fd_hbox->pack_start($fd_label,0,1,0);
$fd_label->show;
$fd_entry=new Gtk::Entry;
$fd_entry->set_text('');
$fd_entry->set_editable('1');
$fd_hbox->pack_start($fd_entry,1,1,0);
$fd_entry->show;
$fd_label2=new Gtk::Label _("Create new folder in:");
$fd_label2->set_alignment(0.0,0.5);
$fldr_dlg->vbox->pack_start($fd_label2,0,1,0);
$fd_label2->show;
$fldr_ctree = new Gtk::CTree(1,0);
$fldr_ctree->set_column_width(0,130);
$sql = "select name,id,sibling,parent from boxlist order by parent,sibling";
$query = $main::conn->prepare($sql);
$query->execute();
while (@row=$query->fetchrow_array()) {
$title = [ $row[0] ];
if (($row[2] == 65535) and ($row[3] == -1)) {
$nf_node[$row[1]] = $fldr_ctree->insert_node(undef,undef,$title,5,undef,undef,undef,undef,0,1);
} elsif ($row[2] == 65535) {
$nf_node[$row[1]] = $fldr_ctree->insert_node($nf_node[$row[3]],undef,$title,5,undef,undef,undef,undef,0,1);
} else {
$nf_node[$row[1]] = $fldr_ctree->insert_node($nf_node[$row[3]],$nf_node[$row[2]],$title,5,undef,undef,undef,undef,0,1);
}
$lft_id{$nf_node[$row[1]]} = $row[1];
if (@fldr_sel && $selected == $row[1]) {
$selected_node = $nf_node[$row[1]];
}
}
if (@fldr_sel) { $fldr_ctree->select($selected_node); }
$fldr_ctree->show;
$fldr_scroll = new Gtk::ScrolledWindow(undef,undef);
$fldr_scroll->set_policy('automatic', 'automatic');
$fldr_scroll->show;
$fldr_scroll->add($fldr_ctree);
$fldr_dlg->vbox->pack_start($fldr_scroll,1,1,0);
$fd_ok=new Gtk::Button _("Ok");
$fd_ok->can_default(1);
$fd_ok->show;
$fldr_dlg->action_area->pack_start($fd_ok,1,1,0);
$fd_button=new Gtk::Button _("Cancel");
$fd_button->signal_connect("clicked", sub { $fldr_dlg->destroy; });
$fldr_dlg->action_area->pack_start($fd_button,1,1,0);
$fd_button->show;
$fldr_dlg->show;
if (defined $virtual and $virtual eq "y") {
$fd_ok->signal_connect("clicked" => \&add_new_folder, $fd_entry,
$fldr_dlg, $fldr_ctree, \%lft_id, $virtual, $querycontent,$body);
$fd_entry->signal_connect("activate" => \&add_new_folder, $fd_entry,
$fldr_dlg, $fldr_ctree, \%lft_id, $virtual, $querycontent,$body);
} else {
$fd_ok->signal_connect("clicked" => \&add_new_folder, $fd_entry,
$fldr_dlg, $fldr_ctree, \%lft_id, undef, undef, undef,$selected);
$fd_entry->signal_connect("activate" => \&add_new_folder, $fd_entry,
$fldr_dlg, $fldr_ctree, \%lft_id, undef, undef, undef, $selected);
}
$fldr_dlg->signal_connect("size-request" => \&main::save_win_size, "fldrdlg", $fldr_dlg->window);
$fd_entry->grab_focus();
return 1;
}
sub folderlist_drag_data_received {
my ($widget, $context, $x, $y, $data, $info, $time) = @_;
if (($data->length >= 0) && ($data->format == 8)) {
if (!@main::dragged) {
&Pronto::Data::Message::move(get_folder_id,$data->data);
} else {
&Pronto::Data::Message::move(get_folder_id,@main::dragged);
}
&Pronto::MessageList::refresh();
&Pronto::FolderTree::refresh_folder_tree();
$context->finish (1, 0, $time);
return 1;
}
$context->finish (0, 0, $time);
}
sub folderlist_drag_motion
{
my ($widget, $context, $x, $y, $time) = @_;
my ($row, $column) = $widget->get_selection_info($x,$y);
$widget->select_row($row,$column);
$context->status ($context->suggested_action, $time);
return 1;
}
sub folder_moved {
my ($widget, $node1, $node2, $node3) = @_;
my ($folder, $new_parent, $new_sib, $sql, $query);
if (defined $node1) { $folder = $main::ft_id{$node1}; }
if (defined $node2) { $new_parent = $main::ft_id{$node2}; }
if (defined $node3) {
$new_sib = $main::ft_id{$node3};
} else {
$new_sib = 65535;
}
$sql = "select sibling from boxlist where id = ?";
$query=$main::conn->prepare($sql);
$query->execute($folder);
my ($old_sib) = $query->fetchrow_array();
$sql = "select id from boxlist where sibling = ?";
$query=$main::conn->prepare($sql);
$query->execute($folder);
my ($old_pre) = $query->fetchrow_array();
$sql = "select id from boxlist where ((sibling = ?) and (parent = ?))";
$query=$main::conn->prepare($sql);
$query->execute($new_sib, $new_parent);
my ($new_pre) = $query->fetchrow_array();
$sql = "update boxlist set sibling = ? where id = ?";
$query=$main::conn->prepare($sql);
$query->execute($old_sib,$old_pre);
if (defined $new_pre) { $query->execute($folder,$new_pre); }
$sql = "update boxlist set parent = ?, sibling = ? where id = ?";
$query=$main::conn->prepare($sql);
$query->execute($new_parent,$new_sib,$folder);
$parent{$folder} = $new_parent;
if($folder < 1000) {
$Pronto::FolderMenus::mv_menu_menus{0}->detach;
$Pronto::FolderMenus::pmv_menus{0}->detach;
$Pronto::FolderMenus::cp_menu_menus{0}->detach;
$Pronto::FolderMenus::pcp_menus{0}->detach;
$Pronto::FolderMenus::mv_menu_menus{0}->destroy;
$Pronto::FolderMenus::pmv_menus{0}->destroy;
$Pronto::FolderMenus::cp_menu_menus{0}->destroy;
$Pronto::FolderMenus::pcp_menus{0}->destroy;
($Pronto::FolderMenus::mv_menu_menus{0},$Pronto::FolderMenus::pmv_menus{0},$Pronto::FolderMenus::cp_menu_menus{0},$Pronto::FolderMenus::pcp_menus{0})=&Pronto::FolderMenus::mvcp_menu(0);
$Pronto::FolderMenus::mv_menu_items{0}->set_submenu($Pronto::FolderMenus::mv_menu_menus{0});
$Pronto::FolderMenus::pmv_items{0}->set_submenu($Pronto::FolderMenus::pmv_menus{0});
$Pronto::FolderMenus::cp_menu_items{0}->set_submenu($Pronto::FolderMenus::cp_menu_menus{0});
$Pronto::FolderMenus::pcp_items{0}->set_submenu($Pronto::FolderMenus::pcp_menus{0});
}
&set_folder_style;
&refresh_folder_tree;
return 1;
}
sub rename_folder {
my ($sql, $query, $foldername, $curfolder, @row, $win,$hbox, $ok, $cancel, $lbl, $entry, $newfoldername);
$curfolder = get_folder_id();
if (!$curfolder) { &main::err_dialog("Select a folder first!"); return 1; }
$foldername = $main::folderidtoname{$curfolder};
$win = new Gtk::Dialog;
$win->set_title(_("Rename Folder ") ."$foldername");
$win->signal_connect("destroy" => sub { $win->destroy });
$win->signal_connect("delete_event" => \&Gtk::false);
$win->set_default_size('300','90');
$win->set_policy(1,1,0);
$win->position(-mouse);
$hbox = new Gtk::HBox(0,5);
$win->vbox->pack_start($hbox,1,1,0);
$hbox->show;
$win->show;
$lbl = new Gtk::Label(_("Rename ") ."$foldername to: ");
$lbl->set_alignment(0.0,0.5);
$lbl->show;
$hbox->pack_start($lbl,0,0,5);
$entry = new Gtk::Entry;
$entry->set_editable('1');
$entry->show;
$hbox->pack_start($entry,1,0,1);
$ok = new Gtk::Button _("Ok");
$ok->can_default(0);
$ok->signal_connect("clicked", sub {
$newfoldername = $entry->get_text;
if ($newfoldername eq '') {
&main::err_dialog(_("enter a name please!"));
return 1;
} else {
$sql = "update boxlist set name = '$newfoldername' where id ='$curfolder'";
$query = $main::conn->prepare($sql);
$query->execute();
$win->destroy;
&refresh_folder_name($curfolder, $newfoldername, $foldername);
}
});
$ok->show;
$win->action_area->pack_start($ok,1,1,0);
$cancel = new Gtk::Button _("Cancel");
$cancel->signal_connect("clicked", sub { $win->destroy; });
$cancel->can_default(1);
$win->action_area->pack_start($cancel, 1, 1, 0);
$cancel->grab_default;
$cancel->show;
return 1;
}
sub refresh_folder_name {
my ($folderid, $newfoldername, $oldname) = @_;
$main::folder_tree->freeze;
$main::folder_tree->node_set_text($main::ft_node[$folderid], 0, "$newfoldername");
$main::folder_tree->thaw;
if ($folderid < 1000) {
# $cp_menu_items{$folderid}->destroy;
$Pronto::FolderMenus::mv_menu_items{$folderid}->destroy;
# $pcp_items{$folderid}->destroy;
$Pronto::FolderMenus::pmv_items{$folderid}->destroy;
delete $main::folderidtoname{$folderid};
delete $main::foldernametoid{$oldname};
$main::folderidtoname{$folderid} = $newfoldername;
$main::foldernametoid{$newfoldername} = $folderid;
if($parent{$folderid} < 1000) {
$Pronto::FolderMenus::mv_menu_menus{$parent{$folderid}}->detach;
$Pronto::FolderMenus::pmv_menus{$parent{$folderid}}->detach;
$Pronto::FolderMenus::cp_menu_menus{$parent{$folderid}}->detach;
$Pronto::FolderMenus::pcp_menus{$parent{$folderid}}->detach;
$Pronto::FolderMenus::mv_menu_menus{$parent{$folderid}}->destroy;
$Pronto::FolderMenus::pmv_menus{$parent{$folderid}}->destroy;
$Pronto::FolderMenus::cp_menu_menus{$parent{$folderid}}->destroy;
$Pronto::FolderMenus::pcp_menus{$parent{$folderid}}->destroy;
($Pronto::FolderMenus::mv_menu_menus{$parent{$folderid}},$Pronto::FolderMenus::pmv_menus{$parent{$folderid}},$Pronto::FolderMenus::cp_menu_menus{$parent{$folderid}},$Pronto::FolderMenus::pcp_menus{$parent{$folderid}})= &Pronto::FolderMenus::mvcp_menu($parent{$folderid});
$Pronto::FolderMenus::mv_menu_items{$parent{$folderid}}->set_submenu($Pronto::FolderMenus::mv_menu_menus{$parent{$folderid}});
$Pronto::FolderMenus::pmv_items{$parent{$folderid}}->set_submenu($Pronto::FolderMenus::pmv_menus{$parent{$folderid
}});
$Pronto::FolderMenus::cp_menu_items{$parent{$folderid}}->set_submenu($Pronto::FolderMenus::cp_menu_menus{$parent{$folderid}});
$Pronto::FolderMenus::pcp_items{$parent{$folderid}}->set_submenu($Pronto::FolderMenus::pcp_menus{$parent{$folderid
}});
}
}
&main::set_win_title;
return 1;
}
sub delete_folder {
my ($widget, $curfolder) = @_;
my (@foldersel, $sql, $query);
if (!$curfolder) {
$curfolder = get_folder_id();
if (!$curfolder) { return }
}
if ($curfolder <= 4) { return; }
if ($parent{$curfolder} == 4) {
$main::folder_tree->remove_node($main::ft_node[$curfolder]);
$sql = "delete from boxlist where id=$curfolder";
$main::conn->do($sql);
$sql = "delete from filters where boxid=$curfolder and type != 6";
$main::conn->do($sql);
$sql = "select id from messages where boxid=?";
$query = $main::conn->prepare($sql);
$query->execute($curfolder);
while (my ($msgid)=$query->fetchrow_array()) {
&Pronto::Data::Message::delete($msgid);
}
if ($curfolder < 1000) {
$Pronto::FolderMenus::mv_menu_menus{0}->detach;
$Pronto::FolderMenus::pmv_menus{0}->detach;
$Pronto::FolderMenus::cp_menu_menus{0}->detach;
$Pronto::FolderMenus::pcp_menus{0}->detach;
$Pronto::FolderMenus::mv_menu_menus{0}->destroy;
$Pronto::FolderMenus::pmv_menus{0}->destroy;
$Pronto::FolderMenus::cp_menu_menus{0}->destroy;
$Pronto::FolderMenus::pcp_menus{0}->destroy;
($Pronto::FolderMenus::mv_menu_menus{0},$Pronto::FolderMenus::pmv_menus{0},$Pronto::FolderMenus::cp_menu_menus{0},$Pronto::FolderMenus::pcp_menus{0})= &Pronto::FolderMenus::mvcp_menu(0);
$Pronto::FolderMenus::mv_menu_items{0}->set_submenu($Pronto::FolderMenus::mv_menu_menus{0});
$Pronto::FolderMenus::pmv_items{0}->set_submenu($Pronto::FolderMenus::pmv_menus{0});
$Pronto::FolderMenus::cp_menu_items{0}->set_submenu($Pronto::FolderMenus::cp_menu_menus{0});
$Pronto::FolderMenus::pcp_items{0}->set_submenu($Pronto::FolderMenus::pcp_menus{0});
}
if ($foldersel[0]) {
delete $main::ft_id{$foldersel[0]};
}
delete $main::foldernametoid{$main::folderidtoname{$curfolder}};
delete $main::folderidtoname{$curfolder};
} else {
$main::folder_tree->move($main::ft_node[$curfolder],$main::ft_node[4],undef);
$parent{$curfolder} = 4;
$sql = "select id from boxlist where sibling=$curfolder";
$query = $main::conn->prepare($sql);
$query->execute();
if ($query->rows() == 1) {
# previous sibling
my ($prev_sibling) = $query->fetchrow();
$sql = "select sibling from boxlist where id=$curfolder";
$query = $main::conn->prepare($sql);
$query->execute();
if ($query->rows() > 1) {
# big error! somehow our id doesn't exist
return 0;
}
my ($next_sibling) = $query->fetchrow();
$sql = "update boxlist set sibling=$next_sibling where id=$prev_sibling";
$main::conn->do($sql);
} elsif ($query->rows() > 1) {
# somehow we have multiple siblings pointing to us = bad
return 0;
}
$sql = "select id from boxlist where parent=4 and sibling=65535";
$query = $main::conn->prepare($sql);
$query->execute();
if (my ($deleted_sibling) = $query->fetchrow()) {
$sql = "update boxlist set sibling=$curfolder where id=$deleted_sibling";
$main::conn->do($sql);
}
$sql = "update boxlist set parent=4,sibling=65535 where id=$curfolder";
$main::conn->do($sql);
}
return 1;
}
sub add_new_folder {
my ($widget, $entry, $win, $fldr_ctree, $ftidref,$virtual,$querycontent,$body,$daddy) = @_;
my ($nfparent, $foldername, @sel, %lft_id);
$foldername = $entry->get_text;
if ($foldername eq '') { &main::err_dialog(_("Enter a name first !")); return 1; }
foreach (keys(%main::foldernametoid)) {
if (lc($foldername) eq lc($_)) {
&main::err_dialog(_("Unique names please!"));
return 1;
}
}
%lft_id = %{$ftidref};
@sel = $fldr_ctree->selection();
if (@sel) {
$nfparent = $daddy;
if (!$nfparent) {
print(_("couldn't get parent for new folder, creating under the root\n"));
$nfparent = 0;
}
} else {
$nfparent = 0;
}
$win->destroy;
my ($sql, $query, $sort, $id);
$sql="select id from boxlist where ((parent = ?) and (sibling = 65535))";
$query = $main::conn->prepare($sql);
$query->execute($nfparent);
my ($oldtail) = $query->fetchrow_array();
if (not defined $virtual) {
$sql="insert into boxlist (id, name, parent, sibling) values (?,?,?,?)";
$query = $main::conn->prepare($sql);
$id = &main::newid_folder('boxlist', $main::conn);
$query->execute($id, $foldername,$nfparent,65535);
} else {
$sql = "insert into boxlist (id,name,parent,sibling,query,body) values (?,?,?,?,?,?)";
$query = $main::conn->prepare($sql);
$id = &main::newid1000('boxlist',$main::conn);
$query->execute($id,$foldername,$nfparent,65535,$querycontent,$body);
}
if (defined $oldtail) {
$sql="update boxlist set sibling = ? where id = ?";
$query = $main::conn->prepare($sql);
$query->execute($id,$oldtail);
}
my ($title);
$main::foldernametoid{$foldername} = $id;
$main::folderidtoname{$id} = $foldername;
$title = [ $foldername , "" ];
$main::ft_node[$id] = $main::folder_tree->insert_node($main::ft_node[$nfparent],undef,$title,5,undef,undef,undef,undef,0,1);
$main::ft_id{$main::ft_node[$id]} = $id;
$parent{$id}=$nfparent;
if (not defined $virtual) {
if(defined $Pronto::FolderMenus::mv_menu_menus{$parent{$id}}) {
$Pronto::FolderMenus::mv_menu_menus{$parent{$id}}->detach;
$Pronto::FolderMenus::pmv_menus{$parent{$id}}->detach;
$Pronto::FolderMenus::cp_menu_menus{$parent{$id}}->detach;
$Pronto::FolderMenus::pcp_menus{$parent{$id}}->detach;
$Pronto::FolderMenus::mv_menu_menus{$parent{$id}}->destroy;
$Pronto::FolderMenus::pmv_menus{$parent{$id}}->destroy;
$Pronto::FolderMenus::cp_menu_menus{$parent{$id}}->destroy;
$Pronto::FolderMenus::pcp_menus{$parent{$id}}->destroy;
}
($Pronto::FolderMenus::mv_menu_menus{$parent{$id}},$Pronto::FolderMenus::pmv_menus{$parent{$id}},$Pronto::FolderMenus::cp_menu_menus{$parent{$id}},$Pronto::FolderMenus::pcp_menus{$parent{$id}})= &Pronto::FolderMenus::mvcp_menu($parent{$id});
$Pronto::FolderMenus::mv_menu_items{$parent{$id}}->set_submenu($Pronto::FolderMenus::mv_menu_menus{$parent{$id}});
$Pronto::FolderMenus::pmv_items{$parent{$id}}->set_submenu($Pronto::FolderMenus::pmv_menus{$parent{$id}});
$Pronto::FolderMenus::cp_menu_items{$parent{$id}}->set_submenu($Pronto::FolderMenus::cp_menu_menus{$parent{$id}});
$Pronto::FolderMenus::pcp_items{$parent{$id}}->set_submenu($Pronto::FolderMenus::pcp_menus{$parent{$id}});
}
$win->destroy;
&refresh_folder_tree;
if ($id > 1000) {
&set_folder_style
}
return 1;
}
sub init_export_folder {
my ($widget, $listwidget)=@_;
my ($fs_window, $sql, $query, $curfolder, $foldername);
$curfolder = get_folder_id();
if (!$curfolder) {
&main::err_dialog(_("Please select a folder first!"));
return 1;
}
$sql = "select name from boxlist where id = '$curfolder'";
$query=$main::conn->prepare($sql);
$query->execute();
$foldername = $query->fetchrow_array();
$fs_window = new Gtk::FileSelection (_("Choose Directory to export folder ") ."($foldername) to ...");
$fs_window->position(-mouse);
$fs_window->file_list->set_sensitive(0);
$fs_window->signal_connect("destroy", sub {$fs_window->destroy;});
$fs_window->signal_connect("delete_event" => \&Gtk::false);
$fs_window->ok_button->signal_connect("clicked", \&main::export_folder, $fs_window, $listwidget, $main::conn, $curfolder, $foldername);
$fs_window->cancel_button->signal_connect("clicked", sub {$fs_window->destroy;});
$fs_window->show;
return 1;
}
sub init_import_folder {
my ($widget, $listwidget)=@_;
my ($fs_window, $sql, $query, $curfolder, $foldername);
$curfolder = get_folder_id();
if (!$curfolder) {
&main::err_dialog(_("Please select a folder first!"));
return 1;
}
$sql = "select name from boxlist where id = '$curfolder'";
$query=$main::conn->prepare($sql);
$query->execute();
$foldername = $query->fetchrow_array();
$fs_window = new Gtk::FileSelection (_("Choose File to import into folder ") . "($foldername) ...");
$fs_window->position(-mouse);
$fs_window->signal_connect("destroy", sub {$fs_window->destroy;});
$fs_window->signal_connect("delete_event" => \&Gtk::false);
$fs_window->ok_button->signal_connect("clicked", \&main::import_folder, $fs_window, $listwidget, $main::conn, $curfolder, $foldername);
$fs_window->cancel_button->signal_connect("clicked", sub {$fs_window->destroy;});
$fs_window->show;
return 1;
}
sub refilter_folder
{
&Pronto::Data::Message::refilter("folder");
return 1;
}
sub empty_folder {
my ($sql, $sql2, $query,$curfolder, @row);
$curfolder = get_folder_id();
if (!$curfolder) { &main::err_dialog(_("Please select a folder first!")); return 1; }
if ($curfolder == 4) { &main::err_dialog(_("Use Empty deleted items for the trash folder")); return 1;}
$sql = "select id from messages where boxid = '$curfolder'";
$query=$main::conn->prepare($sql);
$query->execute();
while (@row = $query->fetchrow_array()) {
$sql = "update messages set boxid = 4 where id = @row";
$main::conn->do($sql);
if ($main::prefs{'DeleteMarksAsRead'} eq "y") {
$sql2 = "update messages set newmsg = 'n' where id = @row";
$main::conn->do($sql2);
}
if ($main::prefs{'EmptyNoBlock'}) {
while (Gtk->events_pending()) {
Gtk->main_iteration();
}
}
}
&refresh_folder_tree;
$main::message_clist->clear;
if (get_folder_id() == $curfolder) {
&Pronto::Read::clear_widget();
}
return 1;
}
sub set_folder_style {
my($sp,$sm,$vp,$vm);
if(-f "$main::prefs{'PixmapDir'}/search.xpm") {
($sp,$sm)=Gtk::Gdk::Pixmap->create_from_xpm($main::root_window->window,$main::root_window->style->bg('normal'),"$main::prefs{'PixmapDir'}/search.xpm");
} else {
($sp,$sm)=Gtk::Gdk::Pixmap->create_from_xpm_d($main::root_window->window,$main::root_window->style->bg('normal'),@main::dummy_pixmap);
}
if (-f "$main::prefs{'PixmapDir'}/vfolder.xpm") {
($vp,$vm)=Gtk::Gdk::Pixmap->create_from_xpm($main::root_window->window,$main::root_window->style->bg('normal'),"$main::prefs{'PixmapDir'}/vfolder.xpm");
} else {
($vp,$vm)=Gtk::Gdk::Pixmap->create_from_xpm_d($main::root_window->window,$main::root_window->style->bg('normal'),@main::dummy_pixmap);
}
foreach(keys(%main::folderidtoname)) {
if ($_ == 1000) {
$main::folder_tree->node_set_pixtext($main::ft_node[$_],0,$main::folderidtoname{$_},2,$sp,$sm);
}
elsif ($_ > 1000) {
$main::folder_tree->node_set_pixtext($main::ft_node[$_],0,$main::folderidtoname{$_},2,$vp,$vm);
}
}
return 1;
}
sub empty_trash {
my ($widget,$at_exit) = @_;
my ($sql, $query, @foldersel, $curfolder,@row);
$sql = "select id from boxlist where parent = 4";
$query=$main::conn->prepare($sql);
$query->execute();
while (@row=$query->fetchrow_array()) {
&delete_folder(undef, $row[0]);
}
$sql = "select id from messages where boxid = 4";
$query=$main::conn->prepare($sql);
$query->execute();
while (my ($msgid)=$query->fetchrow_array()) {
&Pronto::Data::Message::delete($msgid);
if ($main::prefs{'EmptyNoBlock'}) {
while (Gtk->events_pending()) {
Gtk->main_iteration();
}
}
}
$curfolder = &get_folder_id();
if ($curfolder) {
if ($curfolder == 4) {
$main::message_clist->clear;
&Pronto::Read::clear_widget();
}
}
if (!$at_exit) {
&Pronto::FolderTree::refresh_folder_tree;
}
return 1;
}
sub rightclick {
my ($widget, $data, $event) = @_;
if (($event->{button} == 3) and ($widget->{'popup'})) {
$widget->{'popup'}->popup(undef,undef,$event->{button},1);
}
return 1;
}
sub mark_folder_as_read
{
my $folder = get_folder_id();
if (!$folder) { return 1; }
my $sql = "update messages set newmsg = 'n' where boxid = $folder";
$main::conn->do($sql);
&Pronto::MessageList::refresh();
&refresh_folder_tree;
return 1;
}
1;
syntax highlighted by Code2HTML, v. 0.9.1