{--------------------------------------------------------}
{    Programa WordWtil
{    Interface com o Word
{    Biblioteca de utilitários
{--------------------------------------------------------}

unit WuUtil;

interface

uses dvcrt,winprocs,strings, wintypes,dvwin, dvmacro,
     WuVars, WuMensa;

procedure enviaCarac (carac: word);
function  pegaLinha: string;
procedure trocaJanela (newJan :hwnd);
procedure modificaLinha (new_Line:string; muda:boolean);
procedure focaJanela (jan:integer);
procedure criaParagrafo;
procedure continuaParagrafo;
function  janelaAtual (jan:integer):string;
function  marca:boolean;
procedure desmarca;
procedure marcaLinha;
procedure marcaTudo;
procedure blocoAjuda;
procedure quebraLinha2 (o:integer);
function  isolaPalavra:boolean;
procedure VerificaClipBoard;
procedure juntaAsLinhas;
procedure esperaProgVoltar;
procedure cancelaMonitor;

implementation

{-------------------------------------------------}
procedure cancelaMonitor;  {  cancela o monitvox  }
{-------------------------------------------------}
var janMonitor, janAtual: hWnd;
begin
    janMonitor := findWindow (NIL, 'MONITVOX');
    monitorAtivo := janMonitor <> 0;
    janAtual := getFocus;
    if monitorAtivo then
        begin
            showWindow (janMonitor, sw_maximize);
            playInit (300);
            playVirtKey (VK_F4, false, false, true, 1);
            playStart;
            while  playIsActive do;
        end;
    setFocus (janAtual);
end;

{--------------------------------------------------------------}
procedure esperaProgVoltar;   { espera que saia de um programa }
{--------------------------------------------------------------}
var nomeNovo: array [0..100] of char;
    i: integer;
begin
    i := 0;
    repeat
        delay (1000);   { nao remova este delay }
        GetWindowText (getFocus, nomeNovo, 100);
        i := i + 1;
    until (strComp (meuNome, nomeNovo) <> 0) or (i > 10);

    repeat
        delay (1000);
        GetWindowText (getFocus, nomeNovo, 100);
    until strComp (meuNome, nomeNovo) = 0;
end;

{--------------------------------------------------------}
procedure continuaParagrafo;
{ continua no mesmo paragrafo quando o ENTER for teclado }
{--------------------------------------------------------}

begin
   trocaJanela (Jan_Prog);

   enviaCarac (VK_END);
   enviaCarac (VK_SPACE);

   trocaJanela (Minha_Jan);
end;

{---------------------------------------------------}
procedure criaParagrafo;   { cria Um novo paragrafo }
{---------------------------------------------------}
begin
   trocaJanela (Jan_Prog);
   delay (50);
   enviaCarac (VK_END);

   delay (50);
   enviaCarac (VK_RETURN);

   trocaJanela (Minha_Jan);
end;

{------------------------------------------------}
procedure verificaClipBoard;
{ verifica se a area de transferencia foi mudada }
{------------------------------------------------}
begin
   getClipBoard (novClip_Board,8000);

   (* se forem diferentes e porque mudou *)
   if not (strComp (novClip_Board, Clip_Board) = 0) then
      getClipBoard (Clip_Board,8000);
end;
{--------------------------------------------------------}
procedure juntaAsLinhas;  { juntas tres linhas separadas }
{--------------------------------------------------------}
begin
   trocaJanela (Jan_Prog);

   (* junta a linha modificada com a linha posteriaao *)
   enviaCarac (VK_END);
   enviaCarac (VK_DELETE);
   enviacarac (VK_RIGHT);
   enviaCarac (VK_DELETE);

   (* Junta a linha atual com a linha superior *)
   enviaCarac (VK_UP);
   enviaCarac (VK_END);
   enviaCarac (VK_DELETE);
   enviaCarac (VK_DELETE);

   trocaJanela (Minha_Jan);
end;

{------------------------------------------------------------------------}
procedure quebraLinha2(o:integer); { quebra a linha na posicao do cursor }
{------------------------------------------------------------------------}
var
   i :integer;
begin
  trocaJanela (Jan_Prog);
  enviaCarac (VK_HOME);

  (* posiciona o cursor na posicao desejada *)
  for i := 0 to (sintCursorX - 2) do
     enviaCarac (VK_RIGHT);

  enviaCarac (VK_SPACE); enviaCarac (VK_LEFT);
  enviaCarac (VK_RETURN);  (* quebra a linha *)

  if o = 2 then
     enviaCarac (VK_UP);

  trocaJanela (Minha_Jan);
end;

{-------------------------------------------------------------------------}
function isolaPalavra:boolean;   { islola um determinado bloco ou palavra }
{-------------------------------------------------------------------------}
var
   carac:char;
   frase,linha:string;
   i:integer;

label cancelou;
begin
   trocaJanela (Minha_Jan);

   repeat
       textcolor (WHITE); textbackground (BLUE);
       mensagem ('wuentini',1);  { ENTER para marcar o inicio do bloco. }
       textcolor (7); textbackground (BLACK);
       writeln;

      (* recorta a linha atual do Word *)
      linha := pegaLinha;

      (* retira os espacos em branco *)
      while (linha <> '') and (linha [length (linha)] = ' ') do
            delete (linha, length (linha), 1);
      frase := linha;

      if frase = '' then sintclek;

      (* limita a string a 79 caracteres *)
      write (copy (frase, 1, 79));
      carac := ' ';

      (* le a linha *)
      sintetiza (frase);

      (* edita o campo *)
      carac := sintEditaCampo (frase, 1, wherey, 200, 80, false);

      (* foi cancelada a operacao *)
      if carac = ESC then
         begin
            isolaPalavra := false;
            goto cancelou;
         end
      (* apertou tecla inválida *)
      else if carac <> ENTER then
          mensagem ('wuopin', 1);   { Opcao invalida. }

   until carac = ENTER;

   quebraLinha2 (1);

   writeln;

   repeat
      textcolor (WHITE); textbackground (BLUE);
      mensagem ('wuentfim',1);  { ENTER para marcar o fim do bloco. }
      textcolor (7); textbackground (BLACK);
      writeln;

      (* recorta a linha atual do Word *)
      linha := pegaLinha;

      (* retira os espacos em branco *)
      while (linha <> '') and (linha [length (linha)] = ' ') do
            delete (linha, length (linha), 1);
      frase := linha;

      if frase = '' then sintclek;

      (* limita a string a 79 caracteres *)
      write (copy (frase, 1, 79));
      carac := ' ';

      (* le a linha *)
      sintetiza (frase);

      (* edita o campo *)
      carac := sintEditaCampo (frase, 1, wherey, 200, 80, false);

      (* foi cancelada a operacao *)
      if carac = ESC then
         begin
            (* junta as linhas *)
            trocaJanela (Jan_Prog);
            enviaCarac  (VK_UP);
            enviaCarac  (VK_END);
            enviaCarac  (VK_DELETE);
            trocaJanela (Minha_Jan);

            isolaPalavra := false;
            goto cancelou;
         end
      (* apertou tecla inválida *)
      else if carac <> ENTER then
          mensagem ('wuopin', 1); { Opcao invalida. }

   until carac = ENTER;

   quebraLinha2 (2);
   isolaPalavra := true;

cancelou:
end;


{-----------------------------------------}
procedure blocoAjuda;  { ajuda do sistema }
{-----------------------------------------}
begin
    mensagem ('wuteto',1);   { T - texto todo. }
    mensagem ('wuliat',1);   { L - linha atual. }
    mensagem ('wupade',1);   { P - palavras determinada. }
    while sintFalando do;

end;


{--------------------------------------------}
procedure marcaTudo;   { marca todo o texto  }
{--------------------------------------------}

begin
   playInit (300);
   playVirtKey (ord ('T'), true, false, false, 1);
   playStart;
   while  playIsActive do;
   delay (50);

end;


{---------------------------------------------}
procedure marcaLinha;   { marca a linha atual }
{---------------------------------------------}
begin
   enviaCarac (VK_HOME);

   playInit (300);
   playVirtKey (VK_END, false, true, false, 1);
   playStart;
   while  playIsActive do;
   delay (50);

end;

{-------------------------------------------------------------}
procedure focaJanela (jan:integer);  { foca a janela desejada }
{-------------------------------------------------------------}
var
  s:string;
  c:char;

begin
   trocaJanela (Jan_Prog);
   str (jan,s);
   c := s [1];

   delay (50);
   playInit (300);
   playVirtKey (ord ('J'), false, false, true, 1);
   playStart;
   while  playIsActive do;
   delay (150);

   enviaCarac (ord (c));
   delay (150);

end;

{--------------------------------------------------------------------}
function JanelaAtual (jan:integer):string;
{foca a janela passada como parametro e retorna ao número da proxima }
{--------------------------------------------------------------------}
var
    m, m1: hMenu;
    s: array [0..144] of char;
    ss: string;
    New_Jan:hwnd;

label termino;
begin
   trocaJanela (Jan_Prog);

   playInit (300);
   playVirtKey (ord ('A'), false, false, true, 1);
   playStart;
   while  playIsActive do;
   delay (150);

   enviaCarac (ord ('C'));
   delay (100);
   if getActiveWindow = Jan_Prog then
      begin
         ss := '';
         goto termino;
      end;

   New_Jan := GetActiveWindow;
   playInit (300);
   playVirtKey (VK_INSERT, true, false, false, 1);
   playStart;
   while  playIsActive do;
   delay (150);

   enviaCarac (VK_ESCAPE);

   getClipBoard (s,80);

   ss := strPas (s);
termino:

  enviaCarac (VK_ESCAPE);

  janelaAtual := ss; {:= strpas (s);}

  trocaJanela (Minha_Jan);
end;

{------------------------------------------------------------------}
procedure enviaCarac (carac: word);    { envia o caracter desejado }
{------------------------------------------------------------------}
begin

    playInit (300);
    playVirtKey (carac, false, false, false, 1);
    playStart;
    while  playIsActive do;
    delay (100);

end;

{-------------------------------------------------------------}
function pegaLinha: string;   { recorta a linha atual do Word }
{-------------------------------------------------------------}
var linha: array [0..255] of char;
begin
    putClipBoard ('');

    trocaJanela (Jan_Prog);

    delay (30);
    playInit (300);
    playVirtKey (VK_HOME, false, false, false, 1);
    playStart;
    while  playIsActive do;
    delay (10);

    playInit (300);
    playVirtKey (VK_END, false, true, false, 1);
    playStart;
    while  playIsActive do;
    delay (10);

    playInit (300);
    playVirtKey (VK_INSERT, true, false, false, 1);
    playStart;
    while  playIsActive do;
    delay (10);

    getClipBoard (linha, 254);
    pegaLinha := strPas(linha);

    trocaJanela (minha_Jan);
end;

{-------------------------------------------------------------------------}
procedure trocaJanela (newJan :hwnd);   { troca para janela especificada }
{-------------------------------------------------------------------------}
begin
   setActiveWindow (newJan);
   repeat keypressed until getActiveWindow = (newJan);
end;

{------------------------------------------------------}
procedure modificaLinha (new_Line:string; muda:boolean);
{      altera uma linha no Word pela nova string       }
{------------------------------------------------------}
var
   char_New_Line:array [0..225] of char;

begin
   strpcopy (char_New_Line, new_Line);
   putClipBoard (char_New_Line);

   trocaJanela (jan_Prog);

   (* se for para mudar a linha *)
   if not muda then
      begin
         enviaCarac (VK_HOME);

         playInit (300);
         playVirtKey (VK_END, false, true, false, 1);
         playStart;
         while  playIsActive do;
         delay (50);

         playInit (300);
         playVirtKey (VK_LEFT, false, true, false, 1);
         playStart;
         while  playIsActive do;
         delay (50);
      end
   else  (* se for apenas para continuar a digitacao *)
      enviaCarac (VK_END);

   playInit (300);
   playVirtKey (ord ('V'), true, false, false, 1);
   playStart;
   while  playIsActive do;
   delay (50);

   trocaJanela (minha_Jan);

end;

{----------------------------------------------------------}
function marca:boolean;    { isola um deternaminado bloco  }
{----------------------------------------------------------}
var
    s, salva: string;
    i:integer;
    c: char;

label foi_Cancelado;

begin
    salva := pegaLinha;

    (* retira os espacos em branco *)
    while (salva <> '') and (salva [length (salva)] = ' ') do
       delete (salva, length (salva), 1);
    s := salva;

    s := copy (s, 1, 79);

    if s = '' then sintclek
    else
       begin
          repeat
             checkBreak := false;
             c := sintEditaCampo (s, 1, wherey, 200, 80, true);
             checkBreak := true;

          until (c = ENTER) or (c = ESC);

          if c = ENTER then
             begin
                trocaJanela (Jan_Prog);

                enviaCarac (VK_HOME);

                for i := 0 to (sintCursorX - 2) do
                   enviaCarac (VK_RIGHT);

                enviaCarac (VK_RETURN);
                trocaJanela (Minha_Jan);
             end
          else
             begin
                marca := false;
                goto foi_Cancelado;
             end;

          salva := pegaLinha;

          (* retira os espacos em branco *)
          while (salva <> '') and (salva [length (salva)] = ' ') do
          delete (salva, length (salva), 1);
          s := salva;

          write (copy (s, 1, 79));

          repeat
             checkBreak := false;
             c := sintEditaCampo (s, 1, wherey, 200, 80, true);
             checkBreak := true;

          until (c = ENTER) or (c = ESC);

          if c = ENTER then
             begin
                trocaJanela (Jan_Prog);

                enviaCarac (VK_HOME);

                for i := 0 to (sintCursorX - 2) do
                   enviaCarac (VK_RIGHT);

                enviaCarac (VK_RETURN);
                enviaCarac (VK_UP);
                trocaJanela (Minha_Jan);
             end
          else
             begin
                trocaJanela (Jan_Prog);
                enviaCarac (VK_HOME);
                enviaCarac (VK_BACK);
                trocaJanela (Minha_Jan);

                marca := false;
                goto foi_Cancelado;
             end;
       end;

        while keypressed do
           readKey;

   marca := true;

foi_Cancelado:
end;

{---------------------------------------------------}
procedure desmarca; { reagrupa um determinado bloco }
{---------------------------------------------------}
begin
   enviaCarac (VK_END);
   enviaCarac (VK_DELETE);
   enviaCarac (VK_HOME);
   enviaCarac (VK_BACK);
end;
end.