/usr/local/CPAN/PPresenter/PPresenter/Decoration/Lines1.pm
# Copyright (C) 2000-2002, Free Software Foundation FSF.
# This module was created mainly as demonstration how to work with
# the flexability offered by the Decoration module.
package PPresenter::Decoration::Lines1;
use strict;
use PPresenter::Decoration;
use base 'PPresenter::Decoration';
use constant ObjDefaults =>
{ -name => 'lines1'
, -aliases => [ 'Lines1' ]
, -pageLogo => undef
, -pageLogoSpacing => 0.01
, -decorationLineWidth => 2
, -decorationLineColor => undef
};
my $general_tag = __PACKAGE__;
sub prepare($$$)
{ my ($deco, $show, $slide, $view) = @_;
$deco->SUPER::prepare($show, $slide, $view);
my $logo = $deco->{-pageLogo};
my $logoimg = (ref $logo && $logo->isa('PPresenter::Image')) ? $logo
: defined $logo ? $deco->createLogoImage($view, $logo)
: die "pageLogo is obligatory for decoration $deco.\n";
my $decodata= $show->decodata($view);
my $showimg = $decodata->{showing_logo};
return $deco if defined $showimg && "$showimg" eq "$logoimg";
# New logo shows-up.
$deco->cleanup($show, $slide, $view);
my ($imgw, $imgh) = $logoimg->dimensions($view->viewport);
my ($w, $h) = $view->canvasDimensions;
my $space = $deco->{-pageLogoSpacing};
$decodata->{showing_logo} = $logoimg;
$logoimg->show($view->viewport, $view->canvas, $space*$w, $space*$h
, -anchor => 'nw', -tag => $general_tag);
@$decodata{'sx', 'sy', 'vertx'}
= ($space*$h, (2*$space)*$h+$imgh, $space*$w+int($imgw/3));
$deco->{-titleBounds} = [ 2*$space+$imgw/$w, 0.05
, 0.97, $space+$deco->{-defaultTitlebarHeight} ]
unless defined $deco->{-titleBounds};
$deco->{-mainBounds} = [ $space + $imgw/2/$w
, $space+$deco->{-defaultTitlebarHeight} + $deco->{-areaSeparation}
, @{$deco->{-defaultBounds}}[2,3]
] unless defined $deco->{-mainBounds};
$deco;
}
sub createLogoImage($$)
{ my ($deco, $view, $file) = @_;
my $logo = $view->image
( -file => $file
, -resize => 0
);
die "Unable to find image $file\n" unless $logo;
$logo->prepare($view->viewport, $view->canvas);
$logo;
}
sub createPart($$$$$$)
{ my ($deco, $show, $slide, $view, $part, $parttag, $dx) = @_;
$deco->SUPER::createPart($show, $slide, $view, $part, $parttag, $dx);
if($part eq 'footer')
{ my $decodata = $show->decodata($view);
my $canvas = $view->canvas;
my ($x0, $y0, $x1, $y1) = $canvas->bbox($parttag);
my $liney = int( ($y1+$y0)/2 );
my $width = $deco->{-decorationLineWidth};
my $color = $deco->{-decorationLineColor}
|| $deco->color($view, 'FGCOLOR');
my ($sx, $sy, $vertx)= @$decodata{'sx', 'sy', 'vertx'};
$canvas->createLine
( $sx, $sy, $vertx, $sy, $vertx, $liney, $x0-$dx-5, $liney
, -width => $width
, -fill => $color
, -tag => $general_tag
);
$canvas->createLine($x1-$dx+5, $liney, $canvas->width-5, $liney
, -width => $width
, -fill => $color
, -tag => $general_tag
);
}
$deco;
}
sub finish($$$)
{ my ($deco, $show, $slide, $view) = @_;
$deco->SUPER::finish($show, $slide, $view);
$view->canvas->configure
( -background => $deco->color($view,'BGCOLOR')
);
my $decodata= $show->decodata($view);
my $showimg = $decodata->{showing_logo};
$deco;
}
sub cleanup($$$)
{ my ($deco, $show, $slide, $view) = @_;
$deco->SUPER::cleanup($show, $slide, $view);
$view->canvas->delete($general_tag);
$deco;
}
1;