JaM
view release on metacpan or search on metacpan
lib/JaM/GUI/Subjects.pm view on Meta::CPAN
# $Id: Subjects.pm,v 1.20 2001/11/02 12:31:02 joern Exp $
package JaM::GUI::Subjects;
@ISA = qw ( JaM::GUI::Component );
use strict;
use JaM::Func;
use JaM::GUI::Component;
my $DEBUG = 1;
# get/set currently listed mails
sub mail_ids { my $s = shift; $s->{mail_ids}
= shift if @_; $s->{mail_ids} }
# get/set currently mail id where popup opened
sub popup_mail_id { my $s = shift; $s->{popup_mail_id}
= shift if @_; $s->{popup_mail_id} }
# get/set currently selected folder
sub folder_object { my $s = shift; $s->{folder_object}
= shift if @_; $s->{folder_object} }
# get/set gtk object for subjects scrolled window
sub gtk_subjects { my $s = shift; $s->{gtk_subjects}
= shift if @_; $s->{gtk_subjects} }
# get/set gtk object for subjects clist
sub gtk_subjects_list { my $s = shift; $s->{gtk_subjects_list}
= shift if @_; $s->{gtk_subjects_list} }
# get/set currently first selected mail id
sub selected_mail_id { my $s = shift; $s->trace_in; $s->{selected_mail_id}
= shift if @_; $s->{selected_mail_id} }
sub gtk_folder_menu { my $s = shift; $s->{gtk_folder_menu}
= shift if @_; $s->{gtk_folder_menu} }
sub gtk_folder_menu_item{ my $s = shift; $s->{gtk_folder_menu_item}
= shift if @_; $s->{gtk_folder_menu_item} }
# return lref of selected mail ids
sub selected_mail_ids {
my $self = shift;
my @rows = $self->gtk_subjects_list->selection;
my @ids;
my $mail_ids = $self->mail_ids;
foreach my $row ( @rows ) {
push @ids, $mail_ids->[$row];
}
return \@ids;
}
# build subjects widget
sub build {
my $self = shift; $self->trace_in;
my %par = @_;
my ($without_quick_search, $without_resize_tracking) =
@par{'without_quick_search','without_resize_tracking'};
# Create a ScrolledWindow for the list
my $subjects = new Gtk::ScrolledWindow( undef, undef );
$subjects->set_policy( 'automatic', 'automatic' );
$subjects->set_usize(undef, $self->config('subjects_height'));
$subjects->show();
# Create list box
my @titles = qw( Status Subject Sender Date );
my $list = Gtk::CList->new_with_titles ( @titles );
$subjects->add( $list );
$list->set_column_width( 0, $self->config('subjects_column_0') );
$list->set_column_width( 1, $self->config('subjects_column_1') );
$list->set_column_width( 2, $self->config('subjects_column_2') );
$list->set_column_width( 3, $self->config('subjects_column_3') );
# $list->set_selection_mode( 'browse' );
$list->set_selection_mode( 'extended' );
$list->set_shadow_type( 'none' );
$list->set_user_data ( $self );
$list->signal_connect( "select_row", sub { $self->cb_select_mail(@_) } );
$list->signal_connect( "click_column", sub { $self->cb_column_click(@_) } );
if ( not $without_resize_tracking ) {
$list->signal_connect( "resize-column",
sub {
$self->config('subjects_column_'.$_[1], $_[2]);
}
);
$subjects->signal_connect("size-allocate",
sub { $self->config('subjects_height', $_[1]->[3]) }
);
}
$list->show();
# now build popup Menu
$list->signal_connect('button_press_event', sub { $self->cb_click_subjects(@_) } );
my $popup = $list->{popup} = Gtk::Menu->new;
my $item;
# $item = Gtk::MenuItem->new ("Mark selected mail(s) as read...");
# $popup->append($item);
# $item->signal_connect ("activate", sub { $self->cb_mark_mail_as_read ( @_ ) } );
# $item->show;
my $folder_menu_item = Gtk::MenuItem->new ("Move selected mail(s) to folder...");
$popup->append($folder_menu_item);
$folder_menu_item->show;
my $folder_menu = $self->comp('folders')->build_menu_of_folders (
callback => sub { $self->move_selected_mails ( folder_id => $_[0] ); }
);
$folder_menu_item->set_submenu($folder_menu);
$item = Gtk::MenuItem->new;
$popup->append($item);
$item->show;
$item = Gtk::MenuItem->new ("Add Input Filter...");
$popup->append($item);
$item->signal_connect ("activate", sub { $self->cb_add_input_filter ( @_ ) } );
$item->show;
if ( not $without_quick_search ) {
$item = Gtk::MenuItem->new;
$popup->append($item);
$item->show;
$item = Gtk::MenuItem->new ("Quick Search Sender...");
$popup->append($item);
$item->signal_connect ("activate", sub {
$self->comp('subjects')->quick_search(
type => 'sender'
);
});
$item->show;
$item = Gtk::MenuItem->new ("Quick Search Subject...");
$popup->append($item);
$item->signal_connect ("activate", sub {
$self->comp('subjects')->quick_search(
type => 'subject'
);
});
$item->show;
$item = Gtk::MenuItem->new ("Quick Search Body...");
$popup->append($item);
$item->signal_connect ("activate", sub {
$self->comp('subjects')->quick_search(
type => 'body'
);
});
$item->show;
$item = Gtk::MenuItem->new ("Quick Search Recipient...");
$popup->append($item);
$item->signal_connect ("activate", sub {
$self->comp('subjects')->quick_search(
type => 'recipient'
);
});
$item->show;
$item = Gtk::MenuItem->new;
$popup->append($item);
$item->show;
$item = Gtk::MenuItem->new ("Advanced Search...");
$popup->append($item);
$item->signal_connect ("activate", sub {
require JaM::GUI::Search;
my $search = JaM::GUI::Search->new (
dbh => $self->dbh
);
$search->open_window;
$search->folder_chosen ($self->folder_object->id);
});
$item->show;
}
$self->gtk_subjects ($subjects);
$self->gtk_subjects_list ($list);
$self->gtk_folder_menu ($folder_menu);
$self->gtk_folder_menu_item ($folder_menu_item);
$self->widget ($subjects);
return $self;
}
sub cb_click_subjects {
my $self = shift;
my ($widget, $event) = @_;
my ( $row, $column ) = $widget->get_selection_info( $event->{x}, $event->{y} );
if ( $self->mail_ids ) {
$self->popup_mail_id ( $self->mail_ids->[$row] );
} else {
$self->popup_mail_id (undef);
}
if ( $event->{button} == 3 and $widget->{'popup'} ) {
my $folder_menu_item = $self->gtk_folder_menu_item;
$folder_menu_item->remove_submenu;
my $folder_menu = $self->comp('folders')->build_menu_of_folders (
callback => sub { $self->move_selected_mails ( folder_id => $_[0] ); }
);
$folder_menu_item->set_submenu($folder_menu);
$widget->{'popup'}->popup(undef,undef,$event->{button},1);
}
1;
}
sub cb_add_input_filter {
my $self = shift;
my $filter;
eval { $filter = $self->comp('input_filter') };
if ( not $filter ) {
require JaM::GUI::IO_Filter;
$filter = JaM::GUI::IO_Filter->new (
dbh => $self->dbh,
);
$filter->open_window;
}
my $mail = JaM::Mail->load ( dbh => $self->dbh, mail_id => $self->popup_mail_id );
my $folder = JaM::Folder->by_id ($mail->folder_id);
$filter->add_new_filter (
folder_object => $folder,
mail_object => $mail
);
$filter->gtk_win->focus(1);
1;
}
# update subjects list with content of a selected folder
sub show {
my $self = shift; $self->trace_in;
my %par = @_;
my ($folder_object, $where, $params, $tables, $sql) =
@par{'folder_object','where','params','tables','sql'};
$folder_object ||= $self->folder_object;
my $is_sent_folder;
if ( $folder_object ) {
$self->folder_object ( $folder_object );
$is_sent_folder =
($folder_object->id == $self->config('sent_folder_id') or
$folder_object->id == $self->config('drafts_folder_id') or
$folder_object->id == $self->config('templates_folder_id') );
}
my $list = $self->gtk_subjects_list;
my $dbh = $self->dbh;
$list->clear;
$list->freeze;
my $sender_column;
if ( $is_sent_folder ) {
$list->set_column_title (2, "To");
$sender_column = "head_to";
} else {
$list->set_column_title (2, "Sender");
$sender_column = "sender";
}
my $column;
my $direction;
if ( $folder_object ) {
$column = $folder_object->sort_column;
$direction = $folder_object->sort_direction;
$direction = $direction eq 'ascending' ? "" : "desc";
} else {
$column = 5;
$direction = "desc";
}
foreach my $i (0..3) {
my $title = $list->get_column_title ($i);
$title =~ s/[\[\]<> ]//g;
( run in 1.052 second using v1.01-cache-2.11-cpan-364913b4093 )