| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380 | 
							- //////////////////////////////////////////////////////////////////////////
 
- //PathDialog.h file
 
- //
 
- //Written by Nguyen Tan Hung <[email protected]>
 
- //////////////////////////////////////////////////////////////////////////
 
- #include "stdafx.h"
 
- #include "PathDialog.h"
 
- #include <io.h>
 
- #ifdef _DEBUG
 
- #define new DEBUG_NEW
 
- #undef THIS_FILE
 
- static char THIS_FILE[] = __FILE__;
 
- #endif
 
- #define IDC_FOLDERTREE		0x3741
 
- #define IDC_TITLE			0x3742
 
- #define IDC_STATUSTEXT		0x3743
 
- #define IDC_NEW_EDIT_PATH	0x3744
 
- // Class CDlgWnd
 
- BEGIN_MESSAGE_MAP(CPathDialogSub, CWnd)
 
-   ON_BN_CLICKED(IDOK, OnOK)
 
-   ON_EN_CHANGE(IDC_NEW_EDIT_PATH, OnChangeEditPath)
 
-   END_MESSAGE_MAP()
 
-   void CPathDialogSub::OnOK()
 
- {
 
-   ::GetWindowText(::GetDlgItem(m_hWnd, IDC_NEW_EDIT_PATH),
 
-                   m_pPathDialog->m_szPathName, MAX_PATH);
 
-   if(CPathDialog::MakeSurePathExists(m_pPathDialog->m_szPathName)==0)
 
-     {
 
-     m_pPathDialog->m_bGetSuccess=TRUE;
 
-     ::EndDialog(m_pPathDialog->m_hWnd, IDOK);
 
-     }
 
-   else
 
-     {
 
-     ::SetFocus(::GetDlgItem(m_hWnd, IDC_NEW_EDIT_PATH));
 
-     }
 
- }
 
- void CPathDialogSub::OnChangeEditPath()
 
- {
 
-   ::GetWindowText(::GetDlgItem(m_hWnd, IDC_NEW_EDIT_PATH),
 
-                   m_pPathDialog->m_szPathName, MAX_PATH);
 
-   BOOL bEnableOKButton = (_tcslen(m_pPathDialog->m_szPathName)>0);
 
-   SendMessage(BFFM_ENABLEOK, 0, bEnableOKButton);
 
- }
 
- /////////////////////////////////////////////////////////////////////////////
 
- // CPathDialog dialog
 
- CPathDialog::CPathDialog(LPCTSTR lpszCaption, 
 
-                          LPCTSTR lpszTitle, 
 
-                          LPCTSTR lpszInitialPath, 
 
-                          CWnd* pParent)
 
- {
 
-   m_hWnd=NULL;
 
-   m_PathDialogSub.m_pPathDialog= this;
 
-   m_bParentDisabled = FALSE;
 
-   // Get the true parent of the dialog
 
-   m_pParentWnd = CWnd::GetSafeOwner(pParent);
 
-   m_lpszCaption = lpszCaption;
 
-   m_lpszInitialPath = lpszInitialPath;
 
-   memset(&m_bi, 0, sizeof(BROWSEINFO) );
 
-   m_bi.hwndOwner = (m_pParentWnd==NULL)?NULL:m_pParentWnd->GetSafeHwnd();
 
-   m_bi.pszDisplayName = 0;
 
-   m_bi.pidlRoot = 0;
 
-   m_bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;
 
-   m_bi.lpfn = BrowseCallbackProc;
 
-   m_bi.lpszTitle = lpszTitle;
 
- }
 
- /////////////////////////////////////////////////////////////////////////////
 
- // CPathDialog message handlers
 
- CString CPathDialog::GetPathName()
 
- {
 
-   return CString(m_szPathName);
 
- }
 
- int CALLBACK CPathDialog::BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam, LPARAM pData) 
 
