블루앤라이브 님의 Notepad2 4.2.25 패치 중 Notepad2-mod에서 차용된 것이 있으니,
Notepad2 4.2.25 패치 준비#4: Mark Occurrences 기능 추가
링크된 블로그 글에도 있다시피, 다음과 같이 선택된 부분과 일치하는 단어를 강조해 주는 기능이다.
 (Notepad2 4,2,25 original w/ Scintilla 2.25 + 'Mark Occurrences' original)
(Notepad2 4,2,25 original w/ Scintilla 2.25 + 'Mark Occurrences' original)
이 기능을 조금 바꾸어, 아래와 같이 대소문자에 무관하게 동작할 수 있도록 했다.
어셈블리어 소스 코드라든지, 같은 단어가 대소문자를 달리해 나타나는 보통의 글 등에서 쓸 수 있다. 물론 메뉴에서 적용 여부를 선택 가능하며, 기본값은 대소문자 구분이다.
물론 메뉴에서 적용 여부를 선택 가능하며, 기본값은 대소문자 구분이다.
참고로, 대부분의 언어에서 식별자는 대소문자를 구분하기 때문에, 이를 빼 버리는 건 미친 짓이다.
블루앤라이브 님과 같은 순서로 설명하며, 기존 패치와 달라진 줄을 강조했다.
1. resource.h
* 적당히 수정: 사용되지 않는 번호.
2. Notepad2.rc
3. Edit.h
4. Edit.c
5. Notepad2.c
void MsgInitMenu(HWND hwnd,WPARAM wParam,LPARAM lParam) 내의 다음 두 줄 사이에,
LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) 내의 case IDM_VIEW_MARGIN: ~ break;과 case IDM_VIEW_SHOWWHITESPACE: ~ break; 사이에 다음과 같은 내용을 추가한다.
LRESULT MsgNotify(HWND hwnd,WPARAM wParam,LPARAM lParam) 내에서 다음 내용을 찾아서,
void LoadSettings() 내에서 다음 내용을 찾아서,
마지막으로 void SaveSettings() 내의 다음 두 줄 사이에,
시험적으로 구상한 패치 소스 패치(!)였지만 놀랍게도 성공적으로 작동했다.(?)
나도 이제 소스 패치 변태야 엉엉 ㅠㅠ 하라는 과제는 안 하고
앞으로 몇 가지 패치를 더 만들어 낼지도 모르겠습니다. :)
다음 글. 한글은 전영역에서 찾는다든지 하는 옵션이 추가되어 있는데 정신 건강에 좋지는 않습니다.
            
                    
                    
Notepad2 4.2.25 패치 준비#4: Mark Occurrences 기능 추가
링크된 블로그 글에도 있다시피, 다음과 같이 선택된 부분과 일치하는 단어를 강조해 주는 기능이다.
이 기능을 조금 바꾸어, 아래와 같이 대소문자에 무관하게 동작할 수 있도록 했다.
어셈블리어 소스 코드라든지, 같은 단어가 대소문자를 달리해 나타나는 보통의 글 등에서 쓸 수 있다.
참고로, 대부분의 언어에서 식별자는 대소문자를 구분하기 때문에, 이를 빼 버리는 건 미친 짓이다.
블루앤라이브 님과 같은 순서로 설명하며, 기존 패치와 달라진 줄을 강조했다.
1. resource.h
적당한 위치에 아래와 같은 내용을 추가한다. 40445~40449가 사용 중이면 적당히 수정한다.
#define IDM_VIEW_MARKOCCURRENCES_CASE 40445 #define IDM_VIEW_MARKOCCURRENCES_RED 40446 #define IDM_VIEW_MARKOCCURRENCES_GREEN 40447 #define IDM_VIEW_MARKOCCURRENCES_BLUE 40448 #define IDM_VIEW_MARKOCCURRENCES_OFF 40449* 적당한 위치: 번호 순으로 정렬되어 있으므로 번호 순서에 맞게 넣어야 위험하지 않다.
* 적당히 수정: 사용되지 않는 번호.
2. Notepad2.rc
다음과 같은 내용을 찾아
MENUITEM "Selection &Margin\tCtrl+Shift+M", IDM_VIEW_MARGIN바로 아래에 다음 내용을 추가한다.
  POPUP "Mar&k Occurrences"
  BEGIN
      MENUITEM "Matc&h case",                 IDM_VIEW_MARKOCCURRENCES_CASE
      MENUITEM SEPARATOR
      MENUITEM "&Red",                        IDM_VIEW_MARKOCCURRENCES_RED
      MENUITEM "&Green",                      IDM_VIEW_MARKOCCURRENCES_GREEN
      MENUITEM "&Blue",                       IDM_VIEW_MARKOCCURRENCES_BLUE
      MENUITEM "&Off",                        IDM_VIEW_MARKOCCURRENCES_OFF
  END
