2. ¸í·ÉÀÇ ±â·Ï

°¡.±â·Ï ·¹ÄÚµå

»ç¿ëÀÚµéÀÌ ¸ÅÅ©·Î¸¦ ÀÛ¼ºÇÏ·Á¸é ÇÊ¿äÇÑ ¸í·ÉÀ» ¼ø¼­¿¡ ¸Â°Ô ±â¼úÇØ¾ß Çϴµ¥ ±×·¯ÀÚ¸é ¸ÅÅ©·ÎÀÇ ¹®¹ýÀ» ¾Ë¾Æ¾ß ÇÏ´Â ¹ø°Å·Î¿òÀÌ ÀÖ´Ù. ±×·¡¼­ º¸Åë ÆíÁý±â°¡ »ç¿ëÀÚÀÇ Å° µ¿ÀÛÀ» ¸ÅÅ©·Î ¸í·ÉÀ¸·Î º¯È¯ÇÏ¸ç »ç¿ëÀÚ´Â ¹Ýº¹ÇϰíÀÚÇÏ´Â ÆíÁý µ¿ÀÛÀ» ÇÔÀ¸·Î½á ¸ÅÅ©·Î¸¦ ÀÛ¼ºÇÑ´Ù. ÀÌ·± ±â´ÉÀÌ °¡´ÉÇÏ·Á¸é ¸ÅÅ©·Î ±â·Ï ¸ðµå¸¦ µÎ°í ±â·Ï ¸ðµåÀÏ ¶§´Â »ç¿ëÀÚÀÇ Á¶ÀÛÀ» ¸ÅÅ©·Î¿¡ ÀÏÀÏÀÌ ±â·ÏÇØ¾ß ÇÑ´Ù. Áï, ±â·Ï ½ÃÀÛ ¸í·ÉÀ» ³»¸° ÈÄ ¸ÅÅ©·ÎÀÇ º»Ã¼´Â Á÷Á¢ Űº¸µå¸¦ Á¶ÀÛÇÔÀ¸·Î½á ÀÛ¼ºÇÏ´Â °ÍÀÌ´Ù. ºñÁÖ¾ó C++ÀÇ ¸ÅÅ©·Î ±â´Éµµ ÀÌ·± ½ÄÀ¸·Î µÇ¾î ÀÖ´Ù.

´ç±ÙÀº À̿ʹ Á» ´Ù¸¥ ¹æ½ÄÀ¸·Î ¸ÅÅ©·Î¸¦ ÀÛ¼ºÇϴµ¥ ±â·Ï ½ÃÀÛ ¸í·ÉÀ» ¹ÞÀº ÈÄ¿¡ ±â·ÏÇÏÁö ¾Ê°í Ç×»ó ±â·ÏÀ» À¯ÁöÇϸç È£½ºÆ®´Â ÀÌ ±â·ÏÁß ÀϺθ¦ ¸ÅÅ©·Î·Î Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. º°µµÀÇ ½ÃÀÛ ¸í·É¾øÀÌ ¸ÅÅ©·Î¿¡ Æ÷Ç﵃ Èĺ¸ ¸ñ·Ï(Macro Candidate)À» Ç×»ó ÀÛ¼ºÇÏ´Â °ÍÀÌ´Ù. ´Ü¼øÈ÷ ¹®ÀÚ¿­À» ¹Ì¸® Á¶¸³ÇØ µÎ´Â Á¤µµÀ̹ǷΠ½ÇÇà ½Ã°£ÀÇ °¨¼Ò´Â °ÅÀÇ ¾ø´Ù. ÆíÁý µ¿ÀÛ ±â·ÏÀ» À§ÇØ ´ÙÀ½ Ŭ·¡½º¸¦ AeUtil.h¿¡ ¼±¾ðÇÑ´Ù.

 

#define MAXMC 64

#define DEFMCSIZE 32

#define AEVERBNUM 19

 

class CMcRecord

{

public:

     TCHAR *arMc[MAXMC];

     int nowmc;

     int runlevel;

 

     CMcRecord();

     ~CMcRecord();

     void RecordCommand(const TCHAR *Com);

};

 

CMcRecord´Â ¸ÅÅ©·Î Èĺ¸ ¸í·ÉÀÇ ¹è¿­À» ´Ù·ç´Â Ŭ·¡½ºÀÌ´Ù. arMc´Â ¸í·ÉÀÇ ¹è¿­ÀÌ¸ç ±æÀ̸¦ ¹Ì¸® ¿¹ÃøÇÒ ¼ö ¾øÀ¸¹Ç·Î ½ÇÇàÁß¿¡ ÇÊ¿äÇѸ¸Å­ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ´Ù. ÃÖ±Ù 64°³ÀÇ ¸í·ÉÀ» ¹è¿­¿¡ ±â¾ïÇϴµ¥ ÀÌ °³¼ö¸¦ ´õ ´Ã¸®°í ½ÍÀ¸¸é MAXMC ¸ÅÅ©·Î°ªÀ» ´Ã¸®¸é µÈ´Ù. ÀÌ Å¬·¡½ºÀÇ ±¸Çö ÄÚµå´Â ´ÙÀ½°ú °°À¸¸ç AeUtil.cpp¿¡ ÀÛ¼ºÇÑ´Ù.

 

CMcRecord::CMcRecord()

{

     int i;

 

     for (i=0;i<MAXMC;i++) {

          arMc[i]=(TCHAR *)malloc(DEFMCSIZE);

     }

     nowmc=0;

     runlevel=0;

}

 

