³ª. ÇÁ·ÎÁ§Æ® °ü¸®

ÇÁ·ÎÁ§Æ® ·¹ÄÚµåÀÇ ±¸Á¶´Â ¾Õ¿¡¼­ ¼³¸íÇÑ °Íº¸´Ù »ç½Ç ÈξÀ ´õ º¹ÀâÇØÁú ¼ö ÀÖ´Ù. ÇÏÀ§ ¹­À½¿¡ Æ÷ÇԵǴ ÆÄÀϵéÀº ¹Ýµå½Ã °°Àº Æú´õ¿¡ ÀÖÀ» ÇÊ¿ä°¡ ¾øÀ¸¸ç bAbsolute ¿É¼ÇÀÌ FALSEÀÌ´õ¶óµµ ÇÁ·ÎÁ§Æ® ÆÄÀÏÀÇ À§Ä¡¿¡¼­ »ó´ë°æ·Î¸¦ °è»êÇÒ ¼ö ¾ø´Â ÆÄÀÏÀº Àý´ë°æ·Î·Î ±â¾ïµÈ´Ù. ·ÎÄà ³×Æ®¿öÅ©¿¡ ÀÖ´Â ÆÄÀÏÀº ¹°·ÐÀÌ°í FTP, HTTP ÇÁ·ÎÅäÄÝ·Î ÀÐÀ» ¼ö ÀÖ´Â ÆÄÀϵµ ÇÁ·ÎÁ§Æ®¿¡ Æ÷Ç﵃ ¼ö ÀÖÀ¸¸ç ½ÉÁö¾î ÇÁ·ÎÁ§Æ®°¡ ÇÁ·ÎÁ§Æ® ÆÄÀÏÀ» Æ÷ÇÔÇÒ ¼öµµ ÀÖ´Ù.

ÇÁ·ÎÁ§Æ®¸¦ °ü¸®ÇÑ´Ù´Â °ÍÀº ¹Ù·Î ÀÌ·± º¹ÀâÇÑ ÇÁ·ÎÁ§Æ® ·¹Äڵ带 Á¤È®ÇÏ°Ô °ü¸®ÇÏ´Â ÀÛ¾÷À̱⠶§¹®¿¡ Äڵ嵵 ±²ÀåÈ÷ º¹ÀâÇÏ´Ù. ÀÌ¹Ì µî·ÏÇÑ ³ëµå¸¦ »èÁ¦ÇÏ´Â °ÍÀº ¹°·ÐÀÌ°í ÇÏÀ§ ¹­À½µé°£¿¡ ³ëµå¸¦ À̵¿ÇÒ ¼ö ÀÖ´Â ±â´É±îÁö ±¸ÇöÇÒ ÀÛÁ¤ÀÌ´Ù. ¾ÖÃÊ¿¡ ÀÌ ±â´ÉÀ» ¼³°èÇÒ ¶§ ÃÖ´ëÇÑ Á÷°üÀûÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ³ë·ÂÇßÀ¸¸ç À¯¿¬¼ºÀ» ºÎ¿©ÇÏ°íÀÚ Ç߱⠶§¹®¿¡ ÄÚµå´Â º¹ÀâÇÏÁö¸¸ ±×·¡¼­ ÃÖÁ¾ »ç¿ëÀڵ鿡°Ô´Â ÀÌ ±â´ÉÀÌ ºÎ´ã½º·´Áö ¾ÊÀ» °ÍÀ¸·Î ±â´ëµÈ´Ù.

´ÙÀ½ ¿ÞÂÊ ´ëÈ­»óÀÚ´Â ÇÁ·ÎÁ§Æ®¸¦ »ý¼º, ¼öÁ¤ÇÏ¸ç ¿À¸¥ÂÊ ´ëÈ­»óÀÚ´Â ÇÁ·ÎÁ§Æ®ÀÇ ±¸¼º ¿ä¼Ò¸¦ °ü¸®ÇÑ´Ù. ´ëÈ­»óÀÚ ¸ð¾çµµ ¾îÁö°£È÷ º¹ÀâÇÏ°Ô »ý°å´Ù. ¸®¼Ò½º¿¡´Â ÀÌ ´ëÈ­»óÀÚµéÀÌ ÀÌ¹Ì ÀÛ¼ºµÇ¾î ÀÖÀ¸¹Ç·Î Äڵ常 Ãß°¡ÇÏ¸é µÈ´Ù.

 

Áß¾ÓÀÇ Æ®¸® ºä¿¡ ÇÁ·ÎÁ§Æ®ÀÇ ±¸¼º ÆÄÀÏ °èÃþÀ» º¸¿©ÁÖ¸ç ÀÌ Æ®¸®¸¦ °ü¸®ÇÏ´Â °ÍÀÌ ÇÁ·ÎÁ§Æ® °ü¸® ´ëÈ­»óÀÚÀÇ ÁÖµÈ ÀÛ¾÷ÀÌ´Ù. ¿À¸¥ÂÊ Æí¿¡´Â ÇÁ·ÎÁ§Æ® ÀÚü¿Í ±¸¼º ¿ä¼Ò¸¦ °ü¸®Çϴµ¥ ÇÊ¿äÇÑ ¸í·É ¹öÆ°µéÀÌ Â¡±×·¯¿ï Á¤µµ·Î ¸¹ÀÌ ºÙ¾î ÀÖ´Ù. ´ÙÀ½Àº ÀÌ µÎ ´ëÈ­»óÀÚÀÇ ÇÁ·Î½ÃÀú ÇÔ¼ö¿Í ÇÁ·ÎÁ§Æ®¸¦ °ü¸®ÇÏ´Â ÇÔ¼öµéÀÌ´Ù. ¿øÇüÀ» Dangeun.cpp¿¡ ¸ÕÀú ÀÛ¼ºÇϵµ·Ï ÇÏÀÚ.

 

BOOL CALLBACK DgProjectProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam);

BOOL CALLBACK DgNewProjectProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam);

BOOL OpenProject(HWND hDlg,TCHAR *Project,BOOL &bAbsolute);

void InsertProjectRecord(HWND hTree,ProjectRecord *data,HTREEITEM pNode,int pid);

void AddFileToProject(HWND hDlg,TCHAR *Path,BOOL bAbsolute);

void SaveProject(HWND hDlg, TCHAR *Project);

void SaveProjectRecord(HWND hDlg, HANDLE hFile,HTREEITEM hParent,int pid);

BOOL LoadProject(TCHAR *Project,BOOL bUpdate);

HTREEITEM FindTreeItem(HWND hTree, HTREEITEM hParent, TCHAR *Text);

int GetProjectNodePath(HWND hDlg,HWND hPrjTree,HTREEITEM hItem,TCHAR *Path);

BOOL TestProjectValid(HWND hDlg, HTREEITEM hParent);

HTREEITEM CopyTreeItem(HWND hTree, HTREEITEM hSrc, HTREEITEM hDest, BOOL bNext);

HTREEITEM CopyTreeItems(HWND hTree, HTREEITEM hSrc, HTREEITEM hDest,BOOL bNext);

void RePathProject(HANDLE hFile,TCHAR *Project,BOOL bAbsolute);

 

¾ÆÁÖ ¸¹Àº ÇÔ¼öµéÀÌ ÇÊ¿äÇÏ´Ù. ÀÌ ÇÔ¼öµéÀÇ Àüü ÄÚµå´Â ´ÙÀ½°ú °°´Ù. ¿ª½Ã Dangeun.cpp¿¡ ÀÛ¼ºÇ쵂 Á÷Á¢ ÀÔ·ÂÇÒ¸¸ÇÑ ºÐ·®ÀÌ ¾Æ´Ï¹Ç·Î CD-ROM¿¡ ÀÖ´Â ¿¹Á¦¿¡¼­ º¹»çÇØ ¿Àµµ·Ï ÇÏÀÚ.

 