3. Edit.h
다음과 같은 내용을 적당한 위치에 추가한다.
void EditMarkAll(HWND,int,BOOL);
4. Edit.c
다음과 같은 내용을 적당한 위치에 추가한다.
//=============================================================================
//
//  EditMarkAll()
//  Mark all occurrences of the text currently selected (by Aleksandar Lekov / slightly modified by Un-i-que)
//
void EditMarkAll(HWND hwnd, int iMarkOccurrences, BOOL bMarkOccurrencesCaseSensitive)
{
  struct TextToFind ttf;
  int iPos;
  char  *pszText;
  int iTextLen;
  int iSelStart;
  int iSelEnd;
  int iSelCount;
  int iMatchesCount;
 
  // feature is off
  if (!iMarkOccurrences)
  {
      return;
  }
 
  iTextLen = (int)SendMessage(hwnd,SCI_GETLENGTH,0,0);
 
  // get current selection
  iSelStart = (int)SendMessage(hwnd,SCI_GETSELECTIONSTART,0,0);
  iSelEnd = (int)SendMessage(hwnd,SCI_GETSELECTIONEND,0,0);
  iSelCount = iSelEnd - iSelStart;
 
  // clear existing indicator
  SendMessage(hwnd, SCI_SETINDICATORCURRENT, 1, 0);
  SendMessage(hwnd, SCI_INDICATORCLEARRANGE, 0, iTextLen);
 
  // if nothing selected or multiple lines are selected exit
  if (iSelCount == 0 ||
      (int)SendMessage(hwnd, SCI_LINEFROMPOSITION, iSelStart, 0) !=
      (int)SendMessage(hwnd, SCI_LINEFROMPOSITION, iSelEnd, 0))
  {
      return;
  }
 
  pszText = LocalAlloc(LPTR,iSelCount + 1);
  (int)SendMessage(hwnd,SCI_GETSELTEXT,0,(LPARAM)pszText);
 
  ZeroMemory(&ttf,sizeof(ttf));
 
  ttf.chrg.cpMin = 0;
  ttf.chrg.cpMax = iTextLen;
  ttf.lpstrText = pszText;
 
  // set style, green should be greener not to confuse with bookmarks' style
  SendMessage(hwnd, SCI_INDICSETALPHA, 1, iMarkOccurrences == 2 ? 100 : 30);
  SendMessage(hwnd, SCI_INDICSETFORE, 1, 0xff << ((iMarkOccurrences - 1) << 3));
  SendMessage(hwnd, SCI_INDICSETSTYLE, 1, INDIC_ROUNDBOX);
 
  iMatchesCount = 0;
  while ((iPos = (int)SendMessage(hwnd, SCI_FINDTEXT, (bMarkOccurrencesCaseSensitive ? (SCFIND_MATCHCASE | SCFIND_WHOLEWORD) : SCFIND_WHOLEWORD), (LPARAM)&ttf)) != -1
      && ++iMatchesCount < 1000)
  {
    // mark this match
    SendMessage(hwnd, SCI_INDICATORFILLRANGE, iPos, iSelCount);
    ttf.chrg.cpMin = ttf.chrgText.cpMin + iSelCount;
    if (ttf.chrg.cpMin == ttf.chrg.cpMax)
      break;
  }
 
  LocalFree(pszText);
  return;
}* Scintilla에 넘기는 인자가 bMarkOccurrencesCaseSensitive에 따라 바뀐다.
5. Notepad2.c
소스의 앞부분, 다른 전역변수들과 함께 다음 두 변수 선언을 추가한다.
int iMarkOccurrences; BOOL bMarkOccurrencesCaseSensitive;
CheckCmd(hmenu,IDM_VIEW_MARGIN,bShowSelectionMargin); CheckCmd(hmenu,IDM_VIEW_SHOWWHITESPACE,bViewWhiteSpace);다음과 같은 내용을 추가한다.
  CheckCmd(hmenu,IDM_VIEW_MARKOCCURRENCES_CASE,bMarkOccurrencesCaseSensitive);
  switch (iMarkOccurrences)
  {
    case 0: i = IDM_VIEW_MARKOCCURRENCES_OFF;break;
    case 1: i = IDM_VIEW_MARKOCCURRENCES_RED;break;
    case 2: i = IDM_VIEW_MARKOCCURRENCES_GREEN;break;
    case 3: i = IDM_VIEW_MARKOCCURRENCES_BLUE;break;
  }
  CheckMenuRadioItem(hmenu,IDM_VIEW_MARKOCCURRENCES_RED,IDM_VIEW_MARKOCCURRENCES_OFF,i,MF_BYCOMMAND);    case IDM_VIEW_MARKOCCURRENCES_CASE:
      bMarkOccurrencesCaseSensitive = (bMarkOccurrencesCaseSensitive) ? FALSE : TRUE;
      // clear all marks and remark with changed case sensitivity
      SendMessage(hwndEdit, SCI_SETINDICATORCURRENT, 1, 0);
      SendMessage(hwndEdit, SCI_INDICATORCLEARRANGE, 0, (int)SendMessage(hwndEdit,SCI_GETLENGTH,0,0));
      EditMarkAll(hwndEdit, iMarkOccurrences, bMarkOccurrencesCaseSensitive);
      break;
    
    case IDM_VIEW_MARKOCCURRENCES_OFF:
      iMarkOccurrences = 0;
      // clear all marks
      SendMessage(hwndEdit, SCI_SETINDICATORCURRENT, 1, 0);
      SendMessage(hwndEdit, SCI_INDICATORCLEARRANGE, 0, (int)SendMessage(hwndEdit,SCI_GETLENGTH,0,0));
      break;
 
    case IDM_VIEW_MARKOCCURRENCES_RED:
      iMarkOccurrences = 1;
      EditMarkAll(hwndEdit, iMarkOccurrences, bMarkOccurrencesCaseSensitive);
      break;
 
    case IDM_VIEW_MARKOCCURRENCES_GREEN:
      iMarkOccurrences = 2;
      EditMarkAll(hwndEdit, iMarkOccurrences, bMarkOccurrencesCaseSensitive);
      break;
 
    case IDM_VIEW_MARKOCCURRENCES_BLUE:
      iMarkOccurrences = 3;
      EditMarkAll(hwndEdit, iMarkOccurrences, bMarkOccurrencesCaseSensitive);
      break;// Brace Match if (bMatchBraces)이 바로 위에 다음과 같은 내용을 추가한다.
