. 마진폭 확장

마진의 폭은 최초 25픽셀로 초기화되어 있는데 이 정도 폭이면 4자리의 줄번호를 출력할 수 있다. 대부분의 문서는 9999줄 정도면 충분하겠지만 만 줄을 넘어갈 경우는 만 단위가 잘려 보이지 않게 될 것이고 이는 사용자에게 불편과 혼란을 초래할 위험이 있다. 그렇다고 해서 마진을 무작정 넓게 만들어 둘 수도 없는데 편집 영역이 줄어들기 때문이기도 하지만 마진이 너무 넓으면 솔직히 별로 예쁘지 않기 때문이다.

적당한 폭을 가지고도 만 줄 이상의 줄번호도 출력할 수 있도록 하려면 마진의 폭이 문서 길이에 따라 실시간으로 조정되는 것이 가장 이상적이다. 문서를 읽어보고 만 줄이 안되면 디폴트 폭인 25픽셀을 쓰고 그 이상이면 폭을 좀 늘려주면 된다. 결국 마진폭은 문서의 총 줄수에 따라 달라지는데 문서의 줄 수를 결정하는 함수에서 마진폭도 같이 조정해야 한다. UpdateLineInfo 함수에 다음 코드를 추가하도록 하자.

 

void UpdateLineInfo()

{

     int l,s,e;

     int nPara, nLine=0;

 

     for (l=0, nPara=0;;l++) {

          GetLine(l,s,e);

 

          pLine[l].Start=s;

          pLine[l].End=e;

          pLine[l].nPara=nPara;

          pLine[l].nLine=nLine;

          if (s==-1) {

              TotalLine=l;

           if (MarginWidth != 0) {

               if (nPara >= 9999 && MarginWidth==25) {

                   MarginWidth=32;

                   SendMessage(hWndMain,WM_SIZE,0,0);

                   Invalidate(-1);

               }

               if (nPara < 9999 && MarginWidth==32) {

                   MarginWidth=25;

                   SendMessage(hWndMain,WM_SIZE,0,0);

                   Invalidate(-1);

               }

           }

              break;

          }

 

          if (buf[e]==‘\r’) {

              nPara++;

              nLine=0;

          } else {

              nLine++;

          }

     }

}

 

정렬을 다 완료했을 때 총 문단 수와 현재 마진폭을 보고 새 마진폭을 조정한다. 문단 수가 9999줄 이상인데 마진이 25픽셀이라면 32픽셀로 늘려 주도록 하였다. 10000번째 문단이 있고 마진폭이 다섯 글자를 출력하기에 좁다면 폭을 더 늘려 주는 것이다. 마진폭을 늘려주는 코드가 있다면 문서의 일부분이 삭제될 때 다시 줄여주는 코드도 있어야 한다. 문단 수가 9999미만인데 마진폭이 32픽셀로 되어 있다면 이때는 오히려 25픽셀로 줄여 준다.

마진폭이 바뀌면 포맷팅영역이 줄어들고 정렬 조건이 바뀌기 때문에 처음부터 다시 정렬해야 한다. 정렬 상태가 바뀌면 스크롤 정보도 바뀔 것이고 포맷팅영역인 frt도 다시 조정해야 하고 더블 버퍼링에 사용할 비트맵도 다시 생성하도록 해야 한다. 이 모든 처리를 여기서 직접 할 필요는 없고 대신 WM_SIZE 메시지를 보내면 된다. 마진폭이 바뀐 것은 윈도우 크기가 바뀐 것과 완전히 동일한 상황이기 때문이다. , 윈도우 크기가 정말 바뀐 것은 아니기 때문에 작업영역 무효화는 여기서 별도로 해야 한다.

이렇게 되면 UpdateLineInfo 함수는 OnSize를 통해 자기가 자신을 간접적으로 다시 호출하는 구조가 되는데 그렇다고 해서 무한루프에 빠질 위험은 없다. 왜냐하면 문단수가 10000을 넘어 마진폭을 늘린 후 다시 정렬하면 문단 수는 최소한 10000 이상이며 또한 반대로 10000미만이어서 마진폭을 줄이면 다음 정렬한 결과는 역시 10000을 넘지 않기 때문이다.

마진폭이 변경되면 작업영역 전체를 다시 그려야 한다. 그럼 마진폭이 문단 수에 따라 제대로 확장되고 축소되는지 테스트해보자. 이런 테스트를 할 때 설마 만 줄을 부지런히 다 입력해 볼 사람은 없을 것이다. 이 예제는 아직 64KB의 고정 버퍼를 가지기 때문에 만 줄 정도를 편집할 수도 없다. 그렇다고 테스트를 생략하고 그냥 넘어가기에는 좀 불안하고 찜찜하다.

이런 테스트를 할 때는 코드를 약간 수정해서 9999 99 9 정도로 축소해놓고 테스트하면 된다. 99로 바꾼 후 100줄 경계에서 마진폭이 잘 조정되는 것을 확인한 후 9999로 바꿔 놓기만 하면 만 줄 경계에서도 정확하게 동작한다. 너무나 당연한 얘기지만 사실 지나치게 정직하고 성실한 사람은 이런 잔꾀를 쓰는데 좀 미숙한 경우도 있다.

이제 99999줄까지의 문서도 줄 수를 제대로 출력할 수 있게 되었다. 그렇다면 10만 줄 이상이 되는 문서는 어떻게 하는가? 10만 줄이라고 해 봐야 5~10MB 정도의 크기밖에 안되므로 이런 문서도 심심치 않게 볼 수 있을 것이다. 만약 10만 줄이나 백만 줄 또는 그 이상도 지원하고 싶다면 같은 방법대로 마진폭을 더 늘리면 되지만 ApiEdit는 그 이상은 포기하기로 하였다.