/usr/local/CPAN/JaM/JaM/GUI/NetscapeImport.pm


# $Id: NetscapeImport.pm,v 1.3 2001/08/15 20:25:33 joern Exp $

package JaM::GUI::NetscapeImport;

@ISA = qw ( JaM::GUI::Component );

use strict;
use Carp;
use JaM::GUI::Component;
use JaM::Import::Netscape;
use FileHandle;

sub gtk_dialog		{ my $s = shift; $s->{gtk_dialog}
		          = shift if @_; $s->{gtk_dialog}	}

sub gtk_status		{ my $s = shift; $s->{gtk_status}
		          = shift if @_; $s->{gtk_status}	}

sub gtk_ok_button	{ my $s = shift; $s->{gtk_ok_button}
		          = shift if @_; $s->{gtk_ok_button}	}

sub gtk_radio_folders	{ my $s = shift; $s->{gtk_radio_folders}
		          = shift if @_; $s->{gtk_radio_folders}}

sub gtk_radio_mails	{ my $s = shift; $s->{gtk_radio_mails}
		          = shift if @_; $s->{gtk_radio_mails}	}

sub import_successful	{ my $s = shift; $s->{import_successful}
		          = shift if @_; $s->{import_successful}}
		  
sub import_in_progress	{ my $s = shift; $s->{import_in_progress}
		          = shift if @_; $s->{import_in_progress}}
		  
sub import_idle_id	{ my $s = shift; $s->{import_idle_id}
		          = shift if @_; $s->{import_idle_id}}

sub import_pipe_fh	{ my $s = shift; $s->{import_pipe_fh}
		          = shift if @_; $s->{import_pipe_fh}}

sub import_abort_file	{ my $s = shift; $s->{import_abort_file}
		          = shift if @_; $s->{import_abort_file}}

sub build {
	my $self = shift;
	my %par = @_;
	my ($db) = @par{'db'};
	
	my $dialog = Gtk::Dialog->new;
	$dialog->border_width(10);
	$dialog->set_position('center');
	$dialog->set_title ("JaM Netscape Import");
	$dialog->set_default_size (400, 180);
	$dialog->set_modal(1);
	$dialog->action_area->set_homogeneous (1);

	my $text_table = new Gtk::Table( 2, 2, 0 );
	$text_table->show();
	$text_table->set_row_spacing( 0, 2 );
	$text_table->set_col_spacing( 0, 2 );

	my $text = new Gtk::Text( undef, undef );
	$text->show;
	$text->set_usize (undef, 100);
	$text->set_editable( 0 );
	$text->set_word_wrap ( 1 );
	$text_table->attach( $text, 0, 1, 0, 1,
        	       [ 'expand', 'shrink', 'fill' ],
        	       [ 'expand', 'shrink', 'fill' ],
        	       0, 0 );

	my $vscrollbar = new Gtk::VScrollbar( $text->vadj );
	$vscrollbar->show();
	$text_table->attach( $vscrollbar, 1, 2, 0, 1, 'fill',
        	       [ 'expand', 'shrink', 'fill' ], 0, 0 );

	my $frame = Gtk::Frame->new ("Status");
	$frame->show;
	$frame->add ($text_table);

	$dialog->vbox->pack_start($frame, 1, 1, 0);

	my $hbox = Gtk::HBox->new(0, 5);
	$hbox->show;
	
	my $label = Gtk::Label->new ("Import");
	$label->show;
	my $radio_folders = Gtk::RadioButton->new ("Folders only");
	$radio_folders->show;
	my $radio_mails   = Gtk::RadioButton->new ("Folders and mails", $radio_folders);
	$radio_mails->show;
	$radio_mails->set_active(1);

	$hbox->pack_start($label, 0, 1, 0);
	$hbox->pack_start($radio_folders, 0, 1, 0);
	$hbox->pack_start($radio_mails, 0, 1, 0);

	$dialog->vbox->pack_start($hbox, 1, 1, 0);

	my $cancel = new Gtk::Button( "Cancel" );
	$dialog->action_area->pack_start( $cancel, 0, 1, 0 );
	$cancel->signal_connect( "clicked", sub { $self->cancel } );
	$cancel->show();

	my $ok = new Gtk::Button( "Import" );
	$dialog->action_area->pack_start( $ok, 0, 1, 0 );
	$ok->signal_connect( "clicked", sub { $self->import_mails } );
	$ok->show();

	$dialog->show;

	$self->gtk_dialog ( $dialog );
	$self->gtk_status ( $text );
	$self->gtk_ok_button ( $ok );
	$self->gtk_radio_folders ( $radio_folders );
	$self->gtk_radio_mails ( $radio_mails );

	return $dialog;
}

sub cancel {
	my $self = shift;

	if ( $self->import_successful ) {
		$self->restart_program;
	}

	if ( $self->import_in_progress ) {
		Gtk->idle_remove ($self->import_idle_id);
		my $abort_file = $self->import_abort_file;
		open (TOUCH, "> $abort_file") or confess "can't write $abort_file";
		close TOUCH;
		my $fh = $self->import_pipe_fh;
		close $fh or warn "can't execute bin/jam_nsmail_import.pl";
		unlink $abort_file;
		$self->restart_program;
	}

	$self->gtk_dialog->destroy;

	1;
}

sub import_mails {
	my $self = shift;
	
	if ( $self->import_successful ) {
		$self->restart_program;
	}
	
	return if $self->import_in_progress;
	$self->import_in_progress(1);
	
	my $status = $self->gtk_status;
	$status->backward_delete ($status->get_length);

	my $dbh = $self->dbh;

	my $radio_mails = $self->gtk_radio_mails;
	my $mails_too   = $radio_mails->get_active ? 1 : 0;

	$status->insert (undef, undef, undef,
		"Starting Netscape import...\n\n"
	);

	my $abort_filename = "/tmp/jam_import_abort_$$";
	$self->import_abort_file($abort_filename);

	my $fh = new FileHandle;
	open ($fh, "bin/jam_nsmail_import.pl $mails_too $abort_filename|")
		or confess "can't fork bin/jam_nsmail_import.pl";

	my $idle_id;
	$idle_id = Gtk->idle_add ( sub {
		my $line = <$fh>;
		if ( eof($fh) or $line eq "END\n" ) {
			Gtk->idle_remove ($idle_id);
			close $fh or warn "can't execute bin/jam_nsmail_import.pl";
			$self->import_successful (1);
			$self->gtk_ok_button->child->set ("Ok");
			$status->insert (undef, undef, undef, "Finished!");
		} else {
			$status->insert (undef, undef, undef, $line);
		}
		
		return 1;
	});

	$self->import_idle_id($idle_id);
	$self->import_pipe_fh($fh);

	1;
}

1;