CMcRecord::~CMcRecord()

{

     int i;

 

     for (i=0;i<MAXMC;i++) {

          free(arMc[i]);

     }

}

 

void CMcRecord::RecordCommand(const TCHAR *Com)

{

     TCHAR *pOld;

     int Count;

     const TCHAR *p;

     TCHAR szTemp[32];

     int MergeType=0;

     int Verb;

     TCHAR *pCount;

     TCHAR *s1,*s2;

 

     if (runlevel != 0) {

          return;

     }

 

     // ¹è¿­ ¹üÀ§¸¦ ³Ñ¾úÀ» ¶§ ¹è¿­À» ÇÑÄ­ ¾ÕÀ¸·Î º¹»çÇÑ´Ù.

     if (nowmc == MAXMC) {

          pOld=arMc[0];

          memmove(&arMc[0],&arMc[1],sizeof(arMc[0])*(MAXMC-1));

 

          // ´ÜÆíÈ­ ¹æÁö. Áö¿öÁø ù ±â·ÏÀÇ ¸Þ¸ð¸®¸¦ ÀçȰ¿ëÇÑ´Ù.

          // Å©±â°¡ ´Ù¸£¸é ÇØÁ¦ ÈÄ ÀçÇÒ´çÇÑ´Ù.

          if (_msize(pOld) == _msize(arMc[MAXMC-1])) {

              arMc[MAXMC-1]=pOld;

          } else {

              free(pOld);

              arMc[MAXMC-1]=(TCHAR *)malloc(DEFMCSIZE);

          }

          nowmc--;

     }

 

     // µ¿»çÀÇ Á¾·ù¸¦ º¸°í º´ÇÕ °¡´É¼ºÀ» ÆÇº°ÇÑ´Ù. ù¹øÂ° ±â·ÏÀº ¹«Á¶°Ç º´ÇÕ ¾ÈµÊ

     p=Com;

     Verb=GetComVerb(p,arComVerb);

     if (nowmc != 0) {

          if ((arComVerb[Verb].Flag & 0x1) && (strncmp(Com,arMc[nowmc-1],lstrlen(Com))==0)) {

              MergeType=1;

          }

          if (Verb==AEC_INSERT && (strncmp(arMc[nowmc-1],"insert",6)==0)) {

              MergeType=2;

          }

     }

 

     switch (MergeType) {

     case 0:

          if (_msize(arMc[nowmc]) < (unsigned)lstrlen(Com)+1) {

              arMc[nowmc]=(TCHAR *)realloc(arMc[nowmc],lstrlen(Com)+1);

          }

          lstrcpy(arMc[nowmc],Com);

          nowmc++;

          break;

     case 1:

          pCount=arMc[nowmc-1]+lstrlen(Com);

          Count=GetComNumber(pCount,1);

          Count++;

          wsprintf(szTemp, " %d",Count);

          lstrcpy(pCount,szTemp);

          break;

     case 2:

          // ¹®ÀÚ¿­ º´Çսô ȮÀå¿­À» È®ÀåÇÏÁö ¸»¾Æ¾ß ÇÑ´Ù.

          GetComString(p,s1,FALSE);

          p=arMc[nowmc-1];

          GetComVerb(p,arComVerb);

          GetComString(p,s2,FALSE);

 

          // ¸Þ¸ð¸® °ü¸®

          if (_msize(arMc[nowmc-1]) < (unsigned)10+lstrlen(s1)+lstrlen(s2)) {

              arMc[nowmc-1]=(TCHAR *)realloc(arMc[nowmc-1],_msize(arMc[nowmc-1])+10);

          }

          wsprintf(arMc[nowmc-1],"insert \"%s%s\"",s2,s1);

          free(s1);

          free(s2);

          //

          break;

     }

}

 

¸í·ÉÀ» ÀúÀåÇÏ´Â arMc¹è¿­À» °ü¸®ÇÏ´Â °ÍÀÌ ÀÌ °´Ã¼ÀÇ ÁÖµÈ ±â´ÉÀÌ´Ù. RecordCommand ÇÔ¼ö´Â Àμö·Î Àü´ÞµÈ ¹®ÀÚ¿­À» arMc ¹è¿­¿¡ ±â·ÏÇϴµ¥ ¹«Á¶°Ç ±â·ÏÇϱ⸸ ÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ±âÁ¸ ±â·Ï°ú ȣȯµÇ¸é ÀûÀýÈ÷ º´ÇÕÇϱ⵵ ÇÑ´Ù. º´ÇÕÀÇ ÇüÅ´ ¼¼ °¡Áö°¡ Àִµ¥ 0¹øÀº º´ÇÕÀ» ÇÏÁö ¾Ê°í ¹«Á¶°Ç »õ·Î¿î ·¹ÄÚµå·Î ¸¸µå´Â ŸÀÔÀÌ´Ù. ȸ¼ö¸¦ °¡Áö´Â ¸í·ÉµéÀº 1¹ø º´ÇÕ Å¸ÀÔÀÌ¸ç ±âÁ¸ ·¹ÄÚµå¿Í °°Àº Á¾·ùÀÇ ¸í·ÉÀÌ ÀԷµǾúÀ¸¸é ȸ¼ö¸¸ ´Ã¸°´Ù. ¿¹¸¦ µé¾î ÃÖÈÄ ¸í·ÉÀÌ move left 3ÀÎ »óÅ¿¡¼­ ´Ù½Ã move left°¡ µé¾î¿Ô´Ù¸é Ä«¿îÆ®¸¸ 1Áõ°¡½ÃÄÑ move left 4·Î ¼öÁ¤ÇÏ¸é µÈ´Ù.

