2025-11-27 16:46:48 +09:00

264 lines
6.1 KiB
C++

// TreeFilesDlg.cpp : implementation file
//
#include "stdafx.h"
#include "DIBManager.h"
#include "TreeFilesDlg.h"
#include "MainFrm.h"
#include "ChildFrm.h"
#include "DIBManagerDoc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTreeFilesDlg dialog
CTreeFilesDlg::CTreeFilesDlg(CWnd* pParent /*=NULL*/)
: COXSizeDialogBar()
{
UNREFERENCED_PARAMETER(pParent);
//{{AFX_DATA_INIT(CTreeFilesDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// use imagelist to show TreeFilesDlg
m_ilTypeFile.Create(IDB_IMAGELIST, 16, 0, RGB(255,0,255));
}
void CTreeFilesDlg::DoDataExchange(CDataExchange* pDX)
{
COXSizeDialogBar::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTreeFilesDlg)
DDX_Control(pDX, IDC_TREE_FILES, m_TreeFiles);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTreeFilesDlg, COXSizeDialogBar)
//{{AFX_MSG_MAP(CTreeFilesDlg)
ON_NOTIFY(TVN_SELCHANGED, IDC_TREE_FILES, OnSelchangedTreeFiles)
ON_NOTIFY(NM_CLICK, IDC_TREE_FILES, OnClickTreeFiles)
ON_WM_RBUTTONUP()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTreeFilesDlg message handlers
BOOL CTreeFilesDlg::Create(CWnd* pParentWnd, UINT nIDTemplate,
UINT nStyle, UINT nID)
{
if (!COXSizeDialogBar::Create(pParentWnd, MAKEINTRESOURCE(nIDTemplate),
nStyle, nID))
return FALSE;
UpdateData(FALSE);
BOOL bSuccess=IniTreeFiles();
if(!bSuccess)
{
AfxMessageBox(_T("Cannot create Tree Files Bar!"));
}
return bSuccess;
}
BOOL CTreeFilesDlg::IniTreeFiles()
{
// initialize info in TreeFilesDlg
m_TreeFiles.SetImageList(&m_ilTypeFile,TVSIL_NORMAL);
TV_ITEM item;
TV_INSERTSTRUCT InsertStruct;
// root - Bitmaps
item.mask=TVIF_CHILDREN|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_STATE|TVIF_TEXT;
item.cChildren=1;
item.state=TVIS_BOLD|TVIS_EXPANDED;
item.stateMask=TVIS_BOLD|TVIS_EXPANDED;
item.pszText=_T("Opened Files");
item.iImage=0;
item.iSelectedImage=0;
item.lParam=(DWORD)CDIBManagerDoc::TF_DIB;
InsertStruct.hParent=NULL;
InsertStruct.hInsertAfter=TVI_LAST;
InsertStruct.item=item;
if(m_TreeFiles.InsertItem(&InsertStruct)==NULL)
{
return FALSE;
}
return TRUE;
}
void CTreeFilesDlg::AddNewWindowToTree(CWnd* pWnd)
{
ASSERT_VALID(pWnd);
if(!pWnd->IsKindOf(RUNTIME_CLASS(CChildFrame)))
return;
if(FindWindowInTree(pWnd)!=NULL)
return;
CString sWindowText;
pWnd->GetWindowText(sWindowText);
TV_ITEM item;
item.mask=TVIF_CHILDREN|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_PARAM|TVIF_TEXT;
item.cChildren=0;
item.pszText=(LPTSTR)(LPCTSTR)sWindowText;
item.iImage=1;
item.iSelectedImage=1;
item.lParam=(DWORD)pWnd;
TV_INSERTSTRUCT InsertStruct;
InsertStruct.hParent=m_TreeFiles.GetRootItem();
InsertStruct.hInsertAfter=TVI_SORT;
InsertStruct.item=item;
m_TreeFiles.InsertItem(&InsertStruct);
m_TreeFiles.RedrawWindow(NULL,NULL,RDW_INVALIDATE | RDW_ERASE);
}
void CTreeFilesDlg::RemoveWindowFromTree(CWnd* pWnd)
{
if(!pWnd->IsKindOf(RUNTIME_CLASS(CChildFrame)))
return;
HTREEITEM deleteItem=FindWindowInTree(pWnd);
if(deleteItem!=NULL)
m_TreeFiles.DeleteItem(deleteItem);
}
void CTreeFilesDlg::SetTextForWindowInTree(CWnd* pWnd, const CString& string)
{
// rename the name of opened document
if(!pWnd->IsKindOf(RUNTIME_CLASS(CChildFrame)))
return;
HTREEITEM setItem=FindWindowInTree(pWnd);
if(setItem!=NULL)
{
m_TreeFiles.SetItemText(setItem,string);
m_TreeFiles.SortChildren(m_TreeFiles.GetRootItem());
m_TreeFiles.RedrawWindow(NULL,NULL,RDW_INVALIDATE | RDW_ERASE);
}
}
void CTreeFilesDlg::SetActiveWindowInTree(CWnd* pWnd)
{
if(!pWnd->IsKindOf(RUNTIME_CLASS(CChildFrame)))
return;
HTREEITEM setItem=FindWindowInTree(pWnd);
if(setItem!=NULL)
{
HTREEITEM selectedItem=m_TreeFiles.GetSelectedItem();
if(setItem!=selectedItem)
{
if(selectedItem!=NULL)
{
m_TreeFiles.SetItemState(selectedItem,TVIS_SELECTED,TVIS_SELECTED);
}
m_TreeFiles.EnsureVisible(setItem);
m_TreeFiles.Select(setItem,TVGN_CARET);
}
}
}
HTREEITEM CTreeFilesDlg::FindWindowInTree(CWnd* pWnd)
{
// find window with given pWnd
HTREEITEM result=NULL;
if(!pWnd->IsKindOf(RUNTIME_CLASS(CChildFrame)))
return result;
HTREEITEM childItem=m_TreeFiles.GetRootItem();
while(childItem!=NULL)
{
DWORD itemData=m_TreeFiles.GetItemData(childItem);
if(itemData==(DWORD)pWnd)
{
result=childItem;
break;
}
childItem=m_TreeFiles.GetNextItem(childItem,TVGN_NEXTVISIBLE);
}
return result;
}
void CTreeFilesDlg::OnSelchangedTreeFiles(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
// if we poke some element in TreeFilesDlg then
// activate corresponding window
ActivateWindowInTree((DWORD)pNMTreeView->itemNew.lParam);
*pResult = 0;
}
void CTreeFilesDlg::ActivateWindowInTree(DWORD itemData)
{
if(itemData!=m_TreeFiles.GetItemData(m_TreeFiles.GetRootItem()))
{
CDIBManagerApp* pApp=(CDIBManagerApp*)AfxGetApp();
CMainFrame* pMainFrame=(CMainFrame*)pApp->m_pMainWnd;
pMainFrame->LockWindowUpdate();
pMainFrame->MDIActivate((CWnd*)itemData);
m_TreeFiles.SetActiveWindow();
m_TreeFiles.SetFocus();
pMainFrame->UnlockWindowUpdate();
}
}
void CTreeFilesDlg::OnClickTreeFiles(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
UNREFERENCED_PARAMETER(pNMHDR);
// if we poke some element in TreeFilesDlg then
// activate corresponding window
HTREEITEM selectedItem=m_TreeFiles.GetSelectedItem();
if(selectedItem!=NULL)
{
ActivateWindowInTree(m_TreeFiles.GetItemData(selectedItem));
}
*pResult = 0;
}
void CTreeFilesDlg::OnRButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
COXSizeDialogBar::OnRButtonUp(nFlags, point);
}
BOOL CTreeFilesDlg::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Add your specialized code here and/or call the base class
cs.lpszClass = AfxRegisterWndClass(CS_DBLCLKS,NULL,NULL,NULL);
ASSERT(cs.lpszClass);
return COXSizeDialogBar::PreCreateWindow(cs);
}