/usr/local/CPAN/PPresenter/PPresenter/Export/Handouts/PostScript.pm
# Copyright (C) 2000-2002, Free Software Foundation FSF.
package PPresenter::Export::Handouts::PostScript;
use strict;
use PPresenter::Export;
use base 'PPresenter::Export';
use Tk;
use Tk::Dialog;
use constant ObjDefaults =>
{ -name => 'PostScript'
, -aliases => [ 'Postscript', 'ps' ]
, -outputDir => 'slideImages'
, -density => 72
, -paperUnits => 'in'
, -paperWidth => ''
, -paperHeight => ''
, -colorMode => 'gray'
, -orientation => 'Landscape'
};
sub view2postscript($$)
{ my ($export, $opts) = @_;
my $orientation = $export->{-orientation};
my $viewport = $opts->{viewport};
$orientation = $export->bestOrientation($viewport)
if $orientation eq 'Best fit';
my $rotate = $orientation eq 'Landscape' ? 1
: $orientation eq 'Portrait' ? 0
: die "-orientation can be Landscape, Portrait, or "
. "`Best fit', not $orientation.\n";
print PPresenter::TRACE
"Postscript image for $opts->{view} in $orientation.\n";
my $id = $opts->{slide}->number;
$export->makeTkPostscript
( $opts->{canvas}, $export->{-colorMode}, $rotate
, "$export->{-outputDir}/$id-$viewport.eps"
);
$export;
}
sub bestOrientation($)
{ my ($export, $viewport) = @_;
my ($pwidth, $pheight) = $export->paperSizePixels;
my ($cwidth, $cheight) = $viewport->canvasDimensions;
$pwidth>$cwidth && $pheight>$cheight ? 'Portrait' : 'Landscape';
}
sub makeTkPostscript($)
{ my ($export, $canvas, $mode, $rotate, $file) = @_;
my $err = $canvas->postscript
( -colormode => $mode
, -rotate => $rotate
, -file => $file
);
print "$err\n" if $err;
}
#
# The user interface to this module.
#
sub popup($$)
{ my ($export, $show, $screen) = @_;
return $export->{popup}
if exists $export->{popup};
$export->{popup} = my $popup = MainWindow->new(-screen => $screen
, -title => 'Export slides with Tk Postscript'
);
$popup->withdraw;
my $vp = $export->tkViewportSettings($show, $popup);
my $ps = $export->tkPostscript($show, $popup);
my $options = $popup->Frame;
$options->Label
( -text => 'export'
, -anchor => 'e'
)->grid($export->tkSlideSelector($popup), -sticky => 'ew');
$options->Label
( -text => 'output dir'
, -anchor => 'e'
)->grid($options->Entry(-textvariable => \$export->{-outputDir})
, -sticky => 'ew');
my $commands = $popup->Frame;
$commands->Button
( -text => 'Export'
, -relief => 'ridge'
, -command => sub {$export->exportPostscript($show, $popup)}
)->grid($commands->Button
( -text => 'Cancel'
, -relief => 'sunken'
, -command => sub {$popup->withdraw}
)
, -padx => 10, -pady => 10
);
if(defined $vp)
{ $vp->grid($ps, -sticky => 'ewns');
$options->grid('^', -sticky => 'ew');
}
else {$options->grid($ps, -sticky => 'ew')}
$commands->grid(-columnspan => 2, -sticky => 'ew');
if(grep {$_->device ne 'printer'} $show->viewports)
{ my $warning = $popup->LabFrame
( -label => 'warning'
, -labelside => 'acrosstop'
)->grid(-columnspan => 2, -sticky => 'ew');
$warning->Label(-text => <<WARN
The background-color will be lost, so you better
specify `-device=>printer' for all viewports.
WARN
)->grid(-sticky=>'nwsw');
}
return $popup;
}
sub tkPostscript($$)
{ my ($export, $show, $parent) = @_;
my $ps = $parent->LabFrame
( -label => 'Postscript'
, -labelside => 'acrosstop'
);
$ps->Label
( -text => 'Color-mode'
, -anchor => 'w'
)->grid($export->optionlist($ps, qw/-colorMode color gray mono/ )
, '-', -sticky => 'ew');
$ps->Label
( -text => 'Paper size'
, -anchor => 'w'
)->grid($export->optionlist($ps, '-paperSize', map {$_->[0]} @papersizes)
, '-', -sticky => 'ew');
$ps->Label
( -text => 'width'
, -anchor => 'e'
)->grid( $ps->Entry( -textvariable => \$export->{-paperWidth})
, $export->optionlist($ps, qw/-paperUnits in cm pt/ )
, -sticky => 'nsew'
);
$ps->Label
( -text => 'height'
, -anchor => 'e'
)->grid( $ps->Entry( -textvariable => \$export->{-paperHeight})
, '^', -sticky => 'ew'
);
$ps->Label
( -text => 'Density'
, -anchor => 'w'
)->grid( $ps->Entry( -textvariable => \$export->{-density})
, $ps->Label( -anchor => 'w', -text => 'dpi' )
, -sticky => 'ew');
$ps->Label
( -text => 'Orientation'
, -anchor => 'w'
)->grid($export->optionlist($ps, qw/-orientation Landscape Portrait/
, 'Best fit') , '-', -sticky => 'ew');
$ps;
}
sub paperSizePixels()
{ my $export = shift;
my $size = $export->{-paperSize};
print "Papersize - $size.\n";
return (undef, undef) if $size eq 'no scaling';
if($size eq 'own size:')
{ my $units = $export->{-paperUnits};
my $pts = $units eq 'pt' ? 1
: $units eq 'in' ? 72
: $units eq 'cm' ? (72/2.56)
: die "-paperUnits of $units?\n";
return ( int($export->{-paperWidth}*$pts)
, int($export->{-paperHeight}*$pts));
}
return $export->paperSize($size);
}
sub exportPostscript($$)
{ my ($export, $show, $popup) = @_;
$export->createDirectory($popup, $export->{-outputDir}) || return;
$popup->withdraw;
print PPresenter::TRACE "Exporting slides to postscript started.\n";
my @viewports = $export->selectedViewports;
foreach ($export->selectedSlides($show))
{ $export->makeSlideExports
( $show, $_, \@viewports
, [ sub {shift->view2postscript(@_)}, $export ]
)
}
print PPresenter::TRACE "Exporting slides to postscript ready.\n";
$export;
}
1;