mirror of
https://github.com/ptitSeb/Serious-Engine
synced 2024-11-29 13:25:52 +01:00
194 lines
4.6 KiB
C++
194 lines
4.6 KiB
C++
|
/* Copyright (c) 2002-2012 Croteam Ltd. All rights reserved. */
|
||
|
|
||
|
// VirtualTreeCtrl.cpp : implementation file
|
||
|
//
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "WorldEditor.h"
|
||
|
#include "VirtualTreeCtrl.h"
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#undef new
|
||
|
#define new DEBUG_NEW
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CVirtualTreeCtrl
|
||
|
|
||
|
CVirtualTreeCtrl::CVirtualTreeCtrl()
|
||
|
{
|
||
|
m_bIsOpen = FALSE;
|
||
|
}
|
||
|
|
||
|
CVirtualTreeCtrl::~CVirtualTreeCtrl()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void CVirtualTreeCtrl::SetBrowserPtr( CBrowser *pBrowser)
|
||
|
{
|
||
|
m_pBrowser = pBrowser;
|
||
|
}
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CVirtualTreeCtrl, CTreeCtrl)
|
||
|
//{{AFX_MSG_MAP(CVirtualTreeCtrl)
|
||
|
ON_WM_LBUTTONDBLCLK()
|
||
|
ON_WM_KEYDOWN()
|
||
|
ON_WM_LBUTTONDOWN()
|
||
|
ON_WM_DROPFILES()
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CVirtualTreeCtrl message handlers
|
||
|
|
||
|
void CVirtualTreeCtrl::CloseTreeCtrl(void)
|
||
|
{
|
||
|
if( m_bIsOpen)
|
||
|
{
|
||
|
m_pBrowser->m_TreeHeight = CLOSED_TREE;
|
||
|
m_pBrowser->CalcDynamicLayout(0, LM_HORZDOCK);
|
||
|
m_bIsOpen = FALSE;
|
||
|
|
||
|
if( GetCount() != 0)
|
||
|
{
|
||
|
HTREEITEM pSelectedItem = GetSelectedItem();
|
||
|
ASSERT( pSelectedItem != NULL);
|
||
|
EnsureVisible( pSelectedItem);
|
||
|
m_pBrowser->OpenSelectedDirectory();
|
||
|
}
|
||
|
}
|
||
|
// Enable drag/drop open
|
||
|
DragAcceptFiles();
|
||
|
}
|
||
|
|
||
|
void CVirtualTreeCtrl::OpenTreeCtrl(void)
|
||
|
{
|
||
|
if( !m_bIsOpen)
|
||
|
{
|
||
|
m_pBrowser->m_TreeHeight = OPEN_TREE;
|
||
|
m_pBrowser->CalcDynamicLayout(0, LM_HORZDOCK);
|
||
|
m_bIsOpen = TRUE;
|
||
|
if( GetCount() != 0)
|
||
|
{
|
||
|
HTREEITEM pSelectedItem = GetSelectedItem();
|
||
|
ASSERT( pSelectedItem != NULL);
|
||
|
m_pBrowser->CloseSelectedDirectory();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CVirtualTreeCtrl::OnLButtonDown(UINT nFlags, CPoint point)
|
||
|
{
|
||
|
CVirtualTreeNode *pVTN = ItemForCoordinate(point);
|
||
|
// if is not null and not root
|
||
|
if( pVTN!=NULL && pVTN->vnt_pvtnParent!=NULL)
|
||
|
{
|
||
|
CTString strAddr;
|
||
|
strAddr.PrintF("VTN%d", pVTN);
|
||
|
HGLOBAL hglobal = CreateHDrop( strAddr, FALSE);
|
||
|
m_DataSource.CacheGlobalData( CF_HDROP, hglobal);
|
||
|
m_DataSource.DoDragDrop( DROPEFFECT_COPY);
|
||
|
}
|
||
|
|
||
|
OpenTreeCtrl();
|
||
|
CTreeCtrl::OnLButtonDown(nFlags, point);
|
||
|
}
|
||
|
|
||
|
|
||
|
CVirtualTreeNode *CVirtualTreeCtrl::ItemForCoordinate(CPoint pt)
|
||
|
{
|
||
|
UINT ulFlags;
|
||
|
HTREEITEM pItem=HitTest(pt, &ulFlags);
|
||
|
if( pItem==NULL || !(ulFlags&TVHT_ONITEMICON)) return NULL;
|
||
|
CVirtualTreeNode *pVTN = (CVirtualTreeNode *)GetItemData( pItem);
|
||
|
return pVTN;
|
||
|
}
|
||
|
|
||
|
void CVirtualTreeCtrl::OnLButtonDblClk(UINT nFlags, CPoint point)
|
||
|
{
|
||
|
CloseTreeCtrl();
|
||
|
|
||
|
CTreeCtrl::OnLButtonDblClk(nFlags, point);
|
||
|
}
|
||
|
|
||
|
void CVirtualTreeCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
|
||
|
{
|
||
|
UWORD uwScanCode = nFlags & 255;
|
||
|
BOOL bAlt = (nFlags & (1L<<13)) != 0;
|
||
|
|
||
|
/*
|
||
|
if( uwScanCode == 82) // Insert
|
||
|
{
|
||
|
m_pBrowser->OnCreateDirectory();
|
||
|
}
|
||
|
else if( uwScanCode == 83) // Delete
|
||
|
{
|
||
|
m_pBrowser->OnDeleteDirectory();
|
||
|
}
|
||
|
else if( bAlt && (uwScanCode == 19)) // Alt-R - rename
|
||
|
{
|
||
|
m_pBrowser->OnRenameDirectory();
|
||
|
}
|
||
|
else if( bAlt && (uwScanCode == 38)) // Alt+O - open
|
||
|
{
|
||
|
m_pBrowser->OnLoadVirtualTree();
|
||
|
}
|
||
|
else if( bAlt && (uwScanCode == 31)) // Alt+S - save
|
||
|
{
|
||
|
m_pBrowser->OnSaveVirtualTree();
|
||
|
}
|
||
|
*/
|
||
|
|
||
|
CTreeCtrl::OnKeyDown(nChar, nRepCnt, nFlags);
|
||
|
}
|
||
|
|
||
|
void CVirtualTreeCtrl::OnContextMenu( CPoint point)
|
||
|
{
|
||
|
CMenu menu;
|
||
|
if( menu.LoadMenu(IDR_VTREEPOPUP))
|
||
|
{
|
||
|
CMenu* pPopup = menu.GetSubMenu(0);
|
||
|
pPopup->TrackPopupMenu(TPM_LEFTBUTTON | TPM_RIGHTBUTTON | TPM_LEFTALIGN,
|
||
|
point.x, point.y, m_pBrowser);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CVirtualTreeCtrl::OnDropFiles(HDROP hDropInfo)
|
||
|
{
|
||
|
CMainFrame* pMainFrame = STATIC_DOWNCAST(CMainFrame, AfxGetMainWnd());
|
||
|
INDEX ctFiles = DragQueryFile( hDropInfo, 0xFFFFFFFF, NULL, 0);
|
||
|
|
||
|
// get dropped coordinates
|
||
|
CPoint point;
|
||
|
DragQueryPoint( hDropInfo, &point);
|
||
|
|
||
|
CVirtualTreeNode *pVTNDst = ItemForCoordinate(point);
|
||
|
if( pVTNDst!=NULL)
|
||
|
{
|
||
|
for( INDEX i=0; i<ctFiles; i++)
|
||
|
{
|
||
|
wchar_t chrFile[ 256];
|
||
|
DragQueryFile( hDropInfo, i, chrFile, 256);
|
||
|
CTString strAddr = CTString(CStringA(chrFile));
|
||
|
if( strAddr != "")
|
||
|
{
|
||
|
CVirtualTreeNode *pVTNSrc;
|
||
|
strAddr.ScanF("VTN%d", &pVTNSrc);
|
||
|
if(pVTNSrc==pVTNDst) return;
|
||
|
pVTNSrc->MoveToDirectory( pVTNDst);
|
||
|
// delete all items
|
||
|
DeleteAllItems();
|
||
|
m_pBrowser->AddDirectoryRecursiv( &m_pBrowser->m_VirtualTree, TVI_ROOT); // Fill CTreeCtrl using recursion
|
||
|
SortChildren( NULL);
|
||
|
SelectItem( (HTREEITEM) pVTNSrc->vtn_Handle);
|
||
|
m_pBrowser->m_bVirtualTreeChanged = TRUE;
|
||
|
m_pBrowser->OpenSelectedDirectory();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
CTreeCtrl::OnDropFiles(hDropInfo);
|
||
|
}
|