BOOL CALLBACK DgProjectProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     static HWND hPrjTree;

     static BOOL Modified;

     static BOOL bAbsolute;

     TCHAR Project[MAX_PATH];

     OPENFILENAME OFN;

     TCHAR *Files;

     TCHAR Dir[MAX_PATH];

     TCHAR Path[MAX_PATH];

     TCHAR *p;

     TVITEM TV;

     TVINSERTSTRUCT TI;

     HTREEITEM Node,NewNode;

     static HIMAGELIST himl;

     static BOOL bDrag;

     static HTREEITEM hDrag,hTarget, hOldTarget;

     TVHITTESTINFO hti;

     POINT pt;

     int hotx,hoty;

     RECT rt;

     BOOL bNext;

     int Count,n;

 

     switch(iMessage)

     {

     case WM_INITDIALOG:

          MoveToParentCenter(hDlg);

          hPrjTree=GetDlgItem(hDlg,IDC_PRJTREE);

          SendMessage(hPrjTree, TVM_SETIMAGELIST, (WPARAM)TVSIL_NORMAL, (LPARAM)hFileImg);

 

          if (lParam) {

              if (OpenProject(hDlg,(TCHAR *)lParam,bAbsolute)==FALSE) {

                   lParam=NULL;

              }

          }

 

          if (lParam == NULL) {

              EnableWindow(GetDlgItem(hDlg,IDC_BTNPRJEDIT),FALSE);

              EnableWindow(GetDlgItem(hDlg,IDC_BTNPRJTEST),FALSE);

              EnableWindow(GetDlgItem(hDlg,IDC_BTNPRJFILE),FALSE);

              EnableWindow(GetDlgItem(hDlg,IDC_BTNPRJFTP),FALSE);

              EnableWindow(GetDlgItem(hDlg,IDC_BTNPRJHTTP),FALSE);

              EnableWindow(GetDlgItem(hDlg,IDC_BTNPRJDELETE),FALSE);

              EnableWindow(GetDlgItem(hDlg,IDC_BTNPRJSUB),FALSE);

              EnableWindow(GetDlgItem(hDlg,IDC_BTNPRJFOLDER),FALSE);

              EnableWindow(GetDlgItem(hDlg,IDC_BTNPRJRENAME),FALSE);

          }

          Modified=FALSE;

          bDrag=FALSE;

          DragAcceptFiles(hDlg,TRUE);

          return TRUE;

     case WM_COMMAND:

          switch (LOWORD(wParam)) {

          case IDC_BTNPRJNEW:

              if (Modified) {

                   if (MessageBox(hDlg,"ÆíÁýÁßÀÎ ÇÁ·ÎÁ§Æ®¸¦ ÀúÀåÇϽðڽÀ´Ï±î?","Áú¹®",MB_YESNO)==IDYES) {

                        GetDlgItemText(hDlg,IDC_PRJFILE,Project,MAX_PATH);

                        SaveProject(hDlg,Project);

                        LoadProject(Project,TRUE);

                   }

              }

              lstrcpy(Project,"");

              if (DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_NEWPROJECT),

                   hDlg, DgNewProjectProc,(LPARAM)Project)==IDOK) {

                   OpenProject(hDlg,Project,bAbsolute);

                   Modified=FALSE;

              }

               return TRUE;

          case IDC_BTNPRJOPEN:

              if (Modified) {

                   if (MessageBox(hDlg,"ÆíÁýÁßÀÎ ÇÁ·ÎÁ§Æ®¸¦ ÀúÀåÇϽðڽÀ´Ï±î?","Áú¹®",MB_YESNO)==IDYES) {

                        GetDlgItemText(hDlg,IDC_PRJFILE,Project,MAX_PATH);

                        SaveProject(hDlg,Project);

                        LoadProject(Project,TRUE);

                   }

               }

              memset(&OFN, 0, sizeof(OPENFILENAME));

              OFN.lStructSize = sizeof(OPENFILENAME);

              OFN.hwndOwner=hDlg;

              OFN.lpstrFilter="´ç±Ù ÇÁ·ÎÁ§Æ®(*.dgp)\0*.dgp*\0";

              lstrcpy(Project,"");

              OFN.lpstrFile=Project;

              OFN.nMaxFile=MAX_PATH;

              if (GetOpenFileName(&OFN)) {

                   if (OpenProject(hDlg,Project,bAbsolute)==TRUE) {

                        Modified=FALSE;

                   }

              }

              return TRUE;

          case IDC_BTNPRJEDIT:

              GetDlgItemText(hDlg,IDC_PRJFILE,Project,MAX_PATH);

              if (Modified) {

                   if (MessageBox(hDlg,"ÇöÀç±îÁöÀÇ º¯°æ »çÇ×À» ÀúÀåÇÏ¼Å¾ß ÇÁ·ÎÁ§Æ® ¼Ó¼º(°æ·Î ¼³Á¤)"

                        "À» ÆíÁýÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀúÀåÇϽðڽÀ´Ï±î?","Áú¹®",MB_YESNO)==IDYES) {

                        SaveProject(hDlg,Project);

                   } else {

                        return TRUE;

                   }

              }

              if (DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_NEWPROJECT),

                   hDlg, DgNewProjectProc,(LPARAM)Project)==IDOK) {

                   OpenProject(hDlg,Project,bAbsolute);

                   Modified=TRUE;

              }

              return TRUE;

          case IDC_BTNPRJSUB:

              Modified=TRUE;

              TI.hParent=TreeView_GetSelection(hPrjTree);

              TI.hInsertAfter=TVI_LAST;

              TI.item.mask=TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;

              TI.item.iImage=DGI_SUB;

              TI.item.iSelectedImage=DGI_SUBSEL;

              TI.item.pszText="»õ ¹­À½";

              NewNode=TreeView_InsertItem(hPrjTree, &TI);

              TreeView_SelectItem(hPrjTree,NewNode);

              TreeView_EditLabel(hPrjTree,NewNode);

              return TRUE;

          case IDC_BTNPRJFILE:

              memset(&OFN, 0, sizeof(OPENFILENAME));

              OFN.lStructSize = sizeof(OPENFILENAME);

              OFN.hwndOwner=hDlg;

              OFN.lpstrFilter="¸ðµç ÆÄÀÏ(*.*)\0*.*\0ÅؽºÆ® ÆÄÀÏ\0*.txt\0";

              Files=(TCHAR *)malloc(100000);

              Files[0]=0;

              OFN.lpstrFile=Files;

              OFN.nMaxFile=100000;

              OFN.Flags=OFN_EXPLORER | OFN_ALLOWMULTISELECT;

              GetDlgItemText(hDlg,IDC_PRJFILE,Project,MAX_PATH);

              OFN.lpstrInitialDir=Project;

 

              if (GetOpenFileName(&OFN)) {

                   Modified=TRUE;

                   p=Files;

                   lstrcpy(Dir,p);

                   p=p+lstrlen(Dir)+1;

                   if (*p==0) {

                        AddFileToProject(hDlg,Dir,bAbsolute);

                   } else {

                        for (;*p;) {

                             wsprintf(Path,"%s\\%s",Dir,p);

                             p=p+lstrlen(p)+1;

                             AddFileToProject(hDlg,Path,bAbsolute);

                        }

                   }

              } else {

                   if (CommDlgExtendedError()==FNERR_BUFFERTOOSMALL) {

                        MessageBox(hDlg,"ÇÑ ¹ø¿¡ ÆÄÀÏÀ» ³Ê¹« ¸¹ÀÌ ¼±ÅÃÇϼ̽À´Ï´Ù.",

                             "¾Ë¸²",MB_OK);

                   }

              }

              free(Files);

              return TRUE;

          case IDC_BTNPRJFTP:

              if (DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_FTP),

                   g_hFrameWnd, DGFtpProc,(LPARAM)Path)==IDOK) {

                   if (lstrlen(Path)) {

                        Modified=TRUE;

                        AddFileToProject(hDlg,Path,TRUE);

                   }

              }

              return TRUE;

          case IDC_BTNPRJHTTP:

              if (DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_HTTP),

                   hDlg, DGHttpProc,(LPARAM)Path)==IDOK) {

                   if (lstrlen(Path)) {

                        Modified=TRUE;

                        AddFileToProject(hDlg,Path,TRUE);

                   }

              }

              return TRUE;

          case IDC_BTNPRJFOLDER:

              GetDlgItemText(hDlg,IDC_PRJFILE,Project,MAX_PATH);

              if (BrowseFolder(hDlg,"ÇÁ·ÎÁ§Æ®¿¡ Ãß°¡ÇÒ Æú´õ ¸µÅ©¸¦ ¼±ÅÃÇϽʽÿÀ.",Project,Path)==TRUE) {

                   Modified=TRUE;

                   AddFileToProject(hDlg,Path,bAbsolute);

              }

              return TRUE;

          case IDC_BTNPRJTEST:

              if (TestProjectValid(hDlg,NULL)==TRUE) {

                   MessageBox(hDlg,"ÇÁ·ÎÁ§Æ®³»ÀÇ ¸ðµç ÆÄÀϵéÀÌ Á¸ÀçÇϸç ÀÐÀ» ¼ö ÀÖ½À´Ï´Ù","°Ë»ç °á°ú",MB_OK);

              }

              return TRUE;

          case IDC_BTNPRJDELETE:

              Modified=TRUE;

              Node=TreeView_GetSelection(hPrjTree);

              TreeView_DeleteItem(hPrjTree,Node);

              return TRUE;

          case IDC_BTNPRJRENAME:

              Node=TreeView_GetSelection(hPrjTree);

              TreeView_EditLabel(hPrjTree,Node);

              return TRUE;

          case IDOK:

               if (TreeView_GetEditControl(hPrjTree)) {

                   if (HIWORD(wParam) == 0) {

                        TreeView_EndEditLabelNow(hPrjTree,FALSE);

                   }

              } else {

                   if (Modified) {

                        GetDlgItemText(hDlg,IDC_PRJFILE,Project,MAX_PATH);

                        SaveProject(hDlg,Project);

                        LoadProject(Project,TRUE);

                   }

                   EndDialog(hDlg,IDOK);

              }

              return TRUE;

          case IDCANCEL:

              if (TreeView_GetEditControl(hPrjTree)) {

                   TreeView_EndEditLabelNow(hPrjTree,TRUE);

              } else {

                   EndDialog(hDlg,IDCANCEL);

              }

              return TRUE;

          }

          return FALSE;

     case WM_DROPFILES:

          if (GetWindowTextLength(GetDlgItem(hDlg,IDC_PRJFILE))) {

              Count=DragQueryFile((HDROP)wParam,0xffffffff,NULL,0);

 

              for (n=0;n<Count;n++) {

                   Modified=TRUE;

                   DragQueryFile((HDROP)wParam,n,Path,MAX_PATH);

                   AddFileToProject(hDlg,Path,bAbsolute);

              }

          }

          return TRUE;

     case WM_MOUSEMOVE:

          if (bDrag) {

              pt.x=LOWORD(lParam);

              pt.y=HIWORD(lParam);

              ClientToScreen(hDlg,&pt);

              ImageList_DragMove(pt.x,pt.y);

 

              GetWindowRect(hPrjTree,&rt);

              ScreenToClient(hDlg,(POINT *)&rt);

              hti.pt.x=LOWORD(lParam)-rt.left;

              hti.pt.y=HIWORD(lParam)-rt.top;

              hTarget=TreeView_HitTest(hPrjTree,&hti);

              if (hTarget != NULL) {

                   ImageList_DragLeave(NULL);

                   TreeView_SelectDropTarget(hPrjTree,hTarget);

                   UpdateWindow(hPrjTree);

                   ImageList_DragEnter(NULL,pt.x,pt.y);

 

                   if (hTarget != hOldTarget) {

                        hOldTarget=hTarget;

                        KillTimer(hDlg,1);

                        SetTimer(hDlg,1,1000,NULL);

                   }

              }

 

              GetWindowRect(hPrjTree,&rt);

              if ((short)pt.y < rt.top) {

                   SetTimer(hDlg,2,200,NULL);

                   ImageList_DragLeave(NULL);

                   SendMessage(hPrjTree,WM_VSCROLL,MAKEWPARAM(SB_LINEUP,0),NULL);

                   ImageList_DragEnter(NULL,pt.x,pt.y);

              } else {

                   KillTimer(hDlg,2);

              }

 

              if ((short)pt.y > rt.bottom) {

                   SetTimer(hDlg,3,200,NULL);

                   ImageList_DragLeave(NULL);

                   SendMessage(hPrjTree,WM_VSCROLL,MAKEWPARAM(SB_LINEDOWN,0),NULL);

                   ImageList_DragEnter(NULL,pt.x,pt.y);

              } else {

                   KillTimer(hDlg,3);

              }

          }

          return TRUE;

     case WM_LBUTTONUP:

          if (bDrag) {

              ImageList_DragLeave(NULL);

              ImageList_EndDrag();

              TreeView_SelectDropTarget(hPrjTree,NULL);

              ReleaseCapture();

              bDrag=FALSE;

              ImageList_Destroy(himl);

              KillTimer(hDlg,1);

              KillTimer(hDlg,2);

              KillTimer(hDlg,3);

 

              if (hDrag == hTarget || hTarget==NULL)

                    return TRUE;

 

              Node=hTarget;

              while (Node != NULL) {

                   Node=TreeView_GetParent(hPrjTree,Node);

                   if (Node == hDrag)

                        return TRUE;

              }

 

              TV.mask=TVIF_IMAGE;

              TV.hItem=hTarget;

              TreeView_GetItem(hPrjTree,&TV);

              if (TV.iImage==DGI_SUB) {

                   switch (MessageBox(hDlg,"Ç׸ñÀ» ÇÏÀ§ ¹­À½¿¡ ¶³¾î¶ß·È½À´Ï´Ù. "

                        "¾î¶»°Ô ÇϽðڽÀ´Ï±î?\r\n\r\n¿¹=Ç׸ñÀ» ÇÏÀ§ ¹­À½ ¾È¿¡ Áý¾î ³Ö´Â´Ù.\r\n"

                        "¾Æ´Ï¿À=Ç׸ñÀ» ÇÏÀ§ ¹­À½ ´ÙÀ½À¸·Î ¿Å±ä´Ù","Áú¹®",MB_YESNOCANCEL)) {

                   case IDCANCEL:

                        return TRUE;

                   case IDYES:

                        bNext=FALSE;

                        break;

                   case IDNO:

                        bNext=TRUE;

                        break;

                   }

              }

 

              if (TV.iImage==DGI_PROJECT) {

                   bNext=FALSE;

              }

 

              LockWindowUpdate(hPrjTree);

              Node=CopyTreeItems(hPrjTree, hDrag, hTarget,bNext);

              TreeView_EnsureVisible(hPrjTree,Node);

              TreeView_DeleteItem(hPrjTree,hDrag);

              LockWindowUpdate(NULL);

 

              Modified=TRUE;

          }

          return TRUE;

     case WM_TIMER:

          if (wParam == 1) {

              Node=TreeView_GetDropHilight(hPrjTree);

              if ((Node != NULL) && (Node == hTarget)) {

                   ImageList_DragShowNolock(FALSE);

                   TreeView_Expand(hPrjTree,hTarget,TVE_EXPAND);

                   UpdateWindow(hPrjTree);

                   ImageList_DragShowNolock(TRUE);

              }

          }

          if (wParam == 2) {

              SendMessage(hPrjTree,WM_VSCROLL,MAKEWPARAM(SB_LINEUP,0),NULL);

          }

          if (wParam == 3) {

              SendMessage(hPrjTree,WM_VSCROLL,MAKEWPARAM(SB_LINEDOWN,0),NULL);

          }

          return TRUE;

     case WM_NOTIFY:

          LPNMHDR hdr;

          LPNMTREEVIEW ntv;

          LPNMTVDISPINFO ndi;

          hdr=(LPNMHDR)lParam;

          ntv=(LPNMTREEVIEW)lParam;

          ndi=(LPNMTVDISPINFO)lParam;

          if (hdr->hwndFrom == hPrjTree) {

              switch (hdr->code) {

              case TVN_BEGINDRAG:

                   hDrag=ntv->itemNew.hItem;

                   if (hDrag == TreeView_GetRoot(hPrjTree)) {

                        return TRUE;

                   }

                   himl=TreeView_CreateDragImage(hPrjTree,hDrag);

 

                   TreeView_GetItemRect(hPrjTree,hDrag,&rt,TRUE);

                   hotx=ntv->ptDrag.x-(rt.left-18);

                   hoty=ntv->ptDrag.y-rt.top;

                   ImageList_BeginDrag(himl,0,hotx,hoty);

 

                   pt.x=ntv->ptDrag.x;

                   pt.y=ntv->ptDrag.y;

                   ClientToScreen(hDlg,&pt);

                   ImageList_DragEnter(NULL,pt.x,pt.y);

 

                   SetCapture(hDlg);

                   bDrag=TRUE;

                   return TRUE;

              case TVN_SELCHANGED:

                   TV.mask=TVIF_IMAGE;

                   TV.hItem=ntv->itemNew.hItem;

                   TreeView_GetItem(hPrjTree,&TV);

                   if (TV.iImage == DGI_FILE || TV.iImage == DGI_FOLDER) {

                        EnableWindow(GetDlgItem(hDlg,IDC_BTNPRJFILE),FALSE);

                        EnableWindow(GetDlgItem(hDlg,IDC_BTNPRJFTP),FALSE);

                        EnableWindow(GetDlgItem(hDlg,IDC_BTNPRJHTTP),FALSE);

                        EnableWindow(GetDlgItem(hDlg,IDC_BTNPRJDELETE),TRUE);

                        EnableWindow(GetDlgItem(hDlg,IDC_BTNPRJSUB),FALSE);

                        EnableWindow(GetDlgItem(hDlg,IDC_BTNPRJFOLDER),FALSE);

                        EnableWindow(GetDlgItem(hDlg,IDC_BTNPRJRENAME),FALSE);

                   } else {

                        EnableWindow(GetDlgItem(hDlg,IDC_BTNPRJFILE),TRUE);

                        EnableWindow(GetDlgItem(hDlg,IDC_BTNPRJFTP),TRUE);

                        EnableWindow(GetDlgItem(hDlg,IDC_BTNPRJHTTP),TRUE);

                        EnableWindow(GetDlgItem(hDlg,IDC_BTNPRJSUB),TRUE);

                        EnableWindow(GetDlgItem(hDlg,IDC_BTNPRJFOLDER),TRUE);

                        if (TreeView_GetParent(hPrjTree,ntv->itemNew.hItem)==NULL) {

                             EnableWindow(GetDlgItem(hDlg,IDC_BTNPRJDELETE),FALSE);

                             EnableWindow(GetDlgItem(hDlg,IDC_BTNPRJRENAME),FALSE);

                        } else {

                             EnableWindow(GetDlgItem(hDlg,IDC_BTNPRJDELETE),TRUE);

                             EnableWindow(GetDlgItem(hDlg,IDC_BTNPRJRENAME),TRUE);

                        }

                   }

                   return TRUE;

              case TVN_BEGINLABELEDIT:

                   TV.mask=TVIF_IMAGE;

                   TV.hItem=ndi->item.hItem;

                   TreeView_GetItem(hPrjTree,&TV);

                   if (TV.iImage == DGI_SUB) {

                        SendMessage(TreeView_GetEditControl(hPrjTree),EM_LIMITTEXT,32,0);

                        SetWindowLong(hDlg,DWL_MSGRESULT,FALSE);

                   } else {

                        SetWindowLong(hDlg,DWL_MSGRESULT,TRUE);

                   }

                   return TRUE;

              case TVN_ENDLABELEDIT:

                   if (ndi->item.pszText == NULL) {

                        SetWindowLong(hDlg,DWL_MSGRESULT,FALSE);

                   } else {

                        if (strchr(ndi->item.pszText,¡¯:¡¯) || strchr(ndi->item.pszText,¡¯\\¡¯)) {

                             MessageBox(hDlg,"¹­À½ À̸§¿¡ :°ú \\´Â ¾µ ¼ö ¾ø½À´Ï´Ù.","¾Ë¸²",MB_OK);

                             SetWindowLong(hDlg,DWL_MSGRESULT,FALSE);

                        } else {

                             SetWindowLong(hDlg,DWL_MSGRESULT,TRUE);

                             Modified=TRUE;

                        }

                   }

                   return TRUE;

              case TVN_DELETEITEM:

                   if (ntv->itemOld.lParam) {

                        free((LPVOID)ntv->itemOld.lParam);

                   }

                   return TRUE;

              case NM_DBLCLK:

                   Node=TreeView_GetSelection(hPrjTree);

                   if (Node) {

                        TV.mask=TVIF_IMAGE;

                        TV.hItem=Node;

                        TreeView_GetItem(hFileTree,&TV);

                        if (TV.iImage==DGI_FILE) {

                             GetProjectNodePath(hDlg,hPrjTree,Node,Path);

                             OpenFromFile(Path);

                             TabCtrl_SetCurSel(hFileTab,FindFileTab(Path));

                        }

                   }

                   return TRUE;

              case TVN_KEYDOWN:

                   switch (((NMTVKEYDOWN *)lParam)->wVKey) {

                   case VK_DELETE:

                        if (IsWindowEnabled(GetDlgItem(hDlg,IDC_BTNPRJDELETE))) {

                             SendMessage(hDlg,WM_COMMAND,MAKEWPARAM(IDC_BTNPRJDELETE,BN_CLICKED),0);

                        }

                        break;

                   case VK_F2:

                        SendMessage(hDlg,WM_COMMAND,MAKEWPARAM(IDC_BTNPRJRENAME,BN_CLICKED),0);

                        break;

                   default:

                        break;

                   }

                   return TRUE;

              }

              return FALSE;

          }

     }

     return FALSE;

}

 

