From: <lph...@us...> - 2007-09-30 17:42:02
|
Update of /cvsroot/tikiwiki/tiki/lib/graph-engine In directory sc8-pr-cvs10.sourceforge.net:/tmp/cvs-serv11830 Modified Files: core.php graph.bar.php Log Message: Adding support for hooks during data rendering. Index: core.php =================================================================== RCS file: /cvsroot/tikiwiki/tiki/lib/graph-engine/core.php,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- core.php 15 Sep 2007 17:33:14 -0000 1.4 +++ core.php 30 Sep 2007 17:42:03 -0000 1.5 @@ -200,16 +200,43 @@ } } // }}}1 +class DataHandler // {{{ +{ + /** + * Provides means to hook into the data display sequence to add decorations + * or external behaviour. + * + * Called every time a data entry is displayed by the engine. Handlers are + * registered by Graphic::addDataHandler(). No implementations are provided + * with the distribution. + * + * @param renderer The renderer instance on which the rendering is performed. + * This instance may not be cached for other purposes. + * @param positionData Indicates the coordinate of the data to be rendered. + * Coordinates are renderer-specific. This value is provided + * as an associative array. (x,y) is provided for single-point + * data. (top,left,bottom,right) is provided for regions. + * @param series The key of the source series of the data. + * @param entryIndex The zero-based index of the entry in the series. + */ + function handle( $renderer, $positionData, $series, $entryIndex ) + { + die( "Abstract Function Call" ); + } +} // }}} + class Graphic // {{{1 { var $legend; var $title; var $parameters; + var $dataHandlers; function Graphic() // {{{2 { $this->legend = array(); $this->parameters = array(); + $this->dataHandlers = array(); } function setTitle( $title ) // {{{2 @@ -224,6 +251,12 @@ $this->legend[] = array( $color, $value, $url ); } + function addDataHandler( $handler ) // {{{2 + { + if( $handler instanceof DataHandler ) + $this->dataHandlers[] = $handler; + } + function getRequiredSeries() // {{{2 { // Returns an associative array with series name as key @@ -494,6 +527,12 @@ // Planning some user-preferences, until then, defaults. return array_merge( $this->_default(), $this->parameters ); } + + function _notify( $renderer, $positionData, $series, $index ) // {{{2 + { + foreach( $this->dataHandlers as $handler ) + $handler->handle( $renderer, $positionData, $series, $index ); + } } // }}}1 ?> Index: graph.bar.php =================================================================== RCS file: /cvsroot/tikiwiki/tiki/lib/graph-engine/graph.bar.php,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- graph.bar.php 15 Sep 2007 17:33:15 -0000 1.4 +++ graph.bar.php 30 Sep 2007 17:42:03 -0000 1.5 @@ -4,11 +4,15 @@ class BarBasedGraphic extends GridBasedGraphic // {{{1 { var $columns; + var $styleMap; + var $columnMap; function BarBasedGraphic() // {{{2 { GridBasedGraphic::GridBasedGraphic(); $this->columns = array(); + $this->styleMap = array(); + $this->columnMap = array(); } function getRequiredSeries() // {{{2 @@ -95,10 +99,12 @@ foreach( $columns as $key => $line ) { $style = $data['style'][$key]; + $this->styleMap[$style] = "y$key"; foreach( $line as $key => $value ) { $x = $data['x'][$key]; + $this->columnMap[$x] = $key; if( !isset( $this->columns[$x] ) ) $this->columns[$x] = array(); @@ -130,7 +136,17 @@ $ren = &new Fake_GRenderer( $renderer, $range[0], 0, $range[1], 1 ); break; } - $this->_drawColumn( $ren, $values, $zero ); + $positions = $this->_drawColumn( $ren, $values, $zero ); + + if( is_array( $positions ) ) + { + $index = $this->columnMap[$label]; + foreach( $positions as $style => $positionData ) + { + $series = $this->styleMap[$style]; + $this->_notify( $ren, $positionData, $series, $index ); + } + } } } @@ -260,6 +276,7 @@ $width = $layout['multi-columns-width'] / $count; $pad = ( 1 - $layout['multi-columns-width'] ) / 2; + $positions = array(); $i = 0; foreach( $values as $style=>$value ) { @@ -267,8 +284,12 @@ if( $value == 0 ) continue; - $this->_drawBox( $renderer, $base, $zero, $base + $width, $this->dependant->getLocation( $value ), $style ); + $bottom = $this->dependant->getLocation( $value ); + $this->_drawBox( $renderer, $base, $zero, $base + $width, $bottom, $style ); + $positions[$style] = array( 'left' => $base, 'top' => $zero, 'right' => $base + $width, 'bottom' => $bottom ); } + + return $positions; } function _default() // {{{2 |