This commit is contained in:
biosvos
2026-08-07 17:38:18 +09:00
commit 873193a243
9613 changed files with 2755992 additions and 0 deletions
@@ -0,0 +1,250 @@
// LocalTreeCtrl.cpp : implementation file
//
#include "stdafx.h"
#include "ConsoleApp.h"
#include "LocalTreeCtrl.h"
#include "MainFrm.h"
#include "LocalView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
BOOL DeleteDirectory(CString sDirectory);
/////////////////////////////////////////////////////////////////////////////
// CLocalTreeCtrl
CLocalTreeCtrl::CLocalTreeCtrl()
{
}
CLocalTreeCtrl::~CLocalTreeCtrl()
{
}
#ifdef _USE_XTREME_TOOLKITPRO
BEGIN_MESSAGE_MAP(CLocalTreeCtrl, CXTShellTreeCtrl)
#else // _USE_XTREME_TOOLKITPRO
BEGIN_MESSAGE_MAP(CLocalTreeCtrl, CTreeCtrl)
#endif // _USE_XTREME_TOOLKITPRO
//{{AFX_MSG_MAP(CLocalTreeCtrl)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLocalTreeCtrl message handlers
BOOL CLocalTreeCtrl::PreTranslateMessage(MSG* pMsg)
{
CMainFrame *pmf = (CMainFrame *)AfxGetMainWnd();
switch (pMsg->message)
{
case WM_SETFOCUS:
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
pmf->SetFocus(this);
break;
case WM_KEYDOWN:
if (GetKeyState(VK_CONTROL) & 128) {
if (pMsg->wParam == VK_D) {
DeleteSelectedItem();
return TRUE;
}
else if (pMsg->wParam == VK_V) {
if (PasteClipboard())
return TRUE;
}
}
break;
}
return CTreeCtrl::PreTranslateMessage(pMsg);
}
void CLocalTreeCtrl::DeleteSelectedItem()
{
#ifndef _USE_XTREME_TOOLKITPRO
IPTxShTreeNode* pnode = (IPTxShTreeNode*)get_SelectedNode();
if (((CLocalView*)GetParent())->m_pnodeRoot == pnode)
return;
if (AfxMessageBox("선택된 폴더를 삭제하시겠습니까?", MB_YESNO) != IDYES)
return;
VARIANT_BOOL bFileSystem;
pnode->get_IsFileSystem(&bFileSystem);
if (bFileSystem) {
BSTR bstr;
pnode->get_PathName(&bstr);
CString sPath(bstr);
::SysFreeString(bstr);
if (sPath == "")
return;
if (!DeleteDirectory(sPath))
return;
Refresh();
}
#endif // !_USE_XTREME_TOOLKITPRO
}
BOOL CLocalTreeCtrl::PasteClipboard()
{
CMainFrame* pmf = (CMainFrame*)AfxGetMainWnd();
#ifndef _USE_XTREME_TOOLKITPRO
VARIANT_BOOL bFileSystem;
IPTxShTreeNode *pnode = (IPTxShTreeNode*)get_SelectedNode();
pnode->get_IsFileSystem(&bFileSystem);
if (!bFileSystem)
return FALSE;
BSTR bstr;
pnode->get_PathName(&bstr);
CString sPath(bstr);
::SysFreeString(bstr);
COleDataObject odo;
if (odo.AttachClipboard() && odo.IsDataAvailable(CF_HDROP))
return ((CLocalView*)GetParent())->CopyClipboard(odo, sPath);
if (pmf->m_cbs == CBS_NONE)
return FALSE;
if (pmf->m_saDragSource.GetCount() == 0)
return FALSE;
pmf->m_sDragTarget = sPath;
#endif // !_USE_XTREME_TOOLKITPRO
return pmf->Download(false);
}
#ifdef _USE_XTREME_TOOLKITPRO
BOOL CLocalTreeCtrl::InitTreeViewItems(LPSHELLFOLDER lpsf, LPITEMIDLIST lpifq, HTREEITEM hParent)
{
CWaitCursor wait; // show wait cursor.
// Allocate a shell memory object.
CShellMalloc lpMalloc;
if (!lpMalloc)
return FALSE;
// Get the IEnumIDList object for the given folder.
LPENUMIDLIST lpe = NULL;
if (FAILED(lpsf->EnumObjects(::GetParent(m_pTreeCtrl->m_hWnd), m_uFlags, &lpe)))
return FALSE;
if (lpe == NULL)
return FALSE;
ULONG ulFetched = 0;
HTREEITEM hPrev = NULL;
LPITEMIDLIST lpi = NULL;
// Enumerate through the list of folder and non-folder objects.
while (lpe->Next(1, &lpi, &ulFetched) == S_OK)
{
// Create a fully qualified path to the current item
// the SH* shell api's take a fully qualified path pidl,
// (see GetIcon above where I call SHGetFileInfo) whereas the
// interface methods take a relative path pidl.
ULONG ulAttrs = SFGAO_HASSUBFOLDER | SFGAO_FOLDER | SFGAO_DISPLAYATTRMASK | SFGAO_REMOVABLE | SFGAO_COMPRESSED | SFGAO_ENCRYPTED;
// Determine what type of object we have.
lpsf->GetAttributesOf(1, (const struct _ITEMIDLIST **)&lpi, &ulAttrs);
// We need this next if statement so that we don't add things like
// the MSN to our tree. MSN is not a folder, but according to the
// shell it has subfolders.
if ((ulAttrs & SFGAO_FOLDER) || m_bShowFiles)
{
TV_ITEM tvi;
tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;
if ((ulAttrs & SFGAO_HASSUBFOLDER) || (m_bShowFiles && (ulAttrs & SFGAO_FOLDER)))
{
//This item has sub-folders, so let's put the + in the TreeView.
//The first time the user clicks on the item, we'll populate the
//sub-folders.
tvi.cChildren = 1;
tvi.mask |= TVIF_CHILDREN;
}
// Allocate memory for ITEMDATA struct
CString szBuff;
XT_TVITEMDATA* lptvid = (XT_TVITEMDATA*)lpMalloc.Alloc(sizeof(XT_TVITEMDATA));
if (lptvid == NULL || GetName(lpsf, lpi, SHGDN_NORMAL, szBuff) == FALSE)
{
if (lptvid)
{
lpMalloc.Free(lptvid);
}
if (lpe)
{
lpe->Release();
}
if (lpi)
{
lpMalloc.Free(lpi);
}
return FALSE;
}
// Now, make a copy of the ITEMIDLIST and store the parent folders SF.
lptvid->lpi = DuplicateItem(lpMalloc, lpi);
lptvid->lpsfParent = lpsf;
lptvid->lpifq = ConcatPidls(lpMalloc, lpifq, lpi);
lpsf->AddRef();
GetNormalAndSelectedIcons(lptvid->lpifq, &tvi);
tvi.lParam = (LPARAM)lptvid;
tvi.pszText = (LPTSTR)(LPCTSTR)szBuff;
tvi.cchTextMax = 0;
// Populate the TreeVeiw Insert Struct
// The item is the one filled above.
// Insert it after the last item inserted at this level.
// And indicate this is a root entry.
TV_INSERTSTRUCT tvins;
tvins.item = tvi;
tvins.hInsertAfter = hPrev;
tvins.hParent = hParent;
// Add the item to the tree
hPrev = m_pTreeCtrl->InsertItem(&tvins);
SetAttributes(hPrev, ulAttrs);
}
// Free the pidl that the shell gave us.
if (lpi)
{
lpMalloc.Free(lpi);
lpi = 0;
}
}
if (lpi)
{
lpMalloc.Free(lpi);
}
if (lpe)
{
lpe->Release();
}
return TRUE;
}
#endif // _USE_XTREME_TOOLKITPRO