»ç¿ëÀÚµéÀÌ ¸ÅÅ©·Î¸¦ ÀÛ¼ºÇÏ·Á¸é ÇÊ¿äÇÑ ¸í·ÉÀ» ¼ø¼¿¡ ¸Â°Ô ±â¼úÇØ¾ß Çϴµ¥ ±×·¯ÀÚ¸é ¸ÅÅ©·ÎÀÇ ¹®¹ýÀ» ¾Ë¾Æ¾ß ÇÏ´Â ¹ø°Å·Î¿òÀÌ ÀÖ´Ù. ±×·¡¼ º¸Åë ÆíÁý±â°¡ »ç¿ëÀÚÀÇ Å° µ¿ÀÛÀ» ¸ÅÅ©·Î ¸í·ÉÀ¸·Î º¯È¯ÇÏ¸ç »ç¿ëÀÚ´Â ¹Ýº¹ÇϰíÀÚÇÏ´Â ÆíÁý µ¿ÀÛÀ» ÇÔÀ¸·Î½á ¸ÅÅ©·Î¸¦ ÀÛ¼ºÇÑ´Ù. ÀÌ·± ±â´ÉÀÌ °¡´ÉÇÏ·Á¸é ¸ÅÅ©·Î ±â·Ï ¸ðµå¸¦ µÎ°í ±â·Ï ¸ðµåÀÏ ¶§´Â »ç¿ëÀÚÀÇ Á¶ÀÛÀ» ¸ÅÅ©·Î¿¡ ÀÏÀÏÀÌ ±â·ÏÇØ¾ß ÇÑ´Ù. Áï, ±â·Ï ½ÃÀÛ ¸í·ÉÀ» ³»¸° ÈÄ ¸ÅÅ©·ÎÀÇ º»Ã¼´Â Á÷Á¢ Űº¸µå¸¦ Á¶ÀÛÇÔÀ¸·Î½á ÀÛ¼ºÇÏ´Â °ÍÀÌ´Ù. ºñÁÖ¾ó 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´Â ¹«Á¶°Ç ÀÏÁ¤ °³¼öÀÇ ÆíÁý ¸í·ÉÀ» ±â·ÏÇÏ°í °ü¸®ÇÏÁö¸¸ ÄÁÆ®·Ñ ½º½º·Î ÀÌ ±â·ÏÀ» »ç¿ëÇÏÁö´Â ¾Ê´Â´Ù. ±â·ÏµÈ ¸í·ÉµéÀº È£½ºÆ®°¡ »õ·Î¿î ¸ÅÅ©·Ñ ÀÛ¼ºÇÒ ¶§ Èĺ¸ ¸í·ÉÀ¸·Î Âü°í¸¸ ÇÒ »ÓÀÌ´Ù. Àá½Ã ÈÄ ¸ÅÅ©·Î ÆíÁý ´ëÈ»óÀÚ¿¡¼ ÀÌ ±â·ÏµéÀ» »ç¿ëÇÒ °ÍÀÌ´Ù.