°¡. ¹®´Ü °ü¸® ÇÔ¼ö

µé¿©¾²±â(Indent) ±â´ÉÀº ÁÙ ¾Õ¿¡ ÅÇÀ̳ª °ø¹éÀ» »ðÀÔÇÏ¿© Àû´çÈ÷ ¿©¹éÀ» ¶ç¿ö ÁÖ´Â ±â´ÉÀÌ¸ç ¼Ò½º Äڵ带 ÀÛ¼ºÇÒ ¶§ ÁÖ·Î ¸¹ÀÌ »ç¿ëµÈ´Ù. ¹®¼­ ÀÛ¼ºÁß¿¡ ÀÚµ¿À¸·Î µé¿©¾²±â¸¦ ÇÒ ¼öµµ ÀÖ°í ÀÌ¹Ì ÀÛ¼ºµÈ ¹®¼­ÀÇ µé¿©¾²±â¸¦ Á¶Á¤ÇÒ ¼öµµ ÀÖ´Ù. C ÇÁ·Î±×·¡¹ÖÀ» ÇÏ°í ÀÖ´Â »ç¶÷À̶ó¸é µé¿©¾²±âÀÇ °³³ä¿¡´Â ¾ÆÁÖ Àͼ÷ÇÒ °ÍÀÌ¸ç ´ÙÀ½ Àý¿¡¼­ ½Ç½ÀÇØ º¼ °ÍÀÌ´Ù.

µé¿©¾²±â´Â Ç×»ó ¹®´Ü ´ÜÀ§·Î µ¿ÀÛÇÏ¸ç ¿£ÅÍÄÚµå·Î ²÷¾îÁø ¹®´ÜÀÇ ¼±µÎ¿¡ ´ëÇؼ­¸¸ Àû¿ëµÈ´Ù. ÁÙ´ÜÀ§·Î µé¿©¾²±â¸¦ ÇÏ´Â °ÍÀÌ ¾Æ´Ï¹Ç·Î ÀÚµ¿°³ÇàµÈ ÁÙÀÇ ¼±µÎ¿¡´Â µé¿©¾²±â°¡ Àû¿ëµÇÁö ¾Ê´Â´Ù. µé¿©¾²±â ÇÔ¼ö°¡ ¹®¼­¸¦ Á¶ÀÛÇÏ´Â ´ÜÀ§°¡ ¹®´ÜÀ̹ǷΠµé¿©¾²±â ±â´ÉÀ» ±¸ÇöÇϱâ Àü¿¡ ¸ÕÀú ¹®´ÜÀ» °ü¸®ÇÒ ¼ö ÀÖ´Â ÇÔ¼öÀÇ ÁýÇÕÀ» Á¤ÀÇÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. ApiEdit.h¿¡ ´ÙÀ½ ¸â¹öÇÔ¼öÀÇ ¿øÇüÀ» ¼±¾ðÇÑ´Ù.

 

class CApiEdit

{

     ....

     void GetParaFromOff(int nPos, int &pr, int &pc);

     int GetOffFromPara(int pr, int pc);

     int GetParaFirstLine(int nPara);