void RePathProject(HANDLE hFile,TCHAR *Project,BOOL bAbsolute)

{

     ProjectRecord *Record;

     DWORD Size;

     LPVOID buf;

     int i,len;

     TCHAR Drive[_MAX_DRIVE];

     TCHAR Dir[_MAX_DIR];

     DWORD dwRead, dwWritten;

     TCHAR szTemp[MAX_PATH];

 

     Size=GetFileSize(hFile,NULL)-sizeof(ProjectHeader);

     buf=malloc(Size);

     ReadFile(hFile,buf,Size,&dwRead,NULL);

     Record=(ProjectRecord *)buf;

     _splitpath(Project,Drive,Dir,NULL,NULL);

     len=lstrlen(Drive)+lstrlen(Dir);

 

     for (i=0;;i++) {

          if (lstrlen(Record[i].Path)==0) {

              break;

          }

          if (bAbsolute) {

              if (strchr(Record[i].Path,¡¯:¡¯) == NULL) {

                   wsprintf(szTemp,"%s%s%s",Drive,Dir,Record[i].Path);

                   lstrcpy(Record[i].Path,szTemp);

              }

          } else {

              if (strnicmp(Record[i].Path,Project,len) == 0) {

                   lstrcpy(szTemp,Record[i].Path+len);

                   lstrcpy(Record[i].Path,szTemp);

              }

          }

     }

 

     SetFilePointer(hFile,sizeof(ProjectHeader),NULL,FILE_BEGIN);

     WriteFile(hFile,buf,Size,&dwWritten,NULL);

     free(buf);

}

 

