You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
274 lines
6.2 KiB
C++
274 lines
6.2 KiB
C++
2 years ago
|
// XTPShellTreeCtrl.cpp : implementation file
|
||
|
//
|
||
|
// This file is a part of the XTREME CONTROLS MFC class library.
|
||
|
// (c)1998-2012 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/XTPSystemHelpers.h"
|
||
|
|
||
|
#include "../Defines.h"
|
||
|
#include "XTPShellPidl.h"
|
||
|
#include "XTPShellSettings.h"
|
||
|
#include "../Tree/XTPTreeBase.h"
|
||
|
#include "XTPShellTreeBase.h"
|
||
|
#include "XTPShellTreeCtrlView.h"
|
||
|
|
||
|
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#define new DEBUG_NEW
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CXTPShellTreeView
|
||
|
|
||
|
CXTPShellTreeView::CXTPShellTreeView()
|
||
|
{
|
||
|
m_pTreeCtrl = (CTreeCtrl_Friendly*)&GetTreeCtrl();
|
||
|
}
|
||
|
|
||
|
CXTPShellTreeView::~CXTPShellTreeView()
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
IMPLEMENT_DYNCREATE(CXTPShellTreeView, CTreeView)
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CXTPShellTreeView, CTreeView)
|
||
|
ON_SHELLTREE_REFLECT()
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CXTPShellTreeView message handlers
|
||
|
|
||
|
void CXTPShellTreeView::SelectionChanged(HTREEITEM hItem, CString strFolderPath)
|
||
|
{
|
||
|
if (hItem != NULL && !m_bTunneling)
|
||
|
{
|
||
|
CDocument* pDoc = GetDocument();
|
||
|
if (pDoc != NULL)
|
||
|
{
|
||
|
pDoc->UpdateAllViews(this, SHN_XTP_TREESELCHANGE,
|
||
|
(CObject*)GetTreeCtrl().GetItemData(hItem));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
CXTPShellTreeBase::SelectionChanged(hItem, strFolderPath);
|
||
|
|
||
|
}
|
||
|
|
||
|
void CXTPShellTreeView::OnInitialUpdate()
|
||
|
{
|
||
|
CTreeView::OnInitialUpdate();
|
||
|
|
||
|
// mimic native Windows Explorer styles.
|
||
|
DWORD dwStyle = TVS_SHOWSELALWAYS | TVS_HASBUTTONS;
|
||
|
|
||
|
if (XTPSystemVersion()->IsWinXPOrGreater())
|
||
|
{
|
||
|
dwStyle |= (TVS_TRACKSELECT);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
dwStyle |= (TVS_HASLINES | TVS_LINESATROOT);
|
||
|
}
|
||
|
|
||
|
if (InitializeTree(dwStyle))
|
||
|
{
|
||
|
PopulateTreeView();
|
||
|
}
|
||
|
|
||
|
// make the parent of the selected item visible if found.
|
||
|
HTREEITEM hItem = GetTreeCtrl().GetSelectedItem();
|
||
|
HTREEITEM hItemParent = GetTreeCtrl().GetParentItem(hItem);
|
||
|
|
||
|
GetTreeCtrl().EnsureVisible(hItemParent ? hItemParent : hItem);
|
||
|
}
|
||
|
|
||
|
void CXTPShellTreeView::OnUpdate(CView* /*pSender*/, LPARAM lHint, CObject* pHint)
|
||
|
{
|
||
|
switch (lHint)
|
||
|
{
|
||
|
// Update selection of tree view to the
|
||
|
case SHN_XTP_SELECTCHILD:
|
||
|
{
|
||
|
XTP_LVITEMDATA* lplvid = (XTP_LVITEMDATA*)pHint;
|
||
|
ASSERT(lplvid != NULL);
|
||
|
|
||
|
if (!FindTreeItem(GetTreeCtrl().GetSelectedItem(), lplvid, FALSE))
|
||
|
{
|
||
|
// The folder was not found so we send back a message
|
||
|
// to the listview to execute the itemid
|
||
|
CDocument* pDoc = GetDocument();
|
||
|
pDoc->UpdateAllViews(this, SHN_XTP_NOFOLDER, (CObject*)lplvid);
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CXTPShellTreeCtrl
|
||
|
|
||
|
IMPLEMENT_DYNAMIC(CXTPShellTreeCtrl, CTreeCtrl)
|
||
|
|
||
|
CXTPShellTreeCtrl::CXTPShellTreeCtrl()
|
||
|
{
|
||
|
m_pListCtrl = NULL;
|
||
|
m_bAutoInit = TRUE;
|
||
|
m_pTreeCtrl = (CTreeCtrl_Friendly*)this;
|
||
|
}
|
||
|
|
||
|
CXTPShellTreeCtrl::~CXTPShellTreeCtrl()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CXTPShellTreeCtrl, CTreeCtrl)
|
||
|
ON_SHELLTREE_REFLECT()
|
||
|
ON_MESSAGE(WM_XTP_SHELL_NOTIFY, OnUpdateShell)
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CXTPShellTreeCtrl message handlers
|
||
|
|
||
|
void CXTPShellTreeCtrl::SelectionChanged(HTREEITEM hItem, CString strFolderPath)
|
||
|
{
|
||
|
if (hItem != NULL && !m_bTunneling)
|
||
|
{
|
||
|
CWnd* pWndNotify = (CWnd*)m_pListCtrl;
|
||
|
if (!::IsWindow(pWndNotify->GetSafeHwnd()))
|
||
|
{
|
||
|
pWndNotify = GetOwner();
|
||
|
}
|
||
|
|
||
|
// notify list control of selection change.
|
||
|
if (::IsWindow(pWndNotify->GetSafeHwnd()))
|
||
|
{
|
||
|
pWndNotify->SendMessage(WM_XTP_SHELL_NOTIFY,
|
||
|
(WPARAM)SHN_XTP_TREESELCHANGE,
|
||
|
(LPARAM)(CObject*)GetItemData(hItem));
|
||
|
}
|
||
|
}
|
||
|
CXTPShellTreeBase::SelectionChanged(hItem, strFolderPath);
|
||
|
}
|
||
|
|
||
|
LRESULT CXTPShellTreeCtrl::OnUpdateShell(WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
switch (wParam)
|
||
|
{
|
||
|
// Update selection of tree view to the
|
||
|
case SHN_XTP_SELECTCHILD:
|
||
|
{
|
||
|
XTP_LVITEMDATA* lplvid = (XTP_LVITEMDATA*)lParam;
|
||
|
ASSERT(lplvid != NULL);
|
||
|
|
||
|
if (!FindTreeItem(GetSelectedItem(), lplvid, FALSE) && m_pListCtrl != NULL)
|
||
|
{
|
||
|
// The folder was not found so we send back a message
|
||
|
// to the listview to execute the itemid
|
||
|
m_pListCtrl->SendMessage(WM_XTP_SHELL_NOTIFY,
|
||
|
(WPARAM)SHN_XTP_NOFOLDER,
|
||
|
(LPARAM)(CObject*)lplvid);
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
bool CXTPShellTreeCtrl::Init()
|
||
|
{
|
||
|
if (!CXTPShellTreeCtrlBase::Init())
|
||
|
return false;
|
||
|
|
||
|
if (m_bAutoInit)
|
||
|
{
|
||
|
// mimic native Windows Explorer styles.
|
||
|
DWORD dwStyle = TVS_SHOWSELALWAYS | TVS_HASBUTTONS;
|
||
|
|
||
|
if (XTPSystemVersion()->IsWinXPOrGreater())
|
||
|
{
|
||
|
dwStyle |= (TVS_TRACKSELECT);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
dwStyle |= (TVS_HASLINES | TVS_LINESATROOT);
|
||
|
}
|
||
|
|
||
|
if (InitializeTree(dwStyle))
|
||
|
{
|
||
|
PopulateTreeView();
|
||
|
}
|
||
|
|
||
|
// make the parent of the selected item visible if found.
|
||
|
HTREEITEM hItem = GetSelectedItem();
|
||
|
HTREEITEM hItemParent = GetParentItem(hItem);
|
||
|
|
||
|
EnsureVisible(hItemParent ? hItemParent : hItem);
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
void CXTPShellTreeCtrl::AssociateList(CWnd* pWnd)
|
||
|
{
|
||
|
ASSERT_VALID(pWnd); // must be a valid window.
|
||
|
|
||
|
if (::IsWindow(pWnd->GetSafeHwnd()))
|
||
|
{
|
||
|
m_pListCtrl = pWnd;
|
||
|
|
||
|
// make sure list gets updated.
|
||
|
HTREEITEM hItem = GetSelectedItem();
|
||
|
if (hItem)
|
||
|
{
|
||
|
XTP_TVITEMDATA* pItemData = (XTP_TVITEMDATA*)GetItemData(hItem);
|
||
|
if (pItemData)
|
||
|
{
|
||
|
m_pListCtrl->SendMessage(WM_XTP_SHELL_NOTIFY,
|
||
|
(WPARAM)SHN_XTP_TREESELCHANGE, (LPARAM)pItemData);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CXTPShellTreeCtrl::AssociateCombo(CWnd* pWnd)
|
||
|
{
|
||
|
CXTPShellTreeBase::AssociateCombo(pWnd);
|
||
|
|
||
|
if (::IsWindow(pWnd->GetSafeHwnd()))
|
||
|
{
|
||
|
CString strSelectedPath;
|
||
|
GetSelectedFolderPath(strSelectedPath);
|
||
|
|
||
|
// make sure list gets updated.
|
||
|
CXTPShellTreeBase::SelectionChanged(
|
||
|
GetSelectedItem(), strSelectedPath);
|
||
|
}
|
||
|
}
|