´ç±Ù 1.0ÀÇ °Ë»ö ±â´ÉÀº ÅØ½ºÆ®¸¸ °Ë»ö °¡´ÉÇÏ´Ù. ÅØ½ºÆ® ÆíÁý±âÀ̹ǷΠ´ç¿¬ÇÑ ¾ê±âÀÏÁö ¸ð¸£°ÚÁö¸¸ ÅØ½ºÆ®¿¡µµ ÅÇÀ̳ª °³Çà ÄÚµå °°Àº Á¦¾î ÄÚµåµéÀÌ Á¸ÀçÇϹǷΠÀ̵鵵 °Ë»ö ´ë»ó¿¡ Æ÷ÇԵǾî¾ß ÇÑ´Ù. ¶ÇÇÑ Å°º¸µå·Î Á÷Á¢ ÀÔ·ÂÇÒ ¼ö ¾ø´Â Äڵ尪µµ °Ë»öÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù.
ÅØ½ºÆ®¿ÜÀÇ Á¦¾î ÄÚµå´Â ¹®ÀÚ¿·Î Á÷Á¢ Ç¥ÇöÇÒ ¼ö ¾øÀ¸¹Ç·Î È®Àå¿À» »ç¿ëÇØ¾ß ÇÑ´Ù. È®Àå¿ °ü·Ã ±â´ÉÀº ¸ÅÅ©·Î ±¸¹®À» ÀÛ¼ºÇÒ ¶§ ÀÌ¹Ì ÇÔ¼ö¸¦ ÀÛ¼ºÇØ µÎ¾úÀ¸¹Ç·Î ÀÌ ÇÔ¼öµéÀ» Ȱ¿ëÇϱâ·Î ÇÑ´Ù. AeUtil¿¡ È®Àå¿À» ó¸®ÇÏ´Â ´ÙÀ½ ÇÔ¼ö¸¦ Ãß°¡ÇÑ´Ù.
// È®Àå¿À» º¯È¯ÇØ ÁØ´Ù. º¯È¯ ÈÄÀÇ ±æÀ̸¦ ¸®ÅÏÇÑ´Ù.
int AeEscapeString(TCHAR *src,TCHAR *dest)
{
const TCHAR *s;
TCHAR *d;
s=src;
d=dest;
for (;*s;) {
AeEscapeChar(s,d);
}
return d-dest;
}
¸ÅÅ©·ÎÀÇ È®Àå¿ Ã³¸® ·çƾÁß ÇÑ ¹®ÀÚ¿¡ ´ëÇØ È®Àå¿À» ó¸®ÇÏ´Â ÇÔ¼ö¸¦ È£ÃâÇß´Ù. ¸ÅÅ©·Î¿Í´Â ´Ù¸¥ ¸éÀÌ Á¶±Ý Àִµ¥ ¸ÅÅ©·ÎÀÇ ¹®ÀÚ¿Àº µû¿ÈÇ¥·Î µÑ·¯½Î¿© ÀÖÀ¸¹Ç·Î µû¿ÈÇ¥ ÀÚü¸¦ \"·Î¸¸ Ç¥ÇöÇÒ ¼ö ÀÖÁö¸¸ °Ë»öÀÇ È®Àå¿¿¡´Â "¸¦ ¹Ù·Î ¾µ ¼ö ÀÖ´Ù. µû¶ó¼ µû¿ÈÇ¥ÀÇ Â¦ÀÌ ¸ÂÁö ¾Ê´Â ¿¡·¯°¡ ¹ß»ýÇÏÁö ¾ÊÀ¸¸ç Àǹ̾ø´Â È®Àå¿Àº ¹«½ÃµÉ »ÓÀÌ´Ù.
ãÀ» ¹®ÀÚ¿Àº arFind¿¡ ÀúÀåµÇ´Âµ¥ ÀÌ ¹è¿¿¡ ÀúÀåµÇ´Â Æ÷¸ËÀº ¹®ÀÚ¿ ÇüÅ ±×´ë·ÎÀÌ´Ù. È®Àå¿Àº ġȯÇÏÁö ¾ÊÀºÃ¤·Î À¯ÁöÇϴµ¥ ±×·¡¾ß »ç¿ëÀÚ°¡ ÀÌ¹Ì ÀÔ·ÂÇÑ °Ë»ö½ÄÀ» ¼öÁ¤Çؼ ´Ù½Ã °Ë»öÇÒ ¼ö ÀÖ´Ù. FindText ÇÔ¼ö¿¡¼ °Ë»öÀ» ½ÃÀÛÇÒ ¶§ È®Àå¿À» ġȯÇÑ´Ù.
BOOL CApiEditText::FindText(int nPos, TCHAR *what, DWORD dwFlag)
{
int nStart;
TCHAR *pFound;
BOOL bWrap;
TCHAR szCom[256];
TCHAR *pWhat;
int len;
pWhat=(TCHAR *)malloc(lstrlen(what)+1);
if (strchr(what,'\\')==NULL) {
lstrcpy(pWhat,what);
len=lstrlen(pWhat);
} else {
len=AeEscapeString(what,pWhat);
}
wsprintf(szCom,"find \"%s\"",what);
if ((dwFlag & AE_FIND_WRAP)==0)
lstrcat(szCom," nowrap");
if (dwFlag & AE_FIND_UP)
lstrcat(szCom," up");
if (dwFlag & AE_FIND_WHOLEWORD)
lstrcat(szCom," word");
if (dwFlag & AE_FIND_MATCHCASE)
lstrcat(szCom," case");
AeMc.RecordCommand(szCom);
assert(nPos >= 0 && nPos <= pFrame->doclen);
if (nPos == -1) {
if (SelStart==SelEnd) {
nStart=off;
} else {
if (dwFlag & AE_FIND_UP) {
nStart=min(SelStart,SelEnd);
} else {
nStart=max(SelStart,SelEnd);
}
}
} else {
nStart=nPos;
}
bWrap=((dwFlag & AE_FIND_WRAP)!=0);
if (dwFlag & AE_FIND_UP) {
nStart=nStart-len;
if (nStart<0) {
if (bWrap) {
bWrap=FALSE;
nStart=max(0,pFrame->doclen-1);
} else {
free(pWhat);
return FALSE;
}
}
}
for (;;) {
pFound=FindString(pFrame->buf,nStart,what,(dwFlag & AE_FIND_UP)==0,
(dwFlag & AE_FIND_MATCHCASE)!=0);
if (pFound) {
if (dwFlag & AE_FIND_WHOLEWORD) {
if ((pFound==pFrame->buf || IsDelimiter(pFound-pFrame->buf-1)) &&
IsDelimiter(pFound-pFrame->buf+len)) {
break;
} else {
if (dwFlag & AE_FIND_UP) {
nStart=pFound-pFrame->buf-1;
} else {
nStart=pFound-pFrame->buf+len;
}
continue;
}
}
break;
}
if (bWrap) {
bWrap=FALSE;
if ((dwFlag & AE_FIND_UP)==0) {
nStart=0;
} else {
nStart=max(0,pFrame->doclen-1);
}
continue;
}
break;
}
free(pWhat);
if (pFound) {
// ¼±Åà ¿µ¿ª ±æÀÌ¿¡ º¯È°¡ »ý±ä´Ù.
SetSelect(pFound-pFrame->buf,pFound-pFrame->buf+len,TRUE);
return TRUE;
}
return FALSE;
}
pWhat ¹öÆÛ¸¦ »õ·Î ÇÒ´çÇÏ°í °Ë»ö½Ä¿¡ \°¡ ÀÖÀ¸¸é È®ÀåÇÏ°í ¾øÀ¸¸é ´Ü¼øÈ÷ º¹»çÇÑ´Ù. ÀÌÈÄ °Ë»ö ´ë»óÀº whatÀÌ ¾Æ´Ï¶ó pWhatÀÌ µÈ´Ù. ġȯÈÄÀÇ ±æÀ̰¡ ¹Ù²ð ¼ö Àֱ⠶§¹®¿¡ lenº¯¼ö¿¡ º°µµ·Î ±æÀ̸¦ ÀúÀåÇÏ°í ±æÀ̸¦ ÂüÁ¶ÇÏ´Â ¸ðµç Äڵ忡¼ lstrlen(what)À» lenÀ¸·Î ¹Ù²Û´Ù. »ç¿ëÀÚµéÀÌ È®ÀåÀÚ ¿¹¾à¾î¸¦ ¿Ü¿ö¼ ¾²Áö´Â ¾ÊÀ¸¹Ç·Î °Ë»ö ´ëÈ»óÀÚ¿¡ ÆË¾÷ ¸Þ´º¸¦ Á¦°øÇÑ´Ù.
BOOL CALLBACK FindDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
....
HMENU hMenu, hPopup;
POINT pt;
static int PopupID;
switch(iMessage) {
....
case WM_COMMAND:
switch (LOWORD(wParam)) {
....
case IDC_BTNINSCODE:
case IDC_BTNINSCODE2:
if (LOWORD(wParam)==IDC_BTNINSCODE) {
PopupID=IDC_FIND_WHAT;
} else {
PopupID=IDC_FIND_TO;
}
hMenu=LoadMenu(g_hInst, MAKEINTRESOURCE(IDR_POPUP));
hPopup=GetSubMenu(hMenu, 5);
GetCursorPos(&pt);
TrackPopupMenu(hPopup, TPM_LEFTALIGN, pt.x, pt.y,
0, hDlg, NULL);
DestroyMenu(hMenu);
return TRUE;
case IDM_CODE_ENTER:
case IDM_CODE_TAB:
case IDM_CODE_HEXA:
case IDM_CODE_DECIMAL:
case IDM_CODE_BACKSLASH:
GetDlgItemText(hDlg,PopupID,szTemp,256);
switch (LOWORD(wParam)) {
case IDM_CODE_ENTER:
lstrcat(szTemp,"\\n");
break;
case IDM_CODE_TAB:
lstrcat(szTemp,"\\t");
break;
case IDM_CODE_HEXA:
lstrcat(szTemp,"\\x");
break;
case IDM_CODE_DECIMAL:
lstrcat(szTemp,"\\i");
break;
case IDM_CODE_BACKSLASH:
lstrcat(szTemp,"\\\\");
break;
}
SetDlgItemText(hDlg,PopupID,szTemp);
SetFocus(GetDlgItem(hDlg,PopupID));
SendDlgItemMessage(hDlg,PopupID,CB_SETEDITSEL,0,MAKELPARAM(-1,0));
PostMessage(hDlg,WM_COMMAND,MAKEWPARAM(IDC_FIND_WHAT,CBN_EDITCHANGE),0);
return TRUE;
}
¹öưÀ» ´©¸£¸é ÆË¾÷ ¸Þ´º¸¦ º¸¿© ÁÖ°í ¼±ÅÃµÈ ¿¹¾à¾î¸¦ ÄÞº¸ ¹Ú½º ³¡¿¡ µ¡ºÙÀδÙ. FileFindDlgProcµµ ¿ÏÀüÈ÷ µ¿ÀÏÇÑ ¹æ½ÄÀ¸·Î ¼öÁ¤ÇÑ´Ù. ÄÁÆ®·Ñ·ÑÀÇ ID°¡ ÀÏÄ¡Çϱ⠶§¹®¿¡ Äڵ常 ±×´ë·Î º¹»çÇØ ³ÖÀ¸¸é µÈ´Ù.
´ç±Ù 2.0Àº ÀÌÁø ÆíÁýÀ» Áö¿øÇϹǷΠ¹®¼ Áß°£¿¡ ¾ðÁ¦µçÁö NULL¹®ÀÚ°¡ ³ª¿Ã ¼ö ÀÖÀ¸¸ç ¶ÇÇÑ °Ë»ö½Ä¿¡µµ NULL¹®ÀÚ°¡ Æ÷Ç﵃ ¼ö ÀÖ´Ù. ±×·¡¼ Áö±ÝºÎÅÍ °Ë»öÀº ¹®ÀÚ¿ °Ë»öÀÌ ¾Æ´Ï¶ó ÀÓÀÇÀÇ ÀÌÁø ½ºÆ®¸²¿¡ ´ëÇÑ °Ë»öÀ̾î¾ß ÇÑ´Ù. °Ë»ö½Ä¿¡ ¸ðµç ¹ÙÀÌÆ®°¡ ¿Ã ¼ö ÀÖÀ¸¸ç NULL¹®ÀÚ ÀÌÈĵµ °Ë»öÇØ¾ß ÇÑ´Ù. AeUtil.cpp¿¡ ¹®ÀÚ¿ °Ë»öÀ» ÇÏ´Â FindStringÀ̶ó´Â ÇÔ¼ö°¡ ÀÛ¼ºµÇ¾î Àִµ¥ ÀÌ ÇÔ¼ö°¡ ÀÓÀÇÀÇ ÀÌÁø ½ºÆ®¸²ÀÇ °Ë»öÇÒ ¼ö ÀÖµµ·Ï ¼öÁ¤ÇÑ´Ù. °Ë»ö½ÄÀº ¹°·ÐÀÌ°í °Ë»ö ´ë»ó ¹öÆÛµµ ÀÌÁø µ¥ÀÌÅÍÀ̹ǷΠµÑ ´Ù ±æÀ̰ªÀ» Àμö·Î Àü´Þ¹Þ¾Æ¾ß ÇÑ´Ù.
TCHAR *FindString(TCHAR *buf, int buflen, int nPos, TCHAR* what,int len,BOOL bDown, BOOL bCase)
{
TCHAR *pWhat,*p;
int nOff;
TCHAR *pResult;
BOOL bFind;
int Inc;
int len;
TCHAR ch;
pWhat=(TCHAR *)malloc(len);
memcpy(pWhat,what,len);
if (bCase==FALSE) {
for (p=pWhat;p-pWhat<len;p++) {
*p=toupper(*p);
}
}
len=lstrlen(pWhat);
if (bDown) {
Inc=1;
} else {
Inc=-1;
}
for (;;nPos+=Inc) {
if (nPos>buflen-len || nPos<0) {
pResult=NULL;
break;
}
....
¹öÆÛÀÇ ±æÀ̸¦ ÁöÁ¤ÇÏ´Â buflen Àμö¿Í °Ë»ö½ÄÀÇ ±æÀ̸¦ ÁöÁ¤ÇÏ´Â len Àμö°¡ Ãß°¡µÇ¾ú´Ù. ±æÀ̰¡ º°µµÀÇ Àμö·Î Àü´ÞµÇ¹Ç·Î Áö¿ªº¯¼ö lenÀº ÇÊ¿äÄ¡ ¾ÊÀ¸¸ç ±æÀ̸¦ ±¸ÇÏ´Â lstrlen ÇÔ¼ö È£Ãâ¹®µµ Çʿ䰡 ¾ø´Ù. ´ë¼Ò¹®ÀÚ ±¸ºÐ ¹«½Ã ¿É¼ÇÀÌ ¼³Á¤µÇ¾î ÀÖÀ» °æ¿ì ¸ðµÎ ´ë¹®ÀÚ·Î ¹Ù²Û ÈÄ °Ë»öÀ» ½ÃÀÛÇϴµ¥ À̶§ ´ë¹®ÀÚ·Î ¹Ù²Ù±â À§ÇØ CharUpper ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ¾ø´Ù. ¿Ö³ÄÇϸé ÀÌ ÇÔ¼ö´Â ¹®ÀÚ¿¿¡ ´ëÇØ¼¸¸ µ¿ÀÛÇϱ⠶§¹®ÀÌ´Ù. ¹öÆÛ¸¦ Á÷Á¢ ¼øÈ¸ÇÏ¸é¼ ¸ðµç ¼Ò¹®ÀÚ¸¦ ´ë¹®ÀÚ·Î ¹Ù²ã¾ß ÇÑ´Ù.
°Ë»öÀ» ³¡³¾ Á¶°Çµµ ¾à°£ ´Þ¶óÁø´Ù. ÀÌÀüÀÇ Á¶°ÇÀº buf[nPos]==0À̾úÀ¸¸ç ¹®¼ÀÇ ³¡±îÁö °Ë»öÇß¾úÀ¸³ª ÀÌÁ¦ NULL¹®ÀÚ°¡ ¹®¼ÀÇ ³¡ÀÌ ¾Æ´Ï±â ¶§¹®¿¡ ÀÌ Á¶°ÇÀ¸·Î´Â ¹®¼ÀÇ ³¡À» ¾Ë ¼ö ¾ø´Ù. ±×·¡¼ Àμö·Î Àü´ÞµÈ buflen ±æÀ̸¸Å °Ë»öÇØ¾ß Çϴµ¥ À̶§ °Ë»ö½ÄÀÇ ±æÀ̸¸ÅÀº »©¾ß ÇÑ´Ù. ¹®¼³¡±îÁö °Ë»öÇØ ¹ö¸®¸é ´ÙÀ½°ú °°Àº Àç¼ö¾ø´Â °æ¿ì°¡ ¹ß»ýÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù.

"Dangeun first"¶ó´Â ¹®¼¿¡¼ "student"¶ó´Â ¹®ÀÚ¿À» ã´Â´Ù°í ÇÒ¶§ ¹®¼ ³¡±îÁö ã¾Æ ¹ö¸®¸é ¸¶Áö¸· µÞÂÊÀÇ s, t±îÁö ÀÏÄ¡ÇÒ ¶§ ¹®¼ ³Ê¸Ó±îÁö ³ª¸ÓÁö ¹®ÀÚÀÇ ÀÏÄ¡ ¿©ºÎ¸¦ °Ë»çÇÏ·Á°í ÇÒ °ÍÀÌ´Ù. ÀÌ µÚÂÊ¿¡´Â ¾²·¹±â°ªÀÌ µé¾î Àִµ¥ ¿©±â¿¡ ¿ì¿¬È÷ "udent"¶ó´Â ¹®ÀÚ¿ÀÌ µé¾î ÀÖ¾ú´Ù¸é ÀÌ À§Ä¡¿¡¼ ¹®ÀÚ¿À» ã¾Ò´Ù°í ¸®ÅÏÇÒ °ÍÀÌ´Ù. È®·üÀûÀ¸·Î Èñ¹ÚÇÒ °Í °°Áö¸¸ ¹®¼ ³¡¿¡¼ °Ë»ö½ÄÀÇ ¾ÕºÎºÐÀÌ ÀÏÄ¡ÇÏ´Â °æ¿ì´Â »ý°¢º¸´Ù ÈξÀ ´õ ¸¹´Ù.
´õ Å« ¹®Á¦´Â ¹®¼ µÞºÎºÐÀÌ Çã°¡µÇÁö ¾ÊÀº ¸Þ¸ð¸® ¿µ¿ªÀÏ ¼öµµ ÀÖ´Ù´Â Á¡Àε¥ ÀÌ ¿µ¿ªÀÌ Àб⠱ÝÁöÀÏ °æ¿ì ÇÁ·Î±×·¥Àº Á×À» ¼öµµ ÀÖ´Ù. ¼³»ç Àб⠰¡´ÉÇÑ ¿µ¿ªÀ̶ó ¿äÇàÈ÷ Á×Áö ¾Ê¾Ò´Ù ÇÏ´õ¶óµµ ApiEdit°¡ °Ë»öµÈ ¹®ÀÚ¿À» Ç¥½ÃÇϱâ À§ÇØ ¹®¼ ³Ê¸Ó±îÁö ¼±ÅÃÀ» È®ÀåÇÏ´Â °úÁ¤¿¡¼ ºñÁ¤»óÀûÀÎ ¾×¼¼½º°¡ ÀÌ·ç¾îÁø´Ù. ÀÌ ¿µ¿ªÀº ¹®¼ ¹Ù±ùÀÏ »Ó¸¸ ¾Æ´Ï¶ó Á¤·Ä ¹öÆÛ¿¡µµ ¾ø´Â ¿µ¿ªÀ̹ǷΠ°Ë»ö ÈÄ¿¡ ÇÁ·Î±×·¥À» ´Ù¿î½ÃŰ´Â Ä¡¸íÀûÀÎ ¹®Á¦¸¦ ÀÏÀ¸Å²´Ù.
ÀÌÁø °Ë»öÀ» °í·ÁÇÏÁö ¾Ê¾Ò´ø ÀÌÀü ¹öÀü¿¡µµ ÀÌ ¹®Á¦´Â ¸¶Âù°¡Áö¿©¼ ´ç±Ù 1.0ÀÇ °¡Àå Å« ¹ö±×¿´¾ú´Ù. ÀÌ ÇÔ¼ö°¡ ±æÀ̸¦ Àü´Þ¹Þ°í Á¤È®ÇÏ°Ô ±æÀ̱îÁö °Ë»öÇϹǷΠ¹®¼ Áß°£ÀÇ NULL¹®ÀÚ ÀÌÈĵµ °Ë»öÇÒ ¼ö ÀÖÀ» »Ó¸¸ ¾Æ´Ï¶ó °Ë»ö½Ä¿¡µµ NULL¹®ÀÚ¸¦ ¾µ ¼ö ÀÖ´Ù. °Ë»öÀÇ ÇÙ½É ÇÔ¼ö°¡ ¼öÁ¤µÇ¾úÀ¸¹Ç·Î ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â ¸ðµç °÷À» ´Ù ¼öÁ¤ÇØ¾ß ÇÑ´Ù. ¸ÕÀú °Ë»ö ÇÔ¼öÀÎ FindText¸¦ ¼öÁ¤ÇÑ´Ù.
BOOL CApiEditText::FindText(int nPos, TCHAR *what, DWORD dwFlag)
{
....
if (dwFlag & AE_FIND_UP) {
nStart=nStart-len;
if (nStart<0) {
if (bWrap) {
bWrap=FALSE;
nStart=max(0,pFrame->doclen-len);
} else {
free(pWhat);
return FALSE;
}
}
}
....
for (;;) {
pFound=FindString(pFrame->buf,pFrame->doclen,nStart,pWhat,len,(dwFlag & AE_FIND_UP)==0,
(dwFlag & AE_FIND_MATCHCASE)!=0);
....
if (bWrap) {
bWrap=FALSE;
if ((dwFlag & AE_FIND_UP)==0) {
nStart=0;
} else {
nStart=max(0,pFrame->doclen-len);
}
continue;
}
FindString ÇÔ¼ö·Î ¹®¼ÀÇ ±æÀÌ¿Í °Ë»ö½ÄÀÇ ±æÀ̸¦ Àü´ÞÇß´Ù. ÀÌ ÇÔ¼ö°¡ Àü´Þ¹Þ´Â °Ë»ö½ÄÀº ¹®ÀÚ¿ÀÌÁö¸¸ È®Àå¿À» ó¸®ÇÑ ÈÄ¿¡´Â ÀÌÁø ¹®ÀÚ¿ÀÌ µÇ¸ç ±× ±æÀ̰¡ len Áö¿ª º¯¼ö¿¡ Á¶»çµÇ¹Ç·Î ÀÌ Áö¿ª º¯¼ö¸¦ °Ë»ö ÇÔ¼ö·Î ³Ñ±â¸é µÈ´Ù. ¾Æ·¡ÂÊ¿¡ ¼öÁ¤µÈ ÄÚµå´Â ÀÌÀü ã±â(Shift+F3)¸¦ Á¦´ë·Î Áö¿øÇϱâ À§ÇؼÀÌ´Ù. ·¡ÇÎ ¿É¼ÇÀÌ ¼±ÅÃµÈ »óÅ¿¡¼ À§ÂÊÀ¸·Î °Ë»öÇÒ ¶§ ¹®¼ ¾ÕÂÊ¿¡¼ °Ë»ö¿¡ ½ÇÆÐÇÏ¸é ¹®¼ ³¡¿¡¼ºÎÅÍ ´Ù½Ã Çѹø ´õ °Ë»öÇØ¾ß ÇÑ´Ù. À̶§ °Ë»öÀ» ½ÃÀÛÇÒ ¹®¼ÀÇ ³¡Àº ¹®¼ ±æÀÌ¿¡¼ °Ë»ö¹®ÀÚ¿ÀÇ ±æÀ̸¦ »« À§Ä¡¿©¾ß ÇÑ´Ù.
¿ø·¡ ÀÌ ÀÚ¸®¿¡´Â pFrame->doclen-1 ¼ö½ÄÀÌ ÀÛ¼ºµÇ¾î ÀÖ¾ú´Âµ¥ ¹®¼ÀÇ ³¡¿¡¼ºÎÅÍ ¿ª°Ë»öÀ» Çß´Ù. ¾Õ¿¡¼ ¼³¸íÇß´Ù½ÃÇÇ ÀÌ À§Ä¡ºÎÅÍ °Ë»ö½ÄÀ» ºñ±³ÇÏ¸é ¹®¼ ¹üÀ§¸¦ ³Ñ¾î¼±â ¶§¹®¿¡ À§ÇèÇØÁø´Ù. ´õ±¸³ª Áö±ÝÀº ¹Ù·Î ¾Õ¿¡¼ FindStringÀÌ À¯È¿ÇÑ ¹üÀ§ÀÎÁö¸¦ Á¡°ËÇϵµ·Ï Äڵ带 ¼öÁ¤Ç߱⠶§¹®¿¡ ÀÌ´ë·Î¶ó¸é Shift+F3´Â ·¡ÇÎÀÌ µÇÁö ¾Ê´Â´Ù. ±×·¡¼ ¹®¼³¡¿¡¼ °Ë»ö½ÄÀÇ ±æÀ̸¸Å ¾ÕÂÊ¿¡¼ ¿ª°Ë»öÀ» Çϵµ·Ï ¼öÁ¤Çß´Ù. ´ÙÀ½Àº ÆÄÀÏ °Ë»ö ÇÔ¼ö¸¦ ¼öÁ¤ÇÑ´Ù.
int OnFindFile(TCHAR *Path,DWORD Attr,LPVOID pCustom)
{
....
int len;
if (Attr & FILE_ATTRIBUTE_DIRECTORY)
return 0;
if (strchr(arFind[0].Get(0),'\\')==NULL) {
lstrcpy(what,arFind[0].Get(0));
len=lstrlen(what);
} else {
len=AeEscapeString(arFind[0].Get(0),what);
}
hFile=CreateFile(Path,GENERIC_READ,0,NULL,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hFile==INVALID_HANDLE_VALUE) {
return -1;
}
size=GetFileSize(hFile,NULL);
size=min(size,30*1048576);
buf=(TCHAR *)malloc(size);
ReadFile(hFile,buf,size,&dwRead,NULL);
buf[size]=0;
for (pbuf=buf;;) {
p=FindString(pbuf,size-(pbuf-buf),0,what,len,TRUE,(FindFlag
& AE_FIND_MATCHCASE)!=0);
if (p == NULL)
break;
if (FindFlag & AE_FIND_WHOLEWORD) {
if (!((p==buf || IsDelimiter(*(p-1))) && IsDelimiter(*(p+len)))) {
pbuf=p+len;
continue;
}
}
TotalFind++;
GetLineNumAndText(buf,size,p,Text,line,col);
....
pbuf=p+len;
if (bContFIF==FALSE)
break;
}
free(buf);
CloseHandle(hFile);
return 0;
}
FindText ÇÔ¼ö¿Í ºñ½ÁÇÑ ¹æ¹ýÀ¸·Î ¼öÁ¤ÇÑ´Ù. Á¶»çµÈ °Ë»ö½ÄÀº ¾ÆÁ÷ ¹®ÀÚ¿À̹ǷΠȮÀå¿À» Ä¡È¯ÇØ¾ß ÀÌÁø °Ë»ö½ÄÀ» ¾òÀ» ¼ö ÀÖÀ¸¸ç ÀÌ ±æÀ̸¦ FindString¿¡°Ô Àü´ÞÇÑ´Ù. °Ë»öÇÒ ±æÀÌ´Â Àüü ¹®¼ ±æÀÌ¿¡¼ ¹®¼ µÚÂÊÀÇ ³²Àº ºÎºÐ¸¸ÅÀÌ´Ù. ¿¹¸¦ µé¾î 1000¹ÙÀÌÆ® ¹®¼¿¡¼ ±æÀÌ 5ÀÇ µ¥ÀÌÅ͸¦ ã´Âµ¥ 230¹øÂ°¿¡¼ óÀ½ ¹ß°ßµÇ¾ú´Ù¸é pbuf´Â 235°¡ µÇ¸ç ´ÙÀ½ °Ë»ö ¹®¼ÀÇ ±æÀÌ´Â 1000-235°¡ µÇ´Â °ÍÀÌ ¸Â´Ù. ÀÌ ±æÀ̸¦ À߸ø °è»êÇÏ¸é ¸¶Âù°¡Áö·Î ÇÁ·Î±×·¥ÀÌ ´Ù¿îµÉ À§ÇèÀÌ ÀÖ´Ù. °Ë»öµÈ À§Ä¡ÀÇ ÅØ½ºÆ®¿Í Çà¿ ¹øÈ£¸¦ ±¸ÇÏ´Â ÇÔ¼öµµ ¼öÁ¤ÇÑ´Ù.
void GetLineNumAndText(TCHAR *szBuf, int buflen, TCHAR *ptr, TCHAR *Text, int &line, int &col)
{
....
while ((p-szBuf < buflen) && (*p != '\r') && (*p != '\n') && (t-Text < 499)) {
....
szBuf°¡ ³Î Á¾·á ¹®ÀÚ¿À̶ó°í °¡Á¤Çϰí ÀÖ¾ú±â ¶§¹®¿¡ ¹®¼ÀÇ ³¡À» *p°¡ 0ÀÏ ¶§·Î Á¶»çÇß¾úÀ¸³ª ÀÌÁø ÆÄÀÏÀº º°µµÀÇ ±æÀ̸¦ Àü´Þ¹ÞÀº ÈÄ ±æÀ̸¦ Á÷Á¢ ºñ±³ÇØ¾ß ÇÑ´Ù. °Ë»öµÈ ¹®ÀÚ¿À» ã¾Æ°¡´Â ¹æ¹ýµµ ´Þ¶óÁø´Ù.
void OpenFileFromOutput(int idx)
{
TCHAR LastFIF2[256];
int len;
....
hActive=(HWND)SendMessage(g_hMDIClient,WM_MDIGETACTIVE,0,NULL);
pSi=(SInfo *)GetWindowLongPtr(hActive,0);
if (pSi->Ae.GetActiveView()->ViewType==HEXA_VIEW) {
MessageBox(g_hFrameWnd,"Ȱ¼º ºä°¡ Çí»ç ºäÀÏ ¶§´Â °Ë»ö °á°ú¸¦ ã¾Æ°¥ ¼ö "
"¾ø½À´Ï´Ù.","¾Ë¸²",MB_OK);
return;
}
toff=pSi->Ae.GetOffFromPara(line,col);
if (strchr(LastFIF,'\\')==NULL) {
lstrcpy(LastFIF2,LastFIF);
len=lstrlen(LastFIF2);
} else {
len=AeEscapeString(LastFIF,LastFIF2);
}
pSi->Ae.GetText(Text,MAX_PATH,toff,toff+len);
Text[len]=0;
if (stricmp(Text,LastFIF2) != 0) {
MessageBox(g_hFrameWnd,"°Ë»ö ÈÄ¿¡ ÆÄÀÏÀÌ ¼öÁ¤µÇ¾ú½À´Ï´Ù. "
"°Ë»öµÈ ÁÙÀÇ Ã¹ À§Ä¡·Î À̵¿ÇÕ´Ï´Ù.","¾Ë¸²",MB_OK);
pSi->Ae.GotoLine(line,0,1);
} else {
pSi->Ae.GotoLine(line,col,1);
pSi->Ae.SetSelect(toff,toff+len,TRUE);
}
}
LastFIF¿¡´Â °Ë»ö½ÄÀÌ ±×´ë·Î ÀúÀåµÇ¾î ÀÖÀ¸¹Ç·Î È®Àå¿À» ġȯÇÑ ÈÄ ÀÌ ¹®ÀÚ¿À» ã¾Æ°£´Ù. LastFIF2°¡ ¹®¼ÀÇ ÅØ½ºÆ®¿Í °°ÀºÁö ºñ±³Çϱâ À§ÇØ ¿©ÀüÈ÷ stricmp ÇÔ¼ö·Î ºñ±³Çϰí Àִµ¥ ¸Þ¸ð¸® ºñ±³´Â ´ë¼Ò¹®ÀÚ¸¦ ±¸ºÐÇϱ⠶§¹®ÀÌ´Ù. ÀÌ °æ¿ì´Â ´ë¼Ò¹®ÀÚ¸¦ ±¸ºÐÇÏÁö ¾Ê°í ºñ±³ÇÏ´Â °ÍÀÌ ¿Ç´Ù. LastFIF2´Â ÀÌÁø ½ºÆ®¸²À̹ǷΠ°¡²û Á¤È®ÇÏÁö ¾ÊÀ» ¼öµµ Àִµ¥ ¾îµð±îÁö³ª ±Ø´ÜÀûÀÎ »óȲ¿¡ ´ëÇÑ ¿¡·¯ ó¸® ÄÚµåÀ̹ǷΠ´ëÃæ ÀÛ¼ºÇß´Ù. ÆÄÀÏ ¹Ù²Ù±â´Â ÆÄÀÏÀ» ´Ù·ç±â ¶§¹®¿¡ Á» ´õ º¹ÀâÇÏ´Ù.
int OnReplaceFile(TCHAR *Path, DWORD Attr, LPVOID pCustom)
{
....
if (FindChildWithFile(Path) != NULL) {
wsprintf(Mes, "%s ÆÄÀÏÀº ¿·Á ÀÖÀ¸¹Ç·Î ¹Ù²Ù±â¸¦ ¼öÇàÇÒ ¼ö ¾ø½À´Ï´Ù.",Path);
MessageBox(g_hFrameWnd,Mes,"¾Ë¸²",MB_OK);
return -1;
}
if (strchr(arFind[0].Get(0),'\\')==NULL) {
lstrcpy(what,arFind[0].Get(0));
len1=lstrlen(what);
} else {
len1=AeEscapeString(arFind[0].Get(0),what);
}
if (strchr(arFind[1].Get(0),'\\')==NULL) {
lstrcpy(to,arFind[1].Get(0));
len2=lstrlen(to);
} else {
len2=AeEscapeString(arFind[1].Get(0),to);
}
hFile=CreateFile(Path,GENERIC_READ,0,NULL,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
size=GetFileSize(hFile,NULL);
if (size > 30*1048576) {
CloseHandle(hFile);
return -1;
}
extra=10000;
memsize=size+extra+1;
buf=(TCHAR *)malloc(memsize);
ReadFile(hFile,buf,size,&dwRead,NULL);
buf[size]=0;
for (pbuf=buf;;) {
....
p=FindString(pbuf,size-(pbuf-buf),0,what,len1,TRUE,(FindFlag
& AE_FIND_MATCHCASE)!=0);
if (p == NULL)
break;
if (FindFlag & AE_FIND_WHOLEWORD) {
if (!((p==buf || IsDelimiter(*(p-1))) && IsDelimiter(*(p+len1)))) {
pbuf=p+len1;
continue;
}
}
bReplace=TRUE;
memmove(p+len2,p+len1,size-(p+len1-buf));
memcpy(p,to,len2);
size+=(len2-len1);
TotalFind++;
GetLineNumAndText(buf,size,p,Text,line,col);
....
ListView_SetItemText(hList,idx,2,Text);
ListView_EnsureVisible(hList,idx,FALSE);
UpdateWindow(hList);
....
if (hFile!=INVALID_HANDLE_VALUE) {
WriteFile(hFile,buf,size,&dwRead,NULL);
CloseHandle(hFile);
}
ãÀ» ¹®ÀÚ¿°ú ¹Ù²Ü ¹®ÀÚ¿À» ¸ðµÎ È®Àå¿·Î ÀÏ´Ü Ä¡È¯ÇØ ³õ´Â´Ù. FindStringÀ» È£ÃâÇÏ´Â ¹æ½ÄÀº OnFindFile ÇÔ¼ö¿Í µ¿ÀÏÇÏ´Ù. ¸Þ¸ð¸® À̵¿½Ã À̵¿ ±æÀ̸¦ °è»êÇÒ ¶§´Â lstrlen ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ¾ø´Ù. p+len-buf´Â °Ë»öµÈ ¹®ÀÚ¿ ´ÙÀ½ÀÇ ¿ÀÇÁ¼ÂÀ̸ç ÀÌ °ªÀ» ÇöÀçÀÇ ÆÄÀÏ Å©±â size¿¡¼ »©¸é ¹öÆÛÀÇ ³¡±îÁö À̵¿µÈ´Ù.
ġȯÀ» ÇÒ ¶§¸¶´Ù ¸®½ºÆ® ºä¿¡ Áï½Ã °á°ú¸¦ º¸¿©ÁÖ±â À§ÇØ EnsureVisible ÇÔ¼ö¸¦ È£ÃâÇߴµ¥ ÀÌ È£ÃâÀÌ ´ç¿¬È÷ ÀÖ¾î¾ß Çϳª 1.0¿¡¼ ´©¶ôµÇ¾ú´Ù. ÆÄÀÏ Å©±â size´Â ġȯµÉ ¶§¸¶´Ù µÎ ¹®ÀÚ¿ÀÇ Â÷À̸¸Å °°ÀÌ ´Ã¾î³ª¸ç ÃÖÁ¾ÀûÀ¸·Î ÆÄÀÏÀ» ÀúÀåÇÒ ¶§ ÀÌ Å©±â¸¸Å ÀúÀåÇØ¾ß ÇÑ´Ù. ¹Ù²Ù±â ÇÔ¼öµµ ºñ½ÁÇÑ ¹æ¹ýÀ¸·Î ¼öÁ¤ÇÑ´Ù.
int CApiEditText::ReplaceText(int nPos, TCHAR *what, DWORD dwFlag, TCHAR *to)
{
int len,tolen;
TCHAR *pSel;
TCHAR *pWhat,*pTo;
int Result;
TCHAR szDesc[1024];
TCHAR szCom[256];
TCHAR *p;
// ¸ÅÅ©·Î ±â·Ï
wsprintf(szCom,"replace \"%s\" \"%s\"",what,to);
if ((dwFlag & AE_FIND_WRAP)==0)
lstrcat(szCom," nowrap");
if (dwFlag & AE_FIND_UP)
lstrcat(szCom," up");
if (dwFlag & AE_FIND_WHOLEWORD)
lstrcat(szCom," word");
if (dwFlag & AE_FIND_MATCHCASE)
lstrcat(szCom," case");
AeMc.RecordCommand(szCom);
// °Ë»öµÇÁö ¾ÊÀº »óÅ¿¡¼ ¹Ù²Ù±âÀÌ¸é °Ë»öºÎÅÍ ÇÑ´Ù.
if (SelStart == SelEnd) {
if (FindText(nPos,what,dwFlag) == TRUE) {
Result=1;
} else {
Result=0;
}
} else {
// È®Àå¿ÀÌ¸é ¸ÕÀú º¯È¯ÇÑ´Ù.
pWhat=(TCHAR *)malloc(lstrlen(what)+1);
if (strchr(what,'\\')==NULL) {
lstrcpy(pWhat,what);
len=lstrlen(pWhat);
} else {
len=AeEscapeString(what,pWhat);
}
pTo=(TCHAR *)malloc(lstrlen(to)+1);
if (strchr(to,'\\')==NULL) {
lstrcpy(pTo,to);
tolen=lstrlen(pTo);
} else {
tolen=AeEscapeString(to,pTo);
}
// ¼±Åà ¿µ¿ªÀÇ ÅØ½ºÆ®¸¦ Àд´Ù.
pSel=(TCHAR *)malloc(len);
memcpy(pSel,pFrame->buf+min(SelStart,SelEnd),len);
// ´ë¼Ò ±¸ºÐ¾øÀÌ ºñ±³ÇÑ´Ù¸é ¸ðµÎ ´ë¹®ÀÚ·Î º¯°æÇÑ´Ù.
if ((dwFlag & AE_FIND_MATCHCASE) == 0) {
for (p=pWhat;p-pWhat<len;p++) *p=toupper(*p);
for (p=pSel;p-pSel<len;p++) *p=toupper(*p);
}
// ¼±Åÿµ¿ªÀÌ °Ë»öÇÒ ³»¿ëÀÌ ¾Æ´Ï¸é °Ë»ö ¸í·ÉÀ» ´ë½Å ½ÇÇàÇÑ´Ù.
if (memcmp(pWhat,pSel,len) != 0) {
if (FindText(nPos,what,dwFlag) == TRUE) {
Result=1;
} else {
Result=0;
}
} else {
// ¼±Åÿµ¿ªÀ» Áö¿ì°í ´ëü ¹®ÀÚ¿À» »ðÀÔÇÑ´Ù.
wsprintf(szDesc," (%s -> %s)",what,to);
pFrame->StartUndoGroup(11,szDesc);
DeleteSelection();
Insert(off,pTo,tolen);
off+=tolen;
SetCaret();
Invalidate(-1);
// ´ÙÀ½ °Ë»ö °á°ú°¡ ¾øÀ¸¸é 0À» ¸®ÅÏÇÏ¿© ¹Ù²Ù±â¸¦ ÁßÁöÇÑ´Ù.
if (FindText(off,what,dwFlag) == TRUE) {
Result=2;
} else {
Result=0;
}
pFrame->EndUndoGroup();
}
free(pWhat);
free(pTo);
free(pSel);
}
return Result;
}
¿øÇüÀº ±×´ë·ÎÀÌÁö¸¸ ³»ºÎ¿¡¼ È®Àå¿ º¯È¯ ÈÄ °Ë»öÇϱ⠶§¹®¿¡ ¿©±â Àú±â ¼öÁ¤ÇÒ °÷ÀÌ ¸¹¾ÆÁ³´Ù. ¸ÅÅ©·Î ±â·Ï¹®¿¡ find¸¦ ±â·ÏÇÏ´Â ¿ÀŸµµ ÀÖ¾ú´Âµ¥ °°ÀÌ ¼öÁ¤ÇßÀ¸¸ç ´ÙÀ½ °Ë»ö °á°ú°¡ ¾øÀ» ¶§µµ ¹«Á¶°Ç 2¸¦ ¸®ÅÏÇÏ´Â ¹ö±×µµ Àâ¾Ò´Ù. º¹ÀâÇϱ⠶§¹®¿¡ ÁÖ¼® ÀÛ¾÷µµ »õ·Î Çß´Ù.
´ç±Ù 1.0ÀÇ ¸ðµÎ ¹Ù²Ù±â ±â´ÉÀº Ç×»ó ÇöÀç À§Ä¡ ÀÌÈĸ¸ ¹Ù²Ù´Â ¹®Á¦°¡ ÀÖ´Ù. ¸ðµÎ ¹Ù²Ù±â´Â ÆíÁýÇϰí ÀÖ´Â ÆÄÀÏ Àüü¸¦ ´ë»óÀ¸·Î ÇÏ´Â °ÍÀÌ ´õ ÁÁÀºµ¥ 1.0À» ¸¸µé ¶§ ±âȹÀ» À߸øÇß´Ù. ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.
void OnUser2(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
....
case 3:
int Result;
pSi->Ae.StartUndoGroup(6);
for (i=0;;) {
tFlag=FindFlag;
tFlag &= ~AE_FIND_WRAP;
Result=pSi->Ae.ReplaceText(0,arFind[0].Get(0), tFlag,arFind[1].Get(0));
UpdateWindow(pSi->Ae.hWnd);
ReplaceText ÇÔ¼öÀÇ Ã¹¹øÂ° Àμö¸¦ -1¿¡¼ 0À¸·Î ¼öÁ¤Çϱ⸸ ÇÏ¸é µÈ´Ù. ¿É¼ÇÀ¸·Î µÑ ¼öµµ ÀÖÀ¸³ª ÇöÀç À§Ä¡ ÀÌÈĸ¸ ¸ðµÎ ¹Ù²Ù±â¸¦ ÇÏ´Â °æ¿ì°¡ µå¹° °Í °°¾Æ ¿É¼ÇÀ¸·Î ¸¸µéÁö ¾Ê¾Ò´Ù. ¹Ù²Ù±â ´ëÈ»óÀÚÀÇ ¹öư »ç¿ë ±ÝÁö Äڵ忡 ³í¸®»óÀÇ ÇãÁ¡ÀÌ ÀÖ´Ù. °Ë»ö ´ëÈ»óÀÚÀÇ Äڵ带 º¸¸é ´ÙÀ½°ú °°ÀÌ µÇ¾î ÀÖ´Ù.
BOOL CALLBACK FindDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
....
case WM_COMMAND:
....
case IDC_FIND_TO:
switch (HIWORD(wParam)) {
case CBN_EDITCHANGE:
if (GetWindowTextLength(GetDlgItem(hDlg,IDC_FIND_TO)) == 0 ||
GetWindowTextLength(GetDlgItem(hDlg,IDC_FIND_WHAT)) == 0) {
EnableWindow(GetDlgItem(hDlg,IDC_BTNREPLACE),FALSE);
EnableWindow(GetDlgItem(hDlg,IDC_BTNREPLACEALL),FALSE);
} else {
EnableWindow(GetDlgItem(hDlg,IDC_BTNREPLACE),TRUE);
EnableWindow(GetDlgItem(hDlg,IDC_BTNREPLACEALL),TRUE);
}
break;
....
ãÀ» ¹®ÀÚ¿°ú ¹Ù²Ü ¹®ÀÚ¿ Áß Çϳª¶óµµ ÀԷµÇÁö ¾ÊÀ¸¸é ã±â, ¹Ù²Ù±â ¸ðµÎ¸¦ ÇÒ ¼ö ¾ø´Ù. ±×·¯³ª ¹Ù²Ü ¹®ÀÚ¿Àº ¾ø¾îµµ ¹Ù²Ù±â¸¦ ÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ¿Ö³ÄÇÏ¸é Æ¯Á¤ ¹®ÀÚ¿À» ã¾Æ¼ Áö¿ï ¼öµµ Àֱ⠶§¹®ÀÌ´Ù. ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.
case IDC_FIND_TO:
switch (HIWORD(wParam)) {
case CBN_EDITCHANGE:
if (GetWindowTextLength(GetDlgItem(hDlg,IDC_FIND_WHAT)) == 0) {
EnableWindow(GetDlgItem(hDlg,IDC_BTNREPLACE),FALSE);
EnableWindow(GetDlgItem(hDlg,IDC_BTNREPLACEALL),FALSE);
} else {
EnableWindow(GetDlgItem(hDlg,IDC_BTNREPLACE),TRUE);
EnableWindow(GetDlgItem(hDlg,IDC_BTNREPLACEALL),TRUE);
}
break;
....
case IDC_BTNFIND:
case IDC_BTNREPLACE:
case IDC_BTNREPLACEALL:
case IDC_BTNFINDALL:
....
GetDlgItemText(hDlg,IDC_FIND_TO,szTemp,255);
if (lstrlen(szTemp)) {
arFind[1].Add(szTemp);
RefillHistory(GetDlgItem(hDlg,IDC_FIND_TO),arFind[1]);
}
IDC_FIND_TOÀÇ ±æÀÌ´Â Á¡°ËÇÒ ÇÊ¿ä¾ø´Ù. ¹Ù²Ü ¹®ÀÚ¿ÀÌ ºó ¹®ÀÚ¿ÀÌ´õ¶óµµ ApiEditÀÇ Insert°¡ ¾Æ¹« °Íµµ ÇÏÁö ¾ÊÀ¸¹Ç·Î ãÀº ¹®ÀÚ¿À» Áö¿ì±â¸¸ ÇÑ´Ù. È÷½ºÅ丮 Ãß°¡ Äڵ忡µµ ±æÀÌ Á¡°Ë Á¶°Ç¹®À» »èÁ¦ÇÑ´Ù. ÆÄÀÏ ¹Ù²Ù±â¿¡µµ µ¿ÀÏÇÑ ¿À·ù°¡ ÀÖÀ¸¹Ç·Î ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.
BOOL CALLBACK FileFindDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
....
case IDC_FIND_TO:
switch (HIWORD(wParam)) {
case CBN_EDITCHANGE:
if (GetWindowTextLength(GetDlgItem(hDlg,IDC_FIND_WHAT)) == 0 ||
GetWindowTextLength(GetDlgItem(hDlg,IDC_FIND_FOLDER)) == 0 ||
GetWindowTextLength(GetDlgItem(hDlg,IDC_FIND_TYPE)) == 0) {
EnableWindow(GetDlgItem(hDlg,IDC_BTNFIND),FALSE);
EnableWindow(GetDlgItem(hDlg,IDC_BTNREPLACEALL),FALSE);
} else {
EnableWindow(GetDlgItem(hDlg,IDC_BTNFIND),TRUE);
EnableWindow(GetDlgItem(hDlg,IDC_BTNREPLACEALL),TRUE);
}
break;
....
case IDC_BTNFIND:
....
GetDlgItemText(hDlg,IDC_FIND_TO,szTemp,255);
if (lstrlen(szTemp)) {
arFind[1].Add(szTemp);
}
EndDialog(hDlg,IDOK);
°Ë»ö ÈÄ SetCaretÀÌ °Ë»ö ´Ü¾î À§Ä¡·Î ½ºÅ©·ÑÇÑ´Ù. ±×·¯³ª °ÅÀÇ Ç×»ó Æ÷¸ËÆÃ ¿µ¿ªÀÇ Á¦ÀÏ ³¡¿¡ ÀÖ´Ù. Áß¾ÓÀ¸·Î ¿Å±â´Â °ÍÀÌ ÁÖº¯ ¹®ÀåÀ» »ìÆìº¼ ¼ö ÀÖ¾î ´õ ÁÁ´Ù. ´ÙÀ½ ÇÔ¼ö¸¦ Ãß°¡ÇÑ´Ù.
void CApiEditText::ArrangeVerticalCenter(int nPos)
{
int x,y;
GetXYFromOff(nPos,x,y);
yPos=max(0,((y-frt.top)-(frt.bottom-frt.top)/2)/LineHeight*LineHeight);
if (IsWindowEnabled(hVertScroll)) {
SetScrollPos(hVertScroll, SB_CTL, yPos, TRUE);
}
Invalidate(-1);
SetCaret();
}
nPos ¿ÀÇÁ¼ÂÀÌ °¡¸®Å°´Â À§Ä¡°¡ ȸéÀÇ ¼öÁ÷ Áß¾ÓÀÌ µÇµµ·Ï ¸ÂÃá´Ù. FindText¿¡¼ °Ë»ö °á°ú¸¦ º¸¿©ÁÙ ¶§ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.
BOOL CApiEditText::FindText(int nPos, TCHAR *what, DWORD dwFlag)
{
....
int OldyPos;
....
free(pWhat);
if (pFound) {
OldyPos=yPos;
// ¼±Åà ¿µ¿ª ±æÀÌ¿¡ º¯È°¡ »ý±ä´Ù.
SetSelect(pFound-pFrame->buf,pFound-pFrame->buf+len,TRUE);
if (OldyPos!=yPos) {
ArrangeVerticalCenter(SelStart);
}
return TRUE;
}
return FALSE;
}
°Ë»ö ´Ü¾î¸¦ ¼±ÅÃÇϱâ Àü¿¡ ¼öÁ÷ ½ºÅ©·Ñ À§Ä¡¸¦ ÀúÀåÇØ µÎ°í ¼±Åà ÈÄÀÇ °ª°ú ºñ±³ÇØ º¸°í ´Þ¶óÁ³À¸¸é °Á¦·Î ¼±Åà ´Ü¾îÀÇ Ã³À½À» Æ÷¸ËÆÃ ¿µ¿ªÀÇ Áß¾ÓÀ¸·Î À̵¿½ÃÄ×´Ù. ´Ü °°Àº ȸé¾È¿¡¼¶ó¸é ij·µ¸¸ À̵¿ÇÏ¸é µÇ¹Ç·Î ±»ÀÌ ½ºÅ©·ÑÇÏÁö ¾Ê´Â °ÍÀÌ ´õ ÁÁ´Ù. ¸¶Âù°¡Áö ÀÌÀ¯·Î ºÏ¸¶Å© À̵¿ÇÒ ¶§µµ °¡±ÞÀû Áß¾Ó¿¡ ¸ÂÃá´Ù.
void CApiEditText::GotoBookmark(int Mark)
{
int OldyPos;
....
OldyPos=yPos;
GotoLine(Para,0,(ViewType==HEXA_VIEW) ? 0:1);
if (OldyPos!=yPos) {
ArrangeVerticalCenter(off);
}
}
°Ë»ö °á°úâ¿¡¼ ´õºíŬ¸¯ÇÒ ¶§µµ Áß¾ÓÀ¸·Î À̵¿ÇÑ´Ù.
void OpenFileFromOutput(int idx)
{
int OldyPos;
....
if (stricmp(Text,LastFIF) != 0) {
MessageBox(g_hFrameWnd,"°Ë»ö ÈÄ¿¡ ÆÄÀÏÀÌ ¼öÁ¤µÇ¾ú½À´Ï´Ù. "
"°Ë»öµÈ ÁÙÀÇ Ã¹ À§Ä¡·Î À̵¿ÇÕ´Ï´Ù.","¾Ë¸²",MB_OK);
pSi->Ae.GotoLine(line,0,1);
} else {
OldyPos=pSi->Ae.GetActiveView()->GetYPos();
pSi->Ae.GotoLine(line,col,1);
pSi->Ae.SetSelect(toff,toff+len,TRUE);
if (OldyPos != pSi->Ae.GetActiveView()->GetYPos()) {
pSi->Ae.GetActiveView()->ArrangeVerticalCenter(toff);
}
}
¹«Á¶°Ç ¼öÁ÷ Áß¾ÓÀ¸·Î À̵¿ÇÑ´Ù. yPos°¡ º¸È£µÈ ¸â¹öÀ̱⠶§¹®¿¡ ¿ÜºÎ¿¡¼ ¹Ù·Î ÀÐÀ» ¼ö´Â ¾ø´Ù. ±×·¡¼ ÀÌ °ªÀ» Àд º°µµÀÇ ¸â¹ö ÇÔ¼ö¸¦ Ãß°¡ÇÑ´Ù. ÆÄ»ý ºä¿¡¼ ÀçÁ¤ÀÇÇÒ °¡´É¼ºÀÌ ³·Àº ÇÔ¼öÀ̹ǷΠ±»ÀÌ °¡»ó ÇÔ¼öÀÏ ÇÊ¿ä´Â ¾ø´Ù.
class CApiEditText : public CWindow
{
public:
....
int GetYPos() { return yPos; }
ÆÄÀÏ ¹Ù²Ù±â ´ëÈ»óÀÚ¿¡ Æú´õ µå·¡±× ±â´ÉÀ» ÀÛ¼ºÇÑ´Ù. ã¾Æº¸±â ¹öưÀ» ´·¯ ½ÃÀÛ Æú´õ¸¦ °í¸£µµ·Ï µÇ¾î Àִµ¥ Ž»ö±â¿Í ÇÔ²² »ç¿ëÇÒ ¶§´Â ÀÌ ¹æ¹ýÀÌ ¿ÀÈ÷·Á ´õ Æí¸®ÇÏ´Ù. ¾ÆÁÖ À⽺·¯¿î ±â´É°°Áö¸¸ ÆÄÀÏ °Ë»öÀ» ÀÚÁÖ »ç¿ëÇÏ´Â »ç¶÷¿¡°Ô´Â ±²ÀåÈ÷ À¯¿ëÇÑ ±â´ÉÀÌ´Ù.
BOOL CALLBACK FileFindDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
....
switch(iMessage) {
case WM_INITDIALOG:
....
DragAcceptFiles(hDlg,TRUE);
return TRUE;
case WM_DROPFILES:
DragQueryFile((HDROP)wParam,0,Folder,MAX_PATH);
if ((GetFileAttributes(Folder) & FILE_ATTRIBUTE_DIRECTORY)!=0) {
SetDlgItemText(hDlg,IDC_FIND_FOLDER,Folder);
}
return TRUE;
....
ÆÄÀÏ °Ë»öÀ» ½ÃÀÛÇϱâ Àü¿¡ »óŶõ¿¡ °Ë»ö ½ÃÀÛ ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÏ°í °Ë»öÀ» ¿Ï·áÇÑ ÈÄ¿¡ ¿Ï·á ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÑ´Ù.
void FindOrReplaceInFiles(BOOL bReplace)
{
....
SetStatusText(1,"ÆÄÀÏ °Ë»öÁß...");
if (bReplace) {
lstrcpy(LastFIF,arFind[1].Get(0));
hFIFThread=CreateThread(NULL, 0, FIFThread,(LPVOID)OnReplaceFile,0,&ThreadID);
} else {
lstrcpy(LastFIF,arFind[0].Get(0));
hFIFThread=CreateThread(NULL, 0, FIFThread,(LPVOID)OnFindFile,0,&ThreadID);
}
}
DWORD WINAPI FIFThread(LPVOID pCallback)
{
TCHAR Mes[128];
bContFIF=TRUE;
FindInFiles(arFind[2].Get(0),arFind[3].Get(0),FIF_DEEP | FIF_INCHID,
(FIFCALLBACK)pCallback,(LPVOID)NULL);
if (TotalFind != 0) {
wsprintf(Mes,"ÆÄÀÏ °Ë»ö ¿Ï·á : %d °³ ¹ß°ß",TotalFind);
} else {
if (Option.bSoundFindFail) {
MessageBeep(MB_ICONASTERISK);
}
wsprintf(Mes,"ã´Â ¹®ÀÚ¿ÀÌ ¾ø½À´Ï´Ù.");
}
SetStatusText(1,Mes);
return 0;
}
°Ë»ö ½º·¹µå°¡ ³Ê¹« Á¶¿ëÈ÷ ³¡³ª ¹ö¸®±â ¶§¹®¿¡ ÀÌ ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÏÁö ¾ÊÀ¸¸é °Ë»ö ¿Ï·á¸¦ ¾Ë ¼ö°¡ ¾ø´Ù.
¸ðµÎ ã±â´Â ÆíÁýÇÏ´ø ÆÄÀÏ¿¡¼ ƯÁ¤ ¹®ÀÚ¿À» ¸ðµÎ ã¾Æ °Ë»ö °á°úâ¿¡ º¸¿© ÁÖ´Â ±â´ÉÀÌ´Ù. ÀÌ ±â´ÉÀº ¿©·¯ ¸ð·Î ±î´Ù·Î¿î ¸éÀÌ ¸¹´Ù. FindText ÇÔ¼öÀÇ ±¸Á¶ºÎÅÍ ¼öÁ¤ÇØ¾ß ÇÑ´Ù. ÀÌ ÇÔ¼ö´Â °Ë»ö ¹× ¼±ÅñîÁö °°ÀÌ Çϴµ¥ ¸ðµÎ ã±â¿¡¼ ÇÊ¿äÇÑ ±â´ÉÀº °Ë»ö¸¸ ÇÏ´Â °ÍÀÌ´Ù. ´ÙÀ½ µÎ °³ÀÇ ÇÔ¼ö·Î ºÐÇÒÇÑ´Ù.
BOOL CApiEditText::FindTextSub(int nPos, TCHAR *what, DWORD dwFlag,int &s, int &e)
{
int nStart;
TCHAR *pFound;
BOOL bWrap;
TCHAR *pWhat;
int len;
pWhat=(TCHAR *)malloc(lstrlen(what)+1);
if (strchr(what,'\\')==NULL) {
lstrcpy(pWhat,what);
len=lstrlen(pWhat);
} else {
len=AeEscapeString(what,pWhat);
}
if (nPos == -1) {
....
for (;;) {
....
}
free(pWhat);
if (pFound) {
s=pFound-pFrame->buf;
e=s+len;
return TRUE;
} else {
s=e=-1;
return FALSE;
}
}
FindText ÇÔ¼ö¿¡¼ ½ÇÁ¦ °Ë»öÀ» ÇÏ´Â ÄÚµåµéÀÌ ¸ðµÎ ÀÌ ÇÔ¼ö·Î À̵¿µÇ¾ú´Ù. FindTextSub´Â °Ë»ö °á°ú¸¦ ¿ÀÇÁ¼Â ¹üÀ§·Î ¸®ÅÏÇÑ´Ù. ½ÇÁ¦ °Ë»öÇÏ´Â Äڵ尡 Á¹º´ ÇÔ¼ö·Î ¿Å°ÜÁ³À¸¹Ç·Î FindText´Â ´ÙÀ½°ú °°ÀÌ °°´ÜÇØÁø´Ù.
BOOL CApiEditText::FindText(int nPos, TCHAR *what, DWORD dwFlag)
{
TCHAR szCom[256];
int s,e;
int OldyPos;
wsprintf(szCom,"find \"%s\"",what);
if ((dwFlag & AE_FIND_WRAP)==0)
lstrcat(szCom," nowrap");
if (dwFlag & AE_FIND_UP)
lstrcat(szCom," up");
if (dwFlag & AE_FIND_WHOLEWORD)
lstrcat(szCom," word");
if (dwFlag & AE_FIND_MATCHCASE)
lstrcat(szCom," case");
AeMc.RecordCommand(szCom);
if (FindTextSub(nPos,what,dwFlag,s,e)) {
OldyPos=yPos;
SetSelect(s,e,TRUE);
if (OldyPos!=yPos) {
ArrangeVerticalCenter(SelStart);
}
return TRUE;
}
return FALSE;
}
ÆíÁý ±â·Ï ÀÛ¼º°ú °Ë»ö °á°ú¸¦ ¼±ÅÃÇÏ´Â Äڵ常 ³²¾Ò´Ù. ÀÌ»óÀÇ ºäÀÇ °Ë»ö ÇÔ¼ö¸¦ ¼öÁ¤ÇÑ °ÍÀ̰í ÇÁ·¹ÀÓ¿¡µµ °Ë»ö¸¸ ÇÏ´Â ÇÔ¼ö°¡ ÇÊ¿äÇÏ´Ù. ½ÇÁ¦ ÄÚµå´Â ÀÛ¼ºÇÒ ÇÊ¿ä¾ø°í Ȱ¼º ºäÀÇ ÇÔ¼ö¸¦ È£ÃâÇÏ¸é µÈ´Ù.
BOOL CApiEdit::FindTextSub(int nPos, TCHAR *what, DWORD dwFlag,int &s, int &e)
{
return GetActiveView()->FindTextSub(nPos,what,dwFlag,s,e);
}
¸ðµÎ ã±â´Â °Ë»ö °á°ú°¡ ¿©·¯ °³À̹ǷΠij·µÀ» À̵¿ÇÏ´Â ¹æ½ÄÀ¸·Î´Â °á°ú¸¦ Ãâ·ÂÇÒ ¼ö ¾øÀ¸¸ç °Ë»ö °á°úâ¿¡ Ãâ·ÂÇØ¾ß ÇÑ´Ù. °Ë»ö °á°úâ¿¡´Â ÁÖº¯ ¹®ÀÚ¿µµ °°ÀÌ Ãâ·ÂÇϹǷΠƯÁ¤ ¹®´ÜÀÇ ÅØ½ºÆ®¸¦ ±¸ÇÏ´Â ÇÔ¼ö°¡ ÇÊ¿äÇÏ´Ù. ApiEditText¿¡ ´ÙÀ½ ÇÔ¼ö¸¦ Ãß°¡ÇÑ´Ù.
void CApiEditText::GetParaText(int nPara,TCHAR *Text,int len)
{
int ts,te;
int i;
TCHAR *p;
ts=GetOffFromPara(nPara,0);
te=pLine[GetParaLastLine(nPara)].End;
for (p=Text,i=ts;i<te;i++) {
if (pFrame->buf[i]=='\t') {
*p++=' ';
*p++=' ';
*p++=' ';
*p++=' ';
} else {
if (pFrame->IsDBCS(i)) {
*p++=pFrame->buf[i++];
}
*p++=pFrame->buf[i];
}
if (p-Text >= len-2) {
break;
}
}
*p=0;
}
¸®½ºÆ® ºä´Â Á¦¾î Äڵ带 Ãâ·ÂÇÏÁö ¸øÇϹǷΠÅÇ ¹®ÀÚ´Â 4°³ÀÇ °ø¹éÀ¸·Î ¹Ù²Û´Ù. ÇÊ¿äÇÑ ÇÔ¼öµéÀÌ ¿Ï¼ºµÇ¾úÀ¸¸ç °Ë»ö ´ëÈ»óÀÚ¿¡¼ ¸ðµÎ ã±â ¹öưÀÇ ¸í·ÉÀ» ó¸®ÇÑ´Ù.
BOOL CALLBACK FindDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
....
case WM_COMMAND:
....
case IDC_FIND_WHAT:
switch (HIWORD(wParam)) {
case CBN_EDITCHANGE:
if (GetWindowTextLength(GetDlgItem(hDlg,IDC_FIND_WHAT)) == 0) {
EnableWindow(GetDlgItem(hDlg,IDC_BTNFIND),FALSE);
EnableWindow(GetDlgItem(hDlg,IDC_BTNFINDALL),FALSE);
} else {
EnableWindow(GetDlgItem(hDlg,IDC_BTNFIND),TRUE);
EnableWindow(GetDlgItem(hDlg,IDC_BTNFINDALL),TRUE);
}
....
case IDC_BTNFIND:
case IDC_BTNREPLACE:
case IDC_BTNREPLACEALL:
case IDC_BTNFINDALL:
....
switch (LOWORD(wParam)) {
....
case IDC_BTNFINDALL:
SendMessage(GetParent(hDlg),WM_USER+2,4,0);
if (FindFlag & AE_FIND_CLOSE) {
GetWindowRect(hDlg,&drt);
DestroyWindow(hDlg);
}
break;
}
¸ðµÎ ã±â ¹öưµµ ã±â ¹öư°ú ¸¶Âù°¡Áö·Î »ç¿ë ±ÝÁö ¿©ºÎ¸¦ ÅëÁ¦ÇÑ´Ù. ÀÌ ¸í·ÉÀ» ¼±ÅÃÇÏ¸é ¸ÞÀÎ À©µµ¿ì·Î WM_USER+2 ¸Þ½ÃÁö¸¦ º¸³»µÇ wParamÀ¸·Î ¸ðµÎ ã±â¸¦ ¶æÇÏ´Â 4¸¦ º¸³½´Ù. OnUser2¿¡¼ ÀÌ ¸í·ÉÀ» ó¸®ÇÑ´Ù.
void OnUser2(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
....
case 4:
int toff;
int s,e;
LVITEM LI;
int idx;
CApiEditText *pView;
int line,col;
TCHAR Text[501];
// Çí»ç ºä¿¡¼´Â ¸ðµÎ ã±â¸¦ ÇÒ ¼ö ¾øÀ½.
pView=pSi->Ae.GetActiveView();
if (pView->ViewType==HEXA_VIEW) {
break;
}
lstrcpy(LastFIF,arFind[0].Get(0));
TotalFind=0;
if (bShowOutput==FALSE) {
bShowOutput=TRUE;
Relayout();
}
SendMessage(hList,LVM_DELETEALLITEMS,0,0);
tFlag=FindFlag;
tFlag &= ~AE_FIND_WRAP;
for (toff=0;;) {
if (pSi->Ae.FindTextSub(toff,arFind[0].Get(0),tFlag,s,e) == FALSE) {
break;
}
TotalFind++;
pView->GetParaFromOff(s,line,col);
pView->GetParaText(line,Text,500);
LI.mask=LVIF_TEXT | LVIF_PARAM;
LI.state=0;
LI.stateMask=0;
LI.iSubItem=0;
LI.iItem=ListView_GetItemCount(hList);
itoa(TotalFind,Mes,10);
LI.pszText=Mes;
LI.lParam=(LPARAM)hActive;
idx=ListView_InsertItem(hList,&LI);
wsprintf(Mes,"%s(%d,%d)",pSi->NowFile,line+1,col+1);
ListView_SetItemText(hList,idx,1,Mes);
ListView_SetItemText(hList,idx,2,Text);
ListView_EnsureVisible(hList,idx,FALSE);
UpdateWindow(hList);
// ´ÙÀ½ ¿ÀÇÁ¼ÂÀ¸·Î À̵¿
toff=e;
}
if (TotalFind == 0) {
wsprintf(Mes, "ã´Â ¹®ÀÚ¿ \"%s\"°¡ ¾ø½À´Ï´Ù",arFind[0].Get(0));
if (Option.bSoundFindFail) {
MessageBeep(MB_ICONASTERISK);
}
} else {
wsprintf(Mes, "ÃÑ %d°³ÀÇ \"%s\"¹®ÀÚ¿À» ã¾Ò½À´Ï´Ù.",
TotalFind,arFind[0].Get(0));
}
SetStatusText(1,Mes);
break;
}
}
Çí»ç ºä¿¡¼´Â ¸ðµÎ ã±â¸¦ ÇÒ ¼ö ¾ø´Ù. ¿Ö³ÄÇÏ¸é °Ë»ö °á°ú À§Ä¡¸¦ ¹®´Ü°ú ¿ ¹øÈ£·Î º¸¿©Áִµ¥ Çí»ç ºä´Â ÀÌ·± °ÍÀÌ ¾ø±â ¶§¹®ÀÌ´Ù. °Ë»ö °á°úâÀÌ º¸ÀÌÁö ¾ÊÀ¸¸é º¸À̵µ·Ï ¸¸µé°í °Ë»öÇÑ ¿ÀÇÁ¼ÂÀ¸·ÎºÎÅÍ ÅØ½ºÆ®¿Í À§Ä¡¸¦ ±¸ÇØ ¸®½ºÆ® ºä¿¡ Ãâ·ÂÇÑ´Ù.
¸®½ºÆ® ºäÀÇ lParam¿¡ °Ë»ö ´ë»ó À©µµ¿ìÀÇ ÇÚµéÀ» ÀúÀåÇØ ³õ´Â´Ù. ÆÄÀÏ °Ë»ö°ú´Â ´Þ¸® ÆíÁýÁßÀÎ ¹®¼¸¦ °Ë»öÇÏ´Â °ÍÀÌ°í ¹®¼°¡ ¸Þ¸ð¸®»ó¿¡¸¸ ÀÖÀ» ¼öµµ Àֱ⠶§¹®¿¡ ÆÄÀÏÀÇ °æ·Î¸¸À¸·Î´Â ´ë»ó ¹®¼¸¦ Á¤È®ÇÏ°Ô Ã£À» ¼ö ¾ø´Ù. OpenFileFromOutput ÇÔ¼ö´Â °Ë»ö °á°ú·ÎºÎÅÍ ¹®¼·Î À̵¿ÇÏ´Â Äڵ带 ¼öÁ¤ÇÑ´Ù. ±¸Á¶°¡ Á¶±Ý ¹Ù²ï´Ù.
void OpenFileFromOutput(int idx)
{
....
LVITEM LI;
ListView_GetItemText(hList,idx,1,Text,MAX_PATH);
p=strrchr(Text,',');
col=atoi(p+1)-1;
p=strrchr(Text,'(');
line=atoi(p+1)-1;
*p=0;
LI.mask=LVIF_PARAM;
LI.iItem=idx;
LI.iSubItem=0;
ListView_GetItem(hList,&LI);
if (LI.lParam) {
hActive=(HWND)LI.lParam;
pSi=(SInfo *)GetWindowLong(hActive,0);
// ¾ø´Â À©µµ¿ìÀ̰ųª ÆÄÀϸíÀÌ ´Ù¸£¸é ¾Æ¹«°Íµµ ÇÏÁö ¾ÊÀ½
if (pSi==NULL || strcmp(Text,pSi->NowFile)!=0) {
MessageBox(g_hFrameWnd,"°Ë»ö ´ë»ó ¹®¼°¡ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù. "
"´Ù½Ã °Ë»öÇØ ÁֽʽÿÀ","¾Ë¸²",MB_OK);
return;
}
} else {
if (FindFlag & AE_FIND_SHORTPATH) {
wsprintf(Path,"%s\\%s",arFind[2].Get(0),Text);
} else {
lstrcpy(Path,Text);
}
if (OpenFromFile(Path)==FALSE) {
return;
}
hActive=(HWND)SendMessage(g_hMDIClient,WM_MDIGETACTIVE,0,NULL);
pSi=(SInfo *)GetWindowLong(hActive,0);
}
if (pSi->Ae.GetActiveView()->ViewType==HEXA_VIEW) {
MessageBox(g_hFrameWnd,"Ȱ¼º ºä°¡ Çí»ç ºäÀÏ ¶§´Â °Ë»ö °á°ú¸¦ ã¾Æ°¥ ¼ö "
"¾ø½À´Ï´Ù.","¾Ë¸²",MB_OK);
return;
}
toff=pSi->Ae.GetOffFromPara(line,col);
....
¸®½ºÆ® ºäÀÇ lParam¿¡ À©µµ¿ì ÇÚµéÀÌ ÀÖÀ¸¸é ÆÄÀÏ °Ë»öÀ» ÇÑ °á°ú°¡ ¾Æ´Ï°í ¸ðµÎ ã±â¸¦ ÇÑ °á°úÀÌ´Ù. ÆÄÀÏÀ» ´Ù½Ã ¿ ÇÊ¿ä¾øÀÌ °Ë»ö ´ë»ó À©µµ¿ì¿¡¼ °Ë»ö °á°ú¸¦ ã¾Æ °¡¸é µÈ´Ù. °Ë»ö ÈÄ ÀÌ À©µµ¿ì°¡ ´ÝÇû´Ù¸é ã¾Æ°¥ ¼ö ¾ø´Ù.
¹Ù·Î ã±â´Â °Ë»ö ´ëÈ»óÀÚ¸¦ ¶ç¿ï ÇÊ¿ä¾øÀÌ ¿øÇÏ´Â °Ë»ö½ÄÀ» ¹Ù·Î ÀÔ·ÂÇÏ¸é¼ Ã£´Â ¹æ½ÄÀÌ´Ù. »óŶõ¿¡ °Ë»ö½Ä ÀÔ·ÂÀ» À§ÇÑ ¿¡µðÆ® ÄÁÆ®·ÑÀ» ¸¸µé°í ÀÌ ¿¡µðÆ®¿¡ °Ë»ö½ÄÀ» ÀÔ·ÂÇÏ´Â Á·Á· ã¾Æ ÁØ´Ù. ¿¡µðÆ® ÄÁÆ®·ÑÀÌ Á÷Á¢ °Ë»öÀ» ÁöÈÖÇØ¾ß ÇϹǷΠ¼ºêŬ·¡½ÌÇÑ´Ù. ´ÙÀ½ µÎ °³ÀÇ Àü¿ª º¯¼ö¸¦ Dangeun.cpp¿¡ Ãß°¡ÇÑ´Ù.
static HWND hInstEdit;
static WNDPROC OldInstEditProc;
°Ë»ö/¹Ù·Î ã±â ¸í·ÉÀ» ¼±ÅÃÇÏ¸é ¹Ù·Î Ã£±â ¸ðµå·Î µé¾î°£´Ù.
void OnCommand(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
....
case IDM_SEARCH_INST:
InstantSearch(hInstEdit==NULL);
return;
InstantSearch ÇÔ¼ö´Â ¹Ù·Î ã±â ¸ðµå¸¦ Åä±ÛÇϴµ¥ bStart°¡ TRUEÀÌ¸é ¹Ù·Î Ã£±â¸¦ ½ÃÀÛÇϰí FALSEÀÌ¸é ¹Ù·Î Ã£±â¸¦ ³¡³½´Ù. hInstEdit°¡ »ý¼ºµÇ¾î ÀÖÁö ¾Ê´Ù¸é ¹Ù·Î ã±â¸¦ ½ÃÀÛÇϰí ÀÌ¹Ì »ý¼ºµÇ¾î ÀÖ´Ù¸é ¹Ù·Î Ã£±â¸¦ ³¡³½´Ù.
void InstantSearch(BOOL bStart)
{
RECT prt;
HWND hActive;
TCHAR szTemp[256];
hActive=(HWND)SendMessage(g_hMDIClient,WM_MDIGETACTIVE,0,NULL);
if (hActive==NULL) {
return;
}
if (bStart) {
SetStatusText(1,"¹Ù·Î ã±â");
SendMessage(hStatus,SB_GETRECT,0,(LPARAM)&prt);
hInstEdit=CreateWindowEx(WS_EX_STATICEDGE,"Edit",NULL,
WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL,
prt.left+60,prt.top+1,130,prt.bottom-prt.top-2,
hStatus,(HMENU)0,g_hInst,NULL);
OldInstEditProc=(WNDPROC)SetWindowLongPtr(hInstEdit,GWLP_WNDPROC,(LONG_PTR)InstEditProc);
SendMessage(hInstEdit,WM_SETFONT,(WPARAM)hGul9,MAKELPARAM(FALSE,0));
SendMessage(hInstEdit,EM_LIMITTEXT,255,0);
SetFocus(hInstEdit);
} else {
GetWindowText(hInstEdit,szTemp,256);
if (lstrlen(szTemp)) {
arFind[0].Add(szTemp);
}
SetStatusText(1,NULL);
SetWindowLongPtr(hInstEdit,GWLP_WNDPROC,(LONG_PTR)OldInstEditProc);
DestroyWindow(hInstEdit);
hInstEdit=NULL;
SetFocus(hActive);
}
}
»óŶõÀÇ Ã¹¹øÂ° ÆÄÆ®ÀÇ ¹®ÀÚ¿À» "¹Ù·Î ã±â"·Î ¼öÁ¤ÇÏ°í ¿¡µðÆ® ÄÁÆ®·ÑÀ» »ý¼ºÇÑ´Ù. ¿¡µðÆ® ÄÁÆ®·ÑÀÌ Àڽſ¡°Ô ÀÔ·ÂµÈ ¹®ÀÚ¿·Î Á÷Á¢ °Ë»öÀ» ÇØ¾ß ÇÏ¸ç ¸î°¡Áö ´ÜÃàŰ Áö¿øÀ» À§ÇØ ¼ºíŬ·¡½ÌÇß´Ù. »óŶõÀÇ ³ôÀÌ¿¡ Á¦¾àÀÌ ÀÖÀ¸¹Ç·Î ±Û²ÃÀº ±¼¸² 9Æ÷ÀÎÆ®¸¦ »ç¿ëÇÑ´Ù. ¹Ù·Î ã±â¸¦ Á¾·áÇÒ ¶§´Â »óŶõÀÇ ÅØ½ºÆ®¸¦ ¿ø·¡´ë·Î ¹Ù²Ù¾î ³õ°í ¿¡µðÆ® ÄÁÆ®·ÑÀ» ÆÄ±«ÇÑ´Ù. °Ë»ö È÷½ºÅ丮¿¡µµ ±â·ÏÇØ ³õ´Â´Ù.
LRESULT CALLBACK InstEditProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
LRESULT Result;
DWORD tFlag;
switch (iMessage) {
case WM_CHAR:
if (wParam=='\t')
return TRUE;
Result=CallWindowProc(OldInstEditProc,hWnd,iMessage,wParam,lParam);
InstSrchNow(hWnd,0,FindFlag);
return Result;
case WM_KEYDOWN:
switch (wParam) {
case VK_RETURN:
case VK_ESCAPE:
InstantSearch(FALSE);
return TRUE;
case VK_TAB:
SetWindowText(hWnd,"");
return TRUE;
case VK_DOWN:
tFlag=FindFlag;
tFlag &= ~AE_FIND_UP;
InstSrchNow(hWnd,-1,tFlag);
return TRUE;
case VK_UP:
tFlag=FindFlag;
tFlag |= AE_FIND_UP;
InstSrchNow(hWnd,-1,tFlag);
return TRUE;
}
break;
case WM_KILLFOCUS:
InstantSearch(FALSE);
return TRUE;
}
return CallWindowProc(OldInstEditProc,hWnd,iMessage,wParam,lParam);
}
void InstSrchNow(HWND hEdit,int Start,DWORD Flag)
{
TCHAR szTemp[256];
HWND hActive;
SInfo *pSi;
hActive=(HWND)SendMessage(g_hMDIClient,WM_MDIGETACTIVE,0,NULL);
if (hActive!=NULL) {
pSi=(SInfo *)GetWindowLong(hActive,0);
GetWindowText(hEdit,szTemp,256);
if (pSi->Ae.FindText(Start,szTemp,Flag) == FALSE) {
if (Option.bSoundFindFail) {
MessageBeep(MB_ICONASTERISK);
}
}
}
}
¹®ÀÚ°¡ ÀÔ·ÂµÉ ¶§¸¶´Ù Ȱ¼ºÃ¢¿¡ ´ëÇØ Áï½Ã °Ë»öÀ» ½ÇÇàÇÑ´Ù. Enter³ª Esc´Â ¹Ù·Î ã±â¸¦ Á¾·áÇϸç TabÀº °Ë»ö½ÄÀ» ´Ù½Ã ÀÔ·ÂÇÏ°í ¾Æ·¡À§ Ä¿¼ À̵¿Å°´Â ´ÙÀ½, ÀÌÀü ã±âÀÌ´Ù. Æ÷Ä¿½º¸¦ ÀÒÀ¸¸é Áï½Ã ¹Ù·Î ã±â ¸ðµå¸¦ ºüÁ® ³ª°¡µµ·Ï ÇßÀ¸¹Ç·Î ¸¶¿ì½º·Î ¹®¼¸¦ ÂïÀ¸¸é Áï½Ã Á¾·áµÈ´Ù. ¹Ù·Î ã±â´Â ¼Óµµ°¡ ºü¸¥ °ÍÀÌ ÀåÁ¡Àε¥ ³¡³»´Â °Íµµ ÀÌ·¸°Ô ½Å¼ÓÇÏ´Ù. ¹Ù·Î ã±â¸¦ Áö¿øÇϱâ À§ÇØ SetCaretÀ» ¼öÁ¤ÇÑ´Ù.
void CApiEditText::SetCaret(BOOL bUpdatePrevX/*=TRUE*/, BOOL bScrollToCaret/*=TRUE*/)
{
....
CreateCaret(hWnd,NULL,caretwidth,FontHeight);
if (GetFocus()==hWnd) {
CreateCaret(hWnd,NULL,caretwidth,FontHeight);
ShowCaret(hWnd);
}
....
if (GetFocus()==hWnd) {
SetCaretPos(x-xPos,y-yPos+GetCharYPos());
}
¹Ù·Î ã±â ¿¡µðÆ®¿¡¼ °Ë»öÀ» À§ÇØ FindText¸¦ È£ÃâÇϸé ÀÌ ÇÔ¼ö´Â ºäÀÇ SetCaretÀ» È£ÃâÇϴµ¥ ¿©±â¼ ij·µÀ» Á¶ÀÛÇÑ´Ù. ÀÚ½ÅÀÌ Æ÷Ä¿½º¸¦ °¡Áö°í ÀÖÁö ¾ÊÀ¸¸é ¾Æ¿¹ ij·µÀ» ¸¸µéÁöµµ ¸»°í ¿òÁ÷ÀÌÁöµµ ¸»¾Æ¾ß ÇÑ´Ù. ij·µÀº ½Ã½ºÅÛ Àüü¸¦ ÅëÆ²¾î ´Ü Çϳª¹Û¿¡ ¾ø±â ¶§¹®¿¡ Æ÷Ä¿½º¸¦ °¡Áø ÄÁÆ®·Ñ¸¸ ij·µÀ» Á¶ÀÛÇÒ ¼ö ÀÖ´Ù. Çí»ç ºäµµ ¸¶Âù°¡Áö ¹æ¹ýÀ¸·Î ¼öÁ¤ÇÑ´Ù. ÀÌ Ã³¸®¸¦ ÇÏÁö ¾ÊÀ¸¸é °Ë»ö ¿¡µðÆ®¿¡¼ ±ÛÀÚ¸¦ ÀÔ·ÂÇÏ¸é ¿¡µðÆ®ÀÇ Ä³·µÀÌ »ç¶óÁ® ¹ö¸°´Ù.
¹Ù·Î ã±â¿¡´Â ´ÜÃàŰ F4¸¦ ÇÒ´çÇØ ³õ¾Ò´Ù. Á¶ÇÕ۵µ ¾Æ´Ï°í ÇÑ Å°·Î ´©¸¦ ¼ö ÀÖ´Â ´ÜÃà۸¦ ÇÒ´çÇß´Ù´Â °ÍÀÌ ±×¸¸Å ÀÌ ±â´ÉÀÌ À¯¿ëÇÏ´Ù°í Æò°¡Çß´Ù´Â ¶æÀÌ¸ç °³¹ßÀڷμ ÀÚ½ÅÀÌ ¸¸µç ±â´É¿¡ ´ëÇØ ³ª¸§´ë·Î ¾ÖÁ¤ Ç¥ÇöÀ» ÇÑ °ÍÀÌ´Ù. ½ÇÁ¦·Î »ç¿ëÇØ º¸¸é ÀÌ ±â´ÉÀº Á¤¸» Æí¸®ÇÏ´Ù.
´ç±ÙÀÇ ¸ðµç ·çƾÀº ÇѱÛÀÇ °æ°è¿¡ ¿ÀÇÁ¼ÂÀÌ ¿ÀÁö ¾Êµµ·Ï öÀúÇÏ°Ô °ü¸®Çϸç ÀÌ °ü¸® Á¤Ã¥ÀÌ ºñ±³Àû Á¤±³Çؼ º° ¸»½éÀÌ ¾ø¾ú´Ù. ±×·¯³ª Çí»ç ÆíÁý ±â´ÉÀÌ µé¾î°¡¸é¼ ÇѱÛÀÇ °æ°è ¿ÀÇÁ¼Â¿¡ °ÉÄ¡´Â ¹®Á¦°¡ ¹ß»ýÇϱ⠽ÃÀÛÇß´Ù. ÀÌ ¹ö±×µµ ¾ÆÁÖ °£´ÜÇÏ°Ô Å×½ºÆ®ÇÒ ¼ö ÀÖ´Ù. ¾ËÆÄ 4¿¡¼ »õ ¹®¼¸¦ ¸¸µé°í "ABCD ´ëÇѹα¹"¸¸ ÀÔ·ÂÇØ ³õ´Â´Ù. ±×¸®°í ã±â ´ëÈ»óÀÚ¸¦ ¿°í ´ÙÀ½ °Ë»ö½ÄÀ» ÀÔ·ÂÇØ º¸¾Æ¶ó.

\x41Àº 16Áø¼ö·Î ¹®ÀÚÄÚµå 41À» °Ë»öÇ϶ó´Â ¶æÀ̸ç ÀÌ °æ¿ì Á¦ÀÏ Ã³À½ÀÇ "A"°¡ ¾ÆÁÖ Á¤»óÀûÀ¸·Î °Ë»öµÈ´Ù. ±×·¯³ª °Ë»ö½Ä¿¡ \xc7À» ÁÖ°í °Ë»öÇϸé Áï½Ã ´Ù¿îµÈ´Ù. \xc7Àº "ÇÑ"ÀÚÀÇ ¾ÕÂÊ ¹ÙÀÌÆ®Àε¥ ¹ÝÂÊ ÇѱÛÀ» °Ë»öÇÑ ÈÄ ÀÌ°É ¼±ÅÃÇÏ·Á°í ÇÏ´Ï ´Ù¿îµÇ´Â °ÍÀÌ´Ù. °Ë»ö ·çƾÀº \xc7 ¹®ÀÚ¸¦ Á¦´ë·Î ã¾ÒÁö¸¸ °Ë»ö ÈÄ ÀÌ ¹®ÀÚ¸¦ ¼±ÅÃÇÒ ¼ö°¡ ¾ø´Â °ÍÀÌ´Ù. Á» ´õ ±â°¡ ¸·Èù »óȲµµ Å×½ºÆ®ÇØ º¸ÀÚ.

ºó ¹®¼¿¡ "Á¤ÁöÇÑ´Ù"¶ó´Â ¹®ÀÚ¿¸¸ ½á ³Ö°í ÇÑ±Û ¸ðÀ½ "¤Á'¸¦ °Ë»öÇÏ¸é ¿ª½Ã ´Ù¿îµÈ´Ù. ¸ðÀ½¸¸ ÀÖ´Â "¤Á"µµ ºÐ¸íÈ÷ ¹®ÀÚÀ̰í Äڵ尡 Àִµ¥ ÀÌ ¹®ÀÚÀÇ ÄÚµåÀÎ A1C4°¡ "Á¤"ÀÚÀÇ µÞÂÊ ¹ÙÀÌÆ®¿Í "Áö"ÀÚÀÇ ¾ÕÂÊ ¹ÙÀÌÆ®¿Í ÀÏÄ¡ÇÏ´Â °ÍÀÌ´Ù. A1C4¶ó´Â ¹®ÀÚ¿ÀÌ ºÐ¸íÈ÷ Á¸ÀçÇϹǷΠ°Ë»ö ·çƾÀº ÀÌ ¿ÀÇÁ¼ÂÀ» ¸®ÅÏÇϰí SetCaretÀº µÎ ±ÛÀÚÀÇ ¹ÝÂʾ¿À¸·Î ÇÑ ±ÛÀÚ¸¦ ¼±ÅÃÇÏ·Á°í ½ÃµµÇϴµ¥ ÀÌ ¿ÀÇÁ¼ÂÀÌ ¹«È¿Çϱ⠶§¹®¿¡ ´Ù¿îµÇ´Â °ÍÀÌ´Ù.
ÀÌ ¹®Á¦´Â °Ë»ö ·çƾÀÌ DBCS¸¦ Á¦´ë·Î ÀνÄÇÏÁö ¸øÇؼ ¹ß»ýÇÑ °ÍÀ̹ǷΠ±ÛÀÚÀÇ Áß°£À» °Ë»öÇÏÁö ¾Êµµ·Ï ÇØ¾ß ÇÑ´Ù. °Ë»öÀÇ ½ÇÁ¦ ÁÖüÀÎ FindString Àü¿ª ÇÔ¼ö´Â ´Ü¼øÈ÷ ÄÚµåÀÇ ½ºÆ®¸²¸¸ °Ë»öÇϴµ¥ ÀÌ ÇÔ¼ö°¡ DBCS¸¦ ÀνÄÇϵµ·Ï ¼öÁ¤ÇÏ¸é ¹®Á¦°¡ ÇØ°áµÈ´Ù. ±×·¯³ª ÀÌ ÇÔ¼ö´Â Çí»ç ºä¿¡¼µµ È£ÃâÇÏ´Â ÀϹÝÀûÀÎ °Ë»ö ÇÔ¼öÀ̹ǷΠ¿©ÀüÈ÷ DBCS¸¦ ÀνÄÇÏÁö ¾Ê´Â °ÍÀÌ ¿Ç´Ù. ¼öÁ¤ ´ë»óÀº °Ë»ö °á°ú¸¦ Á¡°ËÇÏ´Â FindTextSubÀÌ´Ù.
BOOL CApiEditText::FindTextSub(int nPos, TCHAR *what, DWORD dwFlag,int &s, int &e)
{
....
for (;;) {
pFound=FindString(pFrame->buf,pFrame->doclen,nStart,pWhat,len,(dwFlag & AE_FIND_UP)==0,
(dwFlag & AE_FIND_MATCHCASE)!=0);
if (pFound) {
// ÅØ½ºÆ® ºä¿¡¼ DBCS Áß°£¿¡ °ÉÄ¡¸é °Ë»ö ½ÇÆÐÇÑ °ÍÀ¸·Î °£ÁÖÇÑ´Ù.
if (ViewType != HEXA_VIEW && pFrame->IsInDBCS(pFound-pFrame->buf)) {
if (dwFlag & AE_FIND_UP) {
nStart=pFound-pFrame->buf-1;
} else {
nStart=pFound-pFrame->buf+len;
}
continue;
}
// ´Ü¾î ´ÜÀ§·Î °Ë»öÇÒ °æ¿ì ¾çÂÊ¿¡ °ø¹éÀÌ ÀÖ¾î¾ß ÇÑ´Ù.
if (dwFlag & AE_FIND_WHOLEWORD) {
FindStringÀ» È£ÃâÇÏ¿© °Ë»öÇÑ ÈÄ ÀÌ À§Ä¡°¡ DBCSÀÇ Áß°£ÀÎÁö¸¦ Á¡°ËÇÏ¿© ¹«È¿ÇÑ À§Ä¡¶ó¸é ´Ù½Ã °Ë»öÇÑ´Ù. ´Ü, Çí»çºä´Â DBCS¿¡ »ó°ü¾øÀÌ ¹ÙÀÌÆ® °Ë»öÀ» ÇØ¾ß ÇϹǷΠÀÌ ±ÔÄ¢À» Àû¿ëÇÏÁö ¾Ê´Â °ÍÀÌ ¿Ç´Ù.