Author: Tobias Schlitt
Date: 2007-03-15 16:43:25 +0100 (Thu, 15 Mar 2007)
New Revision: 4759

Log:
- Refactored progressbar to support 2 different backends: 1 for Posix conform
  systems, 1 for Windows.

Added:
   trunk/ConsoleTools/src/interfaces/progressbar_renderer.php
   trunk/ConsoleTools/src/progressbar/
   trunk/ConsoleTools/src/progressbar/posix_renderer.php
   trunk/ConsoleTools/src/progressbar/windows_renderer.php
Modified:
   trunk/ConsoleTools/src/console_autoload.php
   trunk/ConsoleTools/src/progressbar.php

Modified: trunk/ConsoleTools/src/console_autoload.php
===================================================================
--- trunk/ConsoleTools/src/console_autoload.php 2007-03-15 10:42:34 UTC (rev 
4758)
+++ trunk/ConsoleTools/src/console_autoload.php 2007-03-15 15:43:25 UTC (rev 
4759)
@@ -23,6 +23,9 @@
     'ezcConsoleTableOptions'                        => 
'ConsoleTools/options/table.php',
     'ezcConsoleProgressbar'                         => 
'ConsoleTools/progressbar.php',
     'ezcConsoleProgressbarOptions'                  => 
'ConsoleTools/options/progressbar.php',
+    'ezcConsoleProgressbarRenderer'                 => 
'ConsoleTools/interfaces/progressbar_renderer.php',
+    'ezcConsoleProgressbarPosixRenderer'            => 
'ConsoleTools/progressbar/posix_renderer.php',
+    'ezcConsoleProgressbarWindowsRenderer'          => 
'ConsoleTools/progressbar/windows_renderer.php',
     'ezcConsoleProgressMonitor'                     => 
'ConsoleTools/progressmonitor.php',
     'ezcConsoleProgressMonitorOptions'              => 
'ConsoleTools/options/progressmonitor.php',
     'ezcConsoleStatusbar'                           => 
'ConsoleTools/statusbar.php',

