/*******************************************************************************
es el procedimiento que lleva a cabo el proceso de impresion, en caso de no
definirse se imprime el procedimiento definido en Crowse(). Si se define un
string, lo ejecuta como procedimiento recibiendo como parametro los arreglos
CAMP, HEAD, PICT, y PRO_IMP que contiene los encabezados. Alternativamente
se puede pasar en este parametro, un arreglo que contenga los encabezados de
las columnas de impresion en caso de no coincidir con los encabezados de pantalla.
La longitud debe ser menor o igual al arreglo CAMP.
A este arreglo se le pueden definir 7 elementos extras, que se usaran de control
el el procedimiento de impresion definido en Crowse(). Estos 7 elementos deben ser
contiguos y estar ubicados por encima de la longitud de CAMP.

El #1 elemento extradefinido ser  usado como corte de control en iteracion de impresion.
El #2 elemento, como encabezado de hoja.
El #3 elemento, como ubicador de puntero para iniciar impresion.
El #4 elemento en un valor logico que autoriza a seleccionar los campos a imprimir.
El #5 elemento fija el comienzo de impresion de luego de los titulos de columna,
    estos titulos se imprimiran en la linea - 1.
El #6 elemento es el nombre de una funcion que retorna el valor de la fila de
    impresion, recibiendo como parametro la fila, la cantidad de lineas por hoja,
    la linea de comienzo, la columna inicial de impresion y como 5ř parametro si
    se llama desde los titulos o desde los campos.
El #7 elemento determina el SOFTSEEK para el DBSEEK() del punto #3, en caso de no
    definirse un valor logico, se asumira el valor .F..
El #8 elemento complementa al #4, este determina para aquellos casos en que el
    titulo esta partido, la impresion tome los que esta antes del 1ř <;>, o lo
    que esta despues.
El #9 elemento, pregunta antes de imprimir si imprime sobre impresora carro ancho
    o agosto. Cada elemento puede no estar definidos, en cuyo caso el Crowse()
    asume valores por defecto por c/opcion.

qTIT  define como se toma el título de la columna 0 = todo, 1 = 1er mitad, 2da mitas
********************************************************************************/
#include "set.ch"
#include "Gra.ch"
#include "print.ch"
#include "union.ch"
#include "myinkey.ch"

#define CR_    Chr( 13 ) + Chr( 10 )

*
Procedure W_ImpBr_PIK( CAMP_, HEAD_, PICT_, TIR_ )
*
*Begin
   Local TIT, R, COND, nI, BUS, Y, nY, lSF, nLL, nLIN, nCPL, aTxL, PAN, aPrn
   Local nREC, G, oPPS, oOldF, oDC, aSize, oF, TITc, A3, nLC, SI_, nPAG
//   qTIT :=0
   COND :='.T.'
   lSF :=Set( _SET_SOFTSEEK, .F. )
   TIT :="Listado al " + DToC( Date() )
   If ( ValType( TIR_ ) = "A" )
      nI :=Len( HEAD_ )
      If ( Len( TIR_ ) >= Len( HEAD_ ) + 1 )  // corte de control
         If ( ValType( TIR_[ nI + 1 ] ) = "C" )
            If ( ValType( &( TIR_[ nI + 1 ] ) ) = "L" )
               COND :=TIR_[ nI + 1 ]
            EndIF
         EndIF
      EndIF
      If ( Len( TIR_ ) >= Len( HEAD_ ) + 2 )  // titulo
         If ( ValType( TIR_[ nI + 2 ] ) = "C" )
            TIT :=TIR_[ nI + 2 ]
         EndIF
      EndIF
      If ( Len( TIR_ ) >= Len( HEAD_ ) + 3 )  // busqueda dentro del indice de la base
         If ( TIR_[ nI + 3 ] != NIL .And. ValType( TIR_[ nI + 3 ] ) != "L" )
            BUS :=TIR_[ nI + 3 ]
         EndIF
      EndIF
      If ( Len( TIR_ ) >= Len( HEAD_ ) + 5 )  // comienzo de imp.desp.de los titulos
         If ( ValType( TIR_[ nI + 5 ] ) = "N" )
            //nCI :=TIR_[ nI + 5 ]
         EndIF
      EndIF
      If ( Len( TIR_ ) >= Len( HEAD_ ) + 7 )  // determina SOFT SEEK
         If ( ValType( TIR_[ nI + 7 ] ) = "L" )
            lSF :=Set( _SET_SOFTSEEK, TIR_[ nI + 7 ] )
         EndIF
      EndIF
      If ( Len( TIR_ ) >= Len( HEAD_ ) + 8 )  // determina si se toma el nombre de la columna antes de la ';' o despues
         If ( ValType( TIR_[ nI + 8 ] ) = "N" )
            //qTIT :=TIR_[ nI + 8 ]
         EndIF
      EndIF
   EndIF
   nLL  :=0
   TITc :=''                              // cargo el titulo de los campos
   aTxL :={}                               // arreglo que contiene el largo de c/col
   If ( PICT_ = NIL )
      PICT_ :=Array( Len( CAMP_ ) )
      AFill( PICT_, '' )
   EndIF
   For R := 1 To Len( CAMP_ )              // recorro la linea
      If ( PICT_[R] = NIL )
         PICT_[R] :=Replicate( 'X', Len( Var2Char( &(CAMP_[R]) ) ) )
      EndIF
      nLC :=Max( Len( Transform( &(CAMP_[R]), PICT_[R] ) ), Len( HEAD_[R] ) )
      nLL +=nLC + 2                         // sumo el ancho más la separación
      TITc +=Pad( HEAD_[R], nLC + 2 )
      AAdd( aTxL, nLC )
   Next R                                  // del FOR A2
   If ( BUS = NIL ); dbGoTOP()             // si no se definio comienzo de imp.
    Else           ; dbSeek( BUS )         // si se definio comienzo de imp.
   EndIF
   nLIN :=60                               // preasumo tamano A4
   Set( _SET_SOFTSEEK, lSF )
   If     ( nLL <=  80 ); SI_ := t80cpl  ; nCPL := 81
   ElseIf ( nLL <= 100 ); SI_ :=t100cpl  ; nCPL :=103
   ElseIf ( nLL <= 132 ); SI_ :=t132cpl  ; nCPL :=135
   Else                 ; SI_ :=t160cpl  ; nCPL :=161
   EndIF
   G    := ReadINI( '[Impresoras]',, 'ImpresoraPorDefecto' )
   nREC :=RecNo()
   oOldF :=GraSetFont()
   oDC  := XbpPrinter():New()
   aPrn := oDC:List()
   If ( aScan( aPrn, { | x | Upper( x ) == Upper( G ) } ) = 0 )
      G := NIL                             // imprimo en la impresora por defecto
   EndIF
   aPrn:Create()
   G := 0
   If ( oDC:devName = NIL )
      MsgBox( 'Imposible Imprimir' + CR_ + CR_ +'No Hay Impresora Instalada' + CR_ + CR_ + 'Instale Una Desde el Panel de Control' )
    Else
      PAN   := Mensaj():New():Create(,, 'Imprimiendo....' )
      oPPS  := XbpPresSpace():New( oDC )
      aSize := oDC:paperSize()