// mark occurrences of text currently selected EditMarkAll(hwndEdit, iMarkOccurrences, bMarkOccurrencesCaseSensitive);
bViewWhiteSpace = IniSectionGetInt(pIniSection,L"ViewWhiteSpace",0);이 바로 위에 다음과 같은 내용을 추가한다.
bMarkOccurrencesCaseSensitive = IniSectionGetInt(pIniSection,L"MarkOccurrencesCaseSensitively",1); if (bMarkOccurrencesCaseSensitive) bMarkOccurrencesCaseSensitive = 1; iMarkOccurrences = IniSectionGetInt(pIniSection,L"MarkOccurrences",3);
IniSectionSetInt(pIniSection,L"ShowLineNumbers",bShowLineNumbers); IniSectionSetInt(pIniSection,L"ViewWhiteSpace",bViewWhiteSpace);다음 두 줄을 추가한다.
IniSectionSetInt(pIniSection,L"MarkOccurrencesCaseSensitively",bMarkOccurrencesCaseSensitive); IniSectionSetInt(pIniSection,L"MarkOccurrences",iMarkOccurrences);
시험적으로 구상한 패치 소스 패치(!)였지만 놀랍게도 성공적으로 작동했다.(?)
앞으로 몇 가지 패치를 더 만들어 낼지도 모르겠습니다. :)
'Sablog Models > 자작자작' 카테고리의 다른 글
| Notepad2 패치에 발을 담그다 - (2) Mark Occurrences, anywhere for non-ASCII (0) | 2011.06.12 | 
|---|---|
| 환타 오목 게임 재구성: 최종본. (2) | 2009.11.12 | 
| 환타 오목 게임 재구성. (5) (0) | 2009.11.12 | 
| C 언어로 .cdic 파일을 xml로 만드는 프로그램 만드는 중. (0) | 2009.09.21 | 
| 환타 오목 게임 재구성. (4) (0) | 2009.09.17 |