/usr/local/CPAN/PPresenter/PPresenter/Program.pm


# Copyright (C) 2000-2002, Free Software Foundation FSF.

# Program
#
# Maintaining the slide dynamics during the presentation.
#

package PPresenter::Program;

use strict;

sub new(@)
{   my $class = shift;
    bless { last_phase => 0,
            @_ }, $class;
}

sub add($$)
{   my ($program, $phase, $command) = @_;
    push @{$program->{$phase}}, $command;

    $program->{last_phase} = $phase
        if $phase > $program->{last_phase};
    $program;
}

sub start($)
{   my $program = shift;
    my ($show, $viewport) = @$program{'show', 'viewport'};

    $program->{startPhase} = $program->{last_phase}
        if $program->{startPhase} > $program->{last_phase}
           || $show->mustFlushPhases;

    $program->{phase} = -1;

    $program->nextPhase
        while $program->{phase} < $program->{startPhase};
}

sub numberPhases() {shift->{last_phase}+1}
sub lastPhase()    {shift->{last_phase}}
sub phase()        {shift->{phase}}
sub inLastPhase()  {$_[0]->{phase} == $_[0]->{last_phase}}

sub nextPhase()
{   my $program = shift;

    $program->flush_phase;
    return if $program->{phase} == $program->{last_phase};

    my $phase = ++$program->{phase};
    $program->{show}->updatePhaseSymbols($phase, $program->{last_phase});

    return unless exists $program->{$phase}; # empty phase.

    my ($canvas,$dx) = @$program{'canvas', 'dx'};
    map {$_->start($canvas, $dx)} @{$program->{$phase}};

    $program->flush_phase if $program->{show}->mustFlushPhases;
    $program;
}

sub gotoPhase($)
{   my ($program, $phase) = @_;

    $program->nextPhase
       while $program->{phase} < $phase
          && $program->{phase} < $program->{last_phase};
}

sub flush_phase()
{   my $program = shift;
    my $phase   = $program->{phase};
    return unless defined $phase;

    map {$_->flushMove($program->{canvas})}
        @{$program->{$phase}};

    $program;
}

1;