// MotionSheetTreeCtrl.cpp : implementation file // #include "stdafx.h" #include "worldcreator.h" #include "MotionSheetTreeCtrl.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CMotionSheetTreeCtrl CMotionSheetTreeCtrl::CMotionSheetTreeCtrl() { m_pDragImage = NULL; m_bDragging = false; m_hItemDrag = m_hItemDrop = NULL; m_rpGCMDS = NULL; } CMotionSheetTreeCtrl::~CMotionSheetTreeCtrl() { } BEGIN_MESSAGE_MAP(CMotionSheetTreeCtrl, CTreeCtrl) //{{AFX_MSG_MAP(CMotionSheetTreeCtrl) ON_NOTIFY_REFLECT(TVN_BEGINDRAG, OnBegindrag) ON_WM_MOUSEMOVE() ON_WM_LBUTTONUP() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMotionSheetTreeCtrl message handlers void CMotionSheetTreeCtrl::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; // TODO: Add your control notification handler code here *pResult = 0; m_hItemDrag = pNMTreeView->itemNew.hItem; m_hItemDrop = NULL; m_pDragImage = CreateDragImage(m_hItemDrag); if( NULL == m_pDragImage ) { return; } m_bDragging = true; m_pDragImage->BeginDrag(0, CPoint(0,0)); m_pDragImage->DragEnter(this, pNMTreeView->ptDrag); SetCapture(); } void CMotionSheetTreeCtrl::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default HTREEITEM hItem; UINT flags = 0; if( m_bDragging ) { POINT pt = point; if( pt.y < 0 ) { m_pDragImage->DragShowNolock(FALSE); SendMessage( WM_VSCROLL, SB_LINEUP ); m_pDragImage->DragShowNolock(TRUE); } if( pt.x < 0 ) { m_pDragImage->DragShowNolock(FALSE); SendMessage( WM_HSCROLL, SB_LINELEFT ); m_pDragImage->DragShowNolock(TRUE); } ClientToScreen( &pt ); m_pDragImage->DragMove(point); if( NULL != (hItem = HitTest(point, &flags)) ) { m_pDragImage->DragShowNolock(FALSE); SelectDropTarget(hItem); EnsureVisible(hItem); m_hItemDrop = hItem; m_pDragImage->DragShowNolock(TRUE); } } CTreeCtrl::OnMouseMove(nFlags, point); } void CMotionSheetTreeCtrl::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CTreeCtrl::OnLButtonUp(nFlags, point); if( !m_bDragging ) { return; } m_bDragging = false; m_pDragImage->DragLeave(this); m_pDragImage->EndDrag(); ReleaseCapture(); delete m_pDragImage; m_pDragImage = NULL; SelectDropTarget(NULL); if( m_hItemDrag == m_hItemDrop ) { return; } // dropµÈ ¾ÆÀÌÅÛÀÌ dragµÈ ¾ÆÀÌÅÛÀÇ child °¡ ¾Æ´ÑÁö È®ÀÎ HTREEITEM hParent = m_hItemDrop; while( NULL != (hParent = GetParentItem(hParent)) ) { if( hParent == m_hItemDrag ) { return; } } //Expand( m_hItemDrop, TVE_EXPAND ); // actually move item code if( 0 != GetItemData( m_hItemDrop ) ) { // motion itemÀº child¸¦ °¡Áú¼ö ¾ø´Ù return; } if( 0 == GetItemData(m_hItemDrag) ) { // 'motion sheet' dropped on 'motion sheet' Z3DTOK tokSrcSheet, tokDestSheet; Z3DMOTIONSHEET* pSrcSheet; Z3DMOTIONSHEET* pDestSheet; tokSrcSheet = g_TokSheetName.GetTOK( GetItemText(m_hItemDrag) ); tokDestSheet = g_TokSheetName.GetTOK( GetItemText(m_hItemDrop) ); pSrcSheet = m_rpGCMDS->GetMotionsheet(tokSrcSheet); pDestSheet = m_rpGCMDS->GetMotionsheet(tokDestSheet); if( pSrcSheet->rpParentSheet == pDestSheet ) { return; } // motion sheet À̵¿ pSrcSheet->rpParentSheet = pDestSheet; // tree control ¿¡ º¯°æ°ª ¹Ý¿µ HTREEITEM hItemNew = CopyItem( m_hItemDrag, m_hItemDrop, TVI_LAST ); DeleteItem(m_hItemDrag); EnsureVisible( hItemNew ); SelectItem(hItemNew); } else { // 'motion' dropped on 'motion sheet' Z3DTOK tokSrcSheet, tokDestSheet, tokMotion; Z3DMOTIONSHEET* pSrcSheet; Z3DMOTIONSHEET* pDestSheet; Z3DMOTLET* pMotlet; tokSrcSheet = g_TokSheetName.GetTOK( GetItemText(GetParentItem(m_hItemDrag)) ); tokDestSheet = g_TokSheetName.GetTOK( GetItemText(m_hItemDrop) ); tokMotion = g_TokMotionName.GetTOK( GetItemText(m_hItemDrag) ); pSrcSheet = m_rpGCMDS->GetMotionsheet(tokSrcSheet); pDestSheet = m_rpGCMDS->GetMotionsheet(tokDestSheet); pMotlet = (Z3DMOTLET*)GetItemData(m_hItemDrag); if( pSrcSheet == pDestSheet ) { return; } // target motion sheet ¿¡ Áߺ¹µÇ´Â À̸§ÀÇ motionÀÌ ÀÖ´ÂÁö È®ÀÎ if( pDestSheet->mapTok2Motlet.end() != pDestSheet->mapTok2Motlet.find( tokMotion ) ) { CString strErr; strErr.Format( "%s motion sheet¿¡´Â %s motion°¡ ÀÌ¹Ì Á¸ÀçÇÔ", g_TokSheetName.GetString(tokDestSheet), g_TokMotionName.GetString(tokMotion) ); /*CString strErr = g_TokSheetName.GetString(tokDestSheet); strErr += " motion sheet¿¡´Â "; strErr += g_TokMotionName.GetString(tokMotion); strErr += " motionÀÌ ÀÌ¹Ì Á¸ÀçÇÔ";*/ MessageBox(strErr, "”î"); return; } // motion(motlet) À̵¿ pDestSheet->mapTok2Motlet[tokMotion] = pMotlet; pSrcSheet->mapTok2Motlet.erase(tokMotion); // tree controll ¿¡ À̵¿°ª ¹Ý¿µ // ************* insert point ã´ÂºÎºÐ ±¸ÇöÇÒÂ÷·Ê ************* HTREEITEM hInsertPoint = GetChildItem( m_hItemDrop ); if( NULL == hInsertPoint || 0 == GetItemData(hInsertPoint) ) { hInsertPoint = TVI_FIRST; } else { while(1) { HTREEITEM hTmp = GetNextSiblingItem(hInsertPoint); if( NULL == hTmp || 0 == GetItemData(hTmp) ) { break; } hInsertPoint = hTmp; } } HTREEITEM hItemNew = CopyItem( m_hItemDrag, m_hItemDrop, hInsertPoint ); DeleteItem(m_hItemDrag); EnsureVisible( hItemNew ); SelectItem(hItemNew); } } HTREEITEM CMotionSheetTreeCtrl::CopyItem( HTREEITEM hItem, HTREEITEM htiNewParent, HTREEITEM htiAfter /*= TVI_LAST*/ ) { TV_INSERTSTRUCT tvstruct; HTREEITEM hNewItem; CString sText; // get information of the source item tvstruct.item.hItem = hItem; tvstruct.item.mask = TVIF_CHILDREN | TVIF_HANDLE | TVIF_IMAGE | TVIF_SELECTEDIMAGE; GetItem(&tvstruct.item); sText = GetItemText( hItem ); tvstruct.item.cchTextMax = sText.GetLength(); tvstruct.item.pszText = sText.LockBuffer(); // Insert the item at proper location tvstruct.hParent = htiNewParent; tvstruct.hInsertAfter = htiAfter; tvstruct.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT; hNewItem = InsertItem(&tvstruct); sText.ReleaseBuffer(); // Now copy item data and item state. SetItemData( hNewItem, GetItemData( hItem )); SetItemState( hNewItem, GetItemState( hItem, TVIS_STATEIMAGEMASK ), TVIS_STATEIMAGEMASK ); HTREEITEM hChild = GetChildItem( hItem ); while( NULL != hChild ) { CopyItem( hChild, hNewItem, TVI_LAST ); hChild = GetNextSiblingItem( hChild ); } return hNewItem; }