     int GetParaLastLine(int nPara);

 

ÇÔ¼öÀÇ À̸§À» º¸¸é ¾î¶² °ªÀ¸·ÎºÎÅÍ ¹«¾ùÀ» ã¾Æ³»´ÂÁö ½±°Ô ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¿¹¸¦ µé¾î GetParaFirstLineÀº ParaÀÇ First LineÀ» GetÇÑ´Ù. ÇÔ¼öÀÇ À̸§¿¡¼­ º¼ ¼ö ÀÖ´Ù½ÃÇÇ ÀÌ ÇÔ¼öµéÀº GetOffFromRC, GetXYFromOff ·ùÀÇ ÇÔ¼ö¿Í ºñ½ÁÇÑ ±â´ÉÀ» ¼öÇàÇÏ¸ç ±× ´ÜÀ§°¡ ÁÙÀÌ ¾Æ´Ñ ¹®´ÜÀ̶ó´Â Á¡¸¸ ´Ù¸£´Ù. ApiEdit ÄÁÆ®·ÑÀÇ ÇÙ½ÉÀÌ µÇ´Â ¾ÆÁÖ Áß¿äÇÑ ÇÔ¼öµéÀÓ¿¡µµ ºÒ±¸ÇÏ°í ÀÌ ÇÔ¼öÀÇ ÀÛ¼º ½Ã±â°¡ ¸¹ÀÌ ´Ê¾îÁø °Í °°´Ù. ÄÚµå´Â ´ÙÀ½°ú °°´Ù.

 

int CApiEdit::GetParaFirstLine(int nPara)

{

     int Upper,Lower;

     int r;

 

     Lower=0;

     Upper=TotalLine-1;

     if (nPara < 0 || nPara > pLine[Upper].nPara) {

          return -1;

     }

 

     for (;;) {

          r=(Upper+Lower)/2;

 

          if (pLine[r].nPara == nPara) {

              return r-pLine[r].nLine;

          }

 

          if (pLine[r].nPara > nPara) {

              Upper=r-1;

          } else {

              Lower=r+1;

          }

     }

}

 

int CApiEdit::GetParaLastLine(int nPara)

{

     int r;

 

     r=GetParaFirstLine(nPara+1);

     if (r==-1) {

          return TotalLine-1;

     } else {

          return r-1;

     }

}

 

void CApiEdit::GetParaFromOff(int nPos, int &pr, int &pc)

{

     int r,c;

 

     GetRCFromOff(nPos,r,c);

     r=r-pLine[r].nLine;

 

     pr=pLine[r].nPara;

     pc=nPos-pLine[r].Start;

}

 

int CApiEdit::GetOffFromPara(int pr, int pc)

{

     int r,re;

 

     r=GetParaFirstLine(pr);

     if (r==-1) {

          return -1;

     }

     re=GetParaLastLine(pr);

 

     if (pLine[r].Start+pc <= pLine[re].End) {

          return pLine[r].Start+pc;

     } else {

          return -1;

     }

}

 

°¡Àå ±âº»ÀÌ µÇ´Â ÇÔ¼ö´Â GetParaFirstLine ÇÔ¼öÀε¥ ÀÌ ÇÔ¼ö´Â Àμö·Î ¹®´Ü¹øÈ£¸¦ ÁÖ¸é ÀÌ ¹®´Ü¿¡ ¼ÓÇÑ Ã¹ ¹ø° ÁÙÀ» ã¾ÆÁØ´Ù. ÀÌ °Ë»ö¿¡ ÂüÁ¶µÇ´Â Á¤º¸´Â ¹°·Ð Á¤·ÄÁ¤º¸ÀÎ pLineÀε¥ pLineÀº °¢ ÁÙº°·Î ¹®´Ü(nPara)°ú ¹®´Ü ³»ÀÇ ÁÙ¹øÈ£(nLine)¸¦ ÀúÀåÇÏ°í ÀÖ´Ù. ÁÙ¹øÈ£·ÎºÎÅÍ ¹®´Ü¹øÈ£¸¦ ã´Â °ÍÀº pLine[r].nPara¸¸ ÀÐÀ¸¸é µÇ¹Ç·Î ¾ÆÁÖ ½±Áö¸¸ ¹Ý´ë·Î ¹®´Ü¹øÈ£·Î ÁÙ¹øÈ£¸¦ ãÀ¸·Á¸é ½±Áö ¾Ê´Ù.

´ÙÇàÈ÷ pLine ¹è¿­Àº ¹®´Ü¹øÈ£°¡ ¿À¸§Â÷¼øÀ¸·Î Á¤·ÄµÇ¾î ÀÖÀ¸¹Ç·Î À̺Р°Ë»öÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÏ´Ü ¹®´Ü¿¡ ¼ÓÇÑ ÁÙ¹øÈ£¸¦ ãÀ¸¸é ±× ¹®´Ü ³»¿¡¼­ nLineÀÌ 0ÀÎ ÁÙ, Áï ù ¹ø° ÁÙÀÇ ¹øÈ£¸¦ ½±°Ô ±¸ÇÒ ¼ö ÀÖ´Ù. ¸ðµÎ 15ÁÙ·Î ±¸¼ºµÈ ´ÙÀ½ ¹®¼­¸¦ ¿¹·Î µé¾î ÀÌ ÇÔ¼ö°¡ 1¹ø ¹®´ÜÀÇ Ã¹ ¹ø° ÁÙÀ» ã´Â µ¿ÀÛÀ» °üÂûÇغ¸ÀÚ.

TotalLineÀÌ 15À̹ǷΠ¸¶Áö¸· ÁÙÀÇ ¹øÈ£´Â 14°¡ µÈ´Ù. ù ´Ü°è¿¡¼­ °Ë»ö ´ë»óÀº Áß°£ ÁöÁ¡ÀÎ 7¹ø ÁÙÀÌ µÇ´Âµ¥ ÀÌ ÁÙÀÇ ¹®´Ü°ªÀ» º¸´Ï 2·Î µÇ¾î ÀÖÀ¸¸ç ã°íÀÚ ÇÏ´Â 1¹ø ¹®´Ü º¸´Ù´Â ´õ µÚÀÇ ¹®´ÜÀÎ °ÍÀÌ´Ù. ±×·¡¼­ UpperÀÇ ´ÙÀ½ ´Ü°è´Â R1º¸´Ù Çϳª ÀÛÀº 6ÀÌ µÈ´Ù.

µÎ ¹ø° R2°ªÀº 6ÀÇ Àý¹ÝÀÎ 3ÀÌ µÇ¸ç ÀÌ ÁÙÀÇ ¹®´Ü¹øÈ£¸¦ Á¶»çÇغ¸´Ï ã°íÀÚ ÇÏ´Â 1¹ø ¹®´Ü°ú °°´Ù. Áï 3¹ø ÁÙÀÌ Ã£´Â ¹®´Ü¿¡ ¼ÓÇÑ ÁÙÀ̶ó´Â °ÍÀ» ¾Ë ¼ö ÀÖÀ¸¸ç ¹®´ÜÀº ÀÌ¹Ì Ã£Àº °ÍÀÌ´Ù. ¹®´ÜÀ» ãÀº ÈÄ¿¡´Â ±× ¹®´ÜÀÇ Ã¹ ÁÙÀ» ã´Âµ¥ R2¿¡¼­ ½ÃÀÛÇÏ¿© nLineÀÌ 0ÀÌ µÉ ¶§±îÁö °Å²Ù·Î °Å½½·¯ ¿Ã¶ó°¡¸é µÈ´Ù. R2ÀÇ nLineÀº ÇöÀç 2·Î Á¤ÀǵǾî ÀÖÀ¸¹Ç·Î R2´Â 1¹ø ¹®´ÜÀÇ ¼¼ ¹ø° ÁÙÀÌ´Ù. Áï ÀÌ ÁÙÀÇ µÎ Ä­ À§¿¡ ¹®´Ü ù ÁÙÀÌ ÀÖ´Ù´Â ¾ê±â´Ù.

¸¶Áö¸·À¸·Î R2ÀÇ ÁÙ¹øÈ£¿¡¼­ ÀÌ ÁÙÀÇ nLineÀ» »« °ªÀ» °è»êÇؼ­ ¸®ÅÏÇϸé 1¹ø ¹®´ÜÀÇ Ã¹ ¹ø° ÁÙÀ» ã°Ô µÇ´Â °ÍÀÌ´Ù. ÁÙ¹øÈ£´Â Ç×»ó ±× ÁÙÀÇ nLineº¸´Ù Å©±â ¶§¹®¿¡ r-pLine[r].nLineÀº Ç×»ó 0 ÀÌ»óÀ̶ó´Â °ÍÀÌ º¸ÀåµÇ¹Ç·Î ¹è¿­¹üÀ§¸¦ ¹þ¾î³¯ À§ÇèÀº Àý´ë·Î ¾ø´Ù.

ÀÌ ÇÔ¼ö´Â °Ë»öÀ» ½ÃÀÛÇϱâ Àü¿¡ nPara°¡ °ú¿¬ Á¦´ë·Î Àü´ÞµÈ °ªÀÎÁö °Ë»ç¸¦ Çϴµ¥ nPara´Â 0 ÀÌ»óÀ̾î¾ß ÇÏ°í ¶ÇÇÑ ¸¶Áö¸· ÁÙÀÇ ¹®´Ü¹øÈ£º¸´Ù Ŭ ¼ö´Â ¾øÀ¸¹Ç·Î ÀÌ ¹üÀ§¸¦ ¹þ¾î³ª¸é ÁÙ¹øÈ£·Î -1À» ¸®ÅÏÇÏ¿© ¿¡·¯°¡ ¹ß»ýÇßÀ½À» ¾Ë·ÁÁØ´Ù. È£ÃâÃø¿¡¼­ nPara Àμö¸¸ Á¤È®ÇÏ°Ô Àü´ÞÇÑ´Ù¸é ÀÌ·± ¿¡·¯ 󸮴 ±»ÀÌ ÇÊ¿äÄ¡ ¾Ê´Ù. ÇÏÁö¸¸ ÀÌ ¿¡·¯ 󸮸¦ ±³¹¦ÇÏ°Ô ÀÌ¿ëÇÏ¸é ´Ù¸¥ ·çƾµéÀÌ Á» ´õ °£´ÜÇØÁö´Â È¿°ú°¡ Àִµ¥ GetParaLastLine ÇÔ¼ö¿¡¼­ ÀÌ ¿¡·¯ »óȲÀ» È°¿ëÇÏ´Â ¿¹¸¦ º¼ ¼ö ÀÖ´Ù.

¹®´ÜÀÇ ¸¶Áö¸· ÁÙÀº ±× ´ÙÀ½ ¹®´ÜÀÇ Ã¹ ÁÙ ¹Ù·Î À§¿¡ ÀÖ´Â ÁÙÀÌ´Ù. ±×·¡¼­ nParaÀÇ ¸¶Áö¸· ÁÙÀº nPara+1¹®´ÜÀÇ Ã¹ ÁÙ-1·Î ±¸ÇÑ´Ù. ´Ü, ¸¸¾à nPara°¡ ¹®¼­ÀÇ ¸¶Áö¸· ¹®´ÜÀÏ °æ¿ì´Â ÀÌ ´Ü¼øÇÑ °è»êÀÌ ÅëÇÏÁö ¾Ê´Âµ¥ ¿Ö³ÄÇϸé nPara+1ÀÌ Á¸ÀçÇÏÁö ¾Ê±â ¶§¹®ÀÌ´Ù. ÀÌ °æ¿ì GetParaFirstLineÀº -1À̶ó´Â °ªÀ» ¸®ÅÏÇϴµ¥ ±×·¸´Ù¸é nParaÀÇ ¸¶Áö¸· ÁÙÀº TotalLine-1·Î °£´ÜÇÏ°Ô ±¸ÇÒ ¼ö ÀÖ´Ù. ±×·¸Áö ¾Ê´Ù¸é nPara+1 ¹®´ÜÀÇ Ã¹ ÁÙ¿¡¼­ 1À» »©ÁØ ÁÙ¹øÈ£¸¦ ¸®ÅÏÇÑ´Ù.

¿ÀÇÁ¼ÂÀ¸·ÎºÎÅÍ ¹®´Ü¹øÈ£¸¦ ±¸ÇÏ´Â ¹æ¹ýµµ ¾ÆÁÖ °£´ÜÇÏ´Ù. µÑ ´Ù pLine ¹è¿­¿¡ ÀÖ´Â Á¤º¸ÀÌÁö¸¸ ¼­·Î ¿¬°üµÇ¾î ÀÖÁö ¾Ê±â ¶§¹®¿¡ Á÷Á¢ÀûÀ¸·Î ±¸ÇÒ ¼ö ¾øÀ¸¸ç ÁÙ¹øÈ£¸¦ ÅëÇØ °£Á¢ÀûÀ¸·Î ¼­·Î¸¦ ±¸ÇØ¾ß ÇÑ´Ù. Àü´ÞµÈ ¿ÀÇÁ¼Â nPos·ÎºÎÅÍ ÀÌ ¿ÀÇÁ¼ÂÀÌ ÀÖ´Â ÁÙ¹øÈ£ rÀ» ¸ÕÀú ã´Â´Ù. ±×¸®°í pLine[r].nPara¸¦ ÀÐÀ¸¸é ÀÌ °ªÀÌ ¹Ù·Î nPos°¡ ¼ÓÇÑ ¹®´ÜÀÌ´Ù.

¹®´Ü ³»ÀÇ Ä­ ¹øÈ£ÀÎ pc´Â nPos¿¡¼­ ¹®´ÜÀÇ Ã¹ ÁÙ ½ÃÀÛ ¹øÁö¸¦ »©¸é µÈ´Ù. ±×·¡¼­ rÀ» ¹®´ÜÀÇ Ã¹ ÁÙ·Î ¿Ã¸° ÈÄ nPos-pLine[r].Start¸¦ °è»êÇß´Ù. ¹®´Ü¹øÈ£¿Í ¹®´Ü Ä­ ¹øÈ£·ÎºÎÅÍ ¿ÀÇÁ¼ÂÀ» ±¸ÇÏ´Â ¹æ¹ýÀº Áö±ØÈ÷ °£´ÜÇؼ­ ´ÙÀ½ ÇÑ ÁÙÀÌ¸é ±¸ÇÒ ¼ö ÀÖ´Ù.

 

return pLine[GetParaFirstLine(pr)].Start+pc

 

¹®´Ü ù ÁÙÀÇ ½ÃÀÛ ¿ÀÇÁ¼Â°ú ¹®´Ü ³»ÀÇ Ä­ ¹øÈ£¸¦ ´õÇØ ¸®ÅÏÇϱ⸸ ÇÏ¸é µÈ´Ù. ´Ü, pc°¡ ÀÌ ¹®´Ü ¹üÀ§¸¦ ¹þ¾î³­ Ä­ ¹øÈ£ÀÎ °æ¿ì¸¦ À§ÇØ ¿¡·¯ 󸮸¦ ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. ¹®´ÜÀÇ ±æÀÌ´Â 100ÀÚ¹Û¿¡ ¾ÈµÇ´Âµ¥ ¹®´Ü ³»ÀÇ 200Ä­ ¿ÀÇÁ¼ÂÀ» ±¸ÇÒ ¼ö´Â ¾ø±â ¶§¹®ÀÌ´Ù. ±×·¡¼­ pc°¡ ÀÌ ¹®´Ü ¹üÀ§¿¡ ÀÖ´ÂÁö Á¶»çÇϱâ À§ÇØ ¹®´ÜÀÇ ³¡ÁÙÀÌ ÇÊ¿äÇÏ°í pc°¡ ¹®´Ü ù ÁÙÀÇ ½ÃÀÛ°ú ³¡ÁÙÀÇ ¸¶Áö¸· À§Ä¡¿¡ ÀÖ´ÂÁö Á¶»çÇÏ¿´´Ù. GetOffFromPara ÇÔ¼ö´Â ÀÌ·± ¿¡·¯ ó¸® ¶§¹®¿¡ ¾à°£ÀÇ Á¶°Ç °Ë»ç¹®ÀÌ µé¾î°¬´Ù.

ÀÌ ÇÔ¼öµéÀÌ ¿Ï¼ºµÊÀ¸·Î½á ApiEdit´Â ¼ºÁúÀÌ ´Ù¸¥ ¿©·¯ ´ÜÀ§°£À» ½±°Ô ÀüȯÇÒ ¼ö ÀÖ°Ô µÇ¾ú´Ù. ¿ÀÇÁ¼Â°ú ÁÙ, ¹®´Ü, ÁÂÇ¥¸¦ ÀÚÀ¯·Ó°Ô ÀüȯÇÒ ¼ö ÀÖÀ¸¸ç ÇϳªÀÇ °ªÀ» ¾Ë¸é Áß°£°ªÀ» ÅëÇØ ´Ù¸¥ °ªÀ» ½±°Ô ±¸ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î ¸¶¿ì½º·Î ÂïÀº ÁÂÇ¥°¡ ¾î´À ¹®´Ü¿¡ ¼ÓÇÏ´ÂÁö ¾Ë°í ½ÍÀ¸¸é ÁÂÇ¥·ÎºÎÅÍ ¿ÀÇÁ¼ÂÀ» ±¸ÇÏ°í ¿ÀÇÁ¼ÂÀ¸·ÎºÎÅÍ ¹®´ÜÀ» ±¸ÇÏ¸é µÈ´Ù.

ÀÌ ÇÔ¼öµéÀ» ÅëĪÇÑ´Ù¸é GetAFromB¶ó°í ÇÒ ¼ö Àִµ¥ ÀÌ ÇÔ¼öµéÀÌ ´ÜÀ§°£ÀÇ º¯È¯À» Çϱ⠶§¹®¿¡ ApiEditÀÇ ´Ù¸¥ ÄÚµåµéÀÌ °£´ÜÇØÁú ¼ö ÀÖ´Ù. ÀÌ ÇÔ¼ö°¡ Á¦´ë·Î µ¿ÀÛÇÏ´ÂÁö Å×½ºÆ® Çغ¸±â À§ÇØ ´ÙÀ½ Àӽà Äڵ带 ÀÛ¼ºÇغ¸ÀÚ.

 

void CApiEdit::OnLButtonDown(HWND hWnd, BOOL fDoubleClick, int x, int y, UINT keyFlags)

{

     ....

    TCHAR szTemp[256];

    int pr,pc;

    GetParaFromOff(off,pr,pc);

    wsprintf(szTemp,"pr=%d, pc=%d, s=%d, e=%d",pr,pc,

        GetParaFirstLine(pr),GetParaLastLine(pr));

    SetWindowText(GetParent(hWnd),szTemp);

 

     SetCapture(hWnd);

     bCapture=TRUE;

     SetCaret();

}

 

¸¶¿ì½º·Î Ŭ¸¯ÇÑ ºÎºÐÀÇ ¹®´Ü¹øÈ£, ¹®´Ü ³»ÀÇ Ä­¹øÈ£¿Í ¹®´ÜÀÇ Ã¹ ÁÙ, ³¡ÁÙÀ» ŸÀÌƲ¹Ù¿¡ Ãâ·ÂÇϵµ·Ï Çß´Ù. ÀÌ·± Áß¿äÇÑ ÇÔ¼öµéÀº ¿©·¯ °÷¿¡¼­ »ç¿ëµÇ¹Ç·Î Á¤È®ÇÏ°Ô µ¿ÀÛÇÏ´ÂÁö Á¤¹ÐÇÏ°Ô Å×½ºÆ®ÇØ º¼ ÇÊ¿ä°¡ ÀÖÀ¸¸ç ÀÌ·± Å×½ºÆ®¸¦ ÇÒ ¶§´Â µð¹ö°Å¸¦ È°¿ëÇÏ´Â °Íº¸´Ù ¾Æ¿¹ Å×½ºÆ® Äڵ带 ÀÛ¼ºÇؼ­ ½Ç½Ã°£À¸·Î È®ÀÎÇغ¸´Â °ÍÀÌ ÁÁ´Ù. ¹°·Ð Å×½ºÆ®°¡ ³¡³­ ÈÄ ÀÌ ÄÚµå´Â »èÁ¦ÇØ¾ß ÇÑ´Ù.