home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / NOTEPAD2.ZIP / NPSRCH.C < prev    next >
C/C++ Source or Header  |  1989-02-08  |  8KB  |  306 lines

  1. /***************************************************************************\
  2. * npsrch.c - handle search and replace operations
  3. *
  4. * Created by Microsoft Corporation, 1989
  5. \***************************************************************************/
  6.  
  7. #define INCL_WIN
  8. #include <os2.h>
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <opendlg.h>
  12. #include "notepad.h"
  13. #include "npabout.h"
  14. #include "npcmd.h"
  15. #include "npkmp.h"
  16.  
  17. char szSearchKey[NP_KEYSIZE];
  18. char szReplaceObject[NP_KEYSIZE];
  19. BOOL fCaseInsensitive = FALSE;
  20. BOOL fSearching = TRUE;
  21.  
  22. char NextChInsens(VOID);
  23. char LFANextCh(VOID);
  24.  
  25. /********** Initialize Search Module **************/
  26.  
  27. BOOL InitSrch(VOID)
  28. {
  29.         lstrcpy(szSearchKey,"");
  30.         lstrcpy(szReplaceObject,"");
  31.         fCaseInsensitive = FALSE;
  32.         fSearching = TRUE;
  33.         return(TRUE);
  34. }
  35.  
  36. /********** Search Dialog Window Procedure **************/
  37.  
  38. MRESULT CALLBACK SearchDlgProc(hwnd, msg, mp1, mp2)
  39. HWND hwnd;
  40. USHORT msg;
  41. MPARAM mp1;
  42. MPARAM mp2;
  43. {
  44.     switch (msg) {
  45.  
  46.     case WM_INITDLG:
  47.         WinSendDlgItemMsg(hwnd, NP_SEARCH_KEY, EM_SETTEXTLIMIT,
  48.                 MPFROM2SHORT(NP_KEYSIZE,0),0L);
  49.         WinSendDlgItemMsg(hwnd, NP_MATCHEXACT, BM_SETCHECK,
  50.                 MPFROM2SHORT(!fCaseInsensitive, 0),0L);
  51.         WinSetWindowText(WinWindowFromID(hwnd,NP_SEARCH_KEY),
  52.                 szSearchKey);
  53.         return(0L);
  54.         break;
  55.  
  56.     case WM_COMMAND:
  57.         switch (LOUSHORT(mp1)) {
  58.         case NP_SEARCH_OK:
  59.             WinQueryWindowText(WinWindowFromID(hwnd,NP_SEARCH_KEY),
  60.                     NP_KEYSIZE, szSearchKey);
  61.             fCaseInsensitive = !((BOOL)WinSendDlgItemMsg(hwnd, NP_MATCHEXACT,
  62.                     BM_QUERYCHECK, 0L, 0L));
  63.             DoSetKey();
  64.             WinDismissDlg(hwnd,MBID_OK);
  65.             return(0L);
  66.             break;
  67.  
  68.         case NP_SEARCH_CANCEL:
  69.             WinDismissDlg(hwnd,MBID_CANCEL);
  70.             return(0L);
  71.             break;
  72.  
  73.         default:
  74.             return(0L);
  75.             break;
  76.         }
  77.         break;
  78.  
  79.     case WM_HELP:
  80.         return(0L);
  81.         break;
  82.  
  83.     default:
  84.         return(WinDefDlgProc(hwnd, msg, mp1, mp2));
  85.         break;
  86.     }
  87. }
  88.  
  89. /********** Search & Replace Dialog Window Procedure **************/
  90.  
  91. MRESULT CALLBACK ReplaceDlgProc(hwnd, msg, mp1, mp2)
  92. HWND hwnd;
  93. USHORT msg;
  94. MPARAM mp1;
  95. MPARAM mp2;
  96. {
  97.     switch (msg) {
  98.  
  99.     case WM_INITDLG:
  100.         WinSendDlgItemMsg(hwnd, NP_REPL_KEY, EM_SETTEXTLIMIT,
  101.                 MPFROM2SHORT(NP_KEYSIZE,0),0L);
  102.         WinSetWindowText(WinWindowFromID(hwnd,NP_REPL_KEY),
  103.                 szSearchKey);
  104.         WinSendDlgItemMsg(hwnd, NP_REPL_OBJ, EM_SETTEXTLIMIT,
  105.                 MPFROM2SHORT(NP_KEYSIZE,0),0L);
  106.         WinSetWindowText(WinWindowFromID(hwnd,NP_REPL_OBJ),
  107.                 szReplaceObject);
  108.         WinSendDlgItemMsg(hwnd, NP_MATCHEXACT, BM_SETCHECK,
  109.                 MPFROM2SHORT(!fCaseInsensitive,0),NULL);
  110.         return(0L);
  111.         break;
  112.  
  113.     case WM_COMMAND:
  114.         switch (LOUSHORT(mp1)) {
  115.         case NP_REPL_OK:
  116.             WinQueryWindowText(WinWindowFromID(hwnd,NP_REPL_KEY),
  117.                     NP_KEYSIZE, szSearchKey);
  118.             WinQueryWindowText(WinWindowFromID(hwnd,NP_REPL_OBJ),
  119.                     NP_KEYSIZE, szReplaceObject);
  120.             fCaseInsensitive = !((BOOL)WinSendDlgItemMsg(hwnd, NP_MATCHEXACT,
  121.                     BM_QUERYCHECK, NULL, NULL));
  122.             DoSetKey();
  123.             WinDismissDlg(hwnd,MBID_OK);
  124.             return(0L);
  125.             break;
  126.  
  127.         case NP_REPL_CANCEL:
  128.             WinDismissDlg(hwnd,MBID_CANCEL);
  129.             return(0L);
  130.             break;
  131.  
  132.         default:
  133.             return(0L);
  134.             break;
  135.         }
  136.         break;
  137.  
  138.     case WM_HELP:
  139.         return(0L);
  140.         break;
  141.  
  142.     default:
  143.         return(WinDefDlgProc(hwnd, msg, mp1, mp2));
  144.         break;
  145.     }
  146. }
  147.  
  148. /********************* search routines *********************/
  149.  
  150. static VOID highlightSelection(ULONG nch, int len, ULONG selpos)
  151. {
  152.         WinSendMsg(hwndNPEdit, EM_SETSEL,
  153.                         (MPARAM)(ULONG)(selpos+nch-len),
  154.                         (MPARAM)(ULONG)(selpos+nch));
  155. }
  156.  
  157. CHAR NextChInsens(VOID)
  158. {
  159.         return((CHAR)WinUpperChar(hab,NULL,NULL,(USHORT)LFANextCh()));
  160. }
  161.  
  162. BOOL DoSearch(VOID)
  163. {
  164.     ULONG nch;
  165.  
  166.     fSearching = TRUE;
  167.  
  168.     if (!fKeySet)
  169.         return(FALSE);
  170.  
  171.     LFAInit(FALSE);
  172.     if (KMPMatchKey((fCaseInsensitive ? NextChInsens : LFANextCh),
  173.             pckSearchKey, (PULONG)&nch)) {
  174.         highlightSelection(nch, lstrlen(szSearchKey), LFAStartPos());
  175.     } else {
  176.         WinAlarm(HWND_DESKTOP, WA_WARNING);
  177.         WinMessageBox(HWND_DESKTOP,
  178.                 hwndNP,
  179.                 szMsgs[MS_STRNOTFOU],
  180.                 NULL,
  181.                 0,
  182.                 MB_OK | MB_ICONEXCLAMATION | MB_APPLMODAL);
  183.     }
  184.  
  185.     return(nch >= 0);
  186. }
  187.  
  188. BOOL DoReplace(VOID)
  189. {
  190.         ULONG nch;
  191.         IPT iptBegin, iptKeyEnd, iptRepEnd;
  192.         ULONG uKeyLen, uRepLen;
  193.  
  194.         fSearching = FALSE;
  195.  
  196.         if (!fKeySet)
  197.                 return(FALSE);
  198.  
  199.         LFAInit(FALSE);
  200.         if (KMPMatchKey((fCaseInsensitive?NextChInsens:LFANextCh),
  201.                         pckSearchKey,
  202.                         (PULONG)&nch)) {
  203.                 uKeyLen = lstrlen(szSearchKey);
  204.                 uRepLen = lstrlen(szReplaceObject);
  205.                 iptKeyEnd = LFAStartPos() + nch;
  206.                 iptBegin = iptKeyEnd - uKeyLen;
  207.                 iptRepEnd = iptBegin + uRepLen;
  208.                 highlightSelection(nch, lstrlen(szSearchKey),LFAStartPos());
  209.  
  210.                 WinSendMsg(hwndNPEdit, EM_DELETE,
  211.                            MPFROMLONG(iptBegin), MPFROMLONG(uKeyLen));
  212.  
  213.  
  214.                 WinSendMsg(hwndNPEdit, EM_SETIMPORTEXPORT,
  215.                            MPFROMP(szReplaceObject),
  216.                            MPFROMSHORT((SHORT)uRepLen));
  217.                 WinSendMsg(hwndNPEdit, EM_IMPORT, MPFROMP(iptBegin),
  218.                            MPFROMSHORT((SHORT)uRepLen));
  219.  
  220.  
  221.                 WinSendMsg(hwndNPEdit, EM_SETSEL,
  222.                         (MPARAM)(ULONG)(iptBegin),
  223.                         (MPARAM)(ULONG)(iptRepEnd));
  224.  
  225.         } else {
  226.                 WinAlarm(HWND_DESKTOP, WA_WARNING);
  227.                 WinMessageBox(HWND_DESKTOP,
  228.                         hwndNP,
  229.                         szMsgs[MS_STRNOTFOU],
  230.                         NULL,
  231.                         0,
  232.                         MB_OK | MB_ICONEXCLAMATION | MB_APPLMODAL);
  233.         }
  234.  
  235.         return(nch >= 0);
  236. }
  237.  
  238. BOOL DoNextSearchRep(VOID)
  239. {
  240.         if (fSearching)
  241.                 return(DoSearch());
  242.         else
  243.                 return(DoReplace());
  244. }
  245.  
  246. VOID DoSetKey(VOID)
  247. {
  248.         char szKey[NP_KEYSIZE];
  249.  
  250.         if (fCaseInsensitive) {
  251.                 lstrcpy(szKey, szSearchKey);
  252.                 WinUpper(hab,NULL,NULL,szKey);
  253.                 KMPCompileKey(szKey, pckSearchKey);
  254.         } else {
  255.                 KMPCompileKey(szSearchKey,pckSearchKey);
  256.         }
  257.         fKeySet = TRUE;
  258.         WinSendMsg(hwndNPMenu,
  259.                 MM_SETITEMATTR,
  260.                 MPFROM2SHORT(CMD_NEXTSRCH, TRUE),
  261.                 MPFROM2SHORT(MIA_DISABLED, 0));
  262. }
  263.  
  264. /*********************  LINEAR file access stuff *********************/
  265.  
  266. static ULONG pos;
  267. static char FAR *pch;
  268. static ULONG chlen;
  269. static ULONG selpos;
  270. static ULONG reqpos;
  271.  
  272. VOID LFAInit(BOOL fAtStart)
  273. {
  274.         pch = NULL;
  275.         chlen = 0;
  276.         pos = 1;
  277.         if (fAtStart)
  278.             reqpos = selpos = 0;
  279.         else
  280.             reqpos = selpos = LONGFROMMR(WinSendMsg(hwndNPEdit, EM_QUERYSEL, MPFROMSHORT(2), NULL));
  281. }
  282.  
  283. ULONG LFAStartPos(VOID)
  284. {
  285.         return(selpos);
  286. }
  287.  
  288. CHAR LFANextCh(VOID)
  289. {
  290.         CHAR ch;
  291.  
  292.         if (pos >= chlen) {
  293.                 reqpos += chlen;
  294.                 pch = PVOIDFROMMR(WinSendMsg(hwndNPEdit, EM_GETTEXT, (MPARAM)reqpos, MPFROMP(&chlen)));
  295.                 if (pch == NULL) {
  296.                         ch = '\0';
  297.                 } else {
  298.                         pos = 1;
  299.                         ch = *pch;
  300.                 }
  301.         } else {
  302.                 ch = (*(pch+(pos++)));
  303.         }
  304.         return(ch);
  305. }
  306.