//  CAFE2011.EXE is licensed under the terms of the CC-LGPL.
//  (CC-LGPL Version 3, 29 junio 2007 y CAFE2011 version 2011)
//  El objetivo es el libre uso comercial y no comercial del software.
//  Una copia de dicho documento se incluye en esta distribucion.
//  CWSDPMI.EXE, STREAMCO.PAS, el procedimiento TextOut
//  se tomaron de la distribucion FreePascal 2.4.2. con patente similar.
//        StreamCo.PAS es una contraccion conveniente a ocho letras del
//        nombre StreamColl.PAS en la distribucion FreePascal
PROGRAM Cafe2011;

USES
  SysUtils, Classes, GetOpts, KeyBoard, Video   , Math    , CafUtils;

CONST
  TotalCafeLongOptions          = 1;

  CAFELongOptions       : ARRAY [ 1..TotalCafeLongOptions ] OF TOption  =
        ( ( Name        : '';
            Has_Arg     : 0;
            Flag        : NIL;
            Value       : #0                    ) );

VAR
  TextNoParametro               : TEXT;
  MyCadena                      : ShortString;
  ModoPrincipal                 : SysCafeModo;
  Alternativa                   : SetSysCafeModo;
  BanderaKey,
  BanderaModo                   : Boolean;
  OptionIndex                   : LongInt;
  C                             : Char;

LABEL
  SalidaRapida;

PROCEDURE EscribirAyudaKEY;
VAR
  TextoBreve                    : Text;
  MyCadena                      : ShortString;
  ListaBreve                    : TStringList;
  RecorreCadena,
  PosicionVisualizar,
  LargoListaBreve               : LongInt;
  K2,
  K                             : TKeyEvent;
  MyChar                        : Char;
  BanderaSalida,
  BanderaVisualizar             : Boolean;


  Procedure TextOut(X,Y : Word;Const S : String);
  //  Copia casi textual de un procedimiento FreePascal
  Var
    W,P,I,M : Word;

  begin
    P:=((X-1)+(Y-1)*ScreenWidth);
    M:=Length(S);
    If P+M>ScreenWidth*ScreenHeight then
      M:=ScreenWidth*ScreenHeight-P;
    For I:=1 to M do
      VideoBuf^[P+I-1]:=Ord(S[i])+($07 shl 8);
  end;

BEGIN  { PROCEDURE EscribirAyudaKEY }
  InitKeyBoard;
  InitVideo;
  ListaBreve                    := TStringList.Create;
  ListaBreve.Sorted             := FALSE;
  Assign( TextoBreve, '..\INCLUDE\BREVE.TXT' );
  {$I-}
  Reset( TextoBreve );
  {$I+}
  IF IOResult <> 0 THEN BEGIN
    ListaBreve.Add( 'No se encuentra archivo ..\INCLUDE\BREVE.TXT' );
    Exit;
  END;  { IF IOResult <> 0 }
  WHILE NOT( EOF( TextoBreve ) ) DO BEGIN
    ReadLn( TextoBreve, MyCadena );
    ListaBreve.Add( MyCadena );
  END;  { WHILE NOT( EOF( TextNoParametro ) ) }
  Close( TextoBreve );
  BanderaSalida                 := FALSE;
  BanderaVisualizar             := TRUE;
  LargoListaBreve               := ListaBreve.Count;
  PosicionVisualizar            := 1;
  SetCursorType( crHidden );
  REPEAT
    IF BanderaVisualizar THEN BEGIN
      ClearScreen;
      FOR RecorreCadena         := 1 TO
                Min( Pred( ScreenHeight ),
                        LargoListaBreve-PosicionVisualizar+1 )
      DO TextOut( 1, RecorreCadena+1,
                Copy( ListaBreve[ RecorreCadena+PosicionVisualizar-2 ], 1,
                                ScreenWidth ) );
      TextOut( 1, 1,
  '      AYUDA Puede utilizar PgUp y PgDn para moverse Esc para terminar' );
      UpDateScreen( TRUE );
      BanderaVisualizar         := FALSE;
    END;  { IF BanderaVisualizar }
    K                           := PollKeyEvent;
    IF K <> 0 THEN BEGIN
      K                         := GetKeyEvent;
      K                         := TranslateKeyEvent( K );
      MyChar                    := GetKeyEventChar( K );
      IF MyChar <> #0 THEN BEGIN
        CASE MyChar OF
          #27                   : BanderaSalida := TRUE;
        END;
      END ELSE BEGIN
        BanderaVisualizar               := TRUE;
        K2              := GetKeyEventCode( K );
        CASE K2 OF
          kbdPgUp       :
            BEGIN
              PosicionVisualizar        :=
                Max( PosicionVisualizar-ScreenHeight+2, 1 );
            END;
          kbdPgDn       :
            BEGIN
              PosicionVisualizar        :=
                Min( PosicionVisualizar+ScreenHeight-1,
                 LargoListaBreve-ScreenHeight+2 );
            END;
          ELSE BanderaVisualizar := FALSE;
        END;  { CASE K2 }
      END;  { IF MyChar <> 0 }
    END;  { IF K <> 0 }
  UNTIL BanderaSalida;
  ClearScreen;
  DoneVideo;
  DoneKeyBoard;
END;   { PROCEDURE EscribirAyudaKEY }

BEGIN  { PROGRAM main }
  OptErr                        := FALSE;
  BanderaModo                   := FALSE;
  C                             := #0;
  Alternativa                   := [];
  ModoPrincipal                 := DefaultModoCAFE;
  IF ParamCount = 0 THEN BEGIN
    Assign( TextNoParametro, '..\INCLUDE\NOPARAM.TXT' );
    {$I-}
    Reset( TextNoParametro );
    {$I+}
    IF IOResult <> 0 THEN BEGIN
      WriteLn( 'Sugerencia : CAFE2011 -N' );
      WriteLn( 'Ctrl-Z sirve para salir...' );
      GOTO SalidaRapida;
    END;  { IF IOResult <> 0 }
    WHILE NOT( EOF( TextNoParametro ) ) DO BEGIN
      ReadLn( TextNoParametro, MyCadena );
      WriteLn( MyCadena );
    END;  { WHILE NOT( EOF( TextNoParametro ) ) }
    Close( TextNoParametro );
    GOTO SalidaRapida;
  END;  { IF ParamCount = 0 }
  REPEAT
    C                   :=
        GetLongOpts( 'M:m:NnRrHh', @CafeLongOptions[ 1 ], OptionIndex );
    CASE C OF
      'M', 'm'  : BEGIN
                    IF BanderaModo THEN BEGIN
                      WriteLn( 'Se permite un selector de modo solamente' );
                      GOTO SalidaRapida;
                    END;  { IF BanderaModo }
                    BanderaModo         := TRUE;
                    OptArg              := UpperCase( OptArg );
                    IF OptArg = 'NORMAL' THEN BEGIN
                      ModoPrincipal     := PipeCAFE;
                      Include( Alternativa, ExternoCAFE );
                    END;  { IF OptArg = 'NORMAL' }
                    IF ( OptArg = 'RESULTADO' ) OR
                       ( OptArg = 'RESULT' ) THEN BEGIN
                      ModoPrincipal     := BreveCAFE;
                      Include( Alternativa, ExternoCAFE );
                    END;  { IF OptArg = 'RESULTADO' }
                    IF ( OptArg = 'AYUDA' ) OR
                       ( OptArg = 'HELP' ) THEN BEGIN
                      EscribirAyudaKEY;
                      GOTO SalidaRapida;
                    END;  { IF OptArg = 'KEY' }
                    IF ModoPrincipal = DefaultModoCAFE THEN BEGIN
                      WriteLn( 'Selector de modo desconocido (9 Feb 2011)' );
                      GOTO SalidaRapida;
                    END;  { IF ModoPrincipal = DefaultModoCAFE }
                  END;  { CASE 'M' }
      'N', 'n'  : BEGIN
                    IF BanderaModo THEN BEGIN
                      WriteLn( 'Se permite un selector de modo solamente' );
                      GOTO SalidaRapida;
                    END;  { IF BanderaModo }
                    BanderaModo         := TRUE;
                    ModoPrincipal       := PipeCAFE;
                    Include( Alternativa, ExternoCAFE );
                  END;  { CASE 'N' }
      'R', 'r'  : BEGIN
                    IF BanderaModo THEN BEGIN
                      WriteLn( 'Se permite un selector de modo solamente' );
                      GOTO SalidaRapida;
                    END;  { IF BanderaModo }
                    BanderaModo         := TRUE;
                    ModoPrincipal       := BreveCAFE;
                    Include( Alternativa, ExternoCAFE );
                  END;  { CASE 'N' }
      'H', 'h'  : BEGIN
                    EscribirAyudaKEY;
                    GOTO SalidaRapida;
                  END;  { CASE 'H' }
      '?', ':'  : BEGIN
                    WriteLn( 'Error con alternativa : ', OptOpt );
                    GOTO SalidaRapida;
                  END;  { CASE7 '+}
    END;  { CASE C }
  UNTIL C = EndOfOptions;
  IF OptInd <= ParamCount THEN BEGIN
    WriteLn( 'Alternativa ', ParamStr( OptInd ), ' desconocida' );
    GOTO SalidaRapida;
  END;  { IF OptInd <= ParamCount }
  IF ModoPrincipal = DefaultModoCAFE THEN ModoPrincipal         := PipeCAFE;
  Include( Alternativa, ModoPrincipal );
  WITH SysCafe DO BEGIN
    Activar( Alternativa );
    CAFE.Run;
    Desactivar;
  END;  { WITH SysCafe }
SalidaRapida :
END.   { PROGRAM main }