Added: trunk/ConsoleTools/src/interfaces/progressbar_renderer.php
===================================================================
--- trunk/ConsoleTools/src/interfaces/progressbar_renderer.php  2007-03-15 
10:42:34 UTC (rev 4758)
+++ trunk/ConsoleTools/src/interfaces/progressbar_renderer.php  2007-03-15 
15:43:25 UTC (rev 4759)
@@ -0,0 +1,373 @@
+<?php
+
+abstract class ezcConsoleProgressbarRenderer
+{
+    /**
+     * Container to hold the properties
+     *
+     * @var array(string=>mixed)
+     */
+    protected $properties;
+
+    /**
+     * Storage for actual values to be replaced in the format string.
+     * Actual values are stored here and will be inserted into the bar
+     * before printing it.
+     * 
+     * @var array(string => string)
+     */
+    protected $valueMap = array( 
+        'bar'       => '',
+        'fraction'  => '',
+        'act'       => '',
+        'max'       => '',
+    );
+
+    /**
+     * Stores the bar utilization.
+     *
+     * This array saves how much space a specific part of the bar utilizes to 
not
+     * recalculate those on every step.
+     * 
+     * @var array(string => int)
+     */
+    protected $measures = array( 
+        'barSpace'          => 0,
+        'fractionSpace'     => 0,
+        'actSpace'          => 0,
+        'maxSpace'          => 0,
+        'fixedCharSpace'    => 0,
+    );
+
+    /**
+     * The current step the progress bar should show. 
+     * 
+     * @var int
+     */
+    protected $currentStep = 0;
+
+    /**
+     * The maximum number of steps to go.
+     * Calculated once from the settings.
+     *
+     * @var int
+     */
+    protected $numSteps = 0;
+
+    /**
+     * The ezcConsoleOutput object to use.
+     *
+     * @var ezcConsoleOutput
+     */
+    protected $output;
+
+    /**
+     * Indicates if the starting point for the bar has been stored.
+     * Per default this is false to indicate that no start position has been
+     * stored, yet.
+     * 
+     * @var bool
+     */
+    protected $started = false;
+
+    /**
+     * Start the progress bar
+     * Starts the progress bar and sticks it to the current line.
+     * No output will be done yet. Call [EMAIL PROTECTED] 
ezcConsoleProgressbar::output()}
+     * to print the bar.
+     * 
+     * @return void
+     */
+    public abstract function start();
+
+    /**
+     * Draw the progress bar.
+     * Prints the progress-bar to the screen. If start() has not been called 
+     * yet, the current line is used for [EMAIL PROTECTED] 
ezcConsolProgressbar::start()}.
+     *
+     * @return void
+     */
+    public abstract function output();
+    
+    /**
+     * Finish the progress bar.
+     * Finishes the bar (jump to 100% if not happened yet,...) and jumps
+     * to the next line to allow new output. Also resets the values of the
+     * output handler used, if changed.
+     *
+     * @return void
+     */
+    public abstract function finish();
+
+    /**
+     * Creates a new progress bar.
+     *
+     * @param ezcConsoleOutput $outHandler   Handler to utilize for output
+     * @param int $max                       Maximum value, where progressbar 
+     *                                       reaches 100%.
+     * @param array(string=>string) $options Options
+     *
+     * @see ezcConsoleProgressbar::$options
+     */
+    public function __construct( ezcConsoleOutput $outHandler, $max, array 
$options = array() )
+    {
+        $this->output = $outHandler;
+        $this->__set( 'max', $max );
+        $this->properties['options'] = new ezcConsoleProgressbarOptions( 
$options );
+    }
+    
+    /**
+     * Set new options.
+     * This method allows you to change the options of progressbar.
+     *  
+     * @param ezcConsoleProgresbarOptions $options The options to set.
+     *
+     * @throws ezcBaseSettingNotFoundException
+     *         If you tried to set a non-existent option value.
+     * @throws ezcBaseSettingValueException
+     *         If the value is not valid for the desired option.
+     * @throws ezcBaseValueException
+     *         If you submit neither an array nor an instance of 
+     *         ezcConsoleProgresbarOptions.
+     */
+    public function setOptions( $options ) 
+    {
+        if ( is_array( $options ) ) 
+        {
+            $this->properties['options']->merge( $options );
+        } 
+        else if ( $options instanceof ezcConsoleProgressbarOptions ) 
+        {
+            $this->properties['options'] = $options;
+        }
+        else
+        {
+            throw new ezcBaseValueException( "options", $options, "instance of 
ezcConsoleProgressbarOptions" );
+        }
+    }
+
+    /**
+     * Returns the current options.
+     * Returns the options currently set for this progressbar.
+     * 
+     * @return ezcConsoleProgressbarOptions The current options.
+     */
+    public function getOptions()
+    {
+        return $this->properties['options'];
+    }
+
+    /**
+     * Property read access.
+     * 
+     * @param string $key Name of the property.
+     * @return mixed Value of the property or null.
+     *
+     * @throws ezcBasePropertyNotFoundException
+     *         If the the desired property is not found.
+     * @ignore
+     */
+    public function __get( $key )
+    {
+        switch ( $key )
+        {
+            case 'options':
+                return $this->properties['options'];
+            case 'step':
+                // Step is now an option
+                return $this->properties['options']->step;
+            case 'max':
+                return $this->properties[$key];
+            default:
+                break;
+        }
+        throw new ezcBasePropertyNotFoundException( $key );
+    }
+
+    /**
+     * Property write access.
+     * 
+     * @param string $key Name of the property.
+     * @param mixed $val  The value for the property.
+     *
+     * @throws ezcBasePropertyNotFoundException
+     *         If a desired property could not be found.
+     * @throws ezcBaseValueException
+     *         If a desired property value is out of range.
+     * @ignore
+     */
+    public function __set( $key, $val )
+    {
+        switch ( $key )
+        {
+            case 'options':
+                if ( !( $val instanceof ezcConsoleProgressbarOptions ) )
+                {
+                    throw new ezcBaseValueException( 'options',  $val, 
'instance of ezcConsoleProgressbarOptions' );
+                };
+                break;
+            case 'max':
+                if ( ( !is_int( $val ) && !is_float( $val ) ) || $val < 0 )
+                {
+                    throw new ezcBaseValueException( $key, $val, 'number >= 0' 
);
+                }
+                break;
+            case 'step':
+                if ( ( !is_int( $val ) && !is_float( $val ) ) || $val < 0 )
+                {
+                    throw new ezcBaseValueException( $key, $val, 'number >= 0' 
);
+                }
+                // Step is now an option.
+                $this->properties['options']->step = $val;
+                return;
+            default:
+                throw new ezcBasePropertyNotFoundException( $key );
+                break;
+        }
+        // Changes settings or options, need for recalculating measures
+        $this->started = false;
+        $this->properties[$key] = $val;
+    }
+ 
+    /**
+     * Property isset access.
+     * 
+     * @param string $key Name of the property.
+     * @return bool True is the property is set, otherwise false.
+     * @ignore
+     */
+    public function __isset( $key )
+    {
+        switch ( $key )
+        {
+            case 'options':
+            case 'max':
+            case 'step':
+                return true;
+        }
+        return false;
+    }
+
+    /**
+     * Advance the progress bar.
+     * Advances the progress bar by $step steps. Redraws the bar by default,
+     * using the [EMAIL PROTECTED] ezcConsoleProgressbar::output()} method.
+     *
+     * @param bool  $redraw Whether to redraw the bar immediately.
+     * @param float $steps  How far the progress bar should advance on this 
call.
+     * @return void
+     */
+    public function advance( $redraw = true, $step = 1 ) 
+    {
+        $this->currentStep += $step;
+        if ( $redraw === true && $this->currentStep % 
$this->properties['options']->redrawFrequency === 0 )
+        {
+            $this->output();
+        }
+    }
+
+    /**
+     * Generate all values to be replaced in the format string. 
+     * 
+     * @return void
+     */
+    protected function generateValues()
+    {
+        // Bar
+        $barFilledSpace = ceil( $this->measures['barSpace'] / $this->numSteps 
* $this->currentStep );
+        // Sanitize value if it gets to large by rounding
+        $barFilledSpace = $barFilledSpace > $this->measures['barSpace'] ? 
$this->measures['barSpace'] : $barFilledSpace;
+        $bar = str_pad( 
+            str_pad( 
+                $this->properties['options']->progressChar, 
+                $barFilledSpace, 
+                $this->properties['options']->barChar, 
+                STR_PAD_LEFT
+            ), 
+            $this->measures['barSpace'], 
+            $this->properties['options']->emptyChar, 
+            STR_PAD_RIGHT 
+        );
+        $this->valueMap['bar'] = $bar;
+
+        // Fraction
+        $fractionVal = sprintf( 
+            $this->properties['options']->fractionFormat,
+            ( $fractionVal = ( $this->properties['options']->step * 
$this->currentStep ) / $this->max * 100 ) > 100 ? 100 : $fractionVal
+        );
+        $this->valueMap['fraction'] = str_pad( 
+            $fractionVal, 
+            strlen( sprintf( $this->properties['options']->fractionFormat, 100 
) ),
+            ' ',
+            STR_PAD_LEFT
+        );
+
+        // Act / max
+        $actVal = sprintf(
+            $this->properties['options']->actFormat,
+            ( $actVal = $this->currentStep * 
$this->properties['options']->step ) > $this->max ? $this->max : $actVal
+        );
+        $this->valueMap['act'] = str_pad( 
+            $actVal, 
+            strlen( sprintf( $this->properties['options']->actFormat, 
$this->max ) ),
+            ' ',
+            STR_PAD_LEFT
+        );
+        $this->valueMap['max'] = sprintf( 
$this->properties['options']->maxFormat, $this->max );
+    }
+
+    /**
+     * Insert values into bar format string. 
+     * 
+     * @return void
+     */
+    protected function insertValues()
+    {
+        $bar = $this->properties['options']->formatString;
+        foreach ( $this->valueMap as $name => $val )
+        {
+            $bar = str_replace( "%{$name}%", $val, $bar );
+        }
+        return $bar;
+    }
+
+    /**
+     * Calculate several measures necessary to generate a bar. 
+     * 
+     * @return void
+     */
+    protected function calculateMeasures()
+    {
+        // Calc number of steps bar goes through
+        $this->numSteps = ( int ) round( $this->max / 
$this->properties['options']->step );
+        // Calculate measures
+        $this->measures['fixedCharSpace'] = strlen( 
$this->stripEscapeSequences( $this->insertValues() ) );
+        if ( strpos( $this->properties['options']->formatString,'%max%' ) !== 
false )
+        {
+            $this->measures['maxSpace'] = strlen( sprintf( 
$this->properties['options']->maxFormat, $this->max ) );
+
+        }
+        if ( strpos( $this->properties['options']->formatString, '%act%' ) !== 
false )
+        {
+            $this->measures['actSpace'] = strlen( sprintf( 
$this->properties['options']->actFormat, $this->max ) );
+        }
+        if ( strpos( $this->properties['options']->formatString, '%fraction%' 
) !== false )
+        {
+            $this->measures['fractionSpace'] = strlen( sprintf( 
$this->properties['options']->fractionFormat, 100 ) );
+        }
+        $this->measures['barSpace'] = $this->properties['options']->width - 
array_sum( $this->measures );
+    }
+
+    /**
+     * Strip all escape sequences from a string to measure it's size 
correctly. 
+     * 
+     * @param mixed $str 
+     * @return void
+     */
+    protected function stripEscapeSequences( $str )
+    {
+        return preg_replace( '/\033\[[0-9a-f;]*m/i', '', $str  );
+    }
+}
+
+?>


Property changes on: trunk/ConsoleTools/src/interfaces/progressbar_renderer.php
___________________________________________________________________
Name: svn:eol-style
   + native

Added: trunk/ConsoleTools/src/progressbar/posix_renderer.php
===================================================================
--- trunk/ConsoleTools/src/progressbar/posix_renderer.php       2007-03-15 
10:42:34 UTC (rev 4758)
+++ trunk/ConsoleTools/src/progressbar/posix_renderer.php       2007-03-15 
15:43:25 UTC (rev 4759)
@@ -0,0 +1,54 @@
+<?php
+
+class ezcConsoleProgressbarPosixRenderer extends ezcConsoleProgressbarRenderer
+{
+
+    /**
+     * Start the progress bar
+     * Starts the progress bar and sticks it to the current line.
+     * No output will be done yet. Call [EMAIL PROTECTED] 
ezcConsoleProgressbar::output()}
+     * to print the bar.
+     * 
+     * @return void
+     */
+    public function start() 
+    {
+        $this->calculateMeasures();
+        $this->output->storePos();
+        $this->started = true;
+    }
+
+    /**
+     * Draw the progress bar.
+     * Prints the progress-bar to the screen. If start() has not been called 
+     * yet, the current line is used for [EMAIL PROTECTED] 
ezcConsolProgressbar::start()}.
+     *
+     * @return void
+     */
+    public function output()
+    {
+        if ( $this->started === false )
+        {
+            $this->start();
+        }
+        $this->output->restorePos();
+        $this->generateValues();
+        echo $this->insertValues();
+    }
+
+    /**
+     * Finish the progress bar.
+     * Finishes the bar (jump to 100% if not happened yet,...) and jumps
+     * to the next line to allow new output. Also resets the values of the
+     * output handler used, if changed.
+     *
+     * @return void
+     */
+    public function finish()
+    {
+        $this->currentStep = $this->numSteps;
+        $this->output();
+    }
+}
+
+?>


Property changes on: trunk/ConsoleTools/src/progressbar/posix_renderer.php
___________________________________________________________________
Name: svn:eol-style
   + native

Added: trunk/ConsoleTools/src/progressbar/windows_renderer.php
===================================================================
--- trunk/ConsoleTools/src/progressbar/windows_renderer.php     2007-03-15 
10:42:34 UTC (rev 4758)
+++ trunk/ConsoleTools/src/progressbar/windows_renderer.php     2007-03-15 
15:43:25 UTC (rev 4759)
@@ -0,0 +1,56 @@
+<?php
+
+class ezcConsoleProgressbarWindowsRenderer extends 
ezcConsoleProgressbarRenderer
+{
+
+    /**
+     * Start the progress bar
+     * Starts the progress bar and sticks it to the current line.
+     * No output will be done yet. Call [EMAIL PROTECTED] 
ezcConsoleProgressbar::output()}
+     * to print the bar.
+     * 
+     * @return void
+     */
+    public function start() 
+    {
+        $this->calculateMeasures();
+        $this->started = true;
+    }
+
+    /**
+     * Draw the progress bar.
+     * Prints the progress-bar to the screen. If start() has not been called 
+     * yet, the current line is used for [EMAIL PROTECTED] 
ezcConsolProgressbar::start()}.
+     *
+     * @return void
+     */
+    public function output()
+    {
+        if ( $this->started === false )
+        {
+            $this->start();
+        }
+
+        // Echo width number of backspaces.
+        echo str_repeat( "\x8", $this->options->width );
+        
+        $this->Values();
+        echo $this->insertValues();
+    }
+
+    /**
+     * Finish the progress bar.
+     * Finishes the bar (jump to 100% if not happened yet,...) and jumps
+     * to the next line to allow new output. Also resets the values of the
+     * output handler used, if changed.
+     *
+     * @return void
+     */
+    public function finish()
+    {
+        $this->currentStep = $this->numSteps;
+        $this->output();
+    }
+}
+
+?>


Property changes on: trunk/ConsoleTools/src/progressbar/windows_renderer.php
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: trunk/ConsoleTools/src/progressbar.php
===================================================================
--- trunk/ConsoleTools/src/progressbar.php      2007-03-15 10:42:34 UTC (rev 
4758)
+++ trunk/ConsoleTools/src/progressbar.php      2007-03-15 15:43:25 UTC (rev 
4759)
@@ -49,89 +49,66 @@
  */
 class ezcConsoleProgressbar
 {
-    /**
-     * Container to hold the properties
-     *
-     * @var array(string=>mixed)
-     */
-    protected $properties;
+    private $delegate;
 
     /**
-     * Storage for actual values to be replaced in the format string.
-     * Actual values are stored here and will be inserted into the bar
-     * before printing it.
-     * 
-     * @var array(string => string)
-     */
-    protected $valueMap = array( 
-        'bar'       => '',
-        'fraction'  => '',
-        'act'       => '',
-        'max'       => '',
-    );
-
-    /**
-     * Stores the bar utilization.
+     * Creates a new progress bar.
      *
-     * This array saves how much space a specific part of the bar utilizes to 
not
-     * recalculate those on every step.
-     * 
-     * @var array(string => int)
+     * @param ezcConsoleOutput $outHandler   Handler to utilize for output
+     * @param int $max                       Maximum value, where progressbar 
+     *                                       reaches 100%.
+     * @param array(string=>string) $options Options
+     *
+     * @see ezcConsoleProgressbar::$options
      */
-    protected $measures = array( 
-        'barSpace'          => 0,
-        'fractionSpace'     => 0,
-        'actSpace'          => 0,
-        'maxSpace'          => 0,
-        'fixedCharSpace'    => 0,
-    );
-
+    public function __construct( ezcConsoleOutput $outHandler, $max, array 
$options = array() )
+    {
+        if ( ezcBaseFeatures::os() === "Windows" )
+        {
+            $this->delegate = new ezcConsoleProgressbarWindowsRenderer( 
$outHandler, $max, $options );
+        }
+        else
+        {
+            $this->delegate = new ezcConsoleProgressbarPosixRenderer( 
$outHandler, $max, $options );
+        }
+    }
+    
     /**
-     * The current step the progress bar should show. 
+     * Start the progress bar
+     * Starts the progress bar and sticks it to the current line.
+     * No output will be done yet. Call [EMAIL PROTECTED] 
ezcConsoleProgressbar::output()}
+     * to print the bar.
      * 
-     * @var int
+     * @return void
      */
-    protected $currentStep = 0;
+    public function start()
+    {
+        $this->delegate->start();
+    }
 
     /**
-     * The maximum number of steps to go.
-     * Calculated once from the settings.
+     * Draw the progress bar.
+     * Prints the progress-bar to the screen. If start() has not been called 
+     * yet, the current line is used for [EMAIL PROTECTED] 
ezcConsolProgressbar::start()}.
      *
-     * @var int
+     * @return void
      */
-    protected $numSteps = 0;
-
+    public function output()
+    {
+        $this->delegate->output();
+    }
+    
     /**
-     * The ezcConsoleOutput object to use.
+     * Finish the progress bar.
+     * Finishes the bar (jump to 100% if not happened yet,...) and jumps
+     * to the next line to allow new output. Also resets the values of the
+     * output handler used, if changed.
      *
-     * @var ezcConsoleOutput
+     * @return void
      */
-    protected $output;
-
-    /**
-     * Indicates if the starting point for the bar has been stored.
-     * Per default this is false to indicate that no start position has been
-     * stored, yet.
-     * 
-     * @var bool
-     */
-    protected $started = false;
-
-    /**
-     * Creates a new progress bar.
-     *
-     * @param ezcConsoleOutput $outHandler   Handler to utilize for output
-     * @param int $max                       Maximum value, where progressbar 
-     *                                       reaches 100%.
-     * @param array(string=>string) $options Options
-     *
-     * @see ezcConsoleProgressbar::$options
-     */
-    public function __construct( ezcConsoleOutput $outHandler, $max, array 
$options = array() )
+    public function finish()
     {
-        $this->output = $outHandler;
-        $this->__set( 'max', $max );
-        $this->properties['options'] = new ezcConsoleProgressbarOptions( 
$options );
+        $this->delegate->finish();
     }
     
     /**
@@ -150,18 +127,7 @@
      */
     public function setOptions( $options ) 
     {
-        if ( is_array( $options ) ) 
-        {
-            $this->properties['options']->merge( $options );
-        } 
-        else if ( $options instanceof ezcConsoleProgressbarOptions ) 
-        {
-            $this->properties['options'] = $options;
-        }
-        else
-        {
-            throw new ezcBaseValueException( "options", $options, "instance of 
ezcConsoleProgressbarOptions" );
-        }
+        $this->delegate->setOptions( $options );
     }
 
     /**
@@ -172,7 +138,7 @@
      */
     public function getOptions()
     {
-        return $this->properties['options'];
+        return $this->delegate->getOptions();
     }
 
     /**
@@ -187,19 +153,7 @@
      */
     public function __get( $key )
     {
-        switch ( $key )
-        {
-            case 'options':
-                return $this->properties['options'];
-            case 'step':
-                // Step is now an option
-                return $this->properties['options']->step;
-            case 'max':
-                return $this->properties[$key];
-            default:
-                break;
-        }
-        throw new ezcBasePropertyNotFoundException( $key );
+        return $this->delegate->$key;
     }
 
     /**
@@ -216,35 +170,7 @@
      */
     public function __set( $key, $val )
     {
-        switch ( $key )
-        {
-            case 'options':
-                if ( !( $val instanceof ezcConsoleProgressbarOptions ) )
-                {
-                    throw new ezcBaseValueException( 'options',  $val, 
'instance of ezcConsoleProgressbarOptions' );
-                };
-                break;
-            case 'max':
-                if ( ( !is_int( $val ) && !is_float( $val ) ) || $val < 0 )
-                {
-                    throw new ezcBaseValueException( $key, $val, 'number >= 0' 
);
-                }
-                break;
-            case 'step':
-                if ( ( !is_int( $val ) && !is_float( $val ) ) || $val < 0 )
-                {
-                    throw new ezcBaseValueException( $key, $val, 'number >= 0' 
);
-                }
-                // Step is now an option.
-                $this->properties['options']->step = $val;
-                return;
-            default:
-                throw new ezcBasePropertyNotFoundException( $key );
-                break;
-        }
-        // Changes settings or options, need for recalculating measures
-        $this->started = false;
-        $this->properties[$key] = $val;
+        $this->delegate->$key = $val;
     }
  
     /**
@@ -256,50 +182,10 @@
      */
     public function __isset( $key )
     {
-        switch ( $key )
-        {
-            case 'options':
-            case 'max':
-            case 'step':
-                return true;
-        }
-        return false;
+        return isset( $this->delegate->$key );
     }
 
     /**
-     * Start the progress bar
-     * Starts the progress bar and sticks it to the current line.
-     * No output will be done yet. Call [EMAIL PROTECTED] 
ezcConsoleProgressbar::output()}
-     * to print the bar.
-     * 
-     * @return void
-     */
-    public function start() 
-    {
-        $this->calculateMeasures();
-        $this->output->storePos();
-        $this->started = true;
-    }
-
-    /**
-     * Draw the progress bar.
-     * Prints the progress-bar to the screen. If start() has not been called 
-     * yet, the current line is used for [EMAIL PROTECTED] 
ezcConsolProgressbar::start()}.
-     *
-     * @return void
-     */
-    public function output()
-    {
-        if ( $this->started === false )
-        {
-            $this->start();
-        }
-        $this->output->restorePos();
-        $this->generateValues();
-        echo $this->insertValues();
-    }
-
-    /**
      * Advance the progress bar.
      * Advances the progress bar by $step steps. Redraws the bar by default,
      * using the [EMAIL PROTECTED] ezcConsoleProgressbar::output()} method.
@@ -310,128 +196,8 @@
      */
     public function advance( $redraw = true, $step = 1 ) 
     {
-        $this->currentStep += $step;
-        if ( $redraw === true && $this->currentStep % 
$this->properties['options']->redrawFrequency === 0 )
-        {
-            $this->output();
-        }
+        $this->delegate->advance( $redraw, $step );
     }
 
-    /**
-     * Finish the progress bar.
-     * Finishes the bar (jump to 100% if not happened yet,...) and jumps
-     * to the next line to allow new output. Also resets the values of the
-     * output handler used, if changed.
-     *
-     * @return void
-     */
-    public function finish()
-    {
-        $this->currentStep = $this->numSteps;
-        $this->output();
-    }
-
-    /**
-     * Generate all values to be replaced in the format string. 
-     * 
-     * @return void
-     */
-    protected function generateValues()
-    {
-        // Bar
-        $barFilledSpace = ceil( $this->measures['barSpace'] / $this->numSteps 
* $this->currentStep );
-        // Sanitize value if it gets to large by rounding
-        $barFilledSpace = $barFilledSpace > $this->measures['barSpace'] ? 
$this->measures['barSpace'] : $barFilledSpace;
-        $bar = str_pad( 
-            str_pad( 
-                $this->properties['options']->progressChar, 
-                $barFilledSpace, 
-                $this->properties['options']->barChar, 
-                STR_PAD_LEFT
-            ), 
-            $this->measures['barSpace'], 
-            $this->properties['options']->emptyChar, 
-            STR_PAD_RIGHT 
-        );
-        $this->valueMap['bar'] = $bar;
-
-        // Fraction
-        $fractionVal = sprintf( 
-            $this->properties['options']->fractionFormat,
-            ( $fractionVal = ( $this->properties['options']->step * 
$this->currentStep ) / $this->max * 100 ) > 100 ? 100 : $fractionVal
-        );
-        $this->valueMap['fraction'] = str_pad( 
-            $fractionVal, 
-            strlen( sprintf( $this->properties['options']->fractionFormat, 100 
) ),
-            ' ',
-            STR_PAD_LEFT
-        );
-
-        // Act / max
-        $actVal = sprintf(
-            $this->properties['options']->actFormat,
-            ( $actVal = $this->currentStep * 
$this->properties['options']->step ) > $this->max ? $this->max : $actVal
-        );
-        $this->valueMap['act'] = str_pad( 
-            $actVal, 
-            strlen( sprintf( $this->properties['options']->actFormat, 
$this->max ) ),
-            ' ',
-            STR_PAD_LEFT
-        );
-        $this->valueMap['max'] = sprintf( 
$this->properties['options']->maxFormat, $this->max );
-    }
-
-    /**
-     * Insert values into bar format string. 
-     * 
-     * @return void
-     */
-    protected function insertValues()
-    {
-        $bar = $this->properties['options']->formatString;
-        foreach ( $this->valueMap as $name => $val )
-        {
-            $bar = str_replace( "%{$name}%", $val, $bar );
-        }
-        return $bar;
-    }
-
-    /**
-     * Calculate several measures necessary to generate a bar. 
-     * 
-     * @return void
-     */
-    protected function calculateMeasures()
-    {
-        // Calc number of steps bar goes through
-        $this->numSteps = ( int ) round( $this->max / 
$this->properties['options']->step );
-        // Calculate measures
-        $this->measures['fixedCharSpace'] = strlen( 
$this->stripEscapeSequences( $this->insertValues() ) );
-        if ( strpos( $this->properties['options']->formatString,'%max%' ) !== 
false )
-        {
-            $this->measures['maxSpace'] = strlen( sprintf( 
$this->properties['options']->maxFormat, $this->max ) );
-
-        }
-        if ( strpos( $this->properties['options']->formatString, '%act%' ) !== 
false )
-        {
-            $this->measures['actSpace'] = strlen( sprintf( 
$this->properties['options']->actFormat, $this->max ) );
-        }
-        if ( strpos( $this->properties['options']->formatString, '%fraction%' 
) !== false )
-        {
-            $this->measures['fractionSpace'] = strlen( sprintf( 
$this->properties['options']->fractionFormat, 100 ) );
-        }
-        $this->measures['barSpace'] = $this->properties['options']->width - 
array_sum( $this->measures );
-    }
-
-    /**
-     * Strip all escape sequences from a string to measure it's size 
correctly. 
-     * 
-     * @param mixed $str 
-     * @return void
-     */
-    protected function stripEscapeSequences( $str )
-    {
-        return preg_replace( '/\033\[[0-9a-f;]*m/i', '', $str  );
-    }
 }
 ?>

-- 
svn-components mailing list
svn-components@lists.ez.no
http://lists.ez.no/mailman/listinfo/svn-components

Reply via email to