- {
 
-   CPathDialog* pDlg = (CPathDialog*)pData;
 
-   switch(uMsg) 
 
-     {
 
-     case BFFM_INITIALIZED: 
 
-     {
 
-     RECT rc;
 
-     HWND hEdit;
 
-     HFONT hFont;
 
-     pDlg->m_hWnd = hwnd;
 
-     if(pDlg->m_lpszCaption!=NULL)
 
-       {
 
-       ::SetWindowText(hwnd, pDlg->m_lpszCaption);
 
-       }
 
-     VERIFY(pDlg->m_PathDialogSub.SubclassWindow(hwnd));
 
-     ::ShowWindow(::GetDlgItem(hwnd, IDC_STATUSTEXT), SW_HIDE);
 
-     ::GetWindowRect(::GetDlgItem(hwnd, IDC_FOLDERTREE), &rc);
 
-     rc.bottom = rc.top - 4;
 
-     rc.top = rc.bottom - 23;
 
-     ::ScreenToClient(hwnd, (LPPOINT)&rc);
 
-     ::ScreenToClient(hwnd, ((LPPOINT)&rc)+1);
 
-     hEdit = ::CreateWindowEx(WS_EX_CLIENTEDGE, _T("EDIT"), _T(""),
 
-                              WS_CHILD|WS_TABSTOP|WS_VISIBLE|ES_AUTOHSCROLL,
 
-                              rc.left, rc.top, 
 
-                              rc.right-rc.left, rc.bottom-rc.top, 
 
-                              hwnd, NULL, NULL, NULL);
 
-     ::SetWindowLong(hEdit, GWL_ID, IDC_NEW_EDIT_PATH);
 
-     ::ShowWindow(hEdit, SW_SHOW);
 
-     hFont = (HFONT)::SendMessage(hwnd, WM_GETFONT, 0, 0);
 
-     ::SendMessage(hEdit, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0));
 
-     LPCTSTR lpszPath = pDlg->m_lpszInitialPath;
 
-     TCHAR szTemp[MAX_PATH];
 
-     if(lpszPath==NULL)
 
-       {
 
-       ::GetCurrentDirectory(MAX_PATH, szTemp );
 
-       lpszPath = szTemp;
 
-       }
 
-     // WParam is TRUE since you are passing a path.
 
-     // It would be FALSE if you were passing a pidl.
 
-     ::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,
 
-                   (LPARAM)lpszPath);
 
-     break;
 
-     }
 
-     case BFFM_SELCHANGED:
 
-     {
 
-     char szSelection[MAX_PATH];
 
-     if(!::SHGetPathFromIDList((LPITEMIDLIST)lParam, szSelection) ||
 
-        (szSelection[1] !=':' && szSelection[1] != '\\'))
 
-       {
 
-       szSelection[0] = '\0';
 
-       ::SendMessage(hwnd, BFFM_ENABLEOK, 0, FALSE);
 
-       }
 
-     else
 
-       {
 
-       ::SendMessage(hwnd, BFFM_ENABLEOK, 0, TRUE);
 
-       }
 
-     ::SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)szSelection);
 
-     ::SetWindowText(::GetDlgItem(hwnd, IDC_NEW_EDIT_PATH), szSelection);
 
-     break;
 
-     }
 
-     default:
 
-       break;
 
-     }
 
-   return 0;
 
- }
 
- int CPathDialog::DoModal() 
 
- {
 
-   /////////////////////////////////////////////////////////
 
-   TCHAR szPathTemp[MAX_PATH];
 
-   m_bi.lpfn = BrowseCallbackProc;  // address of callback function
 
-   m_bi.lParam = (LPARAM)this;      // pass address of object to callback function
 
-   m_bi.pszDisplayName = szPathTemp;
 
-   LPITEMIDLIST pidl;
 
-   LPMALLOC pMalloc;
 
-   int iResult=-1;
 
-   if(SUCCEEDED(SHGetMalloc(&pMalloc)))
 
-     {
 
-     m_bGetSuccess = FALSE;
 
-     pidl = SHBrowseForFolder(&m_bi);
 
-     if (pidl!=NULL) 
 
-       {
 
-       //not need do this because OnOK function did
 
-       //bSucceeded = SHGetPathFromIDList(pidl, m_szPathName);
 
-       // In C++: 
 
-       pMalloc->Free(pidl);
 
-       //In C:
 
-       //pMalloc->lpVtbl->Free(pMalloc,pidl);
 
-       //pMalloc->lpVtbl->Release(pMalloc);
 
-       }
 
-     if(m_bGetSuccess)
 
-       {
 
-       iResult = IDOK;
 
-       }
 
-     pMalloc->Release();
 
-     }
 
-   if(m_bParentDisabled && (m_pParentWnd!=NULL))
 
-     {
 
-     m_pParentWnd->EnableWindow(TRUE);
 
-     }
 
-   m_bParentDisabled=FALSE;
 
-   return iResult;
 
- }
 
- BOOL CPathDialog::IsFileNameValid(LPCTSTR lpFileName)
 
- {
 
-   return TRUE;
 
- }
 
- const TCHAR c_FolderDoesNotExist[] = _T(
 
-   "The folder:\n\n"
 
-   "%s\n\n"
 
-   "does not exist. Do you want the folder to be created?");
 
