📄 filetreectrl.cpp
字号:
if (m_bWinNT)
{
if (m_pNTShareInfo)
{
for (DWORD i=0; i<m_dwShares && !bShared; i++)
{
CString sShare((LPWSTR) m_pNTShareInfo[i].shi502_path);
bShared = (sPath.CompareNoCase(sShare) == 0) && ((m_pNTShareInfo[i].shi502_type == STYPE_DISKTREE) || ((m_pNTShareInfo[i].shi502_type == STYPE_PRINTQ)));
}
}
}
else
{
if (m_pWin9xShareInfo)
{
for (DWORD i=0; i<m_dwShares && !bShared; i++)
{
CString sShare(m_pWin9xShareInfo[i].shi50_path);
bShared = (sPath.CompareNoCase(sShare) == 0) &&
((m_pWin9xShareInfo[i].shi50_type == STYPE_DISKTREE) || ((m_pWin9xShareInfo[i].shi50_type == STYPE_PRINTQ)));
}
}
}
return bShared;
}
CTreeFileCtrlThreadInfo::CTreeFileCtrlThreadInfo() : m_TerminateEvent(FALSE, TRUE)
{
m_pThread = NULL;
m_pTree = NULL;
m_nIndex = -1;
}
CTreeFileCtrlThreadInfo::~CTreeFileCtrlThreadInfo()
{
delete m_pThread;
}
IMPLEMENT_DYNCREATE(CTreeFileCtrl, CTreeCtrl)
BEGIN_MESSAGE_MAP(CTreeFileCtrl, CTreeCtrl)
//{{AFX_MSG_MAP(CTreeFileCtrl)
ON_COMMAND(ID_TREEFILECTRL_PROPERTIES, OnProperties)
ON_UPDATE_COMMAND_UI(ID_TREEFILECTRL_PROPERTIES, OnUpdateProperties)
ON_COMMAND(ID_TREEFILECTRL_RENAME, OnRename)
ON_UPDATE_COMMAND_UI(ID_TREEFILECTRL_RENAME, OnUpdateRename)
ON_COMMAND(ID_TREEFILECTRL_OPEN, OnOpen)
ON_UPDATE_COMMAND_UI(ID_TREEFILECTRL_OPEN, OnUpdateOpen)
ON_COMMAND(ID_TREEFILECTRL_DELETE, OnDelete)
ON_UPDATE_COMMAND_UI(ID_TREEFILECTRL_DELETE, OnUpdateDelete)
ON_COMMAND(ID_TREEFILECTRL_REFRESH, OnRefresh)
ON_COMMAND(ID_TREEFILECTRL_UPONELEVEL, OnUpOneLevel)
ON_UPDATE_COMMAND_UI(ID_TREEFILECTRL_UPONELEVEL, OnUpdateUpOneLevel)
ON_WM_CONTEXTMENU()
ON_WM_INITMENUPOPUP()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_WM_TIMER()
ON_COMMAND(ID_TREEFILECTRL_BACK, OnBack)
ON_UPDATE_COMMAND_UI(ID_TREEFILECTRL_BACK, OnUpdateBack)
ON_COMMAND(ID_TREEFILECTRL_FORWARD, OnForward)
ON_UPDATE_COMMAND_UI(ID_TREEFILECTRL_FORWARD, OnUpdateForward)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
ON_WM_CONTEXTMENU()
ON_NOTIFY_REFLECT_EX(NM_DBLCLK, OnDblclk)
ON_NOTIFY_REFLECT_EX(TVN_ITEMEXPANDING, OnItemExpanding)
ON_NOTIFY_REFLECT_EX(TVN_BEGINLABELEDIT, OnBeginLabelEdit)
ON_NOTIFY_REFLECT_EX(TVN_ENDLABELEDIT, OnEndLabelEdit)
ON_NOTIFY_REFLECT_EX(NM_RCLICK, OnRclick)
ON_NOTIFY_REFLECT_EX(TVN_BEGINDRAG, OnBeginDrag)
ON_NOTIFY_REFLECT_EX(NM_CUSTOMDRAW, OnCustomDraw)
ON_NOTIFY_REFLECT_EX(TVN_SELCHANGED, OnSelChanged)
ON_NOTIFY_REFLECT_EX(TVN_DELETEITEM, OnDeleteItem)
ON_MESSAGE(WM_TREEUPDATE_CHANGE, OnChange)
END_MESSAGE_MAP()
CTreeFileCtrl::CTreeFileCtrl() : CTreeCtrl()
{
m_sFileNameMask = _T("*.*");
m_dwFileHideFlags = FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM |
FILE_ATTRIBUTE_OFFLINE | FILE_ATTRIBUTE_TEMPORARY;
m_bShowCompressedUsingDifferentColor = TRUE;
m_rgbCompressed = RGB(0, 0, 255);
m_bShowEncryptedUsingDifferentColor = TRUE;
m_rgbEncrypted = RGB(255, 0, 0);
m_dwDriveHideFlags = 0;
m_bShowFiles = TRUE;
m_pilDrag = NULL;
m_hItemDrag = NULL;
m_hItemDrop = NULL;
m_hNetworkRoot = NULL;
m_TimerTicks = 0;
m_bAllowDragDrop = FALSE;
m_bAllowRename = FALSE;
m_bAllowOpen = TRUE;
m_bAllowProperties = TRUE;
m_bAllowDelete = FALSE;
m_nMaxHistory = 20;
m_bUpdatingHistorySelection = FALSE;
m_bAutoRefresh = TRUE;
m_bShowSharedUsingDifferentIcon = TRUE;
m_nTimerID = 0;
for (int i=0; i<26; i++)
m_dwMediaID[i] = 0xFFFFFFFF;
m_pMalloc = NULL;
m_pShellFolder = NULL;
m_bDisplayNetwork = TRUE;
m_FileExtensions = UseTheShellSetting;
m_dwNetworkItemTypes = RESOURCETYPE_ANY;
m_hMyComputerRoot = NULL;
m_bShowMyComputer = TRUE;
m_bShowRootedFolder = FALSE;
m_hRootedFolder = NULL;
m_bShowDriveLabels = TRUE;
}
CTreeFileCtrl::~CTreeFileCtrl()
{
}
int CTreeFileCtrl::CompareByFilenameNoCase(CString& element1, CString& element2)
{
return element1.CompareNoCase(element2);
}
#ifdef _DEBUG
void CTreeFileCtrl::AssertValid() const
{
CTreeCtrl::AssertValid();
}
void CTreeFileCtrl::Dump(CDumpContext& dc) const
{
CTreeCtrl::Dump(dc);
}
#endif //_DEBUG
void CTreeFileCtrl::SetShowFiles(BOOL bFiles)
{
m_bShowFiles = bFiles;
//Force a refresh
Refresh();
}
void CTreeFileCtrl::SetRootFolder(const CString& sPath)
{
m_sRootFolder = sPath;
//Ensure it is terminated with a "\"
int nLength = m_sRootFolder.GetLength();
if (nLength && m_sRootFolder.GetAt(nLength-1) != _T('\\'))
m_sRootFolder += _T('\\');
//Force a refresh
Refresh();
}
int CTreeFileCtrl::GetIconIndex(HTREEITEM hItem)
{
TV_ITEM tvi;
ZeroMemory(&tvi, sizeof(TV_ITEM));
tvi.mask = TVIF_IMAGE;
tvi.hItem = hItem;
if (GetItem(&tvi))
return tvi.iImage;
else
return -1;
}
int CTreeFileCtrl::GetIconIndex(const CString& sFilename)
{
//Retreive the icon index for a specified file/folder
SHFILEINFO sfi;
ZeroMemory(&sfi, sizeof(SHFILEINFO));
SHGetFileInfo(sFilename, 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
return sfi.iIcon;
}
int CTreeFileCtrl::GetSelIconIndex(const CString& sFilename)
{
//Retreive the icon index for a specified file/folder
SHFILEINFO sfi;
ZeroMemory(&sfi, sizeof(SHFILEINFO));
SHGetFileInfo(sFilename, 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_OPENICON | SHGFI_SMALLICON);
return sfi.iIcon;
}
int CTreeFileCtrl::GetIconIndex(LPITEMIDLIST lpPIDL)
{
SHFILEINFO sfi;
ZeroMemory(&sfi, sizeof(SHFILEINFO));
SHGetFileInfo((LPCTSTR)lpPIDL, 0, &sfi, sizeof(sfi), SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_LINKOVERLAY);
return sfi.iIcon;
}
int CTreeFileCtrl::GetSelIconIndex(LPITEMIDLIST lpPIDL)
{
SHFILEINFO sfi;
ZeroMemory(&sfi, sizeof(SHFILEINFO));
SHGetFileInfo((LPCTSTR)lpPIDL, 0, &sfi, sizeof(sfi), SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_OPENICON);
return sfi.iIcon;
}
int CTreeFileCtrl::GetSelIconIndex(HTREEITEM hItem)
{
TV_ITEM tvi;
ZeroMemory(&tvi, sizeof(TV_ITEM));
tvi.mask = TVIF_SELECTEDIMAGE;
tvi.hItem = hItem;
if (GetItem(&tvi))
return tvi.iSelectedImage;
else
return -1;
}
HTREEITEM CTreeFileCtrl::FindSibling(HTREEITEM hParent, const CString& sItem) const
{
HTREEITEM hChild = GetChildItem(hParent);
while (hChild)
{
CTreeFileCtrlItemInfo* pItem = (CTreeFileCtrlItemInfo*) GetItemData(hChild);
ASSERT(pItem);
if (pItem->m_sRelativePath.CompareNoCase(sItem) == 0)
return hChild;
hChild = GetNextItem(hChild, TVGN_NEXT);
}
return NULL;
}
CString CTreeFileCtrl::GetSelectedPath()
{
HTREEITEM hItem = GetSelectedItem();
if (hItem)
return ItemToPath(hItem);
else
return CString();
}
HTREEITEM CTreeFileCtrl::FindServersNode(HTREEITEM hFindFrom) const
{
if (m_bDisplayNetwork)
{
//Try to find some "servers" in the child items of hFindFrom
HTREEITEM hChild = GetChildItem(hFindFrom);
while (hChild)
{
CTreeFileCtrlItemInfo* pItem = (CTreeFileCtrlItemInfo*) GetItemData(hChild);
ASSERT(pItem);
if (pItem->m_pNetResource)
{
//Found a share
if (pItem->m_pNetResource->dwDisplayType == RESOURCEDISPLAYTYPE_SERVER)
return hFindFrom;
}
//Get the next sibling for the next loop around
hChild = GetNextSiblingItem(hChild);
}
//Ok, since we got here, we did not find any servers in any of the child nodes of this
//item. In this case we need to call ourselves recursively to find one
hChild = GetChildItem(hFindFrom);
while (hChild)
{
HTREEITEM hFound = FindServersNode(hChild);
if (hFound)
return hFound;
//Get the next sibling for the next loop around
hChild = GetNextSiblingItem(hChild);
}
}
//If we got as far as here then no servers were found.
return NULL;
}
void CTreeFileCtrl::SetHasPlusButton(HTREEITEM hItem, BOOL bHavePlus)
{
//Remove all the child items from the parent
TV_ITEM tvItem;
tvItem.hItem = hItem;
tvItem.mask = TVIF_CHILDREN;
tvItem.cChildren = bHavePlus;
SetItem(&tvItem);
}
BOOL CTreeFileCtrl::HasPlusButton(HTREEITEM hItem)
{
TVITEM tvItem;
tvItem.hItem = hItem;
tvItem.mask = TVIF_HANDLE | TVIF_CHILDREN;
return GetItem(&tvItem) && (tvItem.cChildren != 0);
}
HTREEITEM CTreeFileCtrl::SetSelectedPath(const CString& sPath, BOOL bExpanded)
{
CString sSearch(sPath);
int nSearchLength = sSearch.GetLength();
if (nSearchLength == 0)
{
TRACE(_T("Cannot select a empty path\n"));
return NULL;
}
//Remove trailing "\" from the path
if (nSearchLength > 3 && sSearch.GetAt(nSearchLength-1) == _T('\\'))
sSearch = sSearch.Left(nSearchLength-1);
//Remove initial part of path if the root folder is setup
int nRootLength = m_sRootFolder.GetLength();
if (nRootLength)
{
if (sSearch.Find(m_sRootFolder) != 0)
{
TRACE(_T("Could not select the path %s as the root has been configued as %s\n"), sPath, m_sRootFolder);
return NULL;
}
sSearch = sSearch.Right(sSearch.GetLength() - nRootLength);
}
if (sSearch.IsEmpty())
return NULL;
SetRedraw(FALSE);
HTREEITEM hItemFound = TVI_ROOT;
if (nRootLength && m_hRootedFolder)
hItemFound = m_hRootedFolder;
BOOL bDriveMatch = m_sRootFolder.IsEmpty();
BOOL bNetworkMatch = m_bDisplayNetwork && ((sSearch.GetLength() > 2) && sSearch.Find(_T("\\\\")) == 0);
if (bNetworkMatch)
{
bDriveMatch = FALSE;
//Working here
BOOL bHasPlus = HasPlusButton(m_hNetworkRoot);
BOOL bHasChildren = (GetChildItem(m_hNetworkRoot) != NULL);
if (bHasPlus && !bHasChildren)
DoExpand(m_hNetworkRoot);
else
Expand(m_hNetworkRoot, TVE_EXPAND);
hItemFound = FindServersNode(m_hNetworkRoot);
sSearch = sSearch.Right(sSearch.GetLength() - 2);
}
if (bDriveMatch)
{
if (m_hMyComputerRoot)
{
//Working here
BOOL bHasPlus = HasPlusButton(m_hMyComputerRoot);
BOOL bHasChildren = (GetChildItem(m_hMyComputerRoot) != NULL);
if (bHasPlus && !bHasChildren)
DoExpand(m_hMyComputerRoot);
else
Expand(m_hMyComputerRoot, TVE_EXPAND);
hItemFound = m_hMyComputerRoot;
}
}
int nFound = sSearch.Find(_T('\\'));
while (nFound != -1)
{
CString sMatch;
if (bDriveMatch)
{
sMatch = sSearch.Left(nFound + 1);
bDriveMatch = FALSE;
}
else
sMatch = sSearch.Left(nFound);
hItemFound = FindSibling(hItemFound, sMatch);
if (hItemFound == NULL)
break;
else if (!IsDrive(sPath))
{
SelectItem(hItemFound);
//Working here
BOOL bHasPlus = HasPlusButton(hItemFound);
BOOL bHasChildren = (GetChildItem(hItemFound) != NULL);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -