DragonNest/Third/XTToolkitPro/Source/Controls/XTShellListCtrlView.cpp

285 lines
6.3 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
// XTShellListCtrl.cpp : implementation file
//
// This file is a part of the XTREME CONTROLS MFC class library.
// (c)1998-2008 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
// CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
// SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Common/XTPVC80Helpers.h"
#include "XTDefines.h"
#include "XTVC50Helpers.h"
#include "XTHeaderCtrl.h"
#include "XTListCtrlView.h"
#include "XTShellPidl.h"
#include "XTShellSettings.h"
#include "XTShellListBase.h"
#include "XTShellListCtrlView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CXTShellListView
CXTShellListView::CXTShellListView()
{
ImplAttach(&GetListCtrl());
}
CXTShellListView::~CXTShellListView()
{
}
IMPLEMENT_DYNCREATE(CXTShellListView, CListView)
BEGIN_MESSAGE_MAP(CXTShellListView, CListView)
ON_SHELLLIST_REFLECT()
ON_MESSAGE(XTWM_SHELL_NOTIFY, OnUpdateShell)
ON_WM_KEYDOWN()
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CXTShellListView message handlers
void CXTShellListView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if (nChar == VK_RETURN)
{
int iIndex = GetListCtrl().GetNextItem(-1, LVNI_FOCUSED);
if (iIndex >= 0)
{
CDocument* pDoc = GetDocument();
pDoc->UpdateAllViews(this, SHN_XT_SELECTCHILD,
(CObject*)GetListCtrl().GetItemData(iIndex));
}
}
CXTShellListViewBase::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CXTShellListView::OnDblclk(NMHDR* /*pNMHDR*/, LRESULT* pResult)
{
int iIndex = GetDoubleClickedItem();
if (iIndex >= 0)
{
CDocument* pDoc = GetDocument();
pDoc->UpdateAllViews(this, SHN_XT_SELECTCHILD,
(CObject*)GetListCtrl().GetItemData(iIndex));
}
*pResult = 0;
}
BOOL CXTShellListView::PreCreateWindow(CREATESTRUCT& cs)
{
if (!CXTShellListViewBase::PreCreateWindow(cs))
return FALSE;
cs.style |= LVS_REPORT | LVS_SHAREIMAGELISTS;
return TRUE;
}
LRESULT CXTShellListView::OnUpdateShell(WPARAM wParam, LPARAM lParam)
{
UpdateList((int)wParam, (XT_TVITEMDATA*)lParam);
return 0;
}
void CXTShellListView::OnUpdate(CView* /*pSender*/, LPARAM lHint, CObject* pHint)
{
UpdateList((int)lHint, (XT_TVITEMDATA*)pHint);
}
/////////////////////////////////////////////////////////////////////////////
// CXTShellListCtrl
CXTShellListCtrl::CXTShellListCtrl()
{
ImplAttach(this);
m_bInitControl = true;
m_pTreeCtrl = NULL;
m_nNameColumnWidth = 200;
}
CXTShellListCtrl::~CXTShellListCtrl()
{
}
BEGIN_MESSAGE_MAP(CXTShellListCtrl, CListCtrl)
ON_SHELLLIST_REFLECT()
ON_MESSAGE(XTWM_SHELL_NOTIFY, OnUpdateShell)
ON_WM_KEYDOWN()
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CXTShellListCtrl message handlers
void CXTShellListCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if (nChar == VK_RETURN)
{
int iIndex = GetNextItem(-1, LVNI_FOCUSED);
if (iIndex >= 0 && m_pTreeCtrl != NULL)
{
m_pTreeCtrl->SendMessage(XTWM_SHELL_NOTIFY,
(WPARAM)SHN_XT_SELECTCHILD, (LPARAM)(XT_LVITEMDATA*)GetItemData(iIndex));
}
}
CListCtrl::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CXTShellListCtrl::OnDblclk(NMHDR* /*pNMHDR*/, LRESULT* pResult)
{
int iIndex = GetDoubleClickedItem();
if (iIndex >= 0 && m_pTreeCtrl != NULL)
{
m_pTreeCtrl->SendMessage(XTWM_SHELL_NOTIFY,
(WPARAM)SHN_XT_SELECTCHILD, (LPARAM)(XT_LVITEMDATA*)GetItemData(iIndex));
}
*pResult = 0;
}
LRESULT CXTShellListCtrl::OnUpdateShell(WPARAM wParam, LPARAM lParam)
{
UpdateList((int)wParam, (XT_TVITEMDATA*)lParam);
return 0;
}
/////////////////////////////////////////////////////////////////////////////
// CXTShellListCtrlEx
CXTShellListCtrlEx::CXTShellListCtrlEx()
: m_pSyncWnd(0)
{
}
CXTShellListCtrlEx::~CXTShellListCtrlEx()
{
}
BEGIN_MESSAGE_MAP(CXTShellListCtrlEx, CXTShellListCtrl)
//{{AFX_MSG_MAP(CXTShellListCtrlEx)
ON_WM_LBUTTONDBLCLK()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CXTShellListCtrlEx message handlers
bool CXTShellListCtrlEx::BrowseToFolder(LPCTSTR lpszPath)
{
XT_TVITEMDATA lpTVID;
LPITEMIDLIST pidl;
LPSHELLFOLDER pDesktopFolder;
OLECHAR szOleChar[MAX_PATH];
ULONG chEaten;
ULONG dwAttributes;
HRESULT hr;
// Get a pointer to the Desktop's IShellFolder interface.
if (SUCCEEDED(::SHGetDesktopFolder(&pDesktopFolder)))
{
// IShellFolder::ParseDisplayName requires the file name be in
// Unicode.
#if !defined(_UNICODE)
::MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, lpszPath, -1,
szOleChar, MAX_PATH);
#else
STRCPY_S(szOleChar, MAX_PATH, lpszPath);
#endif
// Convert the path to an ITEMIDLIST.
hr = pDesktopFolder->ParseDisplayName(NULL, NULL, szOleChar,
&chEaten, &pidl, &dwAttributes);
if (SUCCEEDED(hr))
{
IShellFolder *psfMyFolder;
lpTVID.lpi = lpTVID.lpifq = pidl;
pDesktopFolder->BindToObject(lpTVID.lpifq, NULL,
IID_IShellFolder, (LPVOID*)&psfMyFolder);
lpTVID.lpsfParent = psfMyFolder;
PopulateListView(&lpTVID, lpTVID.lpsfParent);
m_strItemPath = lpszPath;
pDesktopFolder->Release();
return true;
}
pDesktopFolder->Release();
}
return false;
}
void CXTShellListCtrlEx::OnLButtonDblClk(UINT nFlags, CPoint point)
{
CXTShellListCtrl::OnLButtonDblClk(nFlags, point);
int iItem = GetDoubleClickedItem();
if (iItem >= 0)
{
XT_LVITEMDATA* lplvid = (XT_LVITEMDATA*)GetItemData(iItem);
ASSERT(lplvid != NULL);
if (!lplvid)
return;
if ((lplvid->ulAttribs & SFGAO_FOLDER) == SFGAO_FOLDER)
{
if (m_strItemPath.GetAt(m_strItemPath.GetLength() -1) != _T('\\'))
{
m_strItemPath += _T('\\');
}
m_strItemPath += GetItemText(iItem, 0);
BrowseToFolder(m_strItemPath);
if (m_pSyncWnd != 0)
{
m_pSyncWnd->SetWindowText(m_strItemPath);
}
}
else
{
ShellOpenItem(lplvid);
}
}
}