home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 19 / CD_ASCQ_19_010295.iso / dos / prg / pas / ktools / source / otxtview.pas < prev    next >
Pascal/Delphi Source File  |  1994-11-13  |  14KB  |  622 lines

  1. Unit OTxtView;
  2. { objet générique en mode texte }
  3. { K.B. octobre-novembre 1994 }
  4.  
  5. {$IFDEF debug}
  6.  {$A+,B-,D+,E-,F-,I+,L+,N-,R+,S+,V-,W+,X+}
  7. {$ELSE}
  8.  {$A+,B-,D-,E-,F-,I+,L-,N-,R-,S-,V-,W+,X+}
  9. {$ENDIF}
  10.  
  11. INTERFACE
  12.  
  13. Uses Dos, UDrivers, UTextScr, OTableau, OGenView;
  14.  
  15. Const
  16.  { constantes d'Etat }
  17.  stOmbre      = $0100;
  18.  stSauveEcran = $0200;
  19.  stCurseur    = $0400;
  20.  
  21.  { constantes d'erreur }
  22.  erMono = 100;
  23.  
  24.  { Positions de palette }
  25.  pBleu  = 1;
  26.  pGris  = 4;
  27.  pVert  = 7;
  28.  pCyan  = 10;
  29.  pRouge = 13;
  30.  
  31. Type
  32.  TColorPal=String[40];
  33.  TStr30=String[30];
  34.  
  35.  PTextView = ^TTextView;
  36.  TTextView = object(TGenView)
  37.   PalOffset   : Byte;
  38.   SavedScreen : PWordBuffer;
  39.   Constructor Init(X,Y,L,H:Integer);
  40.   Destructor  Done; virtual;
  41.   Procedure   Select; virtual;
  42.   Procedure   UnSelect; virtual;
  43.   Procedure   DrawBegin; virtual;
  44.   Procedure   SauveEcran; virtual;
  45.   Procedure   RestitueEcran; virtual;
  46.   Function    GetColor(n:Byte):Byte;
  47.   Procedure   Ecrire(S:String;x,y,c:Byte);
  48.   End;
  49.  
  50.  TMenuItem=record
  51.   Nom:TStr30;
  52.   Touche:Word;
  53.   End;
  54.  
  55.  PStatusLine=^TStatusLine;
  56.  TStatusLine=object(TTextView)
  57.   Table:TTableau;
  58.   Constructor Init;
  59.   Destructor Done;virtual;
  60.   Procedure HandleEvent(Var Event:TEvent);virtual;
  61.   Procedure Draw;virtual;
  62.   Procedure AjouterItem(N:TStr30;K:Word);
  63.   End;
  64.  
  65.  PHorloge=^THorloge;
  66.  THorloge=object(TTextView)
  67.   Seconde:Word;
  68.   Constructor Init;
  69.   Procedure Draw;virtual;
  70.   End;
  71.  
  72.  PWindow=^TWindow;
  73.  TWindow=object(TTextView)
  74.   Titre:String[60]; {titre}
  75.   Constructor Init(xi,yi,l,h:Integer;T:String);
  76.   { fixe les dimensions et le titre , puis définit
  77.     les valeurs par défaut }
  78.   Procedure BackGround;virtual;
  79.   { dessine le cadre }
  80.   Procedure Draw; virtual;
  81.   Procedure DrawInterior; virtual;
  82.   Procedure Show;
  83.   { affiche et sélectionne }
  84.   Function SurCadre(P:TPoint):Boolean;
  85.   { indique si le point est sur le cadre }
  86.   Procedure ChangeTitre(S:String);
  87.   { change le titre de la fenêtre }
  88.   Function Largeur:Byte;
  89.   { largeur de l'intérieur de la fenêtre, sans le bord }
  90.   Function Hauteur:Byte;
  91.   { hauteur de l'intérieur de la fenêtre, sans le bord }
  92.   Procedure HandleEvent(Var Event:TEvent);virtual;
  93.   { réaction à un évènement }
  94.   { procédure virtuelle à redéfinir à chaque fois }
  95.   { en standard, l'appui sur Echap ou le click sur le bouton droit
  96.     provoquent la fermeture }
  97.   End;
  98.  
  99.  PTextApp=^TTextApp;
  100.  TTextApp=object(TGenApp)
  101.   PalOffset : Byte;
  102.   Titre:String[80];       {titre sur la première ligne}
  103.   Horloge:PHorloge;
  104.   StatusLine:PStatusLine; {ligne d'état}
  105.   Fond:Byte;              {caractère dessinant le bureau}
  106.   Constructor Init;
  107.   Procedure VideoInit; virtual;
  108.   Procedure VideoDone; virtual;
  109.   Procedure BackGround; virtual;
  110.   Function  GetColor(n:Byte):Byte;
  111.   Procedure InitStatusLine; virtual;
  112.   Procedure GetEvent(Var Event:TEvent); virtual;
  113.   Procedure HandleEvent(Var Event:TEvent); virtual;
  114.   Procedure Patience(S:String);
  115.   Procedure FinPatience;
  116.   Procedure TempsMort;virtual;
  117.   Procedure ClearDeskTop;
  118.   End;
  119.  
  120. Var
  121.  DefaultPal, CurPal:TColorPal;    { Palettes de couleurs }
  122.  OldExitProc : Pointer;           { Procédure de sortie }
  123.  
  124. Const
  125.  QuitMsg:String='Au revoir...';
  126.  
  127. Procedure MakeMenuItem(Var T:TMenuItem;N:TStr30;K:Word);
  128. { construit un élément de la ligne de statut }
  129.  
  130. IMPLEMENTATION
  131.  
  132. {$F+}
  133. Procedure MyExitProc;
  134. Begin
  135.  ExitProc := OldExitProc;
  136.  SetCursorType(NormalCursor);
  137.  SetCursorPos(0,0);
  138.  FillScreen(32+256*7);
  139.  if QuitMsg<>''
  140.     then writeln(QuitMsg);
  141. End;
  142. {$F-}
  143.  
  144. Procedure MakeMenuItem(Var T:TMenuItem;N:TStr30;K:Word);
  145. Begin
  146.  with T do
  147.   begin
  148.    Nom:=N;
  149.    Touche:=K;
  150.   end;
  151. End;
  152.  
  153. { objet TTextView }
  154.  
  155. Constructor TTextView.Init(X,Y,L,H:Integer);
  156. Begin
  157.  TGenView.Init(X,Y,L,H);
  158.  SavedScreen:=nil;
  159.  PalOffset:=pBleu;
  160.  Ident:='TEXTVIEW';
  161. End;
  162.  
  163. Destructor TTextView.Done;
  164. Begin
  165.  RestitueEcran;
  166.  TGenView.Done;
  167. End;
  168.  
  169. Procedure TTextView.DrawBegin;
  170. Var P : TPoint;
  171.     O : Integer;
  172. Begin
  173.  MakeGlobal(Origin,P);
  174.  if Etat and stOmbre <> 0
  175.     then O:=1
  176.     else O:=0;
  177.  MouseClipON(P.X,P.Y,P.X+Size.X+O,P.Y+Size.Y+O);
  178. End;
  179.  
  180. Procedure TTextView.Select;
  181. Begin
  182.  if Etat and stSelectable = 0
  183.     then exit;
  184.  TGenView.Select;
  185.  if Etat and stCurseur<>0
  186.     then SetCursorType(NormalCursor)
  187.     else SetCursorType(BlankCursor);
  188. End;
  189.  
  190. Procedure TTextView.UnSelect;
  191. Begin
  192.  TGenView.UnSelect;
  193.  SetCursorType(BlankCursor);
  194. End;
  195.  
  196. Procedure TTextView.SauveEcran;
  197. Var P : TPoint;
  198.     O : Integer;
  199. Begin
  200.  if Etat and stSauveEcran = 0
  201.     then exit;
  202.  if SavedScreen=nil
  203.     then begin
  204.           MakeGlobal(Origin,P);
  205.           if Etat and stOmbre<>0
  206.              then O:=1
  207.              else O:=0;
  208.           GetMem(SavedScreen,(Size.X+O)*(Size.Y+O)*2);
  209.           if SavedScreen=nil
  210.              then begin
  211.                    ErrorFlag:=erMemoire;
  212.                    exit;
  213.                   end;
  214.           DrawBegin;
  215.           ScreenToBuf(P.X,P.Y,P.X+Size.X-1+O,P.Y+Size.Y-1+O,SavedScreen^);
  216.           DrawEnd;
  217.          end;
  218. End;
  219.  
  220. Procedure TTextView.RestitueEcran;
  221. Var P : TPoint;
  222.     O : Integer;
  223. Begin
  224.  if SavedScreen<>nil
  225.     then begin
  226.           MakeGlobal(Origin,P);
  227.           if Etat and stOmbre<>0
  228.              then O:=1
  229.              else O:=0;
  230.           DrawBegin;
  231.           BufToScreen(P.X,P.Y,P.X+Size.X-1+O,P.Y+Size.Y-1+O,SavedScreen^);
  232.           DrawEnd;
  233.           FreeMem(SavedScreen,(Size.X+O)*(Size.Y+O)*2);
  234.           SavedScreen:=nil;
  235.          end;
  236. End;
  237.  
  238. Function TTextView.GetColor(n:Byte):Byte;
  239. Begin
  240.  GetColor:=ord(CurPal[PalOffset+n]);
  241. End;
  242.  
  243. Procedure TTextView.Ecrire(S:String;x,y,c:Byte);
  244. Var P : TPoint;
  245. Begin
  246.  MakeGlobal(Origin,P);
  247.  if P.Y+y=MouseY
  248.     then DrawBegin;
  249.  WriteXY(getcolor(c),P.X+x,P.Y+y,S);
  250.  if P.Y+y=MouseY
  251.     then DrawEnd;
  252. End;
  253.  
  254. { objet THorloge }
  255.  
  256. Constructor THorloge.Init;
  257. Begin
  258.  TTextView.Init(71,0,8,1);
  259.  Seconde:=100;
  260. End;
  261.  
  262. Procedure THorloge.Draw;
  263. Var R  : String[10];
  264.     W  : String[3];
  265.     h,m,s,c : Word;
  266.  Procedure Normalise;
  267.  Begin
  268.   if length(W)=1
  269.      then W:='0'+W;
  270.  End;
  271. Begin
  272.  GetTime(h,m,s,c);
  273.  if s<>Seconde
  274.     then begin
  275.           Seconde:=s;
  276.           str(h,W);
  277.           Normalise;
  278.           R:=W+':';
  279.           str(m,W);
  280.           Normalise;
  281.           R:=R+W+':';
  282.           str(Seconde,W);
  283.           Normalise;
  284.           R:=R+W;
  285.           Ecrire(R,0,0,0);
  286.          end;
  287. End;
  288.  
  289. { objet TStatusLine }
  290.  
  291. Constructor TStatusLine.Init;
  292. Begin
  293.  TTextView.Init(0,24,80,1);
  294.  Etat:=stSauveEcran;
  295.  Table.Init(3,1,sizeof(TMenuItem));
  296. End;
  297.  
  298. Destructor TStatusLine.Done;
  299. Begin
  300.  Table.Done;
  301.  TTextView.Done;
  302. End;
  303.  
  304. Procedure TStatusLine.HandleEvent(Var Event:TEvent);
  305. Var i:Integer;
  306.     T:TMenuItem;
  307.     p:Byte;
  308.     E:TEvent;
  309.     ok:Boolean;
  310. Begin
  311.  if Table.NombreItems=0
  312.     then exit;
  313.  if Event.What<>evMouseLDown
  314.     then exit;
  315.  if Event.Where.Y<>24
  316.     then exit;
  317.  p:=0;
  318.  for i:=1 to Table.NombreItems do
  319.   begin
  320.    Table.Lire(T,i);
  321.    if (Event.Where.x>=p) and (Event.Where.x<=p+length(T.Nom)-1)
  322.       then begin
  323.             Ecrire(T.Nom,p,0,1);
  324.             ok:=true;
  325.             repeat
  326.              GetMouseEvent(E);
  327.              ok:=E.Where.Y=24;
  328.             until (E.What=evMouseLUp) or not ok;
  329.             Ecrire(T.Nom,p,0,0);
  330.             if ok
  331.                then begin
  332.                      Event.What:=evKeyDown;
  333.                      Event.KeyCode:=T.Touche;
  334.                     end;
  335.             exit;
  336.            end
  337.       else p:=p+length(T.Nom)+2;
  338.   end;
  339. End;
  340.  
  341. Procedure TStatusLine.Draw;
  342. Var i:Integer;
  343.     T:TMenuItem;
  344.     S:String;
  345. Begin
  346.  if Table.NombreItems=0
  347.     then begin
  348.           RestitueEcran;
  349.           SauveEcran;
  350.           exit;
  351.          end;
  352.  S:='';
  353.  For i:=1 to Table.NombreItems do
  354.   begin
  355.    Table.Lire(T,i);
  356.    S:=S+T.Nom+'  ';
  357.   end;
  358.  Ajuste(S,80);
  359.  Ecrire(S,0,0,0);
  360. End;
  361.  
  362. Procedure TStatusLine.AjouterItem(N:TStr30;K:Word);
  363. Var T:TMenuItem;
  364. Begin
  365.  MakeMenuItem(T,N,K);
  366.  Table.Ajouter(T);
  367. End;
  368.  
  369. { objet TWindow }
  370.  
  371. Constructor TWindow.Init(xi,yi,l,h:Integer;T:String);
  372. { définit une fenêtre }
  373. Begin
  374.  TTextView.Init(xi,yi,l,h);
  375.  Titre:=T;
  376.  Etat:=stOmbre+stSauveEcran+stSelectable;
  377. End;
  378.  
  379. Procedure TWindow.BackGround;
  380. Var P : TPoint;
  381. Begin
  382.  MakeGlobal(Origin,P);
  383.  DrawBegin;
  384.  Frame(P.X, P.Y, P.X+Size.X-1, P.Y+Size.Y-1,
  385.        GetColor(0), Titre);
  386.  if Etat and stOmbre<>0
  387.     then Shadow(P.X, P.Y, P.X+Size.X-1, P.Y+Size.Y-1, 7);
  388.  DrawEnd;
  389. End;
  390.  
  391. Procedure TWindow.DrawInterior;
  392. Begin
  393. End;
  394.  
  395. Procedure TWindow.Draw;
  396. Begin
  397.  TTextView.Draw;
  398.  DrawInterior;
  399. End;
  400.  
  401. Function TWindow.Largeur:Byte;
  402. { renvoie la largeur de l'intérieur de la fenêtre }
  403. Begin
  404.  Largeur:=Size.X-2;
  405. End;
  406.  
  407. Function TWindow.Hauteur:Byte;
  408. { renvoie la hauteur de l'intérieur de la fenêtre }
  409. Begin
  410.  Hauteur:=Size.Y-2;
  411. End;
  412.  
  413. Function TWindow.SurCadre(P:TPoint):Boolean;
  414. Var T:TPoint;
  415. Begin
  416.  MakeGlobal(Origin,T);
  417.  if (((P.X=T.X) or (P.X=T.X+Size.X-1)) and (P.Y>=T.Y) and (P.Y<=T.Y+Size.Y-1))
  418.     or (((P.Y=T.Y) or (P.Y=T.Y+Size.Y-1)) and (P.X>=T.X) and (P.X<=T.X+Size.X-1))
  419.     then SurCadre:=true
  420.     else SurCadre:=false;
  421. End;
  422.  
  423. Procedure TWindow.Show;
  424. Begin
  425.  if not IsValid
  426.     then exit;
  427.  DrawBegin;
  428.  SauveEcran;
  429.  Draw;
  430.  Select;
  431.  DrawEnd;
  432. End;
  433.  
  434. Procedure TWindow.ChangeTitre(S:String);
  435. Var Tmp:String;
  436. Begin
  437.  Titre:=S;
  438.  Tmp:=Titre;
  439.  if length(Tmp)>Largeur-2
  440.     then Tmp[0]:=chr(Largeur-2);
  441.  while length(Tmp)<Largeur do
  442.   Tmp:=THS+Tmp+THS;
  443.  if length(Tmp)>Largeur
  444.     then dec(Tmp[0]);
  445.  Ecrire(Tmp,1,0,0);
  446. End;
  447.  
  448. Procedure TWindow.HandleEvent(Var Event:TEvent);
  449. Begin
  450.  TTextView.HandleEvent(Event);
  451.  case Event.What of
  452.   evKeyDown:
  453.    case Event.KeyCode of
  454.     Echap: SetCommand(cmClose);
  455.     else exit;
  456.     end;
  457.   evMouseRDown:
  458.    if Etat and stSelected<>0
  459.       then begin
  460.             repeat
  461.              GetMouseEvent(Event);
  462.             until Event.What=evNothing;
  463.             SetCommand(cmClose);
  464.            end
  465.       else exit;
  466.   evCommand:
  467.    case Event.Command of
  468.     cmClose : ExitCode:=exAnnule;
  469.     else exit;
  470.     end;
  471.   else exit;
  472.   end;
  473.  Event.What:=evNothing;
  474. End;
  475.  
  476. { objet TGenApp }
  477.  
  478. Constructor TTextApp.Init;
  479. Begin
  480.  MouseText:=true;
  481.  TGenApp.Init;
  482.  PalOffset:=pBleu;
  483.  Titre:='';
  484.  Fond:=$B1;
  485.  SetCursorType(BlankCursor);
  486.  Horloge:=New(PHorloge,Init);
  487.  if Horloge<>nil
  488.     then Insert(Horloge);
  489.  InitStatusLine;
  490.  if StatusLine<>nil
  491.     then Insert(StatusLine);
  492.  MouseLimits(0,0,Size.X-1,Size.Y-1);
  493.  MouseX:=Size.X div 2;
  494.  MouseY:=Size.Y div 2;
  495.  MouseMoveTo(MouseX,MouseY);
  496.  MouseShow;
  497. End;
  498.  
  499. Procedure TTextApp.VideoInit;
  500. Var ModeEcran : Word;
  501. Begin
  502.  GetVideoMode(ModeEcran);
  503.  if ModeEcran=7
  504.     then begin
  505.           writeln('Ecran couleur nécessaire pour cette application.');
  506.           writeln('Au revoir ...');
  507.           halt(1);
  508.          end;
  509.  SetActivePage(0);
  510.  DefaultPal:=
  511.      chr(grisclair+16*bleu) + chr(bleu+16*grisclair) + chr(jaune+16*bleu)
  512.    + chr(bleu+16*grisclair) + chr(grisclair+16*bleu) + chr(blanc+16*grisclair)
  513.    + chr(blanc+16*vert) + chr(vert+16*grisclair) + chr(jaune+16*vert)
  514.    + chr(bleu+16*cyan) + chr(cyan+16*bleu) + chr(blanc+16*cyan)
  515.    + chr(grisclair+16*rouge) + chr(rouge+16*grisclair) + chr(jaune+16*rouge);
  516.  CurPal:=DefaultPal;
  517.  Size.X:=80;
  518.  Size.Y:=25;
  519.  OldExitProc := ExitProc;     { Sauve Proc de sortie précédente }
  520.  ExitProc    := @MyExitProc;  { Insérons notre procédure de sortie }
  521. End;
  522.  
  523. Procedure TTextApp.VideoDone;
  524. Begin
  525.  ExitProc := OldExitProc;
  526.  SetCursorType(NormalCursor);
  527.  SetCursorPos(0,0);
  528.  FillScreen(32+256*7);
  529.  if QuitMsg<>''
  530.     then writeln(QuitMsg);
  531. End;
  532.  
  533. Procedure TTextApp.BackGround;
  534. Begin
  535.  MouseHide;
  536.  SetCursorPos(0,0);
  537.  PutCharAttrib(32+256*GetColor(0),80);
  538.  WriteXY(GetColor(0),0,0,Titre);
  539.  SetCursorPos(0,1);
  540.  PutCharAttrib(Fond+256*GetColor(0),24*80);
  541.  MouseShow;
  542. End;
  543.  
  544. Function TTextApp.GetColor(n:Byte):Byte;
  545. Begin
  546.  GetColor:=ord(CurPal[PalOffset+n]);
  547. End;
  548.  
  549. Procedure TTextApp.TempsMort;
  550. Begin
  551.  if Horloge<>nil
  552.     then Horloge^.Draw;
  553. End;
  554.  
  555. Procedure TTextApp.InitStatusLine;
  556. Begin
  557.  StatusLine:=New(PStatusLine,Init);
  558. End;
  559.  
  560. Procedure TTextApp.GetEvent(Var Event:TEvent);
  561. Begin
  562.  TGenApp.GetEvent(Event);
  563.  StatusLine^.HandleEvent(Event);
  564. End;
  565.  
  566. Procedure TTextApp.HandleEvent(Var Event:TEvent);
  567. Var W,WPrec:PGenView;
  568. Begin
  569.  if Event.What=evCommand
  570.     then if Event.Command=cmClose
  571.             then begin
  572.                   W:=PGenView(Event.InfoPtr);
  573.                   WPrec:=W^.Prec;
  574.                   W^.UnSelect;
  575.                   dispose(W,Done);
  576.                   if WPrec<>nil
  577.                      then WPrec^.Select;
  578.                   Event.What:=evNothing;
  579.                   exit;
  580.                  end;
  581.  TGenApp.HandleEvent(Event);
  582. End;
  583.  
  584. Procedure TTextApp.ClearDeskTop;
  585. Var W,tmp : PGenView;
  586. Begin
  587.  W:=Child;
  588.  tmp:=Child;
  589.  { trouver le dernier enfant }
  590.  while tmp<>nil do
  591.   begin
  592.    tmp:=W^.Suiv;
  593.    if tmp<>nil
  594.       then W:=tmp;
  595.   end;
  596.  { effacer les enfants sélectables }
  597.  while W<>nil do
  598.   begin
  599.    tmp:=W^.Prec;
  600.    if W^.Etat and stSelectable<>0
  601.       then dispose(W,Done);
  602.    W:=tmp;
  603.   end;
  604.  { curseur }
  605.  SetCursorType(BlankCursor);
  606. End;
  607.  
  608. Procedure TTextApp.Patience(S:String);
  609. Begin
  610.  Ajuste(S,80);
  611.  WriteXY(getcolor(0),0,24,S);
  612. End;
  613.  
  614. Procedure TTextApp.FinPatience;
  615. Begin
  616.  StatusLine^.Draw;
  617. End;
  618.  
  619. END.
  620.  
  621. {                        Fin du fichier OTxtView.Pas                        }
  622.