2¹ø ŸÀÔÀº ¹®ÀÚ¿­ »ðÀÔÀε¥ »ðÀԵǴ ¹®ÀÚ¿­¸¸ µÚÂÊ¿¡ ´õ Ãß°¡ÇÏ¸é µÈ´Ù. ¿¹¸¦ µé¾î insert "kore"±îÁö ÀÔ·ÂµÈ »óÅ¿¡¼­ insert "a"¸í·ÉÀÌ Ãß°¡·Î ÀԷµǾú´Ù¸é ÀÌ µÎ ¸í·ÉÀº insert "korea"·Î º´ÇյȴÙ. À̶§ ±âÁ¸ ·¹ÄÚµåÀÇ ¸Þ¸ð¸®°¡ ºÎÁ·ÇÏÁö ¾ÊÀºÁö Á¡°ËÇØ º¸°í ºÎÁ·ÇÒ °æ¿ì º´ÇÕµÈ ¹®ÀÚ¿­À» ¸ðµÎ °¡Áú ¼ö ÀÖÀ»¸¸ÇÑ ±æÀÌ·Î ÀçÇÒ´çÇØ¾ß ÇÑ´Ù. ÀÌ·± º´ÇÕ¿¡ ÀÇÇØ »ç¿ëÀÚÀÇ ½ÇÁúÀûÀÎ µ¿ÀÛÀ» ÃÖ´ëÇÑ ÀûÀº °³¼öÀÇ ¸í·ÉÀ¸·Î Ç¥ÇöÇÒ ¼ö ÀÖ´Ù.

½ÇÁ¦ ÆíÁýÀ» ÇÏ´Â ÁÖü´Â ÇÁ·¹ÀÓÀÌ ¾Æ´Ï¶ó ºäÀ̹ǷΠºä°¡ ÆíÁý µ¿ÀÛÀ» ±â¾ïÇØ¾ß ÇÑ´Ù. ApiEditText°¡ ÀÌ Å¬·¡½ºÀÇ °´Ã¼¸¦ ¸â¹ö·Î °¡Áö¸ç È£½ºÆ®°¡ ±â·ÏÀ» Á÷Á¢ ÂüÁ¶ÇØ¾ß ÇϹǷΠpublic ¸â¹ö¿©¾ß ÇÑ´Ù.

 

class CApiEditText : public CWindow

{

     ....

public:

