{--------------------------------------------------------}
{          Telemark - procedimento de edicao
{--------------------------------------------------------}

unit tmEdita;
interface
uses dvcrt, dvwin, tmVars, tmMsg, tmArquiv;

procedure editaFicha (var qualFicha: TFicha);
procedure edita (posCadastro: integer);
procedure inclui;

implementation

{--------------------------------------------------------}
{                   mostra uma folha
{--------------------------------------------------------}

procedure mostraFolha (qualFicha: TFicha; nsecao, nfolha: integer);
var i: integer;
begin
    limpaTela;

    gotoxy (1, 2);
    textColor (YELLOW);
    if fichaAtual.secao[1]^.nfolhas <> 0 then
        with fichaAtual.secao[1]^.folha[1]^ do write (dado[1]);
    textColor (LIGHTGRAY);

    with qualFicha.secao[nsecao]^ do
        with folha[nfolha]^, pInfoSecao^ do
            begin
                for i := 1 to ndadosParteFicha do
                    begin
                        gotoxy (1, i+4);
                        textBackGround (RED);
                        textColor (WHITE);
                        write (dadosParteFicha[i].nomeCampo:20, ' ');
                        textBackGround (BLACK);
                        textColor (LIGHTGRAY);
                        write (dado [i]);
                    end;
            end;
end;

{--------------------------------------------------------}
{                 passeia sobre os itens
{--------------------------------------------------------}

function passeiaNaFolha (qualFicha: TFicha; nsecao, nfolha: integer; alterando: boolean): char;
var
    qual: integer;
    acabou: boolean;
    c: char;
    s: string;

begin
    qual := 1;
    acabou := false;
    with qualFicha.secao[nsecao]^ do
      with folha[nfolha]^, pInfoSecao^ do
        begin
            gotoxy (1, 3);
            write ('[', nomeParteFicha, ']');
            tentaFalar (nomeParteFicha);
            repeat
                s := dado [qual];
                tentaFalar (dadosParteFicha[qual].nomeCampo);
                sintetiza (s);
                c := sintEditaCampo (s, 22, qual+4,
                      dadosParteFicha[qual].tamCampo, 59, alterando);
                dado[qual] := s;

                case c of
                    CIMA:              qual := qual - 1;
                    BAIX, TAB, ENTER:  qual := qual + 1;

                    CTLPGUP, CTLPGDN,
                    ESC, PGUP, PGDN:   acabou := true;
                end;
                if qual < 1 then qual := 1;
                if qual > ndadosParteFicha then qual := ndadosParteFicha;

            until acabou;
      end;

    passeiaNaFolha := c;
end;

{--------------------------------------------------------}
{                   edita uma secao
{--------------------------------------------------------}

procedure editaSecao (var qualFicha: TFicha; nsecao: integer);
var nf: integer;
    c: char;
begin
    nf := 1;

    repeat
        if qualFicha.secao[nsecao]^.nfolhas < nf then
            criaFolha (qualFicha, nsecao);

        mostraFolha (qualFicha, nsecao, nf);
        c := passeiaNaFolha (qualFicha, nsecao, nf, true);
        if (nf <> 1) and folhaEstaVazia (qualFicha, nsecao, nf) then
             begin
                 destroiFolha (qualFicha, nsecao, nf);
                 if (c = PGUP) and (nf > 1) then nf := nf - 1;
             end
        else
        if c = PGDN then
            begin
                if nsecao > 1 then nf := nf + 1
                else
                    begin
                        msgBaixo ('TMSEMPAG');   {'Não há mais páginas nesta seção'}
                        delay (500);
                    end
            end
        else
        if c = PGUP then
            begin
                if nf > 1 then nf := nf - 1;
            end
        else
        if c = CTLPGUP then  nf := 1
        else
        if c = CTLPGDN then  nf := qualFicha.secao[nsecao]^.nfolhas;

    until c = ESC;
end;

{--------------------------------------------------------}
{                   edita uma ficha
{--------------------------------------------------------}

procedure editaFicha (var qualFicha: TFicha);
var nsecao, i, erro: integer;
    s: string;
label inicio;
begin
inicio:
    repeat
        limpaTela;

        gotoxy (1, 2);
        textColor (YELLOW);
        if fichaAtual.secao[1]^.nfolhas <> 0 then
            with fichaAtual.secao[1]^.folha[1]^ do write (dado[1]);
        textColor (LIGHTGRAY);

        gotoxy (1, 4);

        if qualFicha.secao[1]^.nfolhas <> 0 then
            begin
                for i := 1 to nPartesModelo do
                     writeln ('   ', i:2, ' - ', fichaModelo[i]^.nomeParteFicha);

                writeln;
                write ('           ');
                mensagem ('TMNUMSEC', 0);    {'Qual seção ? '}

                nsecao := 0;
                sintReadln (s);
                if (s = '') then exit;

                val (s, nsecao, erro);
                if (erro <> 0) or (nsecao <= 0) or (nsecao > nPartesModelo) then
                    begin
                        writeln;
                        write ('       ');
                        mensagem ('TMNUMERR', 1);    {'Digite um número correto ! '}
                        for i := 1 to nPartesModelo do
                            begin
                                str (i, s);
                                sintetiza (s);
                                tentaFalar (fichaModelo[i]^.nomeParteFicha);
                            end;
                        goto inicio;
                    end;
            end
        else
            nsecao := 1;

        editaSecao (qualFicha, nsecao);

    until false;
end;

{--------------------------------------------------------}
{                   edita um registro
{--------------------------------------------------------}

procedure edita (posCadastro: integer);
begin
    destroiFicha (fichaAtual);
    criaFicha (fichaAtual);

    if not leFicha (fichaAtual, pessoas^[posCadastro]^.nomeArq) then
        begin
            msgBaixo ('TMFICSUM');   {'Ficha sumiu'}
            delay (500);
        end
    else
        begin
            editaFicha (fichaAtual);
            gravaFicha (fichaAtual);
        end;
end;

{--------------------------------------------------------}
{                   inclui um registro
{--------------------------------------------------------}

procedure inclui;
var i, j: integer;
begin
    if cadastrados >= MAXCADASTRO then
         begin
             mensagem ('TMEXCEDI', 1);  {'Excedida capacidade de cadastramento desta versão do programa'}
             exit;
         end;

    mensagem ('TMNOVO', 1);    {'Novo registro'}

    destroiFicha (fichaAtual);
    criaFicha (fichaAtual);
    editaFicha (fichaAtual);
    if fichaAtual.secao[1]^.folha[1]^.dado[1] = '' then
        begin
            mensagem ('TMFICNAO', 1);   {'Ficha sem nome, não foi gravada'}
            exit;
        end;

    gravaFicha (fichaAtual);

    cadastrados := cadastrados + 1;
    new (pessoas^[cadastrados]);
    with fichaAtual.secao[1]^, folha[1]^, pInfoSecao^ do
        with pessoas^[cadastrados]^ do
            begin
                nome     := dado[1];
                telefone := dado[2];
                status   := dado[3];
                nomeArq  := fichaAtual.nomeArqFicha;
                selecionado := true;

                if nome < pessoas^[posAtual]^.nome then
                    posAtual := posAtual + 1;
            end;
end;

end.