\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\ Funzioni di aiuto per implementazione messaggi
\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

: REP_GET_POS.X ( f1 -- n1 ) 
  GET_POS DROP 
;

: REP_GET_POS.Y ( f1 -- n1 ) 
  GET_POS NIP 
;

: REP_GET_SIZE.X ( f1 -- n1 ) 
  GET_SIZE DROP 
;

: REP_GET_SIZE.Y ( f1 -- n1 ) 
  GET_SIZE NIP 
;

: REP_GET_BOTTOM ( f1 -- n1 )
  DUP 
  REP_GET_POS.Y
  SWAP 
  REP_GET_SIZE.Y
  +
;

: REP_OFFSET_FIELD_POS.X ( n1 -- ) 
  #THIS REP_GET_POS.X     \ Legge posizione x
  +                       \ La incrementa di n1
  #THIS REP_GET_POS.Y     \ Legge posizione y
  #THIS SET_POS           \ Aggiorna posizione
;

: REP_OFFSET_FIELD_POS.Y ( n1 -- ) 
  #THIS REP_GET_POS.Y     \ Legge posizione y
  +                       \ La incrementa di n1
  #THIS REP_GET_POS.X     \ Legge posizione x
  SWAP                    \ Scambia le coordinate
  #THIS SET_POS           \ Aggiorna posizione
;

: REP_MESSAGE_ALIGN_BOTTOM ( f1 -- )
  REP_GET_BOTTOM          \ Calcola fondo di f1
  #THIS REP_GET_BOTTOM    \ Calcola fondo del campo corrente
  -                       \ Calcola offset come differenza dei due
  REP_OFFSET_FIELD_POS.Y  \ Incrementa posizione y del campo corrente
;

: REP_MESSAGE_ALIGN_TOP ( f1 -- )
  REP_GET_POS.Y           \ Legge posizione y del capo f1
  #THIS REP_GET_POS.X     \ Legge posizione x del campo corrente
  SWAP                    \ Scambia le coordinate
  #THIS SET_POS           \ Aggiorna posizione del campo corrente
;

: REP_MESSAGE_ALIGN_CENTER ( f1 -- )
  REP_GET_BOTTOM          \ Calcola fondo del campo f1
  #THIS REP_GET_BOTTOM    \ Calcola fondo del campo corrente
  - 2 /                   \ Calcola offset verticale
  REP_OFFSET_FIELD_POS.Y  \ Aggiorna posizione del campo corrente
;

: REP_MESSAGE_ALIGN_UNDER ( f1 -- )
  REP_GET_BOTTOM          \ Calcola fondo di f1
  #THIS REP_GET_POS.Y     \ Calcola inizio del campo corrente
  -                       \ Calcola offset come differenza dei due
  REP_OFFSET_FIELD_POS.Y  \ Incrementa posizione y del campo corrente
;

: REP_COPY_HEIGHT ( f1 -- )
  REP_GET_SIZE.Y          \ Altezza campo origine
  #THIS REP_GET_SIZE.X    \ Larghezza campo destinazione
  SWAP                    \ Scambia parametri per set_size
  #THIS SET_SIZE          \ Aggiorna dimensioni
;

: REP_FIELD_NOT_NULL ( f1 -- f1 b1 )
  SP 
;

\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\ Implementazione dei vari messaggi standard
\ f1 campo o sezione del report
\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

: MESSAGE_ADD ( f1 -- )
  #THIS @                      \ Leggo il valore del campo corrente
  SWAP +!                      \ Incrementa f1 col contenuto del campo corrente
;

: MESSAGE_ALIGN ( s1 f1 -- )
  SWAP                         \ Porta su il tipo di allineamento (BOTTOM)
  "REP_MESSAGE_ALIGN_" SWAP +  \ Si crea il nome della funzione da chiamare
  PERFORM                      \ Chiama ad esempio DO_MESSAGE_ALIGN_BOTTOM, ecc... 
;