     CMcRecord AeMc;

 

´ç¿¬ÇÑ ¾ê±â°ÚÁö¸¸ ±âº» ºä°¡ ÀÌ °´Ã¼¸¦ °¡Áö¹Ç·Î ÆÄ»ý ºäµµ ÀÌ ¸â¹ö¸¦ »ó¼Ó¹Þ´Â´Ù. ÀÌÈÄ ÆíÁýÀÌ ÀϾ´Â ¸ðµç °÷¿¡¼­ AeMc °´Ã¼ÀÇ RecordCommand ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ¾î¶² ÆíÁýÀ» Çß´ÂÁö ÀÏÀÏÀÌ ±â·ÏÇØ¾ß ÇÑ´Ù.

 

³ª.±â·Ï ¿øÄ¢

¸ÅÅ©·Î´Â ¹Ýº¹ÀûÀ¸·Î ½ÇÇàµÉ ¸í·ÉÀÇ ÁýÇÕÀ̹ǷΠÈĺ¸ ¸í·ÉÀÌ µÉ ¼ö ÀÖ´Â Á¶°ÇÀÌ Á¶±Ý ±î´Ù·Ó´Ù. ApiEdit´Â ´ÙÀ½ ¿øÄ¢¿¡ µû¶ó ¸í·ÉµéÀ» ±â·ÏÇÑ´Ù.

 

1.Űº¸µå µ¿ÀÛ¸¸ ±â·ÏÇÑ´Ù. µå·¡±×¿¡ ÀÇÇÑ ¼±ÅÃÀ̳ª À̵¿, ½ºÅ©·Ñ µîÀÇ ¸¶¿ì½º µ¿ÀÛÀº ¹«½ÃÇÑ´Ù. ´Ü, ¸¶¿ì½º µ¿ÀÛÀÌ¶óµµ ´ë¹®ÀÚ·Î ¹Ù²Ù±â, ³¯Â¥ »ðÀÔ µîÀÇ ´ëÀÀµÇ´Â ¸Þ´º ¸í·ÉÀÌ ÀÖÀ¸¸é ±â·ÏÇÑ´Ù. ¸¶¿ì½º µ¿ÀÛÀº Á¤±ÔÈ­Çϱ⠾î·Á¿ö ±â·ÏÇÏ±â ¾î·Æ°í ÀϹÝÀûÀ¸·Î ¹Ýº¹ÇÒ Çʿ䵵 ¾ø´Ù.

2.¸í·ÉÀÇ ¼º°ø ¿©ºÎ¿Í´Â ¹«°üÇÏ°Ô ±â·ÏÇÑ´Ù. ¿¹¸¦ µé¾î ¹®¼­ óÀ½¿¡¼­ ¿ÞÂÊÀ¸·ÎÀÇ À̵¿Àº ½ÇÆÐÇÏÁö¸¸ ±×·¡µµ ÀÏ´Ü ¸ÅÅ©·Î Èĺ¸ ¸í·ÉÀ¸·Î ±â·ÏÀº ÇÑ´Ù. ½ÇÁ¦ ½ÇÇà½Ã¿¡´Â ½ÇÆÐÇÏÁö ¾ÊÀ» ¼öµµ Àֱ⠶§¹®ÀÌ´Ù. ´Ü Ctrl+Shift+UpŰó·³ Á¤ÀǵÇÁö ¾ÊÀº Ű ÀÔ·ÂÀ̳ª Àбâ Àü¿ë »óÅ¿¡¼­ÀÇ »èÁ¦ µ¿ÀÛó·³ ¹«ÀǹÌÇÑ µ¿ÀÛÀº ±â·ÏÇÏÁö ¾Ê´Â´Ù.

3.Űº¸µå·Î ¿ø·¡ºÎÅÍ Áö¿øµÇ´ø ¸í·É¸¸ ±â·ÏÇÑ´Ù. ¸ÅÅ©·Î ±¸¹®¿¡ ÀÇÇØ select word, move paraend°°Àº ¸í·ÉÀÌ °¡´ÉÇØÁ³´Âµ¥ ÀÌ·± ¸í·ÉÀº ±â·ÏµÇÁö ¾Ê´Â´Ù. ÇÏÁö¸¸ »ç¿ëÀÚ°¡ Á÷Á¢ ¸ÅÅ©·Î ÆíÁý±â·Î ÀÔ·ÂÇÒ ¼ö´Â ÀÖ´Ù.

4.Çѹø ÀÔ·ÂµÈ ±â·ÏÀº Ãë¼ÒÇÏÁö ¾Ê´Â´Ù. ¿¹¸¦ µé¾î ¿ÞÂÊÀ¸·Î À̵¿Çß´Ù°¡ ¿À¸¥ÂÊÀ¸·Î ´Ù½Ã À̵¿ÇßÀ» ¶§ ÀÌ µÎ µ¿ÀÛÀº ¾È ÇÑ °Í°ú °°¾ÆÁöÁö¸¸ ÀÏ´ÜÀº ±â·ÏÇÑ´Ù. ¸ÅÅ©·Î°¡ Àç»ýµÉ ¶§´Â ¹Ýµå½Ã Á¦ÀÚ¸®°¡ ¾Æ´Ò ¼öµµ Àִµ¥ ¿¹¸¦ µé¾î ¹®¼­ óÀ½À̾ú´Ù¸é ÀÌ µÎ µ¿ÀÛ¿¡ ÀÇÇØ ij·µÀº ÇÑÄ­ ¿À¸¥ÂÊÀ¸·Î À̵¿ÇÑ´Ù. Àß¶ó³»±â, ºÙ¿© ³Ö±âµµ ¸¶Âù°¡Áö·Î ¸ðµÎ ±â·ÏÇÑ´Ù.

5.¹Ýº¹µÇ´Â µ¿ÀÛÀº º´ÇÕÇÑ´Ù. ¸ÅÅ©·Î ±¸¹®ÀÌ È¸¼ö¸¦ Áö¿øÇϹǷΠ°¡±ÞÀûÀÌ¸é ¸ÅÅ©·Î¸¦ ª°Ô ÀÛ¼ºÇÒ ¼ö ÀÖµµ·Ï ȸ¼ö¸¦ º´ÇÕÇÏ´Â °ÍÀÌ ÁÁ´Ù. »ðÀÔ ¸í·ÉÀº »ðÀԵǴ ¹®ÀÚ¿­ÀÌ º´ÇյȴÙ. »ðÀÔÁß¿¡ ¸¶¿ì½º·Î À§Ä¡¸¦ À̵¿ÇÑ ÈÄ °è¼Ó ÀÔ·ÂÇØµµ ¿ª½Ã º´ÇյȴÙ. ¸ÅÅ©·Î Èĺ¸ ¸í·ÉÀº Ű µ¿ÀÛÀ» ±â·ÏÇÏ´Â °Í »ÓÀÌÁö ¹®¼­¸¦ ½ÇÁ¦·Î ¾î¶»°Ô º¯È­½Ã۴°¡¸¦ ±â·ÏÇÏ´Â °ÍÀÌ ¾Æ´Ï´Ù.

6.¸ÅÅ©·Î ½ÇÇàÁß¿¡´Â ±â·ÏÇÏÁö ¾Ê´Â´Ù. ¸ÅÅ©·Î ½ÇÇàÀº ±â·ÏÀÇ °á°ú¸¦ Àç»ýÇÏ´Â °ÍÀ̸ç ÀÌ¹Ì ¸ÅÅ©·Î·Î ¸¸µé¾îÁø ¸í·ÉµéÀ̹ǷΠ´õ ±â·ÏÇÒ Çʿ䰡 ¾ø´Ù. »ó½ÄÀûÀ¸·Î Áö±ØÈ÷ ´ç¿¬ÇÑ ¾ê±â´Ù. runlevel ¸â¹ö º¯¼ö°¡ ½ÇÇàÁß ±â·ÏÀ» ¹æÁöÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù.

´Ù.¸í·É ±â·Ï

»ç¿ëÀÚÀÇ ÆíÁý µ¿ÀÛÀ» ¿ÏÀüÈ÷ ±â·ÏÇÏ·Á¸é ºä¿¡¼­ ÆíÁý µ¿ÀÛÀÌ ÀϾ´Â ¸ðµç °÷¿¡¼­ RecordCommand ÇÔ¼ö¸¦ È£ÃâÇØ¾ß ÇÑ´Ù. ´ëºÎºÐÀÇ ÆíÁý µ¿ÀÛÀÌ Å°ÀÔ·ÂÀ¸·ÎºÎÅÍ ¹ß»ýÇϹǷΠProcessKey ÇÔ¼ö¿¡¼­ ±â·ÏÇÒ °ÍÀÌ ¸¹´Ù. ۵¿ÀÛ ±â·ÏÀ» À§ÇÑ ´ÙÀ½ ÇÔ¼ö¸¦ ÀÛ¼ºÇÑ´Ù.

 

void CApiEditText::ProcessKeyRecord(UINT vk,BOOL bControl,BOOL bShift)

{

     switch (vk) {

     case VK_LEFT:

          if (bShift) {

              if (bControl) {

                   AeMc.RecordCommand("movesel wleft");

              } else {

                   AeMc.RecordCommand("movesel left");

              }

          } else {

              if (bControl) {

                   AeMc.RecordCommand("move wleft");

              } else {

                   AeMc.RecordCommand("move left");

              }

          }

          break;

     case VK_RIGHT:

          if (bShift) {

              if (bControl) {

                   AeMc.RecordCommand("movesel wright");

              } else {

                   AeMc.RecordCommand("movesel right");

              }

          } else {

              if (bControl) {

                   AeMc.RecordCommand("move wright");

              } else {

                   AeMc.RecordCommand("move right");

              }

          }

          break;

     case VK_UP:

          if (bControl && bShift)

              break;

          if (bShift) {

              AeMc.RecordCommand("movesel up");

          } else {

              if (bControl) {

                   AeMc.RecordCommand("scroll up");

              } else {

                   AeMc.RecordCommand("move up");

              }

          }

          break;

     case VK_DOWN:

          if (bControl && bShift)

              break;

          if (bShift) {

              AeMc.RecordCommand("movesel down");

          } else {

              if (bControl) {

                   AeMc.RecordCommand("scroll down");

               } else {

                   AeMc.RecordCommand("move down");

              }

          }

          break;

     case VK_PRIOR:

          if (bShift) {

              AeMc.RecordCommand("movesel pgup");

          } else {

              AeMc.RecordCommand("move pgup");

          }

          break;

     case VK_NEXT:

          if (bShift) {

              AeMc.RecordCommand("movesel pgdn");

          } else {

              AeMc.RecordCommand("move pgdn");

          }

          break;

     case VK_HOME:

          if (bShift) {

              if (bControl) {

                   AeMc.RecordCommand("movesel dochome");

              } else {

                   AeMc.RecordCommand("movesel home");

              }

          } else {

              if (bControl) {

                   AeMc.RecordCommand("move dochome");

              } else {

                   AeMc.RecordCommand("move home");

              }

          }

          break;

     case VK_END:

          if (bShift) {

              if (bControl) {

                   AeMc.RecordCommand("movesel docend");

              } else {

                   AeMc.RecordCommand("movesel end");

              }

          } else {

              if (bControl) {

                   AeMc.RecordCommand("move docend");

              } else {

                   AeMc.RecordCommand("move end");

              }

          }

          break;

     case VK_DELETE:

          if (pFrame->bReadOnly || bCapture)

              break;

          if (!bShift) {

              AeMc.RecordCommand("delete");

          }

          break;

     case VK_BACK:

          if (pFrame->bReadOnly || bCapture || ViewType==HEXA_VIEW)

              break;

          if ((off==0 && SelStart==SelEnd) || (bShift && bControl))

              break;

 

          if (bControl) {

              AeMc.RecordCommand("bs word");

          } else {

              AeMc.RecordCommand("bs char");

          }

          break;

     }

}

 

º¸´Ù½ÃÇÇ ÀÔ·ÂµÈ Å°°ªÀ» ´ëÀÀµÇ´Â ¸í·É ±¸¹®À¸·Î ±â·ÏÇϱ⸸ ÇÏ´Â °£´ÜÇÑ ±¸Á¶·Î µÇ¾î ÀÖ´Ù. ÀÌ ÇÔ¼ö´Â ProcessKey ÇÔ¼öÀÇ Á¹º´ ÇÔ¼öÀ̹ǷΠProcessKey¿¡¼­ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÑ ÈÄ ½ÇÁ¦ Ű µ¿ÀÛÀ» ó¸®ÇÑ´Ù. ±â·Ï ¿øÄ¢¿¡¼­ ¾ê±âÇß´Ù½ÃÇÇ ¸í·ÉÀÇ ¼º°ø ¿©ºÎ¿¡ »ó°ü¾øÀÌ ¹«Á¶°Ç ±â·ÏÇØ¾ß ÇϹǷΠ´Ù¸¥ Á¶°ÇÀ» ´õ Á¡°ËÇÒ ÇÊ¿ä´Â ¾ø´Ù.

 

void CApiEditText::ProcessKey(UINT vk,BOOL bControl,BOOL bShift)

{

     int r,c;

     int oldr;

     int OldOff;

     int toff;

 

    ProcessKeyRecord(vk,bControl,bShift);

 

     switch (vk) {

     ....

 

Çí»ç ºä¿¡¼­µµ ¸¶Âù°¡Áö·Î ÀÌ ÇÔ¼ö¸¦ È£ÃâÇØ¾ß ÇÑ´Ù.

 

void CApiEditHexa::ProcessKey(UINT vk,BOOL bControl,BOOL bShift)

{

     int r,c;

     int oldr;

     int OldOff;

 

    ProcessKeyRecord(vk,bControl,bShift);

 

     switch (vk)

     ....

 

µÎ ºä°¡ Ű ÀÔ·ÂÀ» ó¸®ÇÏ´Â ¹æ½ÄÀº »ó´çÈ÷ ´Ù¸£Áö¸¸ ŰÀÇ ³í¸®Àû Àǹ̴ µ¿ÀÏÇϹǷΠ±â·ÏÇÏ´Â ¹æ½ÄÀº °ÅÀÇ µ¿ÀÏÇÏ´Ù. ´Ü, Çí»ç ºä´Â BS ۸¦ ó¸®ÇÏÁö ¾Ê´Â´Ù´Â Á¤µµ¸¸ ´Ù¸¦ »ÓÀÌ´Ù. ±×·¡¼­ ÄÚµåÀÇ Áߺ¹ ¹æÁö¸¦ À§ÇØ ±âº» ºä°¡ ¾çÂÊ ºä¸¦ ¸ðµÎ Áö¿øÇÏ´Â ±â·Ï ÇÔ¼ö¸¦ Á¦°øÇÏ°í ÆÄ»ý ºä´Â ÀÌ ÇÔ¼ö¸¦ ºÒ·¯¼­ ¾²±â¸¸ ÇÑ´Ù. »ðÀÔ ±â·ÏÀº OnChar, OnImeChar¿¡¼­ ÀÛ¼ºÇϴµ¥ ¹®ÀÚ¿­¿¡ ÀúÀåÇÒ ¼ö ¾ø´Â ¸î¸î Ư¼ö ¹®ÀÚ´Â È®Àå¿­·Î º¯°æÇÑ ÈÄ ±â·ÏÇØ¾ß ÇÑ´Ù.

 

void CApiEditText::OnChar(HWND hWnd, TCHAR ch, int cRepeat)

{

    TCHAR szCom[256];

     ....

    if (ch == '\r') {

        lstrcpy(szCom,"insert \"\\n\"");

    } else if (ch == '\t') {

        lstrcpy(szCom,"insert \"\\t\"");

    } else if (ch == '\"') {

        lstrcpy(szCom,"insert \"\\\"\"");

    } else if (ch == '\\') {

        lstrcpy(szCom,"insert \"\\\\\"");

    } else {

        wsprintf(szCom,"insert \"%s\"",szChar);

    }

    AeMc.RecordCommand(szCom);

 

     if (ch=='\t') {

     ....

 

LRESULT CApiEditText::OnImeChar(HWND hWnd, WPARAM wParam, LPARAM lParam)

{

    TCHAR szCom[256];

     ....

    wsprintf(szCom,"insert \"%s\"",szChar);

    AeMc.RecordCommand(szCom);

 

     bComp=FALSE;

     Invalidate(FindParaStart(off-lstrlen(szChar)));

     SetCaret();

     return 0;

}

 

°³Çà ÄÚµå¿Í ÅÇ, µû¿ÈÇ¥ µîÀº È®Àå¿­·Î ¹Ù²Ù¾î ±â·ÏÇÑ´Ù. Çí»çºä¿¡¼­ÀÇ ÀÔ·ÂÀº ±â·ÏÇÏÁö ¾Ê´Â´Ù. ¹®ÀÚ¿­ÀÌ ¾Æ´Ï±â ¶§¹®¿¡ ±â·ÏÇØµµ Àç»ç¿ë¼ºÀÌ Å©°Ô ¶³¾îÁö°í ÀÌÁø ¹ÙÀÌÆ® ÀÔ·ÂÀº ¸ÅÅ©·Î¿¡ Æ÷ÇÔ½Ã۴µ¥ ¹®Á¦°¡ ¸¹´Ù. OnCommand¿¡¼­ Ŭ¸³º¸µå °ü·Ã ¸í·ÉÀ» ±â·ÏÇÑ´Ù.

 

void CApiEditText::OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify)

{

     switch (id) {

     case IDM_AE_CUT:

          if (SelStart != SelEnd && pFrame->bReadOnly==FALSE && bCapture==FALSE) {

           AeMc.RecordCommand("cut");

           AeMc.runlevel++;

              SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDM_AE_COPY,0),0);

           AeMc.runlevel--;

              ....

     case IDM_AE_COPY:

          if (SelStart != SelEnd) {

           AeMc.RecordCommand("copy");

              ....

     case IDM_AE_PASTE:

          if (IsClipboardFormatAvailable(CF_TEXT) && pFrame->bReadOnly==FALSE &&

              bCapture==FALSE) {

           AeMc.RecordCommand("paste");

              ....

     case IDM_AE_SELALL:

        AeMc.RecordCommand("select doc");

          ....

     case IDM_AE_CUTAPPEND:

        AeMc.RecordCommand("cutapp");

          if (!IsClipboardFormatAvailable(CF_TEXT)) {

              SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDM_AE_CUT,0),0);

              return;

          }

          if (SelStart != SelEnd && pFrame->bReadOnly==FALSE && bCapture==FALSE) {

           AeMc.runlevel++;

              SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDM_AE_COPYAPPEND,0),0);

           AeMc.runlevel--;

          ....

     case IDM_AE_COPYAPPEND:

        AeMc.RecordCommand("copyapp");

          ....

     }

}

 

°¢ ¸Þ´º¿¡ ´ëÀÀµÇ´Â ¸ÅÅ©·Î ¸í·ÉÀ» ±â·ÏÇϱ⸸ ÇÏ¸é µÈ´Ù. ´Ü, Àß¶ó³»±â´Â º¹»ç ÈÄ »èÁ¦·Î Á¤ÀǵǾî Àֱ⠶§¹®¿¡ cut ´ÙÀ½¿¡ copyµµ °°ÀÌ ±â·ÏµÇ´Â ¹®Á¦°¡ ÀÖ´Ù. ±×·¡¼­ º¹»çÇÒ ¶§ runlevelÀ» ¿Ã·Á copy´Â ±â·ÏÇÏÁö ¾Ê¾Ò´Ù. ¶ÇÇÑ Shift+Del Ű·Î Àß¶ó³¾ ¶§´Â ProcessKeyRecord¿¡¼­ »èÁ¦ ±â·ÏÀ» ¸ÕÀú ÀÛ¼ºÇؼ­´Â ¾ÈµÇ¹Ç·Î ÀÌ ÇÔ¼ö¿¡¼­ Shift¿Í ÇÔ²² DelÀ» ´­·¶À» ¶§´Â ±â·ÏÀ» ÀÛ¼ºÇÏÁö ¾Êµµ·Ï ÇØ µÎ¾ú´Ù.

ÇϳªÀÇ ÆíÁý ¸í·ÉÀÌ ¿©·¯ °¡Áö ¼¼ºÎ µ¿ÀÛÀÇ Á¶ÇÕÀ¸·Î ±¸ÇöµÇ´Â °æ¿ì°¡ Á¾Á¾ Àִµ¥ ÀÌ·² ¶§´Â ¼¼ºÎ µ¿ÀÛÀº »©°í ÃÖÁ¾ ¸í·É Çϳª¸¸ ±â·ÏÇØ¾ß ÇÑ´Ù. cutappendµµ ¸¶Âù°¡Áö·Î º¹»ç ¸í·ÉÀº ±â·ÏÇÏÁö ¾Ê¾Æ¾ß Çϸç À̶§µµ runlevelÀ» Àá½Ã Áõ°¡½ÃŰ´Â ¹æ¹ýÀ» »ç¿ëÇß´Ù. Çí»çºä¿¡¼­ OnCommand¸¦ ÀçÁ¤ÀÇÇÏÁö ¾ÊÀ¸¹Ç·Î ±âº» ºä¿¡¸¸ ±â·Ï Äڵ带 ÀÛ¼ºÇÏ¸é µÈ´Ù. ´ÙÀ½Àº ºÏ¸¶Å© °ü·Ã µ¿ÀÛÀ» ±â·ÏÇÑ´Ù.

 

void CApiEditText::ToggleBookmark(int Para, int Mark)

{

    TCHAR szCom[256];

     ....

     if (Mark <= 9) {

        wsprintf(szCom,"setmark %d",Mark);

        AeMc.RecordCommand(szCom);

          ....

     } else {

        AeMc.RecordCommand("setmark unname");

          ....

 

void CApiEditText::GotoBookmark(int Mark)

{

    TCHAR szCom[256];

     ....

     if (Mark<=9) {

        wsprintf(szCom,"gomark %d",Mark);

        AeMc.RecordCommand(szCom);

          ....

     } else {

          ....

          if (Mark == 10) {

           AeMc.RecordCommand("gomark next");

              ....

          } else {

           AeMc.RecordCommand("gomark prev");

              ....

          }

     }

 

     GotoLine(Para,0,1);

}

 

À̸§ÀÌ ¾ø´Â ºÏ¸¶Å©À̸é unnameÀ¸·Î ±â·ÏÇÏ°í ¹øÈ£°¡ ÀÖ´Â ºÏ¸¶Å©´Â ¹øÈ£¿Í ÇÔ²² ±â·ÏÇß´Ù. ´ÙÀ½Àº ã±â, ¹Ù²Ù±â µ¿ÀÛ¿¡ ´ëÇÑ ±â·ÏÀ» ÀÛ¼ºÇÑ´Ù.

 

BOOL CApiEditText::FindText(int nPos, TCHAR *what, DWORD dwFlag)

{

     int nStart;

     TCHAR *pFound;

     BOOL bWrap;

    TCHAR szCom[256];

 

    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);

     ....

 

int CApiEditText::ReplaceText(int nPos, TCHAR *what, DWORD dwFlag, TCHAR *to)

{

     int len;

     TCHAR *pSel;

     TCHAR *pWhat;

     int Result;

     TCHAR szDesc[1024];

    TCHAR szCom[256];

 

    wsprintf(szCom,"find \"%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);

 

ãÀ» ¹®ÀÚ¿­°ú ¹Ù²Ü ¹®ÀÚ¿­, °Ë»ö ¿É¼Ç µîÀÌ Àμö·Î Àü´ÞµÇ¹Ç·Î ÀÌ ÀμöµéÀ» ¸ÅÅ©·ÎÀÇ ´ëÀÀµÇ´Â ¸ñÀû¾î·Î ¹Ù²Ù¾î ±â·ÏÇß´Ù. °¢Á¾ ÆíÁý ¸í·Éµéµµ ±â·ÏÇÑ´Ù.

 

void CApiEditText::ChangeCase(int action)

{

     switch (action) {

     case 0:

          AeMc.RecordCommand("convert upper");

          ....

     case 1:

          AeMc.RecordCommand("convert lower");

          ....

     case 2:

          AeMc.RecordCommand("convert reversecase");

          ....

     case 3:

          AeMc.RecordCommand("convert upperfirst");

          ....

     case 4:

          AeMc.RecordCommand("convert uppersend");

          ....

 

void CApiEditText::ConvertSpaceTab(BOOL bToSpace)

{

     if (bToSpace) {

          AeMc.RecordCommand("convert tospace");

          ....

     } else {

          AeMc.RecordCommand("convert totab");

          ....

 

void CApiEditText::RemoveExtraSpace()

{

     ....

     AeMc.RecordCommand("convert removespace");

 

void CApiEditText::BlockIndent(BOOL bUnindent)

{

     if (!bUnindent) {

          AeMc.RecordCommand("convert indent");

          ....

     } else {

          AeMc.RecordCommand("convert unindent");

          ....

 

void CApiEditText::InsertComment(BOOL bUnComment)

{

     if (!bUnComment) {

          AeMc.RecordCommand("convert comment");

          ....

     } else {

          AeMc.RecordCommand("convert uncomment");

          ....

 

void CApiEditText::CopyChar(int dir)

{

     if (dir==0) {

          AeMc.RecordCommand("copychar up");

          ....

     if (dir==1) {

          AeMc.RecordCommand("copychar down");

          ....

 

void CApiEditText::GotoLastEditOff()

{

     AeMc.RecordCommand("move last");

     Move(AECM_LAST,FALSE);

}

 

Űº¸µå·Î ÆíÁýÀÌ ÀϾ´Â ¸ðµç °÷¿¡¼­ ¸ÅÅ©·Î Èĺ¸ ¸í·ÉÀ» ÀÏÀÏÀÌ ±â·ÏÇÑ´Ù°í º¸¸é µÈ´Ù. »ç¿ëÀÚ´Â ÀÌ·¸°Ô ±â·ÏµÈ Á¤º¸ Áß »õ·Î ¸¸µé ¸ÅÅ©·Î¿¡ Æ÷ÇÔ½Ã۰íÀÚ ÇÏ´Â ¸í·ÉÀ» ½±°Ô ¼±ÅÃÇÒ ¼ö ÀÖÀ¸¸ç ¶§·Î´Â ÀϺθ¦ »èÁ¦Çϰųª ´õ ÀÔ·ÂÇØ ³ÖÀ» ¼öµµ ÀÖ´Ù. ´Ü, ¸ÅÅ©·Î ½ÇÇàÁß¿¡ ¹ß»ýÇÏ´Â ÆíÁýµ¿ÀÛÀº ±â·ÏÇÏÁö ¾Ê´Â´Ù.

 

void CApiEdit::ExecMacro(const TCHAR *szMacro)

{

     const TCHAR *pc;

     int Result,ParentResult;

 

    GetActiveView()->AeMc.runlevel++;

     StartUndoGroup(21);

     for (pc=szMacro;;) {

          ....

     }

     EndUndoGroup();

    GetActiveView()->AeMc.runlevel--;

}

 

RecordCommand ÇÔ¼öÀÇ ¼±µÎ¿¡¼­ runlevelÀÌ 0ÀÌ ¾Æ´Ï¸é ¹«Á¶°Ç ¸®ÅÏÇϵµ·Ï µÇ¾î ÀÖÀ¸¹Ç·Î runlevel¸¸ 0ÀÌ ¾Æ´Ñ ä·Î ¸¸µé¾î ³õ°í ÆíÁý ¸í·ÉÀ» ½ÇÇàÇÏ¸é ¾î¶² ¸í·Éµµ ±â·ÏµÇÁö ¾Ê´Â´Ù. À̶§ runlevelÀº ¹Ýµå½Ã Ä«¿îÆ®·Î °ü¸®ÇØ¾ß Çϴµ¥ ¸ÅÅ©·Î°¡ ¸ÅÅ©·Î¸¦ È£ÃâÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù. Ä«¿îÆ®¸¦ »ç¿ëÇϸé ÁßøµÈ ¸ÅÅ©·Î ½ÇÇà½Ã¿¡µµ Àüü ¸ÅÅ©·Î°¡ ¿ÏÀüÈ÷ Á¾·áµÉ ¶§±îÁö ±â·ÏÀ» ÇÏÁö ¾Ê´Â´Ù.

ApiEdit´Â ¹«Á¶°Ç ÀÏÁ¤ °³¼öÀÇ ÆíÁý ¸í·ÉÀ» ±â·ÏÇÏ°í °ü¸®ÇÏÁö¸¸ ÄÁÆ®·Ñ ½º½º·Î ÀÌ ±â·ÏÀ» »ç¿ëÇÏÁö´Â ¾Ê´Â´Ù. ±â·ÏµÈ ¸í·ÉµéÀº È£½ºÆ®°¡ »õ·Î¿î ¸ÅÅ©·Ñ ÀÛ¼ºÇÒ ¶§ Èĺ¸ ¸í·ÉÀ¸·Î Âü°í¸¸ ÇÒ »ÓÀÌ´Ù. Àá½Ã ÈÄ ¸ÅÅ©·Î ÆíÁý ´ëÈ­»óÀÚ¿¡¼­ ÀÌ ±â·ÏµéÀ» »ç¿ëÇÒ °ÍÀÌ´Ù.