ApiEdit´Â ¼±Åÿµ¿ª¿¡ ´ëÇØ »èÁ¦, º¹»ç, À̵¿, ´ëü, ´ë¼Ò¹®ÀÚ º¯È¯, µé¿©¾²±â µîµî ¾ÆÁÖ ´Ù¾çÇÑ ÆíÁý µ¿ÀÛÀ» Áö¿øÇÑ´Ù. ÀÌ·± ÆíÁý ÇÔ¼öµéÀº ¹®¼¿¡¼ ¼±ÅÃµÈ ºí·ÏÀ» ³»ºÎÀûÀÎ º¯È¯ ¾Ë°í¸®ÁòÀ¸·Î Á¶ÀÛÇÑ ÈÄ ´Ù½Ã ½á ³Ö´Â ½ÄÀ¸·Î µ¿ÀÛÇÑ´Ù. ±×·±µ¥ ¿¸ðµå·Î ¼±ÅÃÇÑ ºí·Ï¿¡ ´ëÇؼ´Â °ð¹Ù·Î ¾î¶² ÀÛ¾÷À» ÇÒ ¼ö°¡ ¾ø´Ù. ¿Ö³ÄÇÏ¸é ¼±Åà ¹üÀ§°¡ ¹®¼»óÀÇ ¿¬¼ÓµÈ ±¸°£ÀÌ ¾Æ´Ï¶ó ¿©·¯ÁÙ¿¡ Èð¾îÁø Á÷»ç°¢Çü ¿µ¿ªÀ̱⠶§¹®ÀÌ´Ù.
ÀÌ »óÅ¿¡¼ ¼±Åúí·ÏÀÇ Ã¹ÁÙ¿¡ ´ëÇØ ¾î¶² ÀÛ¾÷À» ÇÏ¸é ´Ù¸¥ ÁÙÀÇ ¼±Åà »óÅ°¡ Áï°¢ÀûÀÎ ÇüÇâÀ» ¹Þ´Â´Ù. GetSelInLine ÇÔ¼ö´Â SelStart¿Í SelEndÀÇ ¿ÜÁ¢ »ç°¢ÇüÀ» ±¸ÇÏ°í ±× Çȼ¿°ªÀ¸·ÎºÎÅÍ °¢ ÁÙÀÇ ¼±Åà ¿µ¿ªÀ» ±¸Çϴµ¥ ¹®¼°¡ Á¶±Ý¸¸ ¹Ù²î¾îµµ ¼±Åà ¿µ¿ªÀÌ ¿ÏÀüÈ÷ ´Þ¶óÁ® ¹ö¸®´Â °ÍÀÌ´Ù. ±×·¡¼ ¿ ¼±Åà »óÅ´ ¾î¶² ÀÛ¾÷À» Çϱâ Àü¿¡ ¹®¼ÀÇ ¾î¶² ºÎºÐµéÀÌ ¼±Åúí·Ï¿¡ Æ÷ÇԵǾî ÀÖ´ÂÁö ÀÏ°ýÀûÀ¸·Î Á¶»çÇØ ³õÀ» ÇÊ¿ä°¡ ÀÖ´Ù. ¿ ¼±Åà »óÅ´ ´ÙÀ½ ±¸Á¶Ã¼¿¡ ÀúÀåµÈ´Ù. ApiEdit.h¿¡ ±¸Á¶Ã¼¸¦ ¼±¾ðÇÑ´Ù.
struct Ae_SelTable
{
int Line;
int Start;
int End;
};
°¢ ÁÙ¿¡ ´ëÇØ ¼±Åà ½ÃÀÛÁ¡°ú ³¡Á¡À» ±â¾ïÇÏ´Â ±¸Á¶Ã¼À̸ç ÀÌ ±¸Á¶Ã¼ÀÇ ¹è¿À» ¸¸µé¸é Á÷»ç°¢ÇüÀÇ ¼±Åúí·Ï¿¡ ´ëÇÑ Á¤º¸¸¦ ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. ¿ ¼±Åà »óÅ´ ºä¿¡¼ ÇÊ¿ä·Î ÇϹǷΠÀÌ ±¸Á¶Ã¼¿¡ ´ëÇÑ Æ÷ÀÎÅÍ¿Í °ü·Ã ÇÔ¼ö´Â ºä¿¡ ¼±¾ðÇÑ´Ù. Àá½Ã ÈÄ Ãß°¡ÇÒ ÇÔ¼öÀÇ ¿øÇü±îÁö ¹Ì¸® ÀÛ¼ºÇØ ³õ¾Ò´Ù.
class CApiEditText : public CWindow
{
protected:
....
Ae_SelTable *SelTable;
public:
....
virtual int MakeSelTable();
virtual void FreeSelTable();
virtual void PasteColumn(int nPos,int aExtra,TCHAR *data);
virtual void ColumnCopyString(BOOL bCopy,int to,int aExtra);
virtual void ChangeCaseColumn(int action);
};
°¢ ÁÙÀÇ ¾îµð¼ºÎÅÍ ¾îµð±îÁö°¡ ¼±ÅõǾî ÀÖ´ÂÁö¸¦ SelTable ±¸Á¶Ã¼ ¹è¿¿¡ Á¶»çÇÒ °ÍÀÌ´Ù. ¼±Åúí·ÏÀÌ ¸îÁÙ·Î ±¸¼ºµÉÁö´Â ¹Ì¸® ¾Ë¼ö ¾øÀ¸¹Ç·Î SelTableÀº Ae_SelTable ŸÀÔÀÇ Æ÷ÀÎÅÍ·Î ¼±¾ðµÇ¾ú¸ç ¼±Åúí·ÏÀÇ ¼ö¸¸Å µ¿ÀûÀ¸·Î ÇÒ´çÇÒ °ÍÀÌ´Ù. ´ÙÀ½ ÇÔ¼ö´Â ÇöÀç ¼±Åúí·ÏÀ» SelTable¿¡ ÀÛ¼ºÇÑ´Ù.
int CApiEditText::MakeSelTable()
{
int Size;
int SelFirst, SelSecond;
int c,rs,re,Line;
int idx;
int len=0;
if (!bColumnMode || SelStart == SelEnd) return 0;
Size=100;
SelTable=(Ae_SelTable *)malloc(Size*sizeof(Ae_SelTable));
SelFirst=min(SelStart,SelEnd);
SelSecond=max(SelStart,SelEnd);
GetRCFromOff(SelFirst,rs,c);
GetRCFromOff(SelSecond,re,c);
for (Line=rs,idx=0;Line<=re;Line++,idx++) {
if (idx == Size-1) {
Size+=100;
SelTable=(Ae_SelTable *)realloc(SelTable,Size*sizeof(Ae_SelTable));
}
SelTable[idx].Line=Line;
GetSelInLine(Line,SelTable[idx].Start,SelTable[idx].End);
len+=SelTable[idx].End-SelTable[idx].Start+2;
}
SelTable[idx].Line=-1;
return len;
}
void CApiEditText::FreeSelTable()
{
if (SelTable) free(SelTable);
SelTable=NULL;
}
MakeSelTableÀº ¹®¼¸¦ ÀüÇô Á¶ÀÛÇÏÁö ¾ÊÀ¸¸ç GetSelInLineÀÌ Á¶»çÇÏ´Â °¢ ÁÙÀÇ ¼±Åà ¿µ¿ªÀ» SelTable¿¡ ±×´ë·Î ±â·ÏÇÑ´Ù. ¼±Åà ¿µ¿ªÀÇ ±æÀÌ¿¡ Á¦ÇÑÀÌ ¾øÀ¸¹Ç·Î SelTableÀÇ ±æÀ̵µ µ¿ÀûÀ¸·Î ÇÒ´çµÈ´Ù. ÀÌ ÇÔ¼ö´Â ¿ ¸ðµå¿¡¼ ¼±Åà ¿µ¿ªÀÌ ÀÖ´Ù´Â °¡Á¤ÇÏ¿¡¼ µ¿ÀÛÇϹǷΠ¹Ýµå½Ã È£Ãâ¿ø¿¡¼ ÀÌ Á¶°ÇÀÏ ¶§¸¸ È£ÃâÇØ¾ß ÇÑ´Ù.
¸®ÅÏ°ªÀº ¼±Åÿµ¿ªÀÇ ÃÑ ±æÀÌÀε¥ °¢ ÁÙ¸¶´Ù °³Çà ÄÚµå ±â·ÏÀ» À§ÇÑ 2¹ÙÀÌÆ®¾¿À» ´õ °è»êÇØ¾ß ÇÑ´Ù. Ŭ¸³º¸µå·Î º¹»çÇÒ ¶§ °¢ ÁÙÀ» °Á¦ °³ÇàÇØ¾ß ÇϹǷΠ¿£ÅÍ Äڵ尡 ÇÊ¿äÇϸç ÀÌ ÇÔ¼ö°¡ ¸®ÅÏÇÑ ±æÀ̸¸Å ÇÒ´çÇÏ¸é µÈ´Ù.
FreeSelTableÀº SelTableÀ» ÇØÁ¦ÇÑ´Ù. ´Ù »ç¿ëÇßÀ¸¸é ¹Ýµå½Ã ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ÇÒ´çµÈ ¸Þ¸ð¸®¸¦ ¹Ý³³ÇØ¾ß ÇÑ´Ù. µÎ ÇÔ¼ö´Â Ç×»ó ¦À» ÀÌ·ç¾î »ç¿ëÇØ¾ß ÇÑ´Ù. Make¸¸ ºÎ¸£°í Free¸¦ »ý·«Çؼ´Â ¾ÈµÇ¸ç Make´Â ¹«Á¶°Ç SelTableÀ» ÇÒ´çÇϹǷΠ»ý¼ºÀÚ¿¡¼ SelTableÀ» ÃʱâÈÇÏÁö ¾Ê¾Ò´Ù. ¼±Åà »óÅ¿¡¼ »èÁ¦ÇÏ´Â ÇÔ¼ö´Â DeleteSelectionÀε¥ ÀÌ ÇÔ¼ö¿¡ ´ÙÀ½ Äڵ带 Ãß°¡ÇÑ´Ù.
BOOL CApiEditText::DeleteSelection()
{
int SelFirst, SelSecond;
int idx,Acc,linelen;
if (SelStart != SelEnd) {
if (!bColumnMode) {
SelFirst=min(SelStart,SelEnd);
SelSecond=max(SelStart,SelEnd);
Delete(SelFirst,SelSecond-SelFirst);
off=SelFirst;
} else {
MakeSelTable();
pFrame->StartUndoGroup(16);
for (idx=0,Acc=0;SelTable[idx].Line!=-1;idx++) {
linelen=SelTable[idx].End-SelTable[idx].Start;
Delete(SelTable[idx].Start-Acc,linelen);
Acc+=linelen;
}
pFrame->EndUndoGroup();
ExtraX=0;
off=SelTable[0].Start;
FreeSelTable();
}
SelStart=SelEnd=0;
return TRUE;
}
return FALSE;
}
¿ ¸ðµåÀÏ ¶§´Â SelTableÀ» ¸ÕÀú ÀÛ¼ºÇÏ°í °¢ ÁÙÀÇ ¼±Åà ¿µ¿ªÀ» ¼ø¼´ë·Î »èÁ¦ÇÑ´Ù. ÀÁÙÀÌ »èÁ¦µÇ¸é ¾Æ·¡ÁÙÀÇ ¿ÀÇÁ¼ÂÀÌ º¯°æµÇ¹Ç·Î Acc¿¡ »èÁ¦µÈ ¹®ÀÚ¼ö¸¦ ±â¾ïÇÏ¿© ÀÌ ¿ÀÇÁ¼Â¸¸Å »©¸é¼ ¾Æ·¡ÂÊÀ¸·Î »èÁ¦ÇØ¾ß ÇÑ´Ù. »èÁ¦ ÈÄ Ä³·µÀÌ ½ÇÁ¦ ¹®ÀÚ°¡ ÀÖ´Â °÷À¸·Î À̵¿ÇØ¾ß ÇϹǷΠExtraX´Â 0À¸·Î ¸¸µç´Ù. ¸ðµç »èÁ¦ µ¿ÀÛÀº ±×·ìÀ» ±¸¼ºÇÑ´Ù. ÀÌ µ¿ÀÛÀ» 16¹ø ID·Î Á¤ÀÇÇϸç Dangeun.cppÀÇ arGroupDesc ¹è¿¿¡ ±×·ì µ¿ÀÛ¿¡ ´ëÇÑ ¼³¸íÀÌ ÀÌ¹Ì ÀÛ¼ºµÇ¾î ÀÖ´Ù.
¿ »èÁ¦ ÈÄ off´Â ù¹ø° ¿ÀÇ ¼±Åà ½ÃÀÛÁ¡À¸·Î À̵¿ÇÑ´Ù. ¸¶¿ì½º¸¦ ¾î´À ¹æÇâÀ¸·Î µå·¡±×ÇÏ´õ¶óµµ »ç°¢Çü ÇüÅ·Π¼±ÅõǹǷΠ¼±Åà ºí·ÏÀÇ Á»ó´ÜÁ¡Àº SelStart, SelEnd Áß ÀÛÀº °ÍÀÌ µÈ´Ù. ±×·¡¼ off´Â SelFirst¿Í´Â ´Ù¸¥ °ªÀÌ µÉ ¼öµµ ÀÖ´Ù.
¿ ¼±Åà µ¥ÀÌÅÍ´Â ÀÏ¹Ý ÅؽºÆ®¿Í´Â Æ÷¸ËÀÌ ´Ù¸£´Ù. ÅؽºÆ®À̱â´Â ÇÏÁö¸¸ ¿©·¯ Çà¿¡¼ ÃßÃâÇÑ ºÎºÐ ¹®ÀÚ¿ÀÇ ÁýÇÕÀ̹ǷΠÅؽºÆ®¿Í ±¸ºÐÇØ¾ß ÇÑ´Ù. ¿ ¼±ÅÃµÈ ¹®ÀåÀ» Ŭ¸³º¸µå¸¦ ÅëÇØ º¹»ç ¹× ºÙ¿©³Ö±â ÇÏ·Á¸é º°µµÀÇ Å¬¸³º¸µå Æ÷¸ËÀ» µî·ÏÇØ¾ß ÇÑ´Ù. ´ÙÀ½ º¯¼ö¿Í ÇÔ¼ö¸¦ ¼±¾ðÇÑ´Ù.
class CApiEdit : public CWindow
{
private:
....
static UINT AeColFormat;
public:
....
static void RegisterAeColFormat();
°¢°¢ÀÇ CApiEdit °´Ã¼°¡ Æ÷¸ËÀ» µî·ÏÇÒ ÇÊ¿ä´Â ¾øÀ¸¹Ç·Î Æ÷¸Ë ID°ª°ú µî·Ï ÇÔ¼ö ¸ðµÎ ½ºÅÂƽÀ¸·Î ¼±¾ðÇÏ¿´´Ù. ApiEdit.cpp¿¡ ´ÙÀ½ Äڵ带 ÀÛ¼ºÇÑ´Ù.
UINT CApiEdit::AeColFormat;
void CApiEdit::RegisterAeColFormat()
{
AeColFormat=RegisterClipboardFormat("ApiEdit_Column_Format");
}
Á¤Àû º¯¼ö¸¦ ¿ÜºÎ¿¡¼ Á¤ÀÇÇÏ°í RegisterAeColFormat¿¡¼ »õ·Î¿î Ŭ¸³º¸µå Æ÷¸ËÀ» µî·ÏÇÑ ÈÄ ±× ID¸¦ AeColFormat Á¤Àû º¯¼ö¿¡ ´ëÀÔÇÏ¿´´Ù. ÀÌ ÇÔ¼ö´Â µµ¿ì¹ÌÀÇ »ý¼ºÀÚ¿¡¼ µü Çѹø¸¸ È£ÃâµÈ´Ù.
CRegisterHelper::CRegisterHelper()
{
....
CApiEdit::RegisterAeColFormat();
}
µµ¿ì¹ÌÀÇ »ý¼ºÀÚ°¡ Æ÷¸ËÀ» µî·ÏÇϹǷΠCApiEdit °´Ã¼µéÀº Ç×»ó AeColFormat Æ÷¸ËÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¿ ¼±Åà Æ÷¸ËÀº ³Î Á¾·á ¹®ÀÚ¿µéÀÇ ÁýÇÕÀ¸·Î Á¤ÀÇµÇ¸ç ³¡ Ç¥½Ã·Î 0xff¸¦ »ç¿ëÇÑ´Ù. º¹¼ö°³ÀÇ ¹®ÀÚ¿À» Ç¥ÇöÇÒ ¶§ º¸Åë µÎ °³ÀÇ ³Î Á¾·á ¹®ÀÚ¿·Î ³¡³ª´Â Æ÷¸ËÀ» ¸¹ÀÌ »ç¿ëÇϴµ¥ ÀÌ °æ¿ì´Â ºó ¹®ÀÚ¿ÀÌ Áß°£¿¡ ÀÖÀ» ¼ö Àֱ⠶§¹®¿¡ µÎ °³ÀÇ ³Î·Î ³¡À» Ç¥½ÃÇÒ ¼ö ¾ø´Ù. ±×·¡¼ ÅؽºÆ® ¹®¼¿¡´Â Àß ³ª¿ÀÁö ¾Ê´Â 0xff ƯÀÌ°ªÀ» ³¡ Ç¥½ÄÀ¸·Î »ç¿ëÇß´Ù.
¿ ¼±ÅÃµÈ ºí·ÏÀ» º¹»çÇÏ´Â Äڵ带 ÀÛ¼ºÇØ º¸ÀÚ. IDM_AE_COPY¿¡ ´ÙÀ½ Äڵ带 ÀÛ¼ºÇÑ´Ù.
void CApiEditText::OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify)
{
HGLOBAL hmem;
TCHAR *ptr;
int SelFirst, SelSecond;
TCHAR *ptr2;
HGLOBAL hmem2;
int len,idx,linelen,len2;
switch (id) {
case IDM_AE_CUT:
....
case IDM_AE_COPY:
if (SelStart != SelEnd) {
if (!bColumnMode) {
SelFirst=min(SelStart,SelEnd);
SelSecond=max(SelStart,SelEnd);
hmem=GlobalAlloc(GHND, SelSecond-SelFirst+1);
ptr=(TCHAR *)GlobalLock(hmem);
memcpy(ptr,pFrame->buf+SelFirst,SelSecond-SelFirst);
GlobalUnlock(hmem);
if (OpenClipboard(hWnd)) {
EmptyClipboard();
SetClipboardData(CF_TEXT,hmem);
CloseClipboard();
}
} else {
len=MakeSelTable();
hmem=GlobalAlloc(GHND, len+1);
ptr=(TCHAR *)GlobalLock(hmem);
for (idx=0;SelTable[idx].Line!=-1;idx++) {
linelen=SelTable[idx].End-SelTable[idx].Start;
memcpy(ptr,pFrame->buf+SelTable[idx].Start,linelen);
ptr+=linelen;
*ptr++='\r';
*ptr++='\n';
}
*ptr=0;
GlobalUnlock(hmem);
hmem2=GlobalAlloc(GHND, len+1);
ptr2=(TCHAR *)GlobalLock(hmem2);
for (idx=0;SelTable[idx].Line!=-1;idx++) {
linelen=SelTable[idx].End-SelTable[idx].Start;
memcpy(ptr2,pFrame->buf+SelTable[idx].Start,linelen);
ptr2+=linelen;
*ptr2++=0;
}
*ptr2=(TCHAR)0xff;
GlobalUnlock(hmem2);
FreeSelTable();
if (OpenClipboard(hWnd)) {
EmptyClipboard();
SetClipboardData(CF_TEXT,hmem);
SetClipboardData(CApiEdit::AeColFormat,hmem2);
CloseClipboard();
}
}
}
return;
¿ ¸ðµåÀÏ ¶§´Â ÅؽºÆ® Æ÷¸Ë°ú ¿ Æ÷¸ËÀ» °°ÀÌ µî·ÏÇÑ´Ù. ÅؽºÆ® Æ÷¸Ëµµ ¿ ¼±Åà »óÅ¿¡¼´Â ±¸ÇÏ´Â ¹æ¹ýÀÌ ´Ù¸£´Ù. °¢ ÁÙÀÇ ¼±Åà ºÎºÐÀ» ÃëÇÕÇ쵂 °¢ ÁÙ ³¡¿¡´Â °³Çà Äڵ带 ºÙÀδÙ. ±×·¡¼ ¿ ¼±Åà »óÅ¿¡¼ º¹»çÇÑ ÈÄ ´Ù¸¥ ÆíÁý±â¿¡ ºÙ¿© ³ÖÀ¸¸é °¢ ÁÙÀÌ °³ÇàµÈ »óÅ·ΠºÙ¿©Áø´Ù. ¿ Æ÷¸ËÀº °¢ ÁÙ »çÀÌ¿¡ 0¸¦ ³Ö°í ¸¶Áö¸·¿¡ 0xff¸¦ ³Ö´Â´Ù. µÎ °³ÀÇ ºóÁÙÀÌ ¿¬´Þ¾Æ ³ª¿À¸é 0ÀÌ µÎ °³ ³ªÅ¸³¯ ¼ö ÀÖÀ¸¹Ç·Î ´õºí 0´Â »ç¿ëÇÒ ¼ö ¾ø´Ù. ´ÙÀ½Àº º¹»çÇؼ Ãß°¡Çϱ⸦ ÀÛ¼ºÇÑ´Ù.
case IDM_AE_COPYAPPEND:
if (!IsClipboardFormatAvailable(CF_TEXT)) {
SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDM_AE_COPY,0),0);
return;
}
if (SelStart != SelEnd) {
OpenClipboard(hWnd);
hmem=GetClipboardData(CF_TEXT);
ptr=(TCHAR *)GlobalLock(hmem);
GlobalUnlock(hmem);
CloseClipboard();
if (!bColumnMode) {
SelFirst=min(SelStart,SelEnd);
SelSecond=max(SelStart,SelEnd);
hmem=GlobalAlloc(GHND, lstrlen(ptr)+SelSecond-SelFirst+1);
ptr2=(TCHAR *)GlobalLock(hmem);
lstrcpy(ptr2,ptr);
memcpy(ptr2+lstrlen(ptr2),pFrame->buf+SelFirst,SelSecond-SelFirst);
GlobalUnlock(hmem);
if (OpenClipboard(hWnd)) {
EmptyClipboard();
SetClipboardData(CF_TEXT,hmem);
CloseClipboard();
}
} else {
len2=lstrlen(ptr);
len=MakeSelTable();
hmem=GlobalAlloc(GHND,len2+len+1);
ptr2=(TCHAR *)GlobalLock(hmem);
lstrcpy(ptr2,ptr);
ptr2+=len2;
for (idx=0;SelTable[idx].Line!=-1;idx++) {
linelen=SelTable[idx].End-SelTable[idx].Start;
memcpy(ptr2,pFrame->buf+SelTable[idx].Start,linelen);
ptr2+=linelen;
*ptr2++='\r';
*ptr2++='\n';
}
*ptr2=0;
GlobalUnlock(hmem);
if (IsClipboardFormatAvailable(CApiEdit::AeColFormat)) {
OpenClipboard(hWnd);
hmem2=GetClipboardData(CApiEdit::AeColFormat);
ptr=(TCHAR *)GlobalLock(hmem2);
GlobalUnlock(hmem2);
CloseClipboard();
len2=0;
ptr2=ptr;
while (*ptr2!=(TCHAR)0xff) {
len2++;
ptr2++;
}
hmem2=GlobalAlloc(GHND,len2+len+1);
ptr2=(TCHAR *)GlobalLock(hmem2);
memcpy(ptr2,ptr,len2);
ptr2+=len2;
for (idx=0;SelTable[idx].Line!=-1;idx++) {
linelen=SelTable[idx].End-SelTable[idx].Start;
memcpy(ptr2,pFrame->buf+SelTable[idx].Start,linelen);
ptr2+=linelen;
*ptr2++=0;
}
*ptr2=(TCHAR)0xff;
GlobalUnlock(hmem2);
} else {
hmem2=NULL;
}
FreeSelTable();
if (OpenClipboard(hWnd)) {
EmptyClipboard();
SetClipboardData(CF_TEXT,hmem);
if (hmem2) {
SetClipboardData(CApiEdit::AeColFormat,hmem2);
}
CloseClipboard();
}
}
}
return;
³í¸®´Â µ¿ÀÏÇÏÁö¸¸ ÄÚµå´Â ÈξÀ ´õ º¹ÀâÇÏ´Ù. ÀÌ ÇÔ¼ö°¡ È£ÃâµÇ¾úÀ» ¶§ÀÇ »óȲÀº ¼¼ °¡Áö »óÅ Áß ÇϳªÀÌ´Ù.
1.ÅؽºÆ®°¡ ¾ø´Ù. ÀÌ ¶§´Â IDM_AE_COPY¿Í µ¿ÀÏÇØÁø´Ù.
2.ÅؽºÆ®¿Í ¿ Æ÷¸ËÀÌ ¸ðµÎ ÀÖ´Ù. µÎ Æ÷¸Ë ¸ðµÎ Ãß°¡ÇØ¾ß ÇÑ´Ù.
3.ÅؽºÆ®¸¸ ÀÖ°í ¿ Æ÷¸ËÀº ¾ø´Ù. ApiEdit°¡ ¾Æ´Ñ ´Ù¸¥ ÇÁ·Î±×·¥À¸·Î ÅؽºÆ®¸¦ º¹»çÇØ ³õÀº °æ¿ìÀÌ´Ù. ÅؽºÆ®´Â Ãß°¡ÇÏ°í ¿ Æ÷¸ËÀº »õ·Î ÀÛ¼ºÇØ ³Ö´Â´Ù.
¿ Æ÷¸Ë¸¸ ÀÖ°í ÅؽºÆ®´Â ¾ø´Â °æ¿ì´Â Àý´ë·Î ¾ø´Ù. º¹»ç ÇÔ¼ö°¡ ¿ Æ÷¸ËÀ» ³Ö±â Àü¿¡ ¹Ýµå½Ã ÅؽºÆ®¸¦ ¸ÕÀú ³Ö±â ¶§¹®ÀÌ´Ù. ±×·¡¼ CF_TEXT°¡ ÀÖ´Ù°í Çؼ AeColFormatÀÌ ÀÖ´ÂÁö Á¡°ËÇÏÁö ¾Ê¾Æ¼´Â °ï¶õÇÏ´Ù. Ãß°¡ÇÏ´Â ¹æ¹ýÀº ¿ø·ÐÀûÀÌ´Ù. À߶󳻱â, À߶ó¼ Ãß°¡Çϱâ´Â °³³äÀûÀ¸·Î º¹»ç ÈÄ »èÁ¦À̸ç ÀÌ °³³äÀº ¿ Æ÷¸Ë¿¡µµ ±×´ë·Î Àû¿ëµÇ¹Ç·Î ¼öÁ¤ÇÒ ÇÊ¿ä°¡ ¾ø´Ù.
ºÙ¿© ³Ö´Â ÇÔ¼ö´Â º¹ÀâÇϹǷΠ¾Æ¿¹ µû·Î ¸¸µç´Ù. µå·¡±×Çؼ º¹»çÇÒ ¶§µµ ÀÌ ·çƾÀÌ ±×´ë·Î »ç¿ëµÈ´Ù. nPos¿ÀÇÁ¼ÂÀÇ aExtra À§Ä¡¿¡ data¸¦ »ðÀÔÇÑ´Ù. ¸®ÅÏ°ªÀº ÃÖÁ¾ »ðÀÔµÈ ¹®ÀÚ¿ÀÇ ³¡ ¿ÀÇÁ¼ÂÀÌ´Ù.
void CApiEditText::PasteColumn(int nPos,int aExtra,TCHAR *data)
{
int PasteX,Line,dummy,y;
int nLine;
int toff;
int BkVirtualPos;
BkVirtualPos=bVirtualPos;
bVirtualPos=TRUE;
GetXYFromOff(nPos,PasteX,dummy);
GetRCFromOff(nPos,Line,dummy);
for (nLine=Line;;nLine++) {
if (*data==(TCHAR)0xff) {
break;
}
if (nLine == TotalLine) {
Insert(pFrame->doclen,"\r\n",2);
}
GetXYFromOff(pLine[nLine].Start,dummy,y);
toff=GetOffFromXY(PasteX,y);
if (lstrlen(data)) {
InputExtraSpace(toff);
Insert(toff,data,lstrlen(data));
}
data+=lstrlen(data)+1;
}
bVirtualPos=BkVirtualPos;
}
ÀÌ ÇÔ¼ö°¡ ºÙ¿©³Ö´Â ¿ Æ÷¸ËÀº ¾È½Ã ¹®ÀÚ¿ Æ÷¸Ë»ÓÀ̹ǷΠÀ¯´ÏÄڵ峪 À¯´Ð½º ½ºÅ¸ÀÏ µîÀ» °í·ÁÇÒ ÇÊ¿ä´Â ¾ø´Ù. ¿Ö³ÄÇÏ¸é ¿ Æ÷¸ËÀ» ¸¸µé¾î ³»´Â ApiEditÀÇ ³»ºÎ Æ÷¸ËÀÌ ¾È½Ã Æ÷¸Ë»ÓÀ̱⠶§¹®ÀÌ´Ù. ¿ Æ÷¸ËÀ» ºÙ¿© ³ÖÀ» ¶§´Â ºÙÀÏ ÁÙ¿¡ ´ëÀÀµÇ´Â ÁÙÀÌ ¾øÀ» ¼öµµ ÀÖÀ¸¸ç À̶§´Â Ãß°¡ ¿©¹éÀ» »ðÀÔÇÑ ÈÄ ¹®ÀÚ¿À» ºÙ¿©¾ß ÇÑ´Ù. ±×·¡¼ ÇÔ¼ö ¼±µÎ¿¡¼ ÀÓ½ÃÀûÀ¸·Î °¡»ó À§Ä¡ ¿É¼ÇÀ» Àá½Ã Çã¿ëÇÑ´Ù. ½ÉÁö¾î ¹®¼ ³¡¿¡¼ ºÙ¿©³ÖÀ» ¶§´Â Á¸ÀçÇÏÁö ¾Ê´Â ºóÁÙÀ» ¸¸µç ÈÄ ÀÌ ÁÙ¿¡ ºÙ¿© ³Ö±â¸¦ ÇØ¾ß ÇÏ´Â °æ¿ìµµ ÀÖ´Ù. ºÙÀÏ ÁÙÀÌ TotalLineÀÌ¸é °³Çà Äڵ带 »ðÀÔÇÏ¿© ÇÑ ÁÙÀ» ´Ã¸° ÈÄ ºÙ¿© ³Ö±â¸¦ ÇÑ´Ù. ÀÌ ÇÔ¼ö´Â ºÙ¿© ³Ö±â ÇÔ¼ö°¡ ¿ Æ÷¸ËÀ» ºÙÀ̱â À§ÇØ È£ÃâÇÑ´Ù. ºÙ¿© ³Ö±â ÄÚµå´Â ´ÙÀ½°ú °°´Ù.
case IDM_AE_PASTE:
BOOL bPrevSel;
TCHAR *dest;
int Format;
if (IsClipboardFormatAvailable(CF_TEXT) && pFrame->bReadOnly==FALSE &&
bCapture==FALSE) {
if (IsClipboardFormatAvailable(CApiEdit::AeColFormat)) {
OpenClipboard(hWnd);
hmem=GetClipboardData(CApiEdit::AeColFormat);
ptr=(TCHAR *)GlobalLock(hmem);
pFrame->StartUndoGroup(17);
DeleteSelection();
PasteColumn(off,ExtraX,ptr);
pFrame->EndUndoGroup();
GlobalUnlock(hmem);
CloseClipboard();
Invalidate(pFrame->FindParaStart(off));
} else {
InputExtraSpace(off);
if (SelStart != SelEnd) {
pFrame->StartUndoGroup(2);
}
bPrevSel=DeleteSelection();
OpenClipboard(hWnd);
hmem=GetClipboardData(CF_TEXT);
ptr=(TCHAR *)GlobalLock(hmem);
Format=pFrame->AnalyzeFormat(ptr, -1);
if (Format != AE_FORMAT_WIN) {
pFrame->ConvertFormat(Format,AE_FORMAT_WIN,ptr,dest);
Insert(off,dest,lstrlen(dest));
free(dest);
} else {
Insert(off,ptr,lstrlen(ptr));
}
if (bPrevSel) {
pFrame->EndUndoGroup();
}
GlobalUnlock(hmem);
CloseClipboard();
Invalidate(pFrame->FindParaStart(off));
off += lstrlen(ptr);
}
SetCaret();
}
return;
Ŭ¸³º¸µå¿¡¼ ¿ Æ÷¸Ë µ¥ÀÌÅ͸¦ ¸ÕÀú Á¶»çÇÏ°í ¼±Åà ¿µ¿ªÀÌ ÀÖÀ¸¸é ¸ÕÀú »èÁ¦ÇÑ ÈÄ ºÙ¿© ³Ö´Â´Ù. ¸ðµç µ¿ÀÛÀº ±×·ìÀ» ±¸¼ºÇÑ´Ù. ÆíÁý À§Ä¡(off)´Â °Çµå¸®Áö ¾Ê´Â´Ù.
¿ ¼±Åà ¿µ¿ªÀ» µå·¡±×Çؼ º¹»ç ¹× À̵¿½Ãų ¼öµµ ÀÖ´Ù. ÀÌ Ã³¸®´Â CopyString°ú´Â ¿ÏÀüÈ÷ ´Ù¸£´Ù. ¹®ÀÚ¿À» À̵¿, º¹»çÇÏ´Â °úÁ¤µµ Ʋ¸®°í Ãë¼Ò ·¹Äڵ带 ÀÛ¼ºÇÏ´Â °Íµµ ´Ù¸£´Ù. À̵¿ ·¹Äڵ尡 ¾Æ´Ï¶ó ¿©·¯ °³ÀÇ »ðÀÔ, »èÁ¦ ·¹Äڵ尡 ¸¸µé¾îÁø´Ù. ±×·¡¼ ¾Æ¿¹ ÇÔ¼ö¸¦ µû·Î ÀÛ¼ºÇß´Ù.
void CApiEditText::OnLButtonUp(HWND hWnd, int x, int y, UINT keyFlags)
{
if (bDragSel) {
bDragSel=FALSE;
if (IsInSelection(x+xPos, y+yPos)==TRUE) {
....
} else {
if (x > frt.left && x < frt.right && y > frt.top && y < frt.bottom) {
SelLen=abs(SelStart-SelEnd);
toff=GetOffFromXY(x+xPos,y+yPos);
if (bColumnMode) {
ColumnCopyString(bControl,toff,ExtraX);
return;
} else {
CopyString(bControl,min(SelStart,SelEnd),toff,SelLen);
}
¿¸ðµå¿¡¼ µå·¡±×ÇÒ ¶§´Â ColumnCopyString ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.
void CApiEditText::ColumnCopyString(BOOL bCopy,int to,int aExtra)
{
TCHAR *Src,*ptr;
int len,idx,linelen;
int Acc;
len=MakeSelTable();
Src=(TCHAR *)malloc(len+1);
ptr=Src;
for (idx=0;SelTable[idx].Line!=-1;idx++) {
linelen=SelTable[idx].End-SelTable[idx].Start;
memcpy(ptr,pFrame->buf+SelTable[idx].Start,linelen);
ptr+=linelen;
*ptr++=0;
}
*ptr=(TCHAR)0xff;
if (bCopy) {
pFrame->StartUndoGroup(18);
} else {
pFrame->StartUndoGroup(19);
for (idx=0,Acc=0;SelTable[idx].Line!=-1;idx++) {
linelen=SelTable[idx].End-SelTable[idx].Start;
Delete(SelTable[idx].Start-Acc,linelen);
if (SelTable[idx].Start < to) {
to-=linelen;
}
Acc+=linelen;
}
}
FreeSelTable();
PasteColumn(to,aExtra,Src);
pFrame->EndUndoGroup();
free(Src);
SelStart=SelEnd=off=to+aExtra;
SetCaret();
Invalidate(-1);
}
ÀÌ ÇÔ¼öÀÇ µ¿ÀÛ ¹æ½ÄÀº Ŭ¸³º¸µå·Î º¹»ç-ºÙ¿© ³Ö±â-(»èÁ¦) ¹æ½Ä°ú µ¿ÀÏÇÏ´Ù. ´Ü, Ŭ¸³º¸µå¸¦ Æı«Çؼ´Â ¾ÈµÇ¹Ç·Î Src¶ó´Â º°µµÀÇ ¸Þ¸ð¸® ¿µ¿ªÀ» Ŭ¸³º¸µå ´ë½Å »ç¿ëÇÑ´Ù. º¹»ç ¹× À̵¿ ÈÄ »õ·Î º¹»çµÈ ºí·°À» ´Ù½Ã ¼±ÅÃÇÏÁö ¾Ê´Â´Ù. ¿Ö³ÄÇϸé ApiEdit´Â SelStart¿Í SelEnd¸¸À¸·Î ¸ðµç ¼±Åà ¿µ¿ªÀ» ±â¾ïÇÏ°í ¿ ¼±Åà ºí·°Àº Çȼ¿ ÁÂÇ¥¸¦ ±âÁØÀ¸·Î Çϴµ¥ ºí·°ÀÇ À§Ä¡°¡ ¹Ù²î¸é ¸ð¾çµµ ¹Ù²î±â ¶§¹®ÀÌ´Ù. ¿¹¸¦ µé¾î ´ÙÀ½°ú °°ÀÌ ¼±ÅõǾî ÀÖ´Ù°í ÇØ º¸ÀÚ.
iiiii
WW
ÀÌ ºí·°ÀÌ À§Ä¡°¡ ¹Ù²î¸é ¹Ì¼¼ÇÑ Çȼ¿ Â÷ÀÌ¿¡ ÀÇÇØ ºí·°ÀÇ ¸ð¾çµµ ¹Ù²ð ¼ö ÀÖ´Ù. °íÁ¤ÆøÀ̶ó¸é ´Ù½Ã ¼±ÅÃÇÏ´Â °ÍÀÌ °¡´ÉÇÏÁö¸¸ °¡º¯Æø ±Û²Ã »óÅ¿¡¼ ¿ ¸ðµå°¡ °¡´ÉÇϱ⠶§¹®¿¡ ¿ø·¡ ¸ð¾çÀ» ±×´ë·Î º¹¿øÇÒ ¼ö°¡ ¾ø´Ù.
ÆíÁý ¸Þ´º¿¡ ¼±Åÿµ¿ª¿¡ ´ëÇØ µ¿ÀÛÇÏ´Â ¸¹Àº ¸í·ÉµéÀÌ ÀÖ´Ù. ´ëºÎºÐÀº ¹®´Ü¿¡ ´ëÇØ Àû¿ëµÇ´Â °ÍµéÀ̹ǷΠ¿¸ðµå¿¡¼ º°´Ù¸¥ 󸮸¦ ÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ±×·¯³ª ´ë¼Ò¹®ÀÚ º¯È¯Àº ¿¸ðµå·Î ¼±ÅÃÇÑ ¿µ¿ª¿¡ ´ëÇؼ¸¸ Á¤È®ÇÏ°Ô º¯È¯ÇØ¾ß ÇÑ´Ù. ´ë¹®ÀÚ·Î, ¼Ò¹®ÀÚ·Î, ¹Ý´ë·Î ¼¼ µ¿ÀÛ¿¡ ´ëÇؼ¸¸ º¯È¯ÇÏ°í ù±ÛÀÚ¸¸, ¹®Àå óÀ½¸¸Àº ±ÛÀÚ ´ÜÀ§ÀÇ ¾×¼ÇÀÌ ¾Æ´Ï¹Ç·Î ó¸®ÇÒ ÇÊ¿ä¾ø´Ù.
void CApiEditText::ChangeCase(int action)
{
....
if (pFrame->bReadOnly) {
return;
}
if (bColumnMode && SelStart != SelEnd) {
if (action < 3) {
ChangeCaseColumn(action);
}
return;
}
if (SelStart == SelEnd) {
....
¿¸ðµåÀÌ°í ¼±Åÿµ¿ªÀÌ ÀÖÀ¸¸é º°µµÀÇ ÇÔ¼ö¸¦ µû·Î È£ÃâÇÑ´Ù. ¹°·Ð actionÀÌ 3ÀÌ»óÀÌ¸é ¾Æ¹«°Íµµ ÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ¿ÀÇ °¢ ÁÙ¿¡ ´ëÇØ ´ë¼Ò º¯È¯À» ÇØ¾ß ÇϹǷΠÁ÷Á¢ Çϱâ´Â ¾î·Æ°í º°µµÀÇ ÇÔ¼ö¸¦ µû·Î È£ÃâÇÑ´Ù. ÀÌ ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÑ´Ù.
void CApiEditText::ChangeCaseColumn(int action)
{
int idx;
int bkSelStart,bkSelEnd;
MakeSelTable();
bColumnMode=FALSE;
bkSelStart=SelStart;
bkSelEnd=SelEnd;
pFrame->StartUndoGroup(20);
for (idx=0;SelTable[idx].Line!=-1;idx++) {
SelStart=SelTable[idx].Start;
SelEnd=SelTable[idx].End;
if (SelStart!=SelEnd) {
ChangeCase(action);
}
}
pFrame->EndUndoGroup();
bColumnMode=TRUE;
SelStart=bkSelStart;
SelEnd=bkSelEnd;
FreeSelTable();
}
MakeSelTable·Î ¼±Åÿµ¿ªÀ» ±¸ÇØ ³õ°í °¢ÁÙ¿¡ ´ëÇØ ´Ù½Ã ChangeCase¸¦ È£ÃâÇÑ´Ù. À̶§ ChangeCase¸¦ Àá½Ã ¼ÓÀ̱â À§ÇØ ¼¼ °³ÀÇ ¸â¹ö º¯¼ö°ªÀ» »ì¦ ¹Ù²ã ³õ´Â´Ù. °¢ ÁÙ´ÜÀ§ÀÇ ¼±Åà ¿µ¿ª¿¡ ´ëÇØ ´ë¼Ò¹®ÀÚ º¯È¯À» ÇÒ °ÍÀÌ´Ù. ¹°·Ð ¸ðµç ÁÙ¿¡ ´ëÇÑ º¯È¯Àº °°Àº ÆíÁý ±×·ìÀ¸·Î ¹¾î¾ß ÇÑ´Ù.
A°¡ B¸¦ ºÎ¸£°í B´Â ´Ù½Ã A¸¦ ºÎ¸£´Â »óÈ£ È£ÃâÀÇ ¿¹Àε¥ ½ÇÀü¿¡¼ ÀÌ·± °æ¿ì´Â Á¤¸»·Î ÈçÇÏÁö ¾Ê´Ù. ¼·Î È£ÃâÇÒ ¶§ÀÇ Á¶°ÇÀÌ ´Þ¶óÁö±â ¶§¹®¿¡ ¹«ÇÑ ·çÇÁ¿¡ ºüÁöÁö ¾Ê´Â´Ù. Áï A°¡ B¸¦ ºÎ¸¦ ¶§´Â Á¶°Ç K¸¦ ¸¸Á·Çϴµ¥ B°¡ ´Ù½Ã A¸¦ ºÎ¸¦ ¶§´Â Á¶°Ç K¸¦ ¾ø¾Ö°í ºÎ¸£±â ¶§¹®¿¡ A°¡ ´Ù½Ã B¸¦ ºÎ¸£Áö´Â ¾Ê´Â´Ù. ¿©±â¼ K´Â bColumnMode¿¡ ÇØ´çÇÑ´Ù.
¸¸¾à ÀÌ·± »óÈ£ È£ÃâÀ» ÇÏÁö ¾Ê´Â´Ù¸é ¾öû³ª°Ô º¹ÀâÇØÁø´Ù. º¯È¯ ´ë»ó °í¸£°í Àӽà ¹öÆÛ¸¦ ÇÒ´çÇؼ º¹»çÇÏ°í, ¹öÆÛ ³¡±îÁö º¯È¯ÇÑ ÈÄ, Delete·Î Áö¿ì°í, Insert·Î »ðÀÔÇØ¾ß ÇÑ ÁÙ º¯È¯ÀÌ µÈ´Ù. ÀÌ·± 󸮸¦ ¿ ¼±ÅÃµÈ ¸ðµç ÁÙ¿¡ ´ëÇØ ¹Ýº¹ÇØ¾ß ÇÏ°í ÆíÁý ±×·ì±îÁö ±¸¼ºÇØ¾ß ÇÑ´Ù. ÀÌ¹Ì ´Ù ¿Ï¼ºµÈ ÄÚµåÀ̹ǷΠÃÖ´ëÇÑ ÀçÈ°¿ëÇϱâ À§ÇØ »óÈ£ È£Ãâ ±â¹ýÀ» »ç¿ëÇß´Ù.
´ë¼Ò¹®ÀÚ º¯°æ ÈÄ ¼±Åà ¿µ¿ªÀÌ ¹Ù²ï´Ù. ¿Ö³ÄÇÏ¸é ±ÛÀÚÀÇ ÆøÀÌ ´Þ¶óÁö±â ¶§¹®ÀÌ´Ù. ºí·Ï º¹»ç ¹× À̵¿ÇÒ ¶§¿Í ¸¶Âù°¡Áö ÀÌÀ¯´Ù. Á¤ ÀÌ»óÇÏ´Ù¸é ChangeCaseColumn È£Ãâ ÈÄ¿¡ ClearSelectionÀ» È£ÃâÇÏ¸é µÈ´Ù. ±×·¯³ª Åë»ó ¾Æ·¡À§·Î ºñ½ÁÇÑ ´Ü¾îµéÀ» ¿ ¸ðµå·Î ¼±ÅÃÇϱ⠶§¹®¿¡ Á¶±Ý ÀÌ»óÇØ º¸¿©µµ Å©°Ô ¹®Á¦°¡ µÇÁö´Â ¾ÊÀ» °Í °°´Ù. ¿¸ðµå¿¡¼ Àüü ¼±Åà ÀÚü°¡ Àǹ̰¡ ¾ø´Ù. °Á¦·Î ¿ ¸ðµå¸¦ Ǭ ÈÄ Àüü ¼±ÅÃÇÑ´Ù.
void CApiEditText::OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify)
{
....
case IDM_AE_SELALL:
if (bColumnMode) {
SetColumnMode(FALSE);
}
SelStart=0;
SelEnd=pFrame->doclen;
off=SelEnd;
Invalidate(-1);
SetCaret();
return;
°Á¦·Î ¸ðµå¸¦ Ǭ´Ù´Â Á¡¿¡¼ ¾à°£ÀÇ °í¹ÎÀÌ ÇÊ¿äÇÏÁö¸¸ º° ´Ù¸¥ ¹æ¹ýÀÌ ¾ø´Ù. Àüü ¼±ÅÃÀ̶ó´Â ¸í·É ÀÚü°¡ ¿¸ðµå¿Í´Â ¾î¿ï¸®Áö ¾ÊÀ¸¹Ç·Î »ç¿ëÀÚ°¡ ÀÌ ¸í·ÉÀ» ³»·ÈÀ» ¶§ ¿¸ðµå¸¦ ÇØÁ¦Ç϶ó´Â ¶æÀ¸·Î Çؼ®Çصµ ¹«¸®°¡ ¾ø´Ù.