////// aSize[1] = Margen derecho - Margen Izquierdo
////// aSize[2] = Margen inferior - Margen superior
      aSize           := { aSize[5] - aSize[3], aSize[6] - aSize[4] }
      oPPS:Create( oDC, aSize , GRA_PU_LOMETRIC )
/////  GRA_PU_LOMETRIC = 0.1 milimetros
      oPPS:device():startDoc()
      nPAG            :=1                             // contador de paginas
      oF              := XbpFont():new( )
      oF:FamilyName   := "Courier New"
      oF:CompoundName := "12.Courier New"
      oF:height       := 51
      oF:width        := SI_
      oF:Create()
      oPPS:SetFont( oF )
      While ( !Eof() .And. G != K_ESC .And. &COND )
         oPPS:device():startPage()
         Y     :=1
         nY    := oPPS:device():paperSize()[2] - 100
         aSize := GraQueryTextBox( oPPS, TIT )// imprimo titulo de hoja
         nY    := nY - ( aSize[1,2] + 5 )
         Y     += 1
         GraStringAt( oPPS, { 20, nY }, TIT )
         nY    := nY - ( aSize[1,2] + 5 )
         Y     += 1
///////  imprimo titulo de campos
         aSize := GraQueryTextBox( oPPS, PadC( TITc, nCPL ) )
         nY    := nY - ( aSize[1,2] + 5 )
         Y     += 1
         GraStringAt( oPPS, { 20, nY }, PadC( TITc, nCPL ) )
         nY    := nY - ( aSize[1,2] + 5 )
         Y     += 1
         While ( !Eof() .And. G != K_ESC .And. Y <= nLIN .And. &COND. )
            A3 :=''
            For R := 1 To Len( CAMP_ )      // recorro la linea
               If ( Len( A3 ) < nLL )
                  A3 +=Pad( Transform( &(CAMP_[R]), PICT_[R] ), aTxL[ R ] ) + "  "
               EndIF
            Next R                         // del FOR A2
            aSize := GraQueryTextBox( oPPS, PadC( A3, nCPL ) )
            nY    := nY - ( aSize[1,2] + 5 )
            Y     +=1
            GraStringAt( oPPS, { 20, nY }, PadC( A3, nCPL ) )
            Skip
            G :=InKey_()
         EndDO                             // del While del corte de hoja
         //A1 :=oF:width
         nY              := nY - ( aSize[1,2] + 5 )
         oF:width        := t132cpl
         oF:Configure()
         oPPS:SetFont( oF )
         A3 :=PadC( " - " + tPag + " " + lTrim( Str( nPAG, 6 ) ) + " - ", 135 )
         aSize := GraQueryTextBox( oPPS, A3 )
         While ( Y <= nLIN + 1 )
            nY    := nY - ( aSize[1,2] + 5 )
            Y +=1
         EndDO
         GraStringAt( oPPS, { 20, nY }, A3 )
         oF:width        := SI_            // restauro valor
         oF:Configure()
         oPPS:SetFont( oF )
         oPPS:device():endPage()
         nPAG +=1
      EndDO                                // del While !Eof()....
/*        lo deshabilito porque no lo probé
      If ( ValType( FOOT_ ) = 'A' )
         A3 :=''
         For R := 1 To Len( CAMP_ )   // recorro la linea
            If ( Len( A3 ) < nLL )
               A3 +=Pad( Transform( FOOT_[R], PICT_[R] ), nLC ) + "  "
            EndIF
         Next R
         aSize := GraQueryTextBox( oPPS, Pad( A3, nCPL ) )
         nY    := nY - ( aSize[1,2] + 5 )
         Y +=1
         GraStringAt( oPPS, { 20, nY }, Pad( A3, nCPL ) )
      EndIF
*/
      oPPS:device():endDoc()
      oF:destroy()
      oPPS:destroy()
      PAN:Destroy()
   EndIF                                   // del If oDC:devName = NIL
   oDC:destroy()
   dbGoTo( nREC )
   GraSetFont(, oOldF )
   Return
*End;
*