unit uMenuIni;

{==========================================================}
{                                                          }
{  unit uMenuIni                       11/12/2003          }
{                                      Verze 1.2           }
{                                                          }
{  Skelet aplikace s terminalem PC                         }
{                                                          }
{  Inicializace stromu komponent aplikace a procesu        }
{  vizualizace                                             }
{                                                          }
{  (C)2004, SofCon, Stresovicka 49, 160 00 Praha 6         }
{                                                          }
{                                                          }
{==========================================================}

{$I SETS.INC} { Nastaveni prekladu }

interface

{-------------------------
{ StartMenuProcess
{---
{ Spusteni procesu me menu
{ StopFlag je odkaz na promennou, kterou bude po uzavreni
{ aplikace nastavena na True a zpusobi ukonceni pripadnych
{ ostatnich procesu
{---
{ Tuto funkci je mozne volat v pri vytvareni procesu aplikace napr.
{ v tele hlavniho podprogramu.
}

procedure StartMenuProcess( var AStopFlag: Boolean );


implementation

uses
  Objects,    { Standardni knihovna             }
  Kernel,     { ReTOs                           }
  IoDrv,      { Obecne I/O ovladace terminalu   }
  IoAdd,      { Rozsireni I/O ovladacu terminalu}
  Fonts,      { Spravce fontu                   }

{$IFDEF DOS}
 {$IFDEF TERMEMU}
  Crt,
  TEDrv,      { Ovladace pro emulator terminalu }
 {$ELSE}
  PCDrv,      { Ovladace pro simulator na PC    }
 {$ENDIF}
{$ENDIF}
  Controls,   { Zakladni komponenty             }

{$IFDEF COLOR}
  PCCCus,    { Konfigurace pro PC Color         }
{$ELSE}
  PCMCus,    { Konfigurace pro PC Mono	        }
{$ENDIF}

  FoSS16,     { Font Sans Serife 16             }
  StdRSCZ,    { Standardni resource stringy     }
  uMemory,    { Struktury v rezervovane pameti  }
  uMenuDef;   { Definice aplikacniho stromu     }

const

  cMenuStatPri   = 100;   { Staticka priorita procesu menu              }
  cMenuDynPri    = 254;   { Dynamicka pririta procesu menu              }
  cMenuWaitCount = 1;     { Pocet waitu jadra pri necinnosti uzivatele  }
  cMenuStackSize = 8192;  { Velikost zasobniku procesu menu             }


{-------------------------
{ AppIdle
{--
{ Funkce volana pri necinnosti uzivatele
{--
}

procedure AppIdle; far;
begin
  {$IFDEF TERMEMU}
  { Pokud pouzivame emulator terminalu, aplikaci lze ukoncit
  { bud stiskem ALT+X v emulatoru, nebo stiskem libovolne klavesy
  { v DOSovem okne }
  if KeyPressed then Application^.EndModal( mrOk );
  {$ENDIF}

  { Pri necinnosti uspime proces menu na zadany pocet tiku kernelu }
  Wait( cMenuWaitCount );
end;

{-------------------------
{ InitMenu
{--
{ Inicialize Funkce volana pri necinnosti uzivatele
{--
}

procedure InitMenu;
var
  App : PApplication;
begin
  RegisterCustomizeProc( AppCustomizeProc, 2000 );

{$IFDEF DOS}
 {$IFDEF TERMEMU}

  { Inicializace ovladacu a korenu stromu komponent
    pro verzi DOS s pouzitim emulatoru terminalu }
  App :=
    New( PApplication, Init (
      New( PInputDriver, Init(
        New( PTEKeybDriver, Init ),
        New( PTEMouseDriver, Init )
      )),
      New( PTEDispDriver, Init( 640, 480 ) )
      , @g_AppSettings
    ));

 {$ELSE}

  { Inicializace ovladacu a korenu stromu komponent pro verzi DOS }
  App :=
    New( PApplication, Init (
      New( PInputDriver, Init(
        New( PPCKeybDriver, Init ),
        New( PPCMouseDriver, Init )
      )),
    {$ifdef USEVESA}
      New( PVesaDriver, Init( 640, 480 ) )
    {$else}
      New( PVgaMonoDriver, Init( 640, 480 ) )
    {$endif}
      , @g_AppSettings
    ));

 {$ENDIF}
{$ENDIF}


  App^.Customize( ccApplication );

  { Nasteveni Idle procedury - volana pri necinnosti uzivatele }
  App^.OnIdle := AppIdle;

  { Implicitni font aplikace }
  App^.Font := fidSS16;

  { Vytvoreni vsech stranek aplikace }
  CreateAppPages;
end;


{-------------------------
{ RunMenu
{--
{ Spusteni
{--
}

procedure RunMenu;
begin
  if Application <> nil then Application^.Run;
end;

{-------------------------
{ DoneMenu
{--
{ Uvoleni komponent z pameti
{--
}

procedure DoneMenu;
begin
  if Application <> nil then Application^.Free;
end;


{-------------------------
{ StartMenuProcess
{---
{ Spusteni procesu me menu
{ StopFlag je odkaz na promennou, kterou bude po uzavreni
{ aplikace nastavena na True a zpusobi ukonceni pripadnych
{ ostatnich procesu
{---
{ Tuto funkci je mozne volat v pri vytvareni procesu aplikace napr.
{ v tele hlavniho podprogramu.
}

procedure StartMenuProcess( var AStopFlag: Boolean );
begin
  { Inicializace menu }
  InitMenu;

  { Spusteni procesu menu }

  Start( 'Menu', cMenuStackSize, cMenuStatPri, cMenuDynPri ); Exit;
  repeat
    RunMenu;
    AStopFlag := True;
  until AStopFlag;

  { Uvoleni menu z pameti }
  DoneMenu;
end;


end.