. 프로젝트 목록 저장

프로젝트는 구조가 복잡하기는 하지만 결국은 단순한 파일의 집합일 뿐이므로 꼭 실제 프로젝트와 관련된 파일들로만 구성되는 것은 아니다. 아무 상관이 없는 파일이라도 같은 프로젝트에 모아 두면 파일창을 통해 같이 관리할 수 있다. 예를 들어 즐겨찾기라는 이름으로 프로젝트를 만들고 최근에 자주 사용하는 파일들을 모아 놓을 수도 있고 자주 베껴 쓰는 코드라는 이름으로 재사용할만한 코드집을 만들 수도 있다.

프로젝트를 이런 식으로도 쓸 수 있기 때문에 당근은 즐겨찾기 기능을 따로 제공하지 않으며 클립 텍스트나 템플릿 기능의 일부까지도 포괄할 수 있다. 그만큼 프로젝트는 활용성이 높은 기능이다. 이런 프로젝트는 사용할 때 매번 열기가 귀찮으므로 일단 한 번 열어 놓으면 다음 번 실행할 때도 다시 여는 것이 좋다. 프로젝트가 아무리 많이 열려 있더라도 트리 뷰의 노드를 차지하는 것 외에는 별다른 부담을 주지도 않는다.

당근의 옵션 중에 bReloadProject 옵션이 프로젝트 다시 읽기 기능을 선택하는 옵션인데 이 값이 TRUE이면 한 번 연 프로젝트를 저장해놓았다가 다음 실행할 때도 프로젝트를 그대로 열어 준다. 특별한 이유가 없는 한 이 옵션은 켜 두는 것이 좋고 디폴트값도 TRUE이다. 사용하던 프로젝트를 다시 읽어오는 방법은 StartAction 옵션을 처리하는 방법과 거의 동일하다. 종료 직전인 OnDestroy에서 열려 있는 프로젝트의 목록을 조사하여 레지스트리에 기록한다.

 

void OnDestroy(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

     HTREEITEM hNode;

     TVITEM TV;

     ....

     nEditing=0;

     hNode=TreeView_GetRoot(hFileTree);

     while (hNode) {

          TV.mask=TVIF_PARAM | TVIF_IMAGE;

          TV.hItem=hNode;

          TreeView_GetItem(hFileTree,&TV);

          if (TV.iImage == DGI_PROJECT) {

              wsprintf(szKey,"Project%d",++nEditing);

              SHRegWriteString(SHCU,KEY"Project",szKey,(TCHAR *)TV.lParam);

          }

          hNode=TreeView_GetNextSibling(hFileTree,hNode);

     }

     SHRegWriteInt(SHCU,KEY"Project","Num",nEditing);

     ....

 

트리의 1레벨에 등록된 노드 중 DGI_PROJECT 이미지를 가지는 노드의 lParam을 읽으면 열린 프로젝트 파일의 경로를 조사할 수 있으며 이 문자열을 레지스트리에 저장하였다. 이렇게 저장된 정보는 다음 번 실행될 때인 OnTimer에서 다시 읽혀진다.

 

void OnTimer(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

     switch (wParam) {

     case 100:

     ....

        if (Option.bReloadProject) {

           nEditing=SHRegReadInt(SHCU,KEY"Project","Num",0);

           for (i=1;i<=nEditing;i++) {

               wsprintf(szKey,"Project%d",i);

               SHRegReadString(SHCU,KEY"Project",szKey,"",Path,MAX_PATH);

               LoadProject(Path,FALSE);

           }

        }

 

          Option.bMaxFirstChild=bOldMaxFirstChild;

          SHRegReadString(SHCU,KEY"Setting","LastFolder","",Path,MAX_PATH);

          GotoFolderInTree(Path);

          break;

 

레지스트리에 기록된 정보를 읽어 LoadProject 함수만 부르면 이전 실행시에 열어 놓았던 프로젝트 목록이 그대로 복구된다. 이전 실행시에 열려 있던 모든 프로젝트를 다시 읽고 최후 선택된 노드로 찾아갈 것이다.