: MESSAGE_APPEND ( f1 -- )
  #THIS @                      \ Leggo il valore del campo corrente
  DUP EMPTY=                   \ Controlla se e' vuoto
  IF
    DROP                       \ Scarta il valore nullo 
	DROP                       \ Scarta f1
  ELSE
    OVER @                     \ Leggo il valore di f1
	EMPTY= NEGATE
	IF 
      " " SWAP +               \ Sommo uno spazio all'inizio della stringa
    THEN  
	SWAP                       \ Riporto in primo piano f1
    +!                         \ Incrementa f1 col contenuto della stringa
  THEN
;

: MESSAGE_APPEND_CR ( f1 -- )
  #THIS @                      \ Leggo il valore del campo corrente
  DUP EMPTY=                   \ Controlla se e' vuoto
  IF
    DROP                       \ Scarta il valore nullo 
	DROP                       \ Scarta f1
  ELSE	 
    CR                         \ Inserisco un "a capo"
	SWAP
    +                          \ Sommo un "a capo" all'inizio della stringa
    SWAP                       \ Riporto in primo piano f1
    +!                         \ Incrementa f1 col contenuto della stringa
  THEN
;


: MESSAGE_COPY ( f1 ... fn -- )
  BEGIN                        \ Ciclo sui prametri 
    REP_FIELD_NOT_NULL
  WHILE              
    #THIS @ SWAP !             \ Copia il campo corrente
  REPEAT
;

: MESSAGE_DEBUG ( NULL -- )
  MON                          \ Attiva il fantastico debugger
;

: MESSAGE_DISABLE ( f1 ... fn -- )
  BEGIN                        \ Ciclo sui prametri 
    REP_FIELD_NOT_NULL
  WHILE              
	DISABLE                    \ Report defined word
  REPEAT
;

: MESSAGE_ENABLE ( f1 ... fn -- )
  BEGIN                        \ Ciclo sui parametri 
    REP_FIELD_NOT_NULL
  WHILE              
	ENABLE                     \ Report defined word
  REPEAT
;

: MESSAGE_HIDE ( f1 ... fn -- )
  BEGIN                        \ Ciclo sui prametri 
    REP_FIELD_NOT_NULL
  WHILE              
	HIDE                       \ Report defined word
  REPEAT
;

: MESSAGE_INCR ( f1 ... fn -- )
  BEGIN                        \ Ciclo sui prametri 
    REP_FIELD_NOT_NULL
  WHILE              
	INCR                       \ Native word
  REPEAT
;

: MESSAGE_ISAMREAD ( s1 s2 n1 -- )
  ISAM_READ
;

: MESSAGE_PAGENO ( -- )        \ Numero di pagina corrente
  #REPORT.PAGE @               \ Leggo il numero di pagina
  #THIS !                      \ Setto il campo corrente col numero 
;

: MESSAGE_RESET ( f1 ... fn -- )
  BEGIN                        \ Ciclo sui prametri 
    REP_FIELD_NOT_NULL
  WHILE              
    NULL SWAP !                \ Azzera campo
  REPEAT
;

: MESSAGE_SHOW ( f1 ... fn -- )
  BEGIN                        \ Ciclo sui prametri 
    REP_FIELD_NOT_NULL
  WHILE              
	SHOW                       \ Report defined word
  REPEAT
;

: MESSAGE_SUB ( f1 -- )
  #THIS @                      \ Leggo il campo corrente
  -1 *                         \ Lo cambio di segno
  SWAP +!                      \ Decrementa f1 col contenuto del campo corrente
;

: MESSAGE_TABLEREAD ( s1 s2 s3 -- )
  TABLE_READ
;

: MESSAGE_TODAY ( -- )         \ Data odierna
  #SYSTEM.DATE @               \ Leggo la data
  #THIS !                      \ Setto il campo corrente con la data
;
: MESSAGE_DITTA ( s1 -- )
  FIRM                         \ Campi della ditta corrente
;