264 lines
6.1 KiB
C++
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);
|
|
}
|