{**********************************************************************
Copyright (C) 2009 by Salvatore Licciardi

Web http://www.webalice.it/turylicciardi    eMail turylicciardi@tiscali.it

 This program is free software: you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
 Foundation, version 3 of the License.
 This program is distributed in the hope  that it will be useful , but WITHOUT
 ANY WARRANTY without even the implied warranty  of MERCHANTABILITY or FITNESS
 FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details. You should have received
 a copy of the GNU General Public License along with this program. If not, see
 http://www.gnu.org/licenses/

 **********************************************************************}

unit type_var;
{$MODE objfpc}
interface

{$H+}  // longstring
{$ifdef Win64}
 {$define Win32}
{$endif}
{$ifdef Go32v2}
 {$define TxtCrt}
{$endif}
{$ifdef Win32}
 {$define TxtVideo}
{$endif}
{$ifdef OS2}
 {$define TxtVideo}
{$endif}
{$ifdef Linux}
 {$define TxtCrt}
{$endif}

uses LDU_PCH,MClick22,Lista_S,Select,Print2,
      {$ifdef TxtCrt}
      Menu_X,Menu_Y,
      {$endif}
      {$ifdef TxtVideo}
      Menu_X_V,Menu_Y_V,
      {$endif}
      T_Notes,T_Ini,T_Lingua;

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

// ver 1.xx

type Selez=record
           Y1:integer;
           X1:byte;
           Y2:integer;
           X2:byte;
           end;

     Stringhe=array of string;  // ver 2.74

const next_max_righe_txt:longint=6000+2;  // ver 2.74
      next_max_righe_esa:longint=810+2;   // ver 2.74
      unprintable={$ifdef Linux}[0..31,127,155]{$else}[0,7,8,10,13]{$endif};
      as_word=['A'..'Z','a'..'z','0'..'9']; // ver 3.25

const barra_pag:boolean=false;
      mancino:boolean=false;
      salva_tab:boolean=false;
      Tab_num:integer=8;

{$ifdef Go32v2}
var save_screen : array[0..50{righe_max}*80{colonne_max}*2-1] of byte;
    old_x,old_y:byte;
    old_textmode:word;
{$endif}

var filex:text;

    Verticale{barra},x,y{cursore},mox,moy,stato{per il mouse},
    x_reale,max_righe_video{ver 2.20},delimitatore:BYTE;

    ignora{Mai/Min},sotto_{direzione ricerca},jolly{cerca},SC{solo conteggio},
    tutto{sostituzione ovunque},pInt{cerca parola intera},BK{salva backup},
    adiacente{selezione},binario{formato esadecimale/testo non noti},
    modifica{file},topo{enable/disable},ins{tasto},UnoS{1 spazio tra parole},
    AutoDetect{apertura file intelligente},sl{sola lettura},CL{cursore libero},
    sfinal{salva spazi finali},IOF{r/w sul file},selezione{cerca/sostituisce in...},
    Home,Fine_{tasti},selezione_quadrata,Segnala_Errori{quando si va in shell},
    un_bak{creazione primo file di backup}:BOOLEAN;

    copie{stampa},iy{puntatore riga},ymax{max y},frequenza{rate 0..31},
    ritardo{delay 0..3},next_length_TXT,next_length_ESA{per la riga},
    lunghezza_riga:INTEGER;

    old_selezionato,selezionato:selez;

    testo: stringhe;

    MOrizzontale,MVerticale,ClickDelay:LONGINT;
    Tot{parte del file Bin},file_size_byte:int64; // 2.87

    Annulla_Txt,Estensioni:ListaDinamicaUnidirezionale;

    est_note{Esadecimale/Testo/Ask/Predefinito},est_non_note:CHAR;

    cerco,sostituto,percorso,SaveShell,RunShell,RunEdit,opzioni_da_terminale,
    KS,start_dir_default_path,start_dir_prompt:shortstring; // update 2.45
    nomefile,the_files{quelli jolli indicati in apri_file}:string;

    {$ifdef TxtVideo}
    _start,_end:integer; {area di refresh necessaria}
    {$endif}
    Doppio_Click:More_Click;
    Annulla_Esa:Lista_Esadecimale;
    salvato:pointer;
    ListaX:menulista_x;                   // ver 2.00
    ListaY: array [1..13] of menulista_y;
    {ver 2.00 fino a 6,
     7=ver 2.10 (+stampa),
     9=ver 2.40 (+visualizza +recenti),
     10=ver 2.69 con NUOVO aggiornato con submenu,
     11=ver 2.77 con CONVERTI aggiornato con submenu
     12=ver 2.83 con SALVA COPIA aggiornato con submenu }


