mirror of
https://github.com/ptitSeb/Serious-Engine
synced 2024-11-25 19:55:54 +01:00
207 lines
5.2 KiB
C++
207 lines
5.2 KiB
C++
/* Copyright (c) 2002-2012 Croteam Ltd.
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of version 2 of the GNU General Public License as published by
|
|
the Free Software Foundation
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License along
|
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */
|
|
|
|
// 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);
|
|
}
|