PopFind.mod: Translation to Stony Brook Modula-2

Last updated: 11. 1.1998, 17:20

<*/NOWARN:F*>
IMPLEMENTATION MODULE PopFind;
(*--------------------------------------------------------
   POPFIND.C -- Popup Editor Search and Replace Functions
  --------------------------------------------------------*)

IMPORT WINUSER;
IMPORT WIN32;
IMPORT WINGDI;
IMPORT COMMDLG;
IMPORT SYSTEM;
IMPORT Strings;
IMPORT ExStorage;
CONST
  MAX_STRING_LEN = 256;
TYPE
  TEXT = ARRAY[0..MAX_STRING_LEN] OF CHAR;
VAR
  szFindText : TEXT;
  szReplText : TEXT;
VAR
  fr1 : COMMDLG.FINDREPLACE;       (* must be static for modeless dialog!!!                *)
  fr2 : COMMDLG.FINDREPLACE;       (* must be static for modeless dialog!!!                *)

(*++++****************************************************************)
PROCEDURE FindDlg (hwnd :  WIN32.HWND)  :  WIN32.HWND;
(*********************************************************************)
BEGIN
     fr1.lStructSize      := SIZE (COMMDLG.FINDREPLACE);
     fr1.hwndOwner        := hwnd;
     fr1.hInstance        := NIL;
     fr1.Flags            := COMMDLG.FR_HIDEUPDOWN BOR COMMDLG.FR_HIDEMATCHCASE BOR COMMDLG.FR_HIDEWHOLEWORD;
     fr1.lpstrFindWhat    := SYSTEM.ADR(szFindText);
     fr1.lpstrReplaceWith := NIL;
     fr1.wFindWhatLen     := SIZE (szFindText);
     fr1.wReplaceWithLen  := 0;
     fr1.lCustData        := 0;
     fr1.lpfnHook         := SYSTEM.CAST(COMMDLG.LPFRHOOKPROC,NIL);
     fr1.lpTemplateName   := NIL;

     RETURN COMMDLG.FindText (fr1);
END FindDlg;

(*++++****************************************************************)
PROCEDURE ReplaceDlg (hwnd :  WIN32.HWND)  :  WIN32.HWND;
(*********************************************************************)
BEGIN
     fr2.lStructSize      := SIZE (COMMDLG.FINDREPLACE);
     fr2.hwndOwner        := hwnd;
     fr2.hInstance        := NIL;
     fr2.Flags            := COMMDLG.FR_HIDEUPDOWN BOR COMMDLG.FR_HIDEMATCHCASE BOR COMMDLG.FR_HIDEWHOLEWORD;
     fr2.lpstrFindWhat    := SYSTEM.ADR(szFindText);
     fr2.lpstrReplaceWith := SYSTEM.ADR(szReplText);
     fr2.wFindWhatLen     := SIZE (szFindText);
     fr2.wReplaceWithLen  := SIZE (szReplText);
     fr2.lCustData        := 0;
     fr2.lpfnHook         := SYSTEM.CAST(COMMDLG.LPFRHOOKPROC,NIL);
     fr2.lpTemplateName   := NIL;

     RETURN COMMDLG.ReplaceText (fr2);
END ReplaceDlg;

(*++++****************************************************************)
PROCEDURE FindText (hwndEdit       :  WIN32.HWND;
                    piSearchOffset :  INTEGER;
                    pfr            :  COMMDLG.LPFINDREPLACE) : WIN32.BOOL;
(*********************************************************************)
VAR
  iLength   :  INTEGER;
  iPos      :  INTEGER;
  pstrDoc   :  WIN32.PSTR;
  pstrPos   :  CARDINAL;
  text      :  TEXT;
  found     :  BOOLEAN;
BEGIN

               (* Read in the edit document                                         *)
     iLength := WINUSER.GetWindowTextLength (hwndEdit);
     ExStorage.ALLOCATE(pstrDoc,iLength+1);
     IF (pstrDoc=NIL) THEN
          RETURN FALSE;
     END;
     WINUSER.GetWindowText (hwndEdit, pstrDoc^, iLength + 1);

               (* Search the document for the find string                           *)
     
     Strings.FindNext(pfr^.lpstrFindWhat^,pstrDoc^,piSearchOffset,found,pstrPos);          
     ExStorage.DEALLOCATE(pstrDoc,iLength+1);

               (* Return an error code if the string cannot be found                *)

     IF (pstrPos = 0) THEN
          RETURN FALSE;
     END;

               (* Find the position in the document and the new start offset        *)

     iPos := pstrPos;
     Strings.Replace(text,0,SYSTEM.CAST(TEXT,pfr^.lpstrFindWhat^));
     piSearchOffset := iPos + VAL(INTEGER,LENGTH(text));

               (* Select the found text                                             *)

     WINUSER.SendMessage (hwndEdit, WINUSER.EM_SETSEL, iPos, piSearchOffset);
     WINUSER.SendMessage (hwndEdit, WINUSER.EM_SCROLLCARET, 0, 0);

     RETURN TRUE;
END FindText;

(*++++****************************************************************)
PROCEDURE NextText (hwndEdit       :  WIN32.HWND;
                    piSearchOffset :  INTEGER) : WIN32.BOOL;
(*********************************************************************)
VAR
  fr :  COMMDLG.FINDREPLACE;
BEGIN
     fr.lpstrFindWhat := SYSTEM.ADR(szFindText);

     RETURN FindText (hwndEdit, piSearchOffset, SYSTEM.ADR(fr));
END NextText;

(*++++****************************************************************)
PROCEDURE ReplaceText (hwndEdit       :  WIN32.HWND;
                       piSearchOffset :  INTEGER;
                       pfr            :  COMMDLG.LPFINDREPLACE) : WIN32.BOOL;
(*********************************************************************)
               (* Find the text                                                     *)
BEGIN
     IF (FindText (hwndEdit, piSearchOffset, pfr)=FALSE) THEN
          RETURN FALSE;
     END;

               (* Replace it                                                        *)

     WINUSER.SendMessage (hwndEdit, WINUSER.EM_REPLACESEL, 0, SYSTEM.CAST(WIN32.LPARAM, pfr^.lpstrReplaceWith));

     RETURN TRUE;
END ReplaceText;

(*++++****************************************************************)
PROCEDURE ValidFind () : WIN32.BOOL;
(*********************************************************************)
BEGIN
     RETURN szFindText[0] #'';
END ValidFind;
BEGIN
END PopFind.