- const TCHAR c_szErrInvalidPath[] = _T(
 
-   "The folder:"
 
-   "\n\n"
 
-   "%s\n\n"
 
-   "is invalid. Please reenter.");
 
- const TCHAR c_szErrCreatePath[] = _T(
 
-   "The folder:"
 
-   "\n\n"
 
-   "%s"
 
-   "\n\ncan not be created. Please double check.");
 
- //return -1: user break;
 
- //return 0: no error
 
- //return 1: lpPath is invalid
 
- //return 2: can not create lpPath
 
- int CPathDialog::MakeSurePathExists(LPCTSTR lpPath)
 
- {
 
-   CString strMsg;
 
-   int iRet;
 
-   try
 
-     {
 
-     //validate path
 
-     iRet=Touch(lpPath, TRUE);
 
-     if(iRet!=0)
 
-       {
 
-       throw iRet;
 
-       }
 
-     if(_taccess(lpPath, 0)==0)
 
-       {
 
-       return (int)0;
 
-       }
 
-     strMsg.Format(c_FolderDoesNotExist, lpPath);
 
-     if(AfxMessageBox(strMsg, MB_YESNO|MB_ICONQUESTION) != IDYES)
 
-       {
 
-       return (int)-1;
 
-       }
 
-     //create path
 
-     iRet=Touch(lpPath, FALSE);
 
-     if(iRet!=0)
 
-       {
 
-       throw iRet; 
 
-       }
 
-     return 0;
 
-     }
 
-   catch(int nErrCode)
 
-     {
 
-     switch(nErrCode)
 
-       {
 
-       case 1:
 
-         strMsg.Format(c_szErrInvalidPath, lpPath);
 
-         break;
 
-       case 2:
 
-       default:
 
-         strMsg.Format(c_szErrCreatePath, lpPath);
 
-         break;
 
-       }
 
-     AfxMessageBox(strMsg, MB_OK|MB_ICONEXCLAMATION);
 
-     }
 
-   return iRet;
 
- }
 
- //return 0: no error
 
- //return 1: lpPath is invalid
 
- //return 2: lpPath can not be created(bValidate==FALSE)
 
- int CPathDialog::Touch(LPCTSTR lpPath, BOOL bValidate)
 
- {
 
-   if(lpPath==NULL)
 
-     {
 
-     return 1;
 
-     }
 
-   TCHAR szPath[MAX_PATH];
 
-   _tcscpy(szPath, lpPath);
 
-   int nLen = _tcslen(szPath);
 
-   int i;
 
-   if(nLen==3)
 
-     {
 
-     if(!bValidate)
 
-       {
 
-       if(_access(szPath, 0)!=0)
 
-         {
 
-         return 2;
 
-         }
 
-       }
 
-     return 0;
 
-     }
 
-   i = 3;
 
-   BOOL bLastOne=TRUE;
 
-   LPTSTR lpCurrentName;
 
-   while(szPath[i]!=0)
 
-     {
 
-     lpCurrentName = &szPath[i];
 
-     while( (szPath[i]!=0) && (szPath[i]!=_T('\\')) )
 
-       {
 
-       i++;
 
-       }
 
-     bLastOne =(szPath[i]==0);
 
-     szPath[i] = 0;
 
-     if(!bValidate)
 
-       {
 
-       CreateDirectory(szPath, NULL);
 
-       if(_taccess(szPath, 0)!=0)
 
-         {
 
-         return 2;
 
-         }
 
-       }
 
-     if(bLastOne)
 
-       {
 
-       break; //it's done
 
-       }
 
-     else
 
-       {
 
-       szPath[i] = _T('\\');
 
-       }
 
-     i++;
 
-     }
 
-   return (bLastOne?0:1);
 
- }
 
- //return 0: ok
 
- //return 1: error
 
- int CPathDialog::ConcatPath(LPTSTR lpRoot, LPCTSTR lpMorePath)
 
- {
 
-   if(lpRoot==NULL)
 
-     {
 
-     return 1;
 
-     }
 
-   int nLen = _tcslen(lpRoot);
 
-   if(nLen<3)
 
-     {
 
-     return 1;
 
-     }
 
-   if(lpMorePath==NULL)
 
-     {
 
-     return 0;
 
-     }
 
-   if(nLen==3)
 
-     {
 
-     _tcscat(lpRoot, lpMorePath);
 
-     return 0;
 
-     }
 
-   _tcscat(lpRoot, _T("\\"));
 
-   _tcscat(lpRoot, lpMorePath);
 
-   return 0;
 
- }
 
 
  |