2.°Ë»ö ±â´É °³¼±

°¡.¿¹¾à¾î

´ç±Ù 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¿¡ »ó°ü¾øÀÌ ¹ÙÀÌÆ® °Ë»öÀ» ÇØ¾ß ÇϹǷΠÀÌ ±ÔÄ¢À» Àû¿ëÇÏÁö ¾Ê´Â °ÍÀÌ ¿Ç´Ù.