home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 5 Edit
/
05-Edit.zip
/
NOTEPAD2.ZIP
/
NPSRCH.C
< prev
next >
Wrap
C/C++ Source or Header
|
1989-02-08
|
8KB
|
306 lines
/***************************************************************************\
* npsrch.c - handle search and replace operations
*
* Created by Microsoft Corporation, 1989
\***************************************************************************/
#define INCL_WIN
#include <os2.h>
#include <stdio.h>
#include <string.h>
#include <opendlg.h>
#include "notepad.h"
#include "npabout.h"
#include "npcmd.h"
#include "npkmp.h"
char szSearchKey[NP_KEYSIZE];
char szReplaceObject[NP_KEYSIZE];
BOOL fCaseInsensitive = FALSE;
BOOL fSearching = TRUE;
char NextChInsens(VOID);
char LFANextCh(VOID);
/********** Initialize Search Module **************/
BOOL InitSrch(VOID)
{
lstrcpy(szSearchKey,"");
lstrcpy(szReplaceObject,"");
fCaseInsensitive = FALSE;
fSearching = TRUE;
return(TRUE);
}
/********** Search Dialog Window Procedure **************/
MRESULT CALLBACK SearchDlgProc(hwnd, msg, mp1, mp2)
HWND hwnd;
USHORT msg;
MPARAM mp1;
MPARAM mp2;
{
switch (msg) {
case WM_INITDLG:
WinSendDlgItemMsg(hwnd, NP_SEARCH_KEY, EM_SETTEXTLIMIT,
MPFROM2SHORT(NP_KEYSIZE,0),0L);
WinSendDlgItemMsg(hwnd, NP_MATCHEXACT, BM_SETCHECK,
MPFROM2SHORT(!fCaseInsensitive, 0),0L);
WinSetWindowText(WinWindowFromID(hwnd,NP_SEARCH_KEY),
szSearchKey);
return(0L);
break;
case WM_COMMAND:
switch (LOUSHORT(mp1)) {
case NP_SEARCH_OK:
WinQueryWindowText(WinWindowFromID(hwnd,NP_SEARCH_KEY),
NP_KEYSIZE, szSearchKey);
fCaseInsensitive = !((BOOL)WinSendDlgItemMsg(hwnd, NP_MATCHEXACT,
BM_QUERYCHECK, 0L, 0L));
DoSetKey();
WinDismissDlg(hwnd,MBID_OK);
return(0L);
break;
case NP_SEARCH_CANCEL:
WinDismissDlg(hwnd,MBID_CANCEL);
return(0L);
break;
default:
return(0L);
break;
}
break;
case WM_HELP:
return(0L);
break;
default:
return(WinDefDlgProc(hwnd, msg, mp1, mp2));
break;
}
}
/********** Search & Replace Dialog Window Procedure **************/
MRESULT CALLBACK ReplaceDlgProc(hwnd, msg, mp1, mp2)
HWND hwnd;
USHORT msg;
MPARAM mp1;
MPARAM mp2;
{
switch (msg) {
case WM_INITDLG:
WinSendDlgItemMsg(hwnd, NP_REPL_KEY, EM_SETTEXTLIMIT,
MPFROM2SHORT(NP_KEYSIZE,0),0L);
WinSetWindowText(WinWindowFromID(hwnd,NP_REPL_KEY),
szSearchKey);
WinSendDlgItemMsg(hwnd, NP_REPL_OBJ, EM_SETTEXTLIMIT,
MPFROM2SHORT(NP_KEYSIZE,0),0L);
WinSetWindowText(WinWindowFromID(hwnd,NP_REPL_OBJ),
szReplaceObject);
WinSendDlgItemMsg(hwnd, NP_MATCHEXACT, BM_SETCHECK,
MPFROM2SHORT(!fCaseInsensitive,0),NULL);
return(0L);
break;
case WM_COMMAND:
switch (LOUSHORT(mp1)) {
case NP_REPL_OK:
WinQueryWindowText(WinWindowFromID(hwnd,NP_REPL_KEY),
NP_KEYSIZE, szSearchKey);
WinQueryWindowText(WinWindowFromID(hwnd,NP_REPL_OBJ),
NP_KEYSIZE, szReplaceObject);
fCaseInsensitive = !((BOOL)WinSendDlgItemMsg(hwnd, NP_MATCHEXACT,
BM_QUERYCHECK, NULL, NULL));
DoSetKey();
WinDismissDlg(hwnd,MBID_OK);
return(0L);
break;
case NP_REPL_CANCEL:
WinDismissDlg(hwnd,MBID_CANCEL);
return(0L);
break;
default:
return(0L);
break;
}
break;
case WM_HELP:
return(0L);
break;
default:
return(WinDefDlgProc(hwnd, msg, mp1, mp2));
break;
}
}
/********************* search routines *********************/
static VOID highlightSelection(ULONG nch, int len, ULONG selpos)
{
WinSendMsg(hwndNPEdit, EM_SETSEL,
(MPARAM)(ULONG)(selpos+nch-len),
(MPARAM)(ULONG)(selpos+nch));
}
CHAR NextChInsens(VOID)
{
return((CHAR)WinUpperChar(hab,NULL,NULL,(USHORT)LFANextCh()));
}
BOOL DoSearch(VOID)
{
ULONG nch;
fSearching = TRUE;
if (!fKeySet)
return(FALSE);
LFAInit(FALSE);
if (KMPMatchKey((fCaseInsensitive ? NextChInsens : LFANextCh),
pckSearchKey, (PULONG)&nch)) {
highlightSelection(nch, lstrlen(szSearchKey), LFAStartPos());
} else {
WinAlarm(HWND_DESKTOP, WA_WARNING);
WinMessageBox(HWND_DESKTOP,
hwndNP,
szMsgs[MS_STRNOTFOU],
NULL,
0,
MB_OK | MB_ICONEXCLAMATION | MB_APPLMODAL);
}
return(nch >= 0);
}
BOOL DoReplace(VOID)
{
ULONG nch;
IPT iptBegin, iptKeyEnd, iptRepEnd;
ULONG uKeyLen, uRepLen;
fSearching = FALSE;
if (!fKeySet)
return(FALSE);
LFAInit(FALSE);
if (KMPMatchKey((fCaseInsensitive?NextChInsens:LFANextCh),
pckSearchKey,
(PULONG)&nch)) {
uKeyLen = lstrlen(szSearchKey);
uRepLen = lstrlen(szReplaceObject);
iptKeyEnd = LFAStartPos() + nch;
iptBegin = iptKeyEnd - uKeyLen;
iptRepEnd = iptBegin + uRepLen;
highlightSelection(nch, lstrlen(szSearchKey),LFAStartPos());
WinSendMsg(hwndNPEdit, EM_DELETE,
MPFROMLONG(iptBegin), MPFROMLONG(uKeyLen));
WinSendMsg(hwndNPEdit, EM_SETIMPORTEXPORT,
MPFROMP(szReplaceObject),
MPFROMSHORT((SHORT)uRepLen));
WinSendMsg(hwndNPEdit, EM_IMPORT, MPFROMP(iptBegin),
MPFROMSHORT((SHORT)uRepLen));
WinSendMsg(hwndNPEdit, EM_SETSEL,
(MPARAM)(ULONG)(iptBegin),
(MPARAM)(ULONG)(iptRepEnd));
} else {
WinAlarm(HWND_DESKTOP, WA_WARNING);
WinMessageBox(HWND_DESKTOP,
hwndNP,
szMsgs[MS_STRNOTFOU],
NULL,
0,
MB_OK | MB_ICONEXCLAMATION | MB_APPLMODAL);
}
return(nch >= 0);
}
BOOL DoNextSearchRep(VOID)
{
if (fSearching)
return(DoSearch());
else
return(DoReplace());
}
VOID DoSetKey(VOID)
{
char szKey[NP_KEYSIZE];
if (fCaseInsensitive) {
lstrcpy(szKey, szSearchKey);
WinUpper(hab,NULL,NULL,szKey);
KMPCompileKey(szKey, pckSearchKey);
} else {
KMPCompileKey(szSearchKey,pckSearchKey);
}
fKeySet = TRUE;
WinSendMsg(hwndNPMenu,
MM_SETITEMATTR,
MPFROM2SHORT(CMD_NEXTSRCH, TRUE),
MPFROM2SHORT(MIA_DISABLED, 0));
}
/********************* LINEAR file access stuff *********************/
static ULONG pos;
static char FAR *pch;
static ULONG chlen;
static ULONG selpos;
static ULONG reqpos;
VOID LFAInit(BOOL fAtStart)
{
pch = NULL;
chlen = 0;
pos = 1;
if (fAtStart)
reqpos = selpos = 0;
else
reqpos = selpos = LONGFROMMR(WinSendMsg(hwndNPEdit, EM_QUERYSEL, MPFROMSHORT(2), NULL));
}
ULONG LFAStartPos(VOID)
{
return(selpos);
}
CHAR LFANextCh(VOID)
{
CHAR ch;
if (pos >= chlen) {
reqpos += chlen;
pch = PVOIDFROMMR(WinSendMsg(hwndNPEdit, EM_GETTEXT, (MPARAM)reqpos, MPFROMP(&chlen)));
if (pch == NULL) {
ch = '\0';
} else {
pos = 1;
ch = *pch;
}
} else {
ch = (*(pch+(pos++)));
}
return(ch);
}