#include "stdafx.h" #include "XMLTreeFileDlgHelper.h" #include ///////////////// // test whether pathname is directory // #ifdef _UNICODE #define MYstat _wstat #else #define MYstat _stat #endif #ifdef _UNICODE #define XTREELPCTSTR LPCWSTR #else #define XTREELPCTSTR LPCSTR #endif static BOOL IsFolder(LPCTSTR strPathName) { char *szPath = NULL; #ifdef _UNICODE // Zyu modify on 100722,支持64位 //int iLen = 2*wcslen(strPathName);//CString,TCHAR汉字算一个字符,因此不用普通计算长度 INT_PTR iLen = 2*wcslen(strPathName);//CString,TCHAR汉字算一个字符,因此不用普通计算长度 szPath = new char[iLen+1]; wcstombs(szPath,strPathName,iLen+1);//转换成功返回为非负值 #else szPath = ""; #endif struct _stat st; BOOL bIs = _stat(szPath, &st)==0 && (st.st_mode & _S_IFDIR); #ifdef _UNICODE delete szPath; szPath = NULL; #endif return bIs; } CXMLTreeFileDlgHelper::CXMLTreeFileDlgHelper() { } CXMLTreeFileDlgHelper::~CXMLTreeFileDlgHelper() { } ////////////////// // Initialize: subclass appropriate windows // void CXMLTreeFileDlgHelper::Init(CFileDialog* pDlg) { // cubclass dialog ASSERT(pDlg); m_pDlg = pDlg; m_dlghook.HookWindow(pDlg); // subclass dialog's owner/parent CWnd* pWnd = pDlg->GetParent(); ASSERT(pWnd); pWnd = pWnd->GetParent(); ASSERT(pWnd); m_ownerhook.Init(pWnd, pDlg); // hook up m_dlghook.m_pHelper = this; m_ownerhook.m_pHelper = this; } ////////////////// // Get name of item -- what you see in the list control // CString CXMLTreeFileDlgHelper::GetItemName(int i) { return GetListCtrl()->GetItemText(i,0); } ////////////////// // Find out if item is a folder. // BOOL CXMLTreeFileDlgHelper::IsItemFolder(int i) { // Concatenate current folder name with item name to get full path name. // This won't work in general--the item could be a link or shell // object--but then IsFolder returns FALSE anyway, correctly. // CString path = m_pDlg->GetFolderPath(); int len = path.GetLength(); if (len==0 || path[len-1] != '\\') path += '\\'; path += GetItemName(i); return IsFolder(path); } ////////////////// // Get underlying list control // CListCtrl* CXMLTreeFileDlgHelper::GetListCtrl() { ASSERT(m_pDlg); CWnd* pWnd = m_pDlg->GetParent()->GetDlgItem(lst2); ASSERT(pWnd); CListCtrl* plc = (CListCtrl*)pWnd->GetDlgItem(1); ASSERT(plc); #ifdef DEBUG char classname[32]; ::GetClassName(plc->m_hWnd, classname, sizeof(classname)); ASSERT(strcmp(classname,"SysListView32")==0); #endif return plc; } ////////////////// // virtual window proc to trap dialog messages // LRESULT CFileDialogHook::WindowProc(UINT msg, WPARAM wp, LPARAM lp) { if (msg==WM_COMMAND || msg==WM_NOTIFY) { m_pHelper->m_bUpdateUI = TRUE; } return CXMLTreeSubclassWnd::WindowProc(msg, wp, lp); } void CFileDialogOwnerHook::Init(CWnd* pOwner, CFileDialog* pDlg) { HookWindow(pOwner); m_pDlg = pDlg; m_hwndParent = pDlg->GetParent()->m_hWnd; ASSERT(m_hwndParent); } ////////////////// // virtual window proc to trap dialog parent messages // LRESULT CFileDialogOwnerHook::WindowProc(UINT msg, WPARAM wp, LPARAM lp) { if (msg==WM_ENTERIDLE && (HWND)lp==m_hwndParent) { if (m_pHelper->m_bUpdateUI) { m_pDlg->UpdateDialogControls(m_pDlg, FALSE); m_pHelper->m_bUpdateUI=FALSE; } } return CXMLTreeSubclassWnd::WindowProc(msg, wp, lp); }