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

  1. Unit OTEdit;
  2. { Editeur réalisé à partir d'un tableau de pointeurs sur des chaines
  3.   de caractères. Il s'agit d'un objet dérivé de l'objet TStrTab défini
  4.   dans l'unité OStrTab.Pas. }
  5. { Cet objet ne gère pas directement l'affichage, mais il tient à jour
  6.   les paramètres nécessaires à l'affichage. }
  7. { Voir le programme MiniEdit.Pas pour un exemple d'utilisation. }
  8. { KB avril-mai 1994 }
  9.  
  10. {$IFDEF debug}
  11.  {$A+,B-,D+,E-,F-,I+,L+,N-,R+,S+,V-,W+,X+}
  12. {$ELSE}
  13.  {$A+,B-,D-,E-,F-,I+,L-,N-,R-,S-,V-,W+,X+}
  14. {$ENDIF}
  15.  
  16. INTERFACE
  17.  
  18. Uses Dos, OTableau;
  19.  
  20. Type PEdObj=^TEdObj;
  21.      TEdObj=object(TStrTab)
  22.       InsertStatus: Boolean;       { bascule Insertion/Remplacement }
  23.       TextChanged : Boolean;       { indicateur de changements }
  24.       WorkLine,                    { ligne courante dans le texte }
  25.       WorkColumn,                  { colonne courante dans le texte }
  26.       NrScreenLine,                { ligne courante à l'écran }
  27.       NrScreenColumn,              { colonne courante à l'écran }
  28.       FirstScreenLine,             { 1ère ligne affichée }
  29.       FirstTextCol,                { 1ère colonne affichée }
  30.       NbLines,                     { nombre de lignes affichées }
  31.       NbCols: Integer;             { nombre de colonnes affichées }
  32.       FileName:PathStr;            { nom du fichier texte }
  33.       Constructor Init(NbL,NbC:Integer);
  34.       { Le constructeur demande 2 paramètres : le nombre de lignes et
  35.         le nombre de colonnes à afficher. }
  36.       Constructor Load(NbL,NbC:Integer;F:PathStr);
  37.       { Constructeur permettant de charger un fichier texte. }
  38.       Procedure CharLeft;          { Déplacement d'un caractère à gauche }
  39.       Procedure CharRight;         { Déplacement d'un caractère à droite }
  40.       Procedure StartLine;         { Début de ligne }
  41.       Procedure EndLine;           { Fin de ligne }
  42.       Procedure CharUp;            { Déplacement d'un caractère vers le haut }
  43.       Procedure CharDown;          { Déplacement d'un caractère vers le bas }
  44.       Procedure PageUp;            { Déplacement d'une page vers le haut }
  45.       Procedure PageDown;          { Déplacement d'une page vers le bas }
  46.       Procedure StartText;         { Début du texte }
  47.       Procedure EndText;           { Fin du texte }
  48.       Procedure ChangeInsertMode;  { Bascule mode d'insertion }
  49.       Procedure DelChar;           { Supprime le caractère courant }
  50.       Procedure DelPrevChar;       { Supprime le caractère précédent }
  51.       Procedure CharTab;           { Tabulation }
  52.       Procedure NewLine;           { Retour à la ligne }
  53.       Procedure DelLine;           { Supprime la ligne courante }
  54.       Procedure InsertChar(Car: char);  { Insère un caractère }
  55.       Procedure NewPos(x,y:Integer); { Fixe la nouvelle position du curseur }
  56.       Function FindString(FS:String;DebLine:Integer):Boolean;
  57.                                      { recherche d'une chaine }
  58.       Procedure SaveText(F:PathStr); { sauvegarde sur fichier }
  59.       End;
  60.  
  61. IMPLEMENTATION
  62.  
  63. Procedure DelSpace (var Str: string );
  64. { suppression des espaces en fin de chaine }
  65. Begin
  66.  while Str[length(Str)]=#32 do dec(Str[0]);
  67. End;
  68.  
  69. { Objet TEdObj }
  70.  
  71. Constructor TEdObj.Init(NbL,NbC:Integer);
  72. Var Str: String;
  73.     fini: Boolean;
  74. Begin
  75.  { constructeur hérité }
  76.  TStrTab.Init(20,20);
  77.  { initialisation des variables }
  78.  TextChanged:=false;
  79.  WorkLine:=1;         { numéro ligne courante }
  80.  WorkColumn:=1;       { numéro colonne courante }
  81.  NrScreenLine:=1;     { numéro ligne écran }
  82.  NrScreenColumn:=1;   { numéro colonne écran }
  83.  FirstTextCol:=1;     { numéro 1ère colonne affichée }
  84.  FirstScreenLine:=1;  { numéro 1ère ligne affichée }
  85.  NbLines:=NbL;        { nombre de lignes affichées }
  86.  NbCols:=NbC;         { nombre de colonnes affichées }
  87.  FileName:='sansnom'; { nom du fichier }
  88.  { initialisation de la première ligne }
  89.  AjouterLigne('');    { 1ère ligne vide }
  90. End;
  91.  
  92. Constructor TEdObj.Load(NbL,NbC:Integer;F:PathStr);
  93. Begin
  94.  { constructeur hérité }
  95.  TStrTab.Load(F);
  96.  if IsValid
  97.     then FileName:=F
  98.     else FileName:='sansnom';
  99.  TextChanged:=false;
  100.  WorkLine:=1;
  101.  WorkColumn:=1;
  102.  NrScreenLine:=1;
  103.  NrScreenColumn:=1;
  104.  FirstTextCol:=1;
  105.  FirstScreenLine:=1;
  106.  NbLines:=NbL;
  107.  NbCols:=NbC;
  108.  if NombreItems=0
  109.     then AjouterLigne('');
  110. End;
  111.  
  112. Procedure TEdObj.CharLeft;
  113. Begin
  114.  if WorkColumn=1
  115.     then begin
  116.           if WorkLine>1
  117.              then begin
  118.                    CharUp;
  119.                    StartLine;
  120.                    EndLine;
  121.                   end;
  122.          end
  123.     else begin
  124.           if NrScreenColumn>1
  125.              then dec(NrScreenColumn)
  126.              else dec(FirstTextCol);
  127.           dec(WorkColumn);
  128.          end;
  129. End;
  130.  
  131. Procedure TEdObj.CharRight;
  132. Begin
  133.  if WorkColumn=255 then exit;
  134.  inc(WorkColumn);
  135.  if NrScreenColumn<NbCols
  136.     then inc(NrScreenColumn)
  137.     else inc(FirstTextCol);
  138. End;
  139.  
  140. Procedure TEdObj.StartLine;
  141. Begin
  142.  WorkColumn:=1;
  143.  NrScreenColumn:=1;
  144.  FirstTextCol:=1;
  145. End;
  146.  
  147. Procedure TEdObj.EndLine;
  148. Var i:Byte;
  149.     Str:String;
  150. Begin
  151.  Str:=Ligne(WorkLine);
  152.  DelSpace(Str);
  153.  StartLine;
  154.  if Str<>''
  155.     then begin
  156.           while WorkColumn<length(Str) do CharRight;
  157.           CharRight;
  158.          end;
  159. End;
  160.  
  161. Procedure TEdObj.NewPos(x,y:Integer);
  162. Begin
  163.  if x<1 then x:=1;
  164.  if x>NbCols then x:=NbCols;
  165.  while x<NrScreenColumn do CharLeft;
  166.  while x>NrScreenColumn do CharRight;
  167.  if y<1 then y:=1;
  168.  if y>NbLines then y:=NbLines;
  169.  while (y<NrScreenLine) do CharUp;
  170.  while (y>NrScreenLine) and (WorkLine<>NombreItems) do CharDown;
  171. End;
  172.  
  173. Procedure TEdObj.CharUp;
  174. Begin
  175.  if WorkLine=1
  176.     then exit;
  177.  dec(WorkLine);
  178.  if NrScreenLine>1
  179.     then dec(NrScreenLine)
  180.     else FirstScreenLine:=WorkLine;
  181. End;
  182.  
  183. Procedure TEdObj.CharDown;
  184. Begin
  185.  if WorkLine=NombreItems
  186.     then exit;
  187.  inc(WorkLine);
  188.  if NrScreenLine<NbLines
  189.     then inc(NrScreenLine)
  190.     else inc(FirstScreenLine);
  191. End;
  192.  
  193. Procedure TEdObj.PageUp;
  194. Var i:Byte;
  195. Begin
  196.  for i:=1 to NbLines-1 do CharUp;
  197. End;
  198.  
  199. Procedure TEdObj.PageDown;
  200. Var i:Byte;
  201. Begin
  202.  for i:=1 to NbLines-1 do CharDown;
  203. End;
  204.  
  205. Procedure TEdObj.StartText;
  206. Begin
  207.  WorkLine:=1;
  208.  WorkColumn:=1;
  209.  NrScreenLine:=1;
  210.  NrScreenColumn:=1;
  211.  FirstTextCol:=1;
  212.  FirstScreenLine:=1;
  213. End;
  214.  
  215. Procedure TEdObj.EndText;
  216. Begin
  217.  while WorkLine<>NombreItems do CharDown;
  218.  EndLine;
  219. End;
  220.  
  221. Procedure TEdObj.ChangeInsertMode;
  222. Begin
  223.  InsertStatus:=not InsertStatus;
  224. End;
  225.  
  226. Procedure TEdObj.DelChar;
  227. Var Str:String;
  228. Begin
  229.  Str:=Ligne(WorkLine);
  230.  if Str=''
  231.     then DelLine
  232.     else begin
  233.           Delete(Str,WorkColumn,1);
  234.           ChangerLigne(WorkLine,Str);
  235.          end;
  236.  TextChanged:=true;
  237. End;
  238.  
  239. Procedure TEdObj.DelPrevChar;
  240. Var PrevLine:Integer;
  241.     Col: Word;
  242.     Str1, Str2: String;
  243. Begin
  244.  if WorkColumn=1
  245.     then begin
  246.           if WorkLine=1 then exit;
  247.           PrevLine:=WorkLine-1;
  248.           Str1:=Ligne(PrevLine);
  249.           Str2:=Ligne(WorkLine);
  250.           DelSpace(Str1);
  251.           DelSpace(Str2);
  252.           if length(Str1)+length(Str2)>255 then exit;
  253.           Col:=length(Str1);
  254.           ChangerLigne(PrevLine,Str1+Str2);
  255.           DelLine;
  256.           CharUp;
  257.           StartLine;
  258.           while WorkColumn<=Col do CharRight;
  259.          end
  260.     else begin
  261.           CharLeft;
  262.           DelChar;
  263.          end;
  264.  TextChanged:=true;
  265. End;
  266.  
  267. Procedure TEdObj.CharTab;
  268. Var i:Byte;
  269. Begin
  270.  for i:=1 to 5 do InsertChar(#32);
  271. End;
  272.  
  273. Procedure TEdObj.NewLine;
  274. Var Str, Str1, Str2: String;
  275. Begin
  276.  Str:=Ligne(WorkLine);
  277.  Str1:=copy(Str,1,WorkColumn-1);
  278.  DelSpace(Str1);
  279.  Str2:=copy(Str,WorkColumn,255);
  280.  DelSpace(Str2);
  281.  ChangerLigne(WorkLine,Str1);
  282.  PlacerLigne(Str2,WorkLine+1);
  283.  TextChanged:=true;
  284.  StartLine;
  285.  CharDown;
  286. End;
  287.  
  288. Procedure TEdObj.DelLine;
  289. Begin
  290.  if WorkLine<>NombreItems
  291.     then Eliminer(WorkLine)
  292.     else ChangerLigne(WorkLine,'');
  293.  StartLine;
  294.  TextChanged:=true;
  295. End;
  296.  
  297. Procedure TEdObj.InsertChar (Car: char);
  298. Var Str:String;
  299. Begin
  300.  Str:=Ligne(WorkLine);
  301.  while length(Str)<WorkColumn do Str:=Str+#32;
  302.  if not InsertStatus
  303.     then Str[WorkColumn]:=Car
  304.     else Insert(Car,Str,WorkColumn);
  305.  ChangerLigne(WorkLine,Str);
  306.  CharRight;
  307.  TextChanged:=true;
  308. End;
  309.  
  310. Function TEdObj.FindString(FS:String;DebLine:Integer):Boolean;
  311. Var ALine:Integer;
  312.     S:String;
  313.     i,p:Word;
  314.     ok:Boolean;
  315. Begin
  316.  ALine:=DebLine;
  317.  if (ALine<1) or (ALine>NombreItems)
  318.     then begin
  319.           FindString:=false;
  320.           exit;
  321.          end;
  322.  ok:=false;
  323.  repeat
  324.   S:=Ligne(ALine);
  325.   p:=Pos(FS,S);
  326.   if p<>0
  327.      then begin
  328.            ok:=true;
  329.            FirstScreenLine:=ALine;
  330.            NrScreenLine:=1;
  331.            WorkLine:=ALine;
  332.            StartLine;
  333.            For i:=1 to p do CharRight;
  334.            CharLeft;
  335.           end
  336.      else inc(ALine);
  337.  until ok or (ALine>NombreItems);
  338.  FindString:=ok;
  339. End;
  340.  
  341. Procedure TEdObj.SaveText(F:PathStr);
  342. Var ATextFile: text;
  343.     ALine: Integer;
  344.     Str: string;
  345. Begin
  346.  Assign (ATextFile, F);
  347.  {$I-}
  348.  Rewrite (ATextFile);
  349.  {$I+}
  350.  If IOResult<>0
  351.     then exit;
  352.  ALine:=1;
  353.  while ALine<=NombreItems do
  354.    begin
  355.     Str:=Ligne(ALine);
  356.     DelSpace(Str);
  357.     WriteLn(ATextFile,Str);
  358.     inc(ALine);
  359.    end;
  360.  Close(ATextFile);
  361.  TextChanged:=false;
  362.  FileName:=F;
  363. End;
  364.  
  365. END.
  366.  
  367. {                         Fin du fichier OTEdit.pas                         }
  368.