
| Current Path : /var/www/web-klick.de/dsh/10_customer2017/1204__intel/ |
Linux ift1.ift-informatik.de 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64 |
| Current File : /var/www/web-klick.de/dsh/10_customer2017/1204__intel/ProgressBar1.pm |
package ProgressBar;
use strict;
use String_ProgressBar;
#use OptiCm::Notifications qw(
# progressbar_start
# progressbar_step
# progressbar_finish
#);
use Data::Dumper;
# This module provides an implementatiuon of Progress Bars.
# A Progress Bar consists of:
#
# a) an effort still done
# b) the progress in percent
# c) the plan of work still to be done
#
#
#
# Creates a new Progress Bar recursively:
#
# my $bar = OptiCm::Engine::Model::Progress::Bar->new()->remark("Test Bar");
#
# my $bar1 = $bar->new(3)->remark("Step 1");
# my $bar2 = $bar->new()->remark("Step 2");
#
# my $bar21 = $bar2->new(1)->remark("Step 2, Substep 1");
# my $bar22 = $bar2->new()->remark("Step 2, Substep 2");
#
# $bar2->new(3,6,2,2);
#
# my $bar3 = $bar->new(5)->remark("Step 3");
#
#
# Stepping through the plan:
#
# $bar2->step()
#
# $bar22->step()
#
# $bar->step()
#
# With this operation all subtasks BEFORE the task will be added to
# the DONE effort.
#************************************************************************
sub new {
my $self = shift;
my $class = ref($self) || $self;
my @pars = @_;
@pars = (0) if (!@pars);
my $o; my $obj;
$self->{'PLAN'} = [] if (ref($self) and (!(ref($self->{'PLAN'}))));
foreach $o (@pars) {
$obj = {};
$obj->{'PARENT'} = $self;
$obj->{'STEPS_DONE'} = 1;
$obj->{'PLAN'} = $o;
$obj->{'LEVEL'} = 1;
bless($obj,$class);
if (ref($self)) {
push(@{$self->{'PLAN'}},$obj);
$obj->{'LEVEL'} = $self->{'LEVEL'} + 1;
}
}
return($obj);
}
#******************************************************************************
sub subtask {
my $self = shift;
my $weight = shift;
my @pars = @_;
my $first_subtask = $self;
if (ref($first_subtask->{'PLAN'})) {
return($first_subtask->{'PLAN'}->[0]->subtask($weight,@pars));
}
if ($weight == 0) {
$weight = $first_subtask->{'PLAN'};
}
if ($weight > 0) {
my $sum = 0;
map { $sum = $sum + $_ } @pars;
map { $_ = $_ * $weight / $sum } @pars;
}
$first_subtask->new(@pars);
return($first_subtask);
}
#******************************************************************************
# Declares all steps BEFORE as been done and adds that
# efforts to the done work
sub jump {
my $self = shift;
my $o;
$self->{'DONE1'} = shift;
if (ref($self->{'PLAN'})) {
if (@{$self->{'PLAN'}}) {
while (@{$self->{'PLAN'}}) {
$o = $self->{'PLAN'}->[0];
last if (exists $o->{'DONE1'});
$o->clear_bar();
shift(@{$self->{'PLAN'}});
$self->{'STEPS_DONE'} = $self->{'STEPS_DONE'} + 1;
$self->{'DONE1'} = $self->{'DONE1'} + $o->todo();
}
if ($self->{'PROGRESS'} < 1) {
$self->{'DONE1'} = $self->{'DONE1'} + $o->{'DONE1'};
$self->{'PROGRESS'} = $self->{'PROGRESS'} + $self->{'DONE1'} /
($self->{'DONE1'} + $self->todo) * ( 1 - $self->{'PROGRESS'} );
$self->{'DONE'} = $self->{'DONE'} + $self->{'DONE1'};
}
}
}
$self->{'PARENT'}->jump() if (ref($self->{'PARENT'}));
delete ($self->{'DONE1'});
}
#***************************************************************
# Steps to the next sub-task. If that does not exist,
# adds a sub-task with weight 0 and steps to it
sub step {
my $self = shift;
if ( ref($self->{'PLAN'}) ) {
if ($#{$self->{'PLAN'}} == 0) {
$self->new(0) if ($self->{'PLAN'}->[0]->todo() > 0);
}
if ($#{$self->{'PLAN'}} > 0) {
return ( $self->{'PLAN'}->[1]->jump() );
}
}
return( $self->jump() );
}
#*****************************************************************
# Work yet have to be done
sub todo {
my $self = shift;
return($self->{'PLAN'}) if (!(ref($self->{'PLAN'})));
my $o; my $erg = 0;
foreach $o (@{$self->{'PLAN'}}) {
$erg = $erg + $o->todo();
}
return($erg);
}
#*********************************************************************************
sub remark { my $self = shift; $self->{'REMARK'} = shift || $self->{'REMARK'}; }
sub done { my $self = shift; return($self->{'DONE'}); }
sub steps_done { my $self = shift; return($self->{'STEPS_DONE'}); }
sub steps_planned { my $self = shift; return($#{$self->{'PLAN'}}); }
#**************************************************************************
#**************************************************************************
sub planSubTask {
my $self = shift;
my $pars = { @_ };
my $weight = $pars->{'taskWeight'} || 1;
my $task = $self->new($weight);
if ($pars->{'taskName'}) {
if (!($pars->{'taskLabel'})) { $pars->{'taskLabel'} = $pars->{'taskName'} }
# $taskList->{ $pars->{'taskName'} } = $task;
}
if ($pars->{'taskLabel'}) {
$task->remark($pars->{'taskLabel'});
}
return($task);
}
#***************************************************************************
# Starts a ProgressBar on this item
sub start {
my $self = shift;
my $text = shift;
if (!($self->{'SHOWPROGRESS'})) {
if ($text) {
$self->{'SHOWPROGRESS'} = $text;
$self->progressbar1_start( $self->{'LEVEL'}, $self->{'REMARK'}, $text );
}
}
}
#***************************************************************************
# Closes the ProgressBar on this item
sub finish {
my $self = shift;
if ($self->{'SHOWPROGRESS'}) {
$self->{'SHOWPROGRESS'} = "";
$self->progressbar1_finish($self->{'LEVEL'});
}
}
#***************************************************************************
sub clear_bar { my $self = shift; $self->finish(); }
sub DESTROY { my $self = shift; $self->clear_bar(); }
#***************************************************************************
sub startStep {
my $self = shift;
my $text = shift;
$self->step();
$self->progressbar1_step($text);
}
#**************************************************************
sub progressbar1_start {
my $self = shift;
my $level = shift;
my $remark = shift;
my $text = shift;
if (ref($self->{'PARENT'})) {
return( $self->{'PARENT'}->progressbar1_start($level,$remark,$text) );
}
$self->{'BAR'}->{$level} = [0,0,$remark,0,0,$text];
$self->printbar();
}
#**************************************************************
sub progressbar1_step {
my $self = shift;
my $text = shift;
my @pars = ( @_, [$self->{'LEVEL'},$self->done(),$self->todo(),
$self->remark(),$self->steps_done(),
$self->steps_planned()+$self->steps_done(),$text]);
if (ref($self->{'PARENT'})) {
return( $self->{'PARENT'}->progressbar1_step("",@pars) );
}
my $o; my $level;
foreach $o (@pars) {
$level = shift(@$o);
if (exists($self->{'BAR'}->{$level})) {
$self->{'BAR'}->{$level} = [ @$o ];
}
}
$self->printbar();
}
#**************************************************************
sub progressbar1_finish {
my $self = shift;
my $level = shift;
if (ref($self->{'PARENT'})) {
return( $self->{'PARENT'}->progressbar1_finish($level) );
}
delete ( $self->{'BAR'}->{$level} );
delete ( $self->{'TEXT'}->{$level} );
$self->printbar() if ($self->{'GRAFIK'});
}
#**************************************************************
sub printbar {
my $self = shift;
my $o; my $done; my $todo; my $remark; my $steps_done; my $steps_planned; my $text;
my $level; my $gross; my $steps_gross; my $quotient; my $bar; my $text;
if ($self->{'GRAFIK'}) {
1;
} else {
system("clear"); print "\n" x 10;
foreach $level (sort {$a <=> $b} keys %{$self->{'BAR'}}) {
$done = $self->{'BAR'}->{$level}->[0];
$todo = $self->{'BAR'}->{$level}->[1];
$gross = $done + $todo;
$remark = $self->{'BAR'}->{$level}->[2];
$steps_done = $self->{'BAR'}->{$level}->[3];
$steps_planned = $self->{'BAR'}->{$level}->[4];
$steps_gross = $steps_done + $steps_gross;
$text = $self->{'BAR'}->{$level}->[5];
if ($text) {
$self->{'TEXT'}->{$level} = $text;
} else {
$text = $self->{'TEXT'}->{$level};
}
$quotient = 0;
if ($gross != 0) { $quotient = $done/$gross; }
print $level . ". " . substr($remark." "x20,0,20) . " [" .
("=" x int( 30 * $quotient )) . (" " x (30 - int( 30 * $quotient))) .
"]" . sprintf("%6.1f",100 * $quotient) .
substr(" (" . $steps_done . "/" . $steps_planned . ") "." "x13,0,13)
. $text . "\n";
}
}
}
#**************************************************************
#**************************************************************
sub newBar {
my $self = shift;
my @args = @_;
unshift (@args,'taskLabel') if (@args % 2);
my $pars = { @args };
$pars->{'taskWeight'} = $pars->{'taskWeight'} || 1;
if (!(ref($pars->{'plannedStepCount'}))) {
$pars->{'plannedStepCount'} = $pars->{'plannedStepCount'} || 1;
$pars->{'plannedStepCount'} = [-1, ( $pars->{'taskWeight'} ) x $pars->{'plannedStepCount'} ];
}
my $subtask = $self->subtask( $pars->{'plannedStepCount'} );
# my $bar = "";
# if ($taskList->{ $pars->{'taskName'} }) {
# $bar = $taskList->{ $pars->{'taskName'} };
# } else {
# $bar = $self->new( $pars->{'taskWeight'} );
# }
#
if ($pars->{'taskLabel'}) { $subtask->remark( $pars->{'taskLabel'} ); }
#
# if ($pars->{'plannedStepCount'}) {
# $bar->new( ( $pars->{'taskWeight'} ) x $pars->{'plannedStepCount'} );
# }
if ($pars->{'showProgress'}) {
$subtask->showProgress(".");
}
return( $subtask );
}
1;