{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

// ver 2.00 .. 2.3x

const salva_formato:char='T'; //T,B,L,U formato testo/big/little/UTF per salvare ver 2.20
const min_righe_video=25;
var menu__x:byte;
    apri_formato:char;  // Esa Txt Auto  ver 2.20
    short_name:shortstring;  // ver 2.20
    Annulla_Selezione:ListaDinamicaUnidirezionale;
    vera_tastiera:boolean;

const not_text=[0..8,11,12,14..31]{$ifdef Linux}+[127,155]{$endif};
      ver='3.30'; // versione
      intestazione_UTF=#239+#187+#191;  // EF  BB  BF
      intestazione_B=#254+#255;         // FE  FF       unicode, big endian
      intestazione_L=#255+#254;         // FF  FE       unicode, little endian

{$ifdef Go32v2}
var save_shell : array[0..50{righe_max}*80{colonne_max}*2-1] of byte;
    save_shell_x,save_shell_y:byte;
{$endif}

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

// ver 2.40

const min_mem_avail=500;

type  multi_file_tipo=record

         // da t_edit_2
         salva_formato:char;  // T,B,L,U formato testo/big/little/UTF per salvare ver 2.20
         apri_formato:char;   // Esa Txt Auto
         short_name:shortstring;
         Annulla_Selezione:ListaDinamicaUnidirezionale;

         // da t_edit32
         salva_tab:boolean;  // tabulazione
         Tab_num:integer;
         x,                  // testo
         y,
         x_reale:BYTE;

         ignora{Mai/Min},    // ricerca e sostituzione: le variabili 'cerco' e 'sostituto' sono condivise
         sotto_{direzione ricerca},
         jolly{cerca},
         SC{solo conteggio},
         tutto{sostituzione ovunque},
         pInt{cerca parola intera},

         BK{salva backup},   // varie
         adiacente{selezione},
         binario{formato esadecimale/testo non noti},
         modifica{file},
         ins{tasto},
         UnoS{uno spazio tra parole},
         AutoDetect{apertura file intelligente},sl{sola lettura},CL{cursore libero},
         sfinal{salva spazi finali},
         selezione{cerca/sostituisce in...},
         per_riga, {ricerca riga per riga indifferentemente dalla posizione delle parole}
         Home,
         Fine_{tasti},
         selezione_quadrata,
         un_bak:BOOLEAN;

         iy{puntatore nel vettore},
         ymax{max y},
         lunghezza_riga:INTEGER;

         old_selezionato,selezionato:selez;

         testo: Stringhe;

         Tot{parte del file Bin},file_size_byte:int64;

         Ripristina_Txt,         // ver 3.15
         Ripristina_Selezione,   // ver 3.15
         Annulla_Txt:ListaDinamicaUnidirezionale;

         percorso,
         nomefile:string;
         delimitatore:byte;

         Annulla_Esa:Lista_Esadecimale;

         salvato:pointer;

         // locale
         aperto:boolean;  // se true, significa che e' tutto in memoria, altrimenti, e' stato scaricato perche' chiuso
         attributi_del_file:string;            // ver 2.52
         x_min,x_riga,                         // ver 2.62
         max_righe:integer;                    // ver 2.83
         end;

var multi_file: array of multi_file_tipo;
    posizione_file_attuale:longint;       // ver 2.40
    files_da_terminale:Lista_Esadecimale; // ver 2.50
    forza_apertura:byte;                  // ver 2.50
    Lista_Visualizza:Sfoglia_Dati;        // ver 2.52
    max_larghezza_menu_visualizza:longint;// ver 2.52
    attributi_del_file:shortstring;       // ver 2.52
    stato_appunti:Indicatore_Appunti;     // ver 2.53 ' -\|/'

const max_larghezza=80; {numero colonne}  // ver 2.54
      ambiente_terminale={$ifdef Linux}'SHELL'{$else}'COMSPEC'{$endif}; // $SHELL e %COMSPEC%
      opz={$ifdef Linux}'-'{$else}'/'{$endif};  // separatore opzioni da terminale
      inv={$ifdef Linux}'/'{$else}'-'{$endif};  // indicatore opzioni inverse da terminale
      pallino_modifica='*';

var Appunti: array of Lista_Esadecimale;  // ver 2.58 (prima non era un vettore)
    appunti_usato:longint;  // si parte da 0: se -1 significa non usato
    Num_Notes:longint;    // numero massimo di appunti memorizzabili: 0=infinito , 1<Num_Notes<2G
    Editor_Ini:Ini_File;  // ver 2.59
    x_min,x_riga:integer; // ver 2.62
    no_update:boolean;    // ver 2.62
    stampante:print;      // ver 2.63
const lunghezza_riga_forzata:integer=0;  // ver 2.69
      max_rtf_size=3276;  // ver 2.96

type  attributi_Htm=record  // ver 2.77
         titolo:boolean;
         fine_riga_br:boolean;     // <br> (predefinito) , altrimenti <p></p>
         font:string;       // ver 2.94
         colore_testo:string[6];   // FFFFFF  r,g,b; stringa vuota=ignora
         colore_sfondo:string[6];  // FFFFFF  r,g,b; stringa vuota=ignora
         h:byte;                   // 0..6: <h>  ,  0=ignora
         size:integer;             // 0..7: size= dentro font , 0=ignora
         allinea:integer;          // 0=ignora, 1=sinistra, 2=destra, 3=centro 4=giustificato
         corsivo:boolean;          // 0=stampatello, 1=corsivo (tutte le righe)
         grassetto:boolean;        // 0=ignora, 1=grassetto (tutte le righe)
         sottolineato:boolean;     // 0=ignora, 1=sottolineato (tutte le righe) // ver 2.93
         selezione:boolean;
         size_rtf:integer;         // 1..1638, ovvero 1..1638*2=3276  ver 2.96
         end;

var htm:attributi_Htm;  // ver 2.77
    max_righe:integer;  // ver 2.83
    apri_file_caricati:boolean;  // ver 2.85
    mem_automatica:boolean;      // ver 2.88
    menu_selezione_speciale:byte;          // ver 3.03
    menu_selezione_formattato:byte;        // ver 3.04
    Ripristina_Txt,Ripristina_Selezione:ListaDinamicaUnidirezionale;  // ver 3.15

const spunta='V';     // ver 3.03   Il simbolo di spunta dei Menu

var Lingue:Lingua;    // ver 3.20
    per_riga:boolean; // ver 3.23

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

implementation

begin
end.

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}

{ COMMENTI
 "adiacente" e' quel booleano che se TRUE, unifica la vecchia selezione con
   la nuova, per farne una sola
}
