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 )