]> git.llucax.com Git - mecon/meconlib.git/blobdiff - lib/MECON/PDF/Tabla.php
Se modifica el método acumular para que las secuencias se pinten automáticamente...
[mecon/meconlib.git] / lib / MECON / PDF / Tabla.php
index 414b0192695f9a93aef1f3f3a2b07ddc6349a81e..719962fd4c4b08157b69a9051a491a74d5f8b7da 100644 (file)
@@ -105,13 +105,21 @@ class MECON_PDF_Tabla extends MECON_PDF_Contenido {
     function _obtenerAlineacionTexto($row, $col, $texto, $attr, $estilo) {
         
         $at = $this->_tabla->getCellAttributes($row, $col);
+
+        if (@$at['colspan']) {
+            $offset = $at['colspan'];
+        }
+        else {
+            $offset = 1;
+        }
+        
         if (@$at['align'] == 'center') {
             $tam = $this->_marco->strlen($texto, $estilo);
-            $init = $attr[$col] + ($attr[$col+1] - $attr[$col] - $tam) / 2;
+            $init = $attr[$col] + ($attr[$col+$offset] - $attr[$col] - $tam) / 2;
         }
         elseif (@$at['align'] == 'right') {
             $tam = $this->_marco->strlen($texto, $estilo);
-            $init = $attr[$col+1] - $tam + 1;
+            $init = $attr[$col+$offset] - $tam + 1;
         }
         else {
             $init = $attr[$col];
@@ -151,6 +159,9 @@ class MECON_PDF_Tabla extends MECON_PDF_Contenido {
         else {
             $estilo = $this->_config['celda_comun'];
         }
+        if (@$clase['colspan']) {
+            $estilo['colspan'] = $clase['colspan'];
+        }
         return $estilo;
     }
 
@@ -163,14 +174,21 @@ class MECON_PDF_Tabla extends MECON_PDF_Contenido {
     function _obtenerAnchoColumnas() {
         $ancho_pagina = $this->_marco->getWidth($this->_marco->refPage(),
                 $this->_marco->getOrientation());
-        for ($i=0; $i<$this->_tabla->getColCount(); $i++ ) {
-            $tmp = $this->_tabla->getCellAttributes(0,$i);
-            if (is_null(@$tmp['width'])) {
-                die ('Todas las columnas deben tener asignado un ancho.');                
+        for ($row = 0; $row<$this->_tabla->getRowCount(); $row++) {
+            for ($i=0; $i<$this->_tabla->getColCount(); $i++ ) {
+                $tmp = $this->_tabla->getCellAttributes($row,$i);
+                if(@intval($tmp['width']) != 0)
+                    $attr[$i] = intval($tmp['width']);
+                if(@count($attr) == $this->_tabla->getColCount())
+                  break 2;
             }
-            $attr[$i] = intval($tmp['width']);
         }
+        
+        if (!isset($attr))
+            die ('Todas las columnas tienen que tener un ancho asignado');
+        
         $tmp = array_sum($attr);
+        
         $attr2[0] = 0;
         for ($i=1; $i<count($attr); $i++) {
             $attr2[$i] = intval(($ancho_pagina * $attr[$i-1] / $tmp) +
@@ -206,14 +224,28 @@ class MECON_PDF_Tabla extends MECON_PDF_Contenido {
             $orientacion = $this->_marco->getOrientation();
             $alto = $this->_marco->espacioDisponible;
         }
-
         $attr2 = $this->_obtenerAnchoColumnas();
         for ($i = 0; $i < $this->_tabla->getRowCount(); $i++) {
             $max = 0;
             for ($j = 0; $j < $this->_tabla->getColCount(); $j++) {
                 $estilo = $this->_obtenerEstiloCelda($i, $j);
-                $txt = $this->_marco->wordWrap($this->_tabla->getCellContents($i,$j),
-                        $attr2[$j+1] - $attr2[$j], $estilo);
+
+                //Actuo por el colspan
+                if (@$estilo['colspan']) {
+                    if ($estilo['colspan'] > $this->_tabla->getColCount()) {
+                        $estilo['colspan'] = 
+                            $this->_tabla->getColCount() - $j;
+                    }
+                    $ancho_columna = $attr2[$j+$estilo['colspan']] - 
+                        $attr2[$j];
+                }
+                else {
+                   $ancho_columna = $attr2[$j+1] - $attr2[$j];
+                }
+                $txt = $this->_marco->wordWrap(
+                        @$this->_tabla->getCellContents($i,$j), $ancho_columna, 
+                        $estilo);
+                
                 $txtt[$j] = $txt; //Esto es para no hacer el wordWrap siempre
                 $max = max($estilo['alto_linea'] * count($txt), $max);
                 
@@ -224,7 +256,6 @@ class MECON_PDF_Tabla extends MECON_PDF_Contenido {
                     $repetir[$i]['max'] = $max;
                 }
             }
-            
             if ($alto <= 0) 
             {
                 $this->_newPage();               
@@ -234,10 +265,25 @@ class MECON_PDF_Tabla extends MECON_PDF_Contenido {
                     $alto -= $repetir[$ii]['max'];
                     for ($jj = 0; $jj < $this->_tabla->getColCount(); $jj++) {
                         $estilo = $this->_obtenerEstiloCelda($ii, $jj);
-                        $this->_marco->addRectangle($attr2[$jj], $alto,
-                                $attr2[$jj+1],  $alto+$repetir[$ii]['max'],
-                                @$estilo['fill'], null, $orientacion);
+
+                        //Actuo por el colspan
+                        if (@$estilo['colspan']) {
+                            if ($estilo['colspan'] > $this->_tabla->getColCount()) {
+                                $estilo['colspan'] =
+                                    $this->_tabla->getColCount() - $jj;
+                            }
+                            $der = $attr2[$jj+$estilo['colspan']];
+                            $izq = $attr2[$jj];
+                        }
+                        else {
+                           $der = $attr2[$jj+1];
+                           $izq = $attr2[$jj];
+                        }
+
                         
+                        $this->_marco->addRectangle($izq, $alto, $der, 
+                                $alto+$repetir[$ii]['max'], @$estilo['fill'], 
+                                null, $orientacion);
                         $alto1 = $alto + $repetir[$ii]['max'];
                         foreach ($repetir[$ii][$jj] as $t) {
                             $alto1 -= $estilo['alto_linea'];
@@ -249,6 +295,11 @@ class MECON_PDF_Tabla extends MECON_PDF_Contenido {
                             $this->_marco->addText($init, $alto1 + 2,
                                     $t, $estilo, null, $orientacion);
                         }
+
+                        if (@$estilo['colspan']) {
+                            $jj += $estilo['colspan'] -1;
+                        }
+                        
                     }
                 }
                 
@@ -256,12 +307,25 @@ class MECON_PDF_Tabla extends MECON_PDF_Contenido {
             
             $alto -= $max;
             for ($j = 0; $j < $this->_tabla->getColCount(); $j++) {
-
+                
                 $estilo = $this->_obtenerEstiloCelda($i, $j);
+                 
+                //Actuo por el colspan
+                if (@$estilo['colspan']) {
+                    if ($estilo['colspan'] > $this->_tabla->getColCount()) {
+                        $estilo['colspan'] = $this->_tabla->getColCount()  - 1;
+                    }
+                    $der = $attr2[$j+$estilo['colspan']];
+                    $izq = $attr2[$j];
+                }
+                else {
+                   $der = $attr2[$j+1];
+                   $izq = $attr2[$j];
+                }
+
                 
-                $this->_marco->addRectangle($attr2[$j], $alto,
-                        $attr2[$j+1], $alto+$max, @$estilo['fill'], null,
-                        $orientacion);
+                $this->_marco->addRectangle($izq, $alto, $der, $alto+$max, 
+                        @$estilo['fill'], null, $orientacion);
                 
                 $alto1 = $alto + $max;
                 if (@$txtt[$j]) {
@@ -276,6 +340,10 @@ class MECON_PDF_Tabla extends MECON_PDF_Contenido {
                                 $t, $estilo, null, $orientacion);
                     }
                 }
+                if (@$estilo['colspan']) {
+                    $j += $estilo['colspan']-1;
+                }
+
             }
         }
         $this->_marco->espacioDisponible = $alto;