BOOL CALLBACK DgNewProjectProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     OPENFILENAME OFN;

     TCHAR lpstrFile[MAX_PATH]="";

     ProjectHeader Header;

     ProjectRecord Node;

     static TCHAR *Project;

     HANDLE hFile;

     DWORD dwRead, dwWritten;

     static BOOL OldAbsolute, bNew;

 

     switch(iMessage)

     {

     case WM_INITDIALOG:

          MoveToParentCenter(hDlg);

          Project=(TCHAR *)lParam;

          SendDlgItemMessage(hDlg,IDC_PRJNEWFILE,EM_LIMITTEXT,MAX_PATH-1,0);

          SendDlgItemMessage(hDlg,IDC_PRJNEWFILE,EM_LIMITTEXT,31,0);

          SendDlgItemMessage(hDlg,IDC_PRJNEWFILE,EM_LIMITTEXT,127,0);

 

          if (lstrlen(Project) != 0) {

              SetWindowText(hDlg,"ÇÁ·ÎÁ§Æ® Á¤º¸ ¼öÁ¤");

              hFile=CreateFile(Project,GENERIC_READ,0,NULL,

                   OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

               if (hFile==INVALID_HANDLE_VALUE) {

              }

              ReadFile(hFile,&Header,sizeof(Header),&dwRead,NULL);

              CloseHandle(hFile);

              SetDlgItemText(hDlg,IDC_PRJNEWFILE,Project);

              SetDlgItemText(hDlg,IDC_PRJNEWNAME,Header.Name);

              SetDlgItemText(hDlg,IDC_PRJNEWDESC,Header.Desc);

              CheckRadioButton(hDlg,IDC_PRJABSOLUTE, IDC_PRJRELATIVE,

                   Header.bAbsolute ? IDC_PRJABSOLUTE : IDC_PRJRELATIVE);

              OldAbsolute=Header.bAbsolute;

              EnableWindow(GetDlgItem(hDlg,IDC_PRJNEWFILE),FALSE);

              EnableWindow(GetDlgItem(hDlg,IDC_BTNBRPROJECT),FALSE);

              bNew=FALSE;

          } else {

              SetWindowText(hDlg,"»õ ÇÁ·ÎÁ§Æ®");

              SetDlgItemText(hDlg,IDC_PRJNEWFILE,"À̸§°ú ÀúÀå À§Ä¡¸¦ ¸ÕÀú ¼±ÅÃÇØÁֽʽÿÀ. ->");

              EnableWindow(GetDlgItem(hDlg,IDC_PRJNEWNAME),FALSE);

              EnableWindow(GetDlgItem(hDlg,IDC_PRJNEWDESC),FALSE);

              EnableWindow(GetDlgItem(hDlg,IDC_PRJABSOLUTE),FALSE);

              EnableWindow(GetDlgItem(hDlg,IDC_PRJRELATIVE),FALSE);

              CheckRadioButton(hDlg,IDC_PRJABSOLUTE,IDC_PRJRELATIVE,IDC_PRJRELATIVE);

              bNew=TRUE;

              SetFocus(GetDlgItem(hDlg,IDC_BTNBRPROJECT));

              return FALSE;

          }

          return TRUE;

     case WM_COMMAND:

          switch (LOWORD(wParam))   {

          case IDC_BTNBRPROJECT:

              memset(&OFN, 0, sizeof(OPENFILENAME));

              OFN.lStructSize = sizeof(OPENFILENAME);

              OFN.hwndOwner=hDlg;

              OFN.lpstrFilter="´ç±Ù ÇÁ·ÎÁ§Æ®(*.dgp)\0*.dgp*\0";

              OFN.lpstrTitle="»õ·Î ¸¸µé ÇÁ·ÎÁ§Æ®ÀÇ ÀúÀå À§Ä¡¿Í À̸§À» ¼±ÅÃÇϽʽÿÀ";

              OFN.lpstrFile=lpstrFile;

              OFN.nMaxFile=MAX_PATH;

              OFN.lpstrDefExt="dgp";

              if (GetSaveFileName(&OFN)==TRUE) {

                   SetDlgItemText(hDlg,IDC_PRJNEWFILE,lpstrFile);

                   EnableWindow(GetDlgItem(hDlg,IDC_PRJNEWNAME),TRUE);

                   EnableWindow(GetDlgItem(hDlg,IDC_PRJNEWDESC),TRUE);

                   EnableWindow(GetDlgItem(hDlg,IDC_PRJABSOLUTE),TRUE);

                   EnableWindow(GetDlgItem(hDlg,IDC_PRJRELATIVE),TRUE);

              }

              return TRUE;

          case IDOK:

              if (bNew) {

                   GetDlgItemText(hDlg,IDC_PRJNEWFILE,Project,MAX_PATH);

                   if (lstrlen(Project)==0) {

                        MessageBox(hDlg,"ÇÁ·ÎÁ§Æ®ÀÇ ÀúÀå °æ·Î¸¦ ¼±ÅÃÇØ ÁֽʽÿÀ.","¾Ë¸²",MB_OK);

                        return TRUE;

                   }

                   if (_access(Project,0)==0) {

                        if (MessageBox(hDlg,"ÇÁ·ÎÁ§Æ® ÆÄÀÏÀÌ ÀÌ¹Ì ÀÖ½À´Ï´Ù. µ¤¾î ¾²½Ã°Ú½À´Ï±î?",

                             "Áú¹®",MB_YESNO)==IDNO)

                             return TRUE;

                   }

              }

 

              memset(&Header,0,sizeof(Header));

              lstrcpy(Header.Text, "´ç±Ù ÆíÁý±âÀÇ ÇÁ·ÎÁ§Æ® ÆÄÀÏÀÔ´Ï´Ù");

              Header.Ver=100;

              GetDlgItemText(hDlg,IDC_PRJNEWNAME,Header.Name,32);

              if (lstrlen(Header.Name)==0) {

                   MessageBox(hDlg,"ÇÁ·ÎÁ§Æ®ÀÇ À̸§Àº ¹Ýµå½Ã ÀÔ·ÂÇØ¾ß ÇÕ´Ï´Ù","¾Ë¸²",MB_OK);

                   return TRUE;

              }

              if (strchr(Header.Name,¡¯:¡¯) || strchr(Header.Name,¡¯\\¡¯)) {

                   MessageBox(hDlg,"ÇÁ·ÎÁ§Æ®ÀÇ À̸§¿¡ :°ú \\´Â ¾µ ¼ö ¾ø½À´Ï´Ù.","¾Ë¸²",MB_OK);

                   return TRUE;

              }

              GetDlgItemText(hDlg,IDC_PRJNEWDESC,Header.Desc,128);

              Header.bAbsolute=IsDlgButtonChecked(hDlg,IDC_PRJABSOLUTE);

 

              if (bNew) {

                   hFile=CreateFile(Project,GENERIC_WRITE,0,NULL,

                        CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

              } else {

                   hFile=CreateFile(Project,GENERIC_WRITE | GENERIC_READ,0,NULL,

                        OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

              }

 

              WriteFile(hFile,&Header,sizeof(Header),&dwWritten,NULL);

 

              if (bNew) {

                   memset(&Node,0,sizeof(Node));

                   WriteFile(hFile,&Node,sizeof(Node),&dwRead,NULL);

              } else if (Header.bAbsolute != OldAbsolute) {

                   RePathProject(hFile,Project,Header.bAbsolute);

              }

              CloseHandle(hFile);

              EndDialog(hDlg,IDOK);

              return TRUE;

          case IDCANCEL:

              EndDialog(hDlg,IDCANCEL);

              return TRUE;

          }

          return FALSE;

     }

     return FALSE;

}

 

BOOL OpenProject(HWND hDlg,TCHAR *Project,BOOL &bAbsolute)

{

     ProjectHeader Header;

     ProjectRecord *Record;

     HANDLE hFile;

     DWORD dwRead;

     DWORD Size;

     LPVOID buf;

     HWND hPrjTree;

     TVITEM TV;

     TVINSERTSTRUCT TI;

     HTREEITEM hChild, hChild2, hRoot;

 

     hPrjTree=GetDlgItem(hDlg,IDC_PRJTREE);

     hFile=CreateFile(Project,GENERIC_READ,0,NULL,

          OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

     if (hFile==INVALID_HANDLE_VALUE) {

          MessageBox(hDlg,"ÇÁ·ÎÁ§Æ® ÆÄÀÏÀ» ¿­ ¼ö ¾ø½À´Ï´Ù","¾Ë¸²",MB_OK);

          return FALSE;

     }

     Size=GetFileSize(hFile,NULL);

     buf=malloc(Size);

     ReadFile(hFile,buf,Size,&dwRead,NULL);

     CloseHandle(hFile);

 

     memcpy(&Header,buf,sizeof(Header));

     if (strnicmp(Header.Text,"´ç±Ù",4) != 0 || Header.Ver != 100) {

          MessageBox(hDlg,"´ç±Ù 1.0ÀÇ ÇÁ·ÎÁ§Æ® ÆÄÀÏÀÌ ¾Æ´Õ´Ï´Ù","¾Ë¸²",MB_OK);

          free(buf);

          return FALSE;

     }

     SetDlgItemText(hDlg,IDC_PRJFILE,Project);

     SetDlgItemText(hDlg,IDC_PRJNAME,Header.Name);

     SetDlgItemText(hDlg,IDC_PRJDESC,Header.Desc);

     bAbsolute=Header.bAbsolute;

 

     Record=(ProjectRecord *)((BYTE *)buf+sizeof(Header));

         

     hRoot=TreeView_GetRoot(hPrjTree);

     if (hRoot) {

          hChild=TreeView_GetChild(hPrjTree,hRoot);

 

          while (hChild) {

              hChild2=TreeView_GetNextSibling(hPrjTree,hChild);

              TreeView_DeleteItem(hPrjTree,hChild);

              hChild=hChild2;

          }

          TV.mask=TVIF_TEXT;

          TV.pszText=Header.Name;

          TV.hItem=hRoot;

          TreeView_SetItem(hPrjTree,&TV);

     } else {

          TI.hParent=TVI_ROOT;

          TI.hInsertAfter=TVI_LAST;

          TI.item.mask=TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;

          TI.item.iImage=DGI_PROJECT;

          TI.item.iSelectedImage=DGI_PROJECTSEL;

          TI.item.pszText=Header.Name;

          hRoot=TreeView_InsertItem(hPrjTree, &TI);

     }

     InsertProjectRecord(hPrjTree,Record,(HTREEITEM)hRoot,-1);

 

     TreeView_SelectItem(hPrjTree,hRoot);

     TreeView_Expand(hPrjTree,hRoot,TVE_EXPAND);

     EnableWindow(GetDlgItem(hDlg,IDC_BTNPRJEDIT),TRUE);

     EnableWindow(GetDlgItem(hDlg,IDC_BTNPRJTEST),TRUE);

     free(buf);

     return TRUE;

}

 

void InsertProjectRecord(HWND hTree,ProjectRecord *Record,HTREEITEM pNode,int pid)

{

     TVINSERTSTRUCT TI;

     TVITEM TV;

     HTREEITEM Node;

     TCHAR EncPath[MAX_PATH];

     TCHAR Text[MAX_PATH];

     int i;

 

     for (i=0;;i++) {

          if (lstrlen(Record[i].Path) == 0) {

              return;

          }

          if (Record[i].Parent==pid) {

              TI.hParent=pNode;

              TI.hInsertAfter=TVI_LAST;

              TI.item.mask=TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;

               switch (Record[i].Type) {

              case DGP_SUB:

                   TI.item.iImage=DGI_SUB;

                   TI.item.iSelectedImage=DGI_SUBSEL;

                   break;

              case DGP_FILE:

                   TI.item.iImage=DGI_FILE;

                   TI.item.iSelectedImage=DGI_FILESEL;

                   break;

              case DGP_FOLDER:

                   TI.item.iImage=DGI_FOLDER;

                   TI.item.iSelectedImage=DGI_FOLDERSEL;

                   break;

              }

              if (strnicmp(Record[i].Path,"Enco",4)==0) {

                   DecodeText(Record[i].Path,Text);

                   EncodePath(Text,EncPath);

                   TI.item.lParam=(LPARAM)malloc(MAX_PATH);

                   lstrcpy((TCHAR *)TI.item.lParam,Text);

              } else {

                   lstrcpy(EncPath,Record[i].Path);

                   TI.item.lParam=NULL;

              }

              TI.item.pszText=EncPath;

              Node=TreeView_InsertItem(hTree, &TI);

              if (Record[i].Type == DGP_SUB) {

                   InsertProjectRecord(hTree,Record,Node,i);

              }

               if (Record[i].Type == DGP_FOLDER && hTree==hFileTree) {

                   TV.mask=TVIF_CHILDREN;

                   TV.hItem=Node;

                   TV.cChildren=1;

 

                   TreeView_SetItem(hFileTree,&TV);

              }

          }

     }

}

 

void AddFileToProject(HWND hDlg,TCHAR *Path,BOOL bAbsolute)

{

     HTREEITEM Node;

     TVINSERTSTRUCT TI;

     HWND hPrjTree;

     TVITEM TV;

     TCHAR Project[MAX_PATH];

     TCHAR Drive[_MAX_DRIVE];

     TCHAR Dir[_MAX_DIR];

     TCHAR Text[MAX_PATH];

     TCHAR EncPath[MAX_PATH];

     TCHAR Mes[512];

 

     hPrjTree=GetDlgItem(hDlg,IDC_PRJTREE);

 

     Node=TreeView_GetSelection(hPrjTree);

     if (Node==NULL) {

          Node=TreeView_GetRoot(hPrjTree);

     }

     TV.mask=TVIF_IMAGE;

     TV.hItem=Node;

     TreeView_GetItem(hPrjTree,&TV);

     if (TV.iImage != DGI_PROJECT && TV.iImage != DGI_SUB) {

          Node=TreeView_GetRoot(hPrjTree);

     }

 

     if (bAbsolute) {

          lstrcpy(Text,Path);

     } else {

          GetDlgItemText(hDlg,IDC_PRJFILE,Project,MAX_PATH);

          _splitpath(Project,Drive,Dir,NULL,NULL);

          if (strnicmp(Path,Project,lstrlen(Drive)+lstrlen(Dir)) == 0) {

              lstrcpy(Text,Path+lstrlen(Drive)+lstrlen(Dir));

          } else {

              lstrcpy(Text,Path);

          }

     }

 

     EncodePath(Text,EncPath);

 

     if (FindTreeItem(hPrjTree,TreeView_GetRoot(hPrjTree),EncPath)) {

          wsprintf(Mes,"%s ÆÄÀÏÀº ÀÌ¹Ì µî·ÏµÇ¾î ÀÖ½À´Ï´Ù",EncPath);

          MessageBox(hDlg,Mes,"¾Ë¸²",MB_OK);

          return;

     }

 

     TI.hParent=Node;

     TI.hInsertAfter=TVI_LAST;

     TI.item.mask=TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;

     if (strnicmp(Path,"http",4) != 0 && strnicmp(Path,"ftp",3) != 0 &&

          (GetFileAttributes(Path) & FILE_ATTRIBUTE_DIRECTORY) != 0) {

          TI.item.iImage=DGI_FOLDER;

          TI.item.iSelectedImage=DGI_FOLDERSEL;

     } else {

          TI.item.iImage=DGI_FILE;

          TI.item.iSelectedImage=DGI_FILESEL;

     }

     TI.item.pszText=EncPath;

     if (strnicmp(Text,"ftp",3)==0) {

          TI.item.lParam=(LPARAM)malloc(MAX_PATH);

          lstrcpy((TCHAR *)TI.item.lParam,Text);

     } else {

          TI.item.lParam=NULL;

     }

     Node=TreeView_InsertItem(hPrjTree, &TI);

     TreeView_EnsureVisible(hPrjTree,Node);

}

 

void SaveProject(HWND hDlg, TCHAR *Project)

{

     ProjectHeader Header;

     ProjectRecord Record;

     HANDLE hFile;

     DWORD dwWritten;

 

     hFile=CreateFile(Project,GENERIC_READ,0,NULL,

          OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

     ReadFile(hFile,&Header,sizeof(Header),&dwWritten,NULL);

     CloseHandle(hFile);

 

     hFile=CreateFile(Project,GENERIC_WRITE,0,NULL,

          CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

     WriteFile(hFile,&Header,sizeof(Header),&dwWritten,NULL);

 

     SaveProjectRecord(hDlg,hFile,(HTREEITEM)NULL,-1);

 

     memset(&Record,0,sizeof(Record));

     WriteFile(hFile,&Record,sizeof(Record),&dwWritten,NULL);

     CloseHandle(hFile);

}

 

void SaveProjectRecord(HWND hDlg, HANDLE hFile,HTREEITEM hParent,int pid)

{

     ProjectRecord Record;

     HTREEITEM hChild;

     TVITEM TV;

     TCHAR Text[MAX_PATH];

     int self;

     static int id;

     DWORD dwWritten;

     HWND hPrjTree;

 

     hPrjTree=GetDlgItem(hDlg,IDC_PRJTREE);

 

     if (hParent==NULL) {

          hParent=TreeView_GetRoot(hPrjTree);

          id=0;

          self=pid;

     } else {

          memset(&Record,0,sizeof(Record));

          Record.Parent=pid;

          Record.Type=1;

          TV.mask=TVIF_TEXT;

          TV.hItem=hParent;

          TV.pszText=Text;

          TV.cchTextMax=MAX_PATH;

          TreeView_GetItem(hPrjTree,&TV);

          lstrcpy(Record.Path,Text);

          WriteFile(hFile,&Record,sizeof(Record),&dwWritten,NULL);

          self=id;

          id++;

     }

 

     hChild=TreeView_GetChild(hPrjTree,hParent);

     while (hChild) {

          TV.mask=TVIF_TEXT | TVIF_IMAGE | TVIF_PARAM;

          TV.hItem=hChild;

          TV.pszText=Text;

          TV.cchTextMax=MAX_PATH;

          TreeView_GetItem(hPrjTree,&TV);

 

          if (TV.iImage == DGI_FILE || TV.iImage == DGI_FOLDER) {

              memset(&Record,0,sizeof(Record));

              Record.Parent=self;

              if (TV.iImage == DGI_FILE) {

                   Record.Type=DGP_FILE;

              } else {

                   Record.Type=DGP_FOLDER;

              }

              if (strnicmp(Text,"ftp",3) == 0) {

                   EncodeText((TCHAR *)TV.lParam,Text);

              }

              lstrcpy(Record.Path,Text);

 

              WriteFile(hFile,&Record,sizeof(Record),&dwWritten,NULL);

              id++;

          } else {

              SaveProjectRecord(hDlg,hFile,hChild,self);

          }

          hChild=TreeView_GetNextSibling(hPrjTree,hChild);

     }

}

 

BOOL LoadProject(TCHAR *Project,BOOL bUpdate)

{

     ProjectHeader Header;

     ProjectRecord *Record;

     HANDLE hFile;

     DWORD Size,dwRead;

     LPVOID buf;

     TVINSERTSTRUCT TI;

     HTREEITEM hRoot, hChild, hPrev;

     TVITEM TV;

 

     hPrev=TVI_LAST;

     hChild=TreeView_GetRoot(hFileTree);

     while (hChild) {

          TV.mask=TVIF_PARAM;

          TV.hItem=hChild;

          TreeView_GetItem(hFileTree,&TV);

          if (lstrcmpi((TCHAR *)TV.lParam,Project) == 0) {

              hPrev=TreeView_GetPrevSibling(hFileTree,hChild);

              if (hPrev==NULL) {

                   hPrev=TVI_FIRST;

              }

              TreeView_DeleteItem(hFileTree,hChild);

              break;

          }

          hChild=TreeView_GetNextSibling(hFileTree,hChild);

     }

 

     if (hChild == NULL && bUpdate==TRUE) {

          return TRUE;

     }

 

     hFile=CreateFile(Project,GENERIC_READ,0,NULL,

          OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

     if (hFile==INVALID_HANDLE_VALUE) {

          MessageBox(g_hFrameWnd,"ÇÁ·ÎÁ§Æ® ÆÄÀÏÀ» ¿­ ¼ö ¾ø½À´Ï´Ù","¾Ë¸²",MB_OK);

          return FALSE;

     }

     Size=GetFileSize(hFile,NULL);

     buf=malloc(Size);

     ReadFile(hFile,buf,Size,&dwRead,NULL);

     CloseHandle(hFile);

     memcpy(&Header,buf,sizeof(Header));

     if (strnicmp(Header.Text,"´ç±Ù",4) != 0 || Header.Ver != 100) {

          MessageBox(g_hFrameWnd,"´ç±Ù 1.0ÀÇ ÇÁ·ÎÁ§Æ® ÆÄÀÏÀÌ ¾Æ´Õ´Ï´Ù","¾Ë¸²",MB_OK);

          free(buf);

          return FALSE;

     }

     Record=(ProjectRecord *)((BYTE *)buf+sizeof(Header));

 

     TI.hParent=TVI_ROOT;

     TI.hInsertAfter=hPrev;

     TI.item.mask=TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;

     TI.item.iImage=DGI_PROJECT;

     TI.item.iSelectedImage=DGI_PROJECTSEL;

     TI.item.lParam=(LPARAM)malloc(MAX_PATH);

     lstrcpy((TCHAR *)TI.item.lParam,Project);

     TI.item.pszText=Header.Name;

     hRoot=TreeView_InsertItem(hFileTree, &TI);

 

     InsertProjectRecord(hFileTree,Record,(HTREEITEM)hRoot,-1);

     TreeView_Expand(hFileTree,hRoot,TVE_EXPAND);

     free(buf);

     return TRUE;

}

 

HTREEITEM FindTreeItem(HWND hTree, HTREEITEM hParent, TCHAR *Text)

{

     HTREEITEM hChild,hChild2;

     TVITEM TV;

     TCHAR ChildText[MAX_PATH];

 

     hChild=TreeView_GetChild(hTree,hParent);

     while (hChild) {

          TV.mask=TVIF_TEXT | TVIF_IMAGE;

          TV.hItem=hChild;

          TV.pszText=ChildText;

          TV.cchTextMax=MAX_PATH;

          TreeView_GetItem(hTree,&TV);

          if (lstrcmpi(Text,ChildText)==0) {

              return hChild;

          }

          if (TV.iImage == DGI_SUB) {

              hChild2=FindTreeItem(hTree,hChild,Text);

              if (hChild2) {

                   return hChild;

              }

          }

          hChild=TreeView_GetNextSibling(hTree,hChild);

     }

     return NULL;

}

 

int GetProjectNodePath(HWND hDlg,HWND hPrjTree,HTREEITEM hItem,TCHAR *Path)

{

     TVITEM TV;

     TCHAR Text[MAX_PATH];

     TCHAR Project[MAX_PATH];

     TCHAR Drive[_MAX_DRIVE];

     TCHAR Dir[_MAX_DIR];

 

     TV.mask=TVIF_TEXT | TVIF_IMAGE | TVIF_PARAM;

     TV.hItem=hItem;

     TV.pszText=Text;

     TV.cchTextMax=MAX_PATH;

     TreeView_GetItem(hPrjTree,&TV);

 

     if (TV.iImage == DGI_FILE || TV.iImage == DGI_FOLDER) {

          GetDlgItemText(hDlg,IDC_PRJFILE,Project,MAX_PATH);

          _splitpath(Project,Drive,Dir,NULL,NULL);

 

          if (strchr(Text,¡¯:¡¯) == NULL) {

              wsprintf(Path,"%s%s%s",Drive,Dir,Text);

          } else {

              if (strnicmp(Text,"ftp",3)==0) {

                   lstrcpy(Path,(TCHAR *)TV.lParam);

              } else {

                   lstrcpy(Path,Text);

              }

          }

     }

     return TV.iImage;

}

 

BOOL TestProjectValid(HWND hDlg, HTREEITEM hParent)

{

     HWND hPrjTree;

     HTREEITEM hChild;

     TCHAR Text[MAX_PATH];

     TCHAR Path[MAX_PATH];

     TCHAR Mes[512];

     BOOL bResult=TRUE, bValid;

     TCHAR *pDummy;

     int iImage;

 

     hPrjTree=GetDlgItem(hDlg,IDC_PRJTREE);

     if (hParent) {

          hChild=TreeView_GetChild(hPrjTree,hParent);

     } else {

          hChild=TreeView_GetChild(hPrjTree,TreeView_GetRoot(hPrjTree));

     }

 

     while (hChild) {

          bValid=TRUE;

          pDummy=NULL;

          iImage=GetProjectNodePath(hDlg,hPrjTree,hChild,Path);

          if (iImage==DGI_FILE || iImage==DGI_FOLDER) {

              if (strnicmp(Path,"ftp",3)==0) {

                   bValid=(DgFtpDown(Path,pDummy) != -1);

              } else if (strnicmp(Path,"http",4)==0) {

                   bValid=(DgHttpDown(Path,pDummy) != -1);

              } else {

                   bValid=(_access(Path,0) == 0);

               }

 

              if (!bValid) {

                   EncodePath(Path,Text);

                   wsprintf(Mes,"%s ÆÄÀÏÀÌ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù. ÀÌ ÆÄÀÏÀÌ »èÁ¦µÇ¾ú°Å³ª À̸§ÀÌ º¯°æµÇ¾ú½À´Ï´Ù"

                        "\r\n³×Æ®¿öÅ© ¹®Á¦·Î ÀÎÇÑ ÀϽÃÀûÀÎ Çö»óÀÏ ¼öµµ ÀÖ½À´Ï´Ù.",Text);

                   MessageBox(hDlg,Mes,"¾Ë¸²",MB_OK);

                   bResult=FALSE;

              } else {

                   if (pDummy)

                        free(pDummy);

              }

          } else if (iImage == DGI_SUB) {

              if (TestProjectValid(hDlg,hChild)==FALSE) {

                   bResult=FALSE;

              }

          }

          hChild=TreeView_GetNextSibling(hPrjTree,hChild);

     }

     return bResult;

}

 

HTREEITEM CopyTreeItem(HWND hTree, HTREEITEM hSrc, HTREEITEM hDest, BOOL bNext)

{

     HTREEITEM hNew;

     TVINSERTSTRUCT TI;

     TVITEM TV;

     TCHAR Text[MAX_PATH];

 

     TV.hItem=hSrc;

     TV.mask=TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;

     TV.pszText=Text;

     TV.cchTextMax=256;

     TreeView_GetItem(hTree,&TV);

 

     TI.itemex.mask=TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;

     TI.itemex.pszText=Text;

     if (TV.lParam) {

          TI.itemex.lParam=(LPARAM)malloc(MAX_PATH);

          lstrcpy((TCHAR *)TI.itemex.lParam, (TCHAR *)TV.lParam);

     } else {

          TI.itemex.lParam=NULL;

     }

     TI.itemex.iImage=TV.iImage;

     TI.itemex.iSelectedImage=TV.iSelectedImage;

     if (bNext) {

          TI.hParent=TreeView_GetParent(hTree,hDest);

          TI.hInsertAfter=hDest;

     } else {

          TI.hParent=hDest;

          TI.hInsertAfter=TVI_LAST;

     }

     hNew=TreeView_InsertItem(hTree,&TI);

     return hNew;

}

 

HTREEITEM CopyTreeItems(HWND hTree, HTREEITEM hSrc, HTREEITEM hDest,BOOL bNext)

{

     HTREEITEM hNew, hChild;

 

     hNew=CopyTreeItem(hTree, hSrc, hDest,bNext);

 

     hChild=TreeView_GetChild(hTree, hSrc);

     while (hChild != NULL) {

          CopyTreeItems(hTree,hChild, hNew,FALSE);

          hChild=TreeView_GetNextSibling(hTree,hChild);

     }

 

     return hNew;

}

 

ÇÏ´Â ÀÏÀÌ ¸¹´Ù º¸´Ï Äڵ尡 °áÄÚ ÂªÁö ¾ÊÀºµ¥ Ime1~ApiEdit4±îÁö ÀÛ¼ºÇÑ ÄÚµåÀÇ ¾ç°ú ¸Â¸Ô´Â Á¤µµ´Ù. ´ëºÎºÐÀÇ ÀÛ¾÷µéÀÌ Æ®¸® ºä¿¡¼­ ¼öÇàµÇ±â ¶§¹®¿¡ Æ®¸® ºäÀÇ Ç׸ñµéÀ» °ü¸®ÇÏ´Â ÄÚµåµéÀÌ ¸¹°í ±× ¿Ü ÇÁ·ÎÁ§Æ® ÆÄÀÏÀ» °ü¸®ÇÏ´Â Äڵ尡 ¾à°£ ÀÖ´Ù. Æ®¸® ºä¸¦ ÀÚÀ¯ ÀÚÀç·Î ¾µ ¼ö ÀÖ´Ù¸é ÀÌ Äڵ带 ÀÌÇØÇÏ´Â °ÍÀº ±×¸® ¾î·ÆÁö ¾ÊÀ» °ÍÀÌ´Ù.

ÀÌ Äڵ忡 ´ëÇؼ­´Â ´õ ÀÌ»óÀÇ ºÐ¼®À» ÇÏÁö ¾Ê´Â´Ù. ÀÌ·¸°Ô ±ä Äڵ尡 ÇѲ¨¹ø¿¡ Ãß°¡µÇ¸é »ó¼¼ÇÑ ºÐ¼® ´ë»óÀ¸·Î´Â ºÎÀûÇÕÇÏ´Ù. ½Ç½À Á¾¹ÝÀÎ ÀÌ ½ÃÁ¡¿¡¼­ ApiEdit1ó·³ ¼ø¼­´ë·Î Äڵ带 ÀÛ¼ºÇØ ³ª°¡¸é¼­ ÀÏÀÏÀÌ ¼³¸íÀ» ºÙÀÏ ¼öµµ ¾ø°í ±×·² ÇÊ¿äµµ ¾ø´Ù°í »ý°¢ÇÑ´Ù. ÀÌ Äڵ忡 ´ëÇÑ ¼³¸íÀ» Àаí Äڵ带 ÀÌÇØÇÒ ¼ö ÀÖ´Â »ç¶÷À̶ó¸é ¼³¸íÀÌ ¾ø¾îµµ Äڵ常À¸·Î ³í¸®¸¦ ÀÌÇØÇÒ ¼ö ÀÖ´Ù. ¹Ý¸é Äڵ带 º¸°í ³í¸®¸¦ ÀÌÇØÇÏÁö ¸øÇÏ´Â »ç¶÷Àº ¼³¸íÀÌ À־ ÀÌÇØÇϱ⠾î·Æ´Ù.

¾çÀÌ ¸¹±â´Â ÇÏÁö¸¸ º° Ưº°ÇÑ ±â¼úÀ» »ç¿ëÇÏ´Â °Íµµ ¾ø°í Áö±Ý±îÁö ÀÛ¼ºÇØ ¿Ô´ø ÄÚµåµé°ú ÁúÀûÀ¸·Î Ʋ¸®Áö ¾Ê´Ù. ÀÌ Äڵ忡 ´ëÇÑ ºÐ¼®Àº ¿©·¯ºÐ ½º½º·Î¿¡°Ô ¸Ã±â±â·Î ÇÑ´Ù. ÀÌ ÄÚµå´Â ÇÁ·ÎÁ§Æ® ÆÄÀÏÀ» °ü¸®ÇÏ´Â µ¶¸³µÈ ±â´ÉÀ» ±¸ÇöÇÏ°í ÀÖÀ¸¸ç ´Ù¸¥ ÄÚµå¿Í ÀÇÁ¸ÀûÀÌÁö ¾Ê´Â µ¶¸³¼ºÀ» °¡Áö°í ÀÖÀ¸¹Ç·Î ÇϳªÀÇ ¿¹Á¦¶ó°í »ý°¢ÇÏ°í ºÐ¼®Çغ¸¸é µÈ´Ù. ºÐ¸í ½±Áö´Â ¾ÊÀº ÀÏÀÌÁö¸¸ ½º½º·Î Äڵ带 ºÐ¼®Çغ¸´Â ¿¬½Àµµ ¹Ýµå½Ã ÇÊ¿äÇϹǷΠ±ÍÂú´Ù°í¸¸ »ý°¢ÇÏÁö ¸»°í ²À µµÀüÇغ¸±â ¹Ù¶õ´Ù.

ÇÁ·ÎÁ§Æ® °ü¸® ´ëÈ­»óÀÚ´Â ÀÌ¹Ì ¿Ï¼ºµÇ¾úÀ¸¸ç ¸ÞÀÎ À©µµ¿ìÀÇ OnCommand¿¡¼­ ÀÌ ´ëÈ­»óÀÚ¸¦ ºÒ·¯Áֱ⸸ ÇÏ¸é µÈ´Ù.

 

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

{

     ....

     case IDM_FILE_PROJECT:

          DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_PROJECT),

              g_hFrameWnd, DgProjectProc,(LPARAM)NULL);

          break;

 

lParamÀ¸·Î ÆíÁýÇÒ ÇÁ·ÎÁ§Æ® ÆÄÀÏÀÇ °æ·Î¸¦ ¾Ë·Á ÁÖµÇ NULLÀ̸é ÆíÁý ´ë»ó¾øÀÌ ¿­¶ó´Â ¶æÀÌ´Ù. ÇÁ·ÎÁ§Æ® °ü¸® ´ëÈ­»óÀÚ´Â lParamÀ¸·Î Àü´ÞµÈ ÇÁ·ÎÁ§Æ®¸¦ ´ë»óÀ¸·Î µ¿ÀÛÇÑ´Ù. ¿©±â±îÁö Äڵ带 ÀÛ¼ºÇÑ ÈÄ ½ÇÇàÇغ¸¸é ÇÁ·ÎÁ§Æ® °ü¸®°¡ °¡´ÉÇÏ´Ù. CD-ROMÀÇ »ùÇà ÇÁ·ÎÁ§Æ®.dgp¸¦ ¿­¾î º¸¸é ÇÁ·ÎÁ§Æ® ±¸¼ºÀ» º¼ ¼ö ÀÖ´Ù.