// TriggerPaneView.cpp : implementation file // #include "stdafx.h" #include "EtWorldPainter.h" #include "TriggerPaneView.h" #include "TEtWorld.h" #include "TEtWorldGrid.h" #include "TEtWorldSector.h" #include "TEtWorldProp.h" #include "UserMessage.h" #include "EtWorldPainterDoc.h" #include "EtWorldPainterView.h" #include "MainFrm.h" #include "PaneDefine.h" #include "FileServer.h" #include "TEtTrigger.h" #include "TEtTriggerObject.h" #include "TEtTriggerElement.h" // CTriggerPaneView IMPLEMENT_DYNCREATE(CTriggerPaneView, CFormView) CTriggerPaneView::CTriggerPaneView() : CFormView(CTriggerPaneView::IDD) { m_bActivate = false; CBitmap bitmap; bitmap.LoadBitmap( IDB_BITMAP3 ); m_ImageList.Create( 16, 16, ILC_COLOR24|ILC_MASK, 5, 1 ); m_ImageList.Add( &bitmap, RGB(0,255,0) ); m_pContextMenu = new CMenu; m_pContextMenu->LoadMenu( IDR_CONTEXTMENU ); m_pDragImage = NULL; m_bDragging = false; m_hDrag = 0; m_hDrop = 0; m_bClipObjectCut = false; m_bCopyDrag = false; } CTriggerPaneView::~CTriggerPaneView() { SAFE_DELETE( m_pContextMenu ); } void CTriggerPaneView::DoDataExchange(CDataExchange* pDX) { CFormView::DoDataExchange(pDX); DDX_Control(pDX, IDC_TREE1, m_TreeCtrl); } BEGIN_MESSAGE_MAP(CTriggerPaneView, CFormView) ON_WM_SIZE() ON_WM_ERASEBKGND() ON_MESSAGE( UM_REFRESH_PANE_VIEW, OnRefresh ) ON_WM_CONTEXTMENU() ON_COMMAND(ID_TRIGGERLIST_ADDCATEGORY, &CTriggerPaneView::OnTriggerlistAddcategory) ON_COMMAND(ID_TRIGGERLIST_ADDTRIGGER, &CTriggerPaneView::OnTriggerlistAddtrigger) ON_NOTIFY(TVN_BEGINLABELEDIT, IDC_TREE1, &CTriggerPaneView::OnTvnBeginlabeleditTree1) ON_NOTIFY(TVN_ENDLABELEDIT, IDC_TREE1, &CTriggerPaneView::OnTvnEndlabeleditTree1) ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, &CTriggerPaneView::OnTvnSelchangedTree1) ON_MESSAGE( UM_ENABLE_PANE_VIEW, OnEnablePane ) ON_COMMAND(ID_TRIGGERLIST_DELETE, &CTriggerPaneView::OnTriggerlistDelete) ON_WM_KEYDOWN() ON_NOTIFY(TVN_BEGINDRAG, IDC_TREE1, &CTriggerPaneView::OnTvnBegindragTree1) ON_WM_MOUSEMOVE() ON_WM_LBUTTONUP() ON_COMMAND(ID_TRIGGERLIST_COPY, &CTriggerPaneView::OnTriggerlistCopy) ON_COMMAND(ID_TRIGGERLIST_CUT, &CTriggerPaneView::OnTriggerlistCut) ON_COMMAND(ID_TRIGGERLIST_PASTE, &CTriggerPaneView::OnTriggerlistPaste) ON_NOTIFY(TVN_KEYDOWN, IDC_TREE1, &CTriggerPaneView::OnTvnKeydownTree1) END_MESSAGE_MAP() // CTriggerPaneView diagnostics #ifdef _DEBUG void CTriggerPaneView::AssertValid() const { CFormView::AssertValid(); } #ifndef _WIN32_WCE void CTriggerPaneView::Dump(CDumpContext& dc) const { CFormView::Dump(dc); } #endif #endif //_DEBUG // CTriggerPaneView message handlers void CTriggerPaneView::OnSize(UINT nType, int cx, int cy) { CFormView::OnSize(nType, cx, cy); // TODO: Add your message handler code here if( m_TreeCtrl ) { m_TreeCtrl.SetWindowPos( NULL, 0, 0, cx, cy, SWP_FRAMECHANGED ); } } void CTriggerPaneView::OnInitialUpdate() { CFormView::OnInitialUpdate(); // TODO: Add your specialized code here and/or call the base class if( m_bActivate == true ) return; m_bActivate = true; SendMessage( UM_REFRESH_PANE_VIEW ); } BOOL CTriggerPaneView::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default return TRUE; } namespace TempStruct { struct CategoryStruct { CString szStr; HTREEITEM hti; }; }; LRESULT CTriggerPaneView::OnRefresh( WPARAM wParam, LPARAM lParam ) { if( !m_TreeCtrl ) return S_OK; m_TreeCtrl.DeleteAllItems(); m_TreeCtrl.SetImageList( &m_ImageList, TVSIL_NORMAL ); m_TreeCtrl.EnableMultiSelect( true ); if( wParam == 0 ) m_pVecClipObjectList.clear(); m_hRootTree = m_TreeCtrl.InsertItem( "Trigger", 0, 1 ); SectorIndex Index = CGlobalValue::GetInstance().m_SelectGrid; if( Index == -1 ) return S_OK; CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Index ); if( pSector == NULL ) return S_OK; CTEtTrigger *pTrigger = (CTEtTrigger *)pSector->GetTrigger(); if( pTrigger == NULL ) return S_OK; using namespace TempStruct; std::vector VecCategory; for( DWORD i=0; iGetTriggerCount(); i++ ) { CTEtTriggerObject *pObject = (CTEtTriggerObject *)pTrigger->GetTriggerFromIndex(i); int nIndex = -1; for( DWORD j=0; jGetCategory() ) == NULL ) { nIndex = j; break; } } if( nIndex == -1 ) { CategoryStruct Struct; Struct.szStr = pObject->GetCategory(); Struct.hti = m_TreeCtrl.InsertItem( Struct.szStr, 0, 1, m_hRootTree ); VecCategory.push_back( Struct ); } } m_TreeCtrl.Expand( m_hRootTree, TVE_EXPAND ); for( DWORD i=0; iGetTriggerCount(); i++ ) { CTEtTriggerObject *pObject = (CTEtTriggerObject *)pTrigger->GetTriggerFromIndex(i); int nIndex = -1; for( DWORD j=0; jGetCategory() ) == NULL ) { nIndex = j; break; } } if( nIndex == -1 ) assert(0); m_TreeCtrl.InsertItem( pObject->GetTriggerName(), 2, 2, VecCategory[nIndex].hti ); // m_TreeCtrl.Expand( VecCategory[nIndex].hti, TVE_EXPAND ); } return S_OK; } void CTriggerPaneView::OnContextMenu(CWnd* /*pWnd*/, CPoint point) { // TODO: Add your message handler code here if( CFileServer::GetInstance().IsConnect() == false ) return; if( CGlobalValue::GetInstance().m_nPickType != -1 ) return; SectorIndex Index = CGlobalValue::GetInstance().m_SelectGrid; if( Index == -1 ) return; CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Index ); if( pSector == NULL ) return; CTEtTrigger *pTrigger = (CTEtTrigger *)pSector->GetTrigger(); if( pTrigger == NULL ) return; CMenu *pSubMenu = m_pContextMenu->GetSubMenu(5); pSubMenu->EnableMenuItem( ID_TRIGGERLIST_ADDCATEGORY, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED ); pSubMenu->EnableMenuItem( ID_TRIGGERLIST_ADDTRIGGER, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED ); pSubMenu->EnableMenuItem( ID_TRIGGERLIST_COPY, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED ); pSubMenu->EnableMenuItem( ID_TRIGGERLIST_CUT, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED ); pSubMenu->EnableMenuItem( ID_TRIGGERLIST_PASTE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED ); pSubMenu->EnableMenuItem( ID_TRIGGERLIST_DELETE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED ); if( CGlobalValue::GetInstance().IsCheckOutMe() ) { CalcSelectItem(); if( m_SelectItemList.GetCount() == 1 ) { HTREEITEM hti = m_SelectItemList.GetHead(); CString szName = m_TreeCtrl.GetItemText( hti ); if( hti == m_hRootTree ) { pSubMenu->EnableMenuItem( ID_TRIGGERLIST_ADDCATEGORY, MF_BYCOMMAND | MF_ENABLED ); } else { if( pTrigger->GetTriggerFromName( szName ) == NULL ) { pSubMenu->EnableMenuItem( ID_TRIGGERLIST_ADDTRIGGER, MF_BYCOMMAND | MF_ENABLED ); } if( !m_pVecClipObjectList.empty() ) pSubMenu->EnableMenuItem( ID_TRIGGERLIST_PASTE, MF_BYCOMMAND | MF_ENABLED ); } } if( m_SelectItemList.GetCount() >= 1 ) { bool bValid = true; POSITION p = m_SelectItemList.GetHeadPosition(); HTREEITEM hti; while(p) { hti = m_SelectItemList.GetNext(p); if( hti == m_hRootTree ) { bValid = false; break; } } if( bValid ) { pSubMenu->EnableMenuItem( ID_TRIGGERLIST_DELETE, MF_BYCOMMAND | MF_ENABLED ); pSubMenu->EnableMenuItem( ID_TRIGGERLIST_COPY, MF_BYCOMMAND | MF_ENABLED ); pSubMenu->EnableMenuItem( ID_TRIGGERLIST_CUT, MF_BYCOMMAND | MF_ENABLED ); } } } pSubMenu->TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this ); } void CTriggerPaneView::OnTriggerlistAddcategory() { // TODO: Add your command handler code here SectorIndex Index = CGlobalValue::GetInstance().m_SelectGrid; if( Index == -1 ) return; CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Index ); if( pSector == NULL ) return; CString szName; int nCount = 0; while(1) { szName.Format( "New Category - %03d", nCount ); HTREEITEM hti = m_TreeCtrl.FindItem( szName, TRUE, TRUE, TRUE, m_hRootTree ); if( hti == NULL ) break; nCount++; } HTREEITEM hti = m_TreeCtrl.InsertItem( szName, 0, 1, m_hRootTree ); m_TreeCtrl.Expand( m_hRootTree, TVE_EXPAND ); m_TreeCtrl.SelectItems( hti, hti, TRUE ); CGlobalValue::GetInstance().SetModify(); } void CTriggerPaneView::OnTriggerlistAddtrigger() { // TODO: Add your command handler code here SectorIndex Index = CGlobalValue::GetInstance().m_SelectGrid; if( Index == -1 ) return; CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Index ); if( pSector == NULL ) return; CString szName = pSector->GetUniqueTriggerName(); CTEtTrigger *pTrigger = (CTEtTrigger *)pSector->GetTrigger(); if( pTrigger == NULL ) return; HTREEITEM hParent = m_SelectItemList.GetHead(); CString szCategory = m_TreeCtrl.GetItemText( hParent ); pTrigger->InsertTrigger( szCategory, szName ); HTREEITEM hti = m_TreeCtrl.InsertItem( szName, 2, 2, hParent ); m_TreeCtrl.Expand( hParent, TVE_EXPAND ); m_TreeCtrl.SelectItems( hti, hti, TRUE ); CGlobalValue::GetInstance().SetModify(); } void CTriggerPaneView::CalcSelectItem() { m_SelectItemList.RemoveAll(); m_TreeCtrl.GetSelectedList( m_SelectItemList ); } void CTriggerPaneView::OnTvnBeginlabeleditTree1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMTVDISPINFO pTVDispInfo = reinterpret_cast(pNMHDR); // TODO: Add your control notification handler code here *pResult = 0; m_szPrevLabelString = pTVDispInfo->item.pszText; } void CTriggerPaneView::OnTvnEndlabeleditTree1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMTVDISPINFO pTVDispInfo = reinterpret_cast(pNMHDR); // TODO: Add your control notification handler code here *pResult = 0; if( m_hRootTree == pTVDispInfo->item.hItem ) return; if( pTVDispInfo->item.pszText == NULL ) return; if( !CGlobalValue::GetInstance().IsCheckOutMe() ) return; SectorIndex Index = CGlobalValue::GetInstance().m_SelectGrid; if( Index == -1 ) return; CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Index ); if( pSector == NULL ) return; CTEtTrigger *pTrigger = (CTEtTrigger *)pSector->GetTrigger(); if( pTrigger == NULL ) return; CEtTriggerObject *pObject = pTrigger->GetTriggerFromName( m_szPrevLabelString ); if( pObject ) { CEtTriggerObject *pNewObject = pTrigger->GetTriggerFromName( pTVDispInfo->item.pszText ); if( pNewObject ) return; ((CTEtTriggerObject*)pObject)->SetTriggerName( pTVDispInfo->item.pszText ); m_TreeCtrl.SetItemText( pTVDispInfo->item.hItem, pTVDispInfo->item.pszText ); CWnd *pWnd = GetPaneWnd( TRIGGER_PROP_PANE ); if( pWnd ) pWnd->SendMessage( UM_REFRESH_PANE_VIEW, 0, (LPARAM)pObject ); pWnd = GetPaneWnd( TRIGGER_ATTR_PANE ); if( pWnd ) pWnd->SendMessage( UM_REFRESH_PANE_VIEW, (WPARAM)pObject, 0 ); } else { HTREEITEM hti = m_TreeCtrl.FindItem( pTVDispInfo->item.pszText, TRUE, TRUE, TRUE ); if( hti ) { if( hti != pTVDispInfo->item.hItem ) return; } pTrigger->ChangeCategoryName( m_szPrevLabelString, pTVDispInfo->item.pszText ); m_TreeCtrl.SetItemText( pTVDispInfo->item.hItem, pTVDispInfo->item.pszText ); } CGlobalValue::GetInstance().SetModify(); } void CTriggerPaneView::OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMTREEVIEW pNMTreeView = reinterpret_cast(pNMHDR); // TODO: Add your control notification handler code here *pResult = 0; SectorIndex Index = CGlobalValue::GetInstance().m_SelectGrid; if( Index == -1 ) return; CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Index ); if( pSector == NULL ) return; CTEtTrigger *pTrigger = (CTEtTrigger *)pSector->GetTrigger(); if( pTrigger == NULL ) return; CWnd *pWnd = GetPaneWnd( TRIGGER_PROP_PANE ); CWnd *pWndAttr = GetPaneWnd( TRIGGER_ATTR_PANE ); CalcSelectItem(); if( m_SelectItemList.GetCount() == 1 ) { HTREEITEM hti = m_SelectItemList.GetHead(); CString szName = m_TreeCtrl.GetItemText( hti ); if( m_hRootTree == hti ) { if( pWnd ) pWnd->SendMessage( UM_REFRESH_PANE_VIEW, -1 ); if( pWndAttr ) pWndAttr->SendMessage( UM_REFRESH_PANE_VIEW ); } else { CEtTriggerObject *pObject = pTrigger->GetTriggerFromName( szName ); if( pObject ) { if( pWnd ) pWnd->SendMessage( UM_REFRESH_PANE_VIEW, 0, (LPARAM)pObject ); if( pWndAttr ) pWndAttr->SendMessage( UM_REFRESH_PANE_VIEW, (WPARAM)pObject ); } } } else { if( pWnd ) pWnd->SendMessage( UM_REFRESH_PANE_VIEW, -1 ); if( pWndAttr ) pWndAttr->SendMessage( UM_REFRESH_PANE_VIEW ); } } LRESULT CTriggerPaneView::OnEnablePane( WPARAM wParam, LPARAM lParam ) { m_TreeCtrl.EnableWindow( (BOOL)wParam ); return S_OK; } void CTriggerPaneView::OnTriggerlistDelete() { // TODO: Add your command handler code here SectorIndex Index = CGlobalValue::GetInstance().m_SelectGrid; if( Index == -1 ) return; CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Index ); if( pSector == NULL ) return; CTEtTrigger *pTrigger = (CTEtTrigger *)pSector->GetTrigger(); if( pTrigger == NULL ) return; for( DWORD i=0; iGetTriggerName(), TRUE, TRUE, TRUE ); if( hti ) { m_TreeCtrl.SetItemState( hti, 0, TVIS_CUT ); } } m_pVecClipObjectList.clear(); POSITION p = m_SelectItemList.GetHeadPosition(); std::vector hVecList; HTREEITEM hti; CString szStr, szCategory; std::vector hVecCategory; while(p) { hti = m_SelectItemList.GetNext(p); if( hti == m_hRootTree ) continue; hVecList.push_back( hti ); } for( DWORD i=0; iGetTriggerFromName( szStr ); if( pObject ) { HTREEITEM hParent = m_TreeCtrl.GetParentItem( hVecList[i] ); szCategory = m_TreeCtrl.GetItemText( hParent ); pTrigger->RemoveTrigger( szCategory, szStr ); m_TreeCtrl.DeleteItem( hVecList[i] ); } else { pTrigger->RemoveTrigger( szStr ); if( std::find( hVecCategory.begin(), hVecCategory.end(), hVecList[i] ) == hVecCategory.end() ) { hVecCategory.push_back( hVecList[i] ); } } } for( DWORD i=0; iSendMessage( UM_REFRESH_PANE_VIEW, -1, -1 ); if( pWndAttr ) pWndAttr->SendMessage( UM_REFRESH_PANE_VIEW ); } void CTriggerPaneView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default CFormView::OnKeyDown(nChar, nRepCnt, nFlags); } void CTriggerPaneView::OnTvnBegindragTree1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMTREEVIEW pNMTreeView = reinterpret_cast(pNMHDR); // TODO: Add your control notification handler code here if( m_TreeCtrl.GetParentItem(pNMTreeView->itemNew.hItem) == NULL ) return; SectorIndex Index = CGlobalValue::GetInstance().m_SelectGrid; if( Index == -1 ) return; CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Index ); if( pSector == NULL ) return; CTEtTrigger *pTrigger = (CTEtTrigger *)pSector->GetTrigger(); if( pTrigger == NULL ) return; m_hDrag = pNMTreeView->itemNew.hItem; if( m_hDrag == m_hRootTree ) return; // CString szObjectName = m_TreeCtrl.GetItemText( m_hDrag ); // CTEtTriggerObject *pElement = (CTEtTriggerObject *)pTrigger->GetTriggerFromName( szObjectName.GetBuffer() ); // if( !pElement ) return; // get the image list for dragging m_pDragImage = m_TreeCtrl.CreateDragImage( m_hDrag ); m_bDragging = true; m_pDragImage->BeginDrag( 0, CPoint(-15,0) ); POINT pt = pNMTreeView->ptDrag; ClientToScreen( &pt ); m_pDragImage->DragEnter( NULL, pt ); SetCapture(); if( GetAsyncKeyState( VK_SHIFT ) & 0x8000 ) m_bCopyDrag = true; else m_bCopyDrag = false; *pResult = 0; } void CTriggerPaneView::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default HTREEITEM hitem; UINT flags; if( m_bDragging ) { POINT pt = point; ClientToScreen( &pt ); CImageList::DragMove(pt); if( (hitem = m_TreeCtrl.HitTest(point, &flags) ) != NULL ) { CImageList::DragShowNolock(FALSE); SectorIndex Index = CGlobalValue::GetInstance().m_SelectGrid; if( Index == -1 ) return; CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Index ); if( pSector == NULL ) return; CTEtTrigger *pTrigger = (CTEtTrigger *)pSector->GetTrigger(); if( pTrigger == NULL ) return; CString szDragObject = m_TreeCtrl.GetItemText( m_hDrag ); CTEtTriggerObject *pObject = (CTEtTriggerObject *)pTrigger->GetTriggerFromName( szDragObject ); bool bValid = true; if( pObject ) { if( m_hRootTree == hitem ) bValid = false; } else { CString szDrop = m_TreeCtrl.GetItemText( hitem ); pObject = (CTEtTriggerObject *)pTrigger->GetTriggerFromName( szDrop ); if( pObject ) bValid = false; } if( bValid ) { m_TreeCtrl.SelectDropTarget(hitem); m_hDrop = hitem; } else { m_TreeCtrl.SelectDropTarget(NULL); m_hDrop = NULL; } CImageList::DragShowNolock( TRUE ); } } CFormView::OnMouseMove(nFlags, point); } void CTriggerPaneView::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default if( m_bDragging ) { m_bDragging = false; CImageList::DragLeave(this); CImageList::EndDrag(); ReleaseCapture(); if( m_pDragImage != NULL ) { delete m_pDragImage; m_pDragImage = NULL; } m_TreeCtrl.SelectDropTarget(NULL); if( m_hDrag != m_hDrop ) { HTREEITEM hitem; POINT pt2 = point; if( ((hitem = m_TreeCtrl.HitTest(pt2, &nFlags)) == NULL) ) return ; SectorIndex Index = CGlobalValue::GetInstance().m_SelectGrid; if( Index == -1 ) return; CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Index ); if( pSector == NULL ) return; CTEtTrigger *pTrigger = (CTEtTrigger *)pSector->GetTrigger(); if( pTrigger == NULL ) return; CString szDrop = m_TreeCtrl.GetItemText( hitem ); CString szDrag = m_TreeCtrl.GetItemText( m_hDrag ); CTEtTriggerObject *pObject = (CTEtTriggerObject *)pTrigger->GetTriggerFromName( szDrop ); CTEtTriggerObject *pDragObject = (CTEtTriggerObject *)pTrigger->GetTriggerFromName( szDrag ); if( pDragObject ) { if( m_hRootTree == hitem ) return; } else { if( pObject ) return; } CGlobalValue::GetInstance().SetModify(); if( pDragObject == NULL ) { if( m_hDrop == m_hRootTree ) { pTrigger->ChangeCategoryOrder( szDrag, "" ); } else { pTrigger->ChangeCategoryOrder( szDrag, szDrop ); } SendMessage( UM_REFRESH_PANE_VIEW, 1 ); // return; } else { if( m_bCopyDrag ) { if( !( GetAsyncKeyState( VK_SHIFT ) & 0x8000 ) ) m_bCopyDrag = false; } if( m_bCopyDrag ) { CTEtTriggerObject *pCopy = (CTEtTriggerObject *)pTrigger->AllocTriggerObject(); *pCopy = *pDragObject; CString szCopy; int nCount = 0; while(1) { szCopy.Format( "Copy to %s %d", pCopy->GetTriggerName(), nCount ); if( pTrigger->GetTriggerFromName( szCopy ) == NULL ) break; nCount++; } pCopy->SetTriggerName( szCopy ); pDragObject = pCopy; pTrigger->InsertTrigger( pCopy ); } if( pObject == NULL ) { if( _stricmp( szDrop, pDragObject->GetCategory() ) == NULL ) { pTrigger->ChangeTriggerOrder( pDragObject, szDrop ); } else { pDragObject->SetCategory( szDrop ); pTrigger->ChangeTriggerOrder( pDragObject, szDrop ); } if( !m_bCopyDrag ) m_TreeCtrl.DeleteItem( m_hDrag ); m_TreeCtrl.InsertItem( pDragObject->GetTriggerName(), 2, 2, hitem, TVI_FIRST ); } else { if( _stricmp( pObject->GetCategory(), pDragObject->GetCategory() ) != NULL ) { pDragObject->SetCategory( pObject->GetCategory() ); } pTrigger->ChangeTriggerOrder( pDragObject, pObject ); HTREEITEM hCategory = m_TreeCtrl.FindItem( pObject->GetCategory(), TRUE, TRUE, TRUE, m_hRootTree ); // HTREEITEM hti = m_TreeCtrl.FindItem( pObject->GetTriggerName(), TRUE, TRUE, TRUE, hCategory ); if( !m_bCopyDrag ) m_TreeCtrl.DeleteItem( m_hDrag ); m_TreeCtrl.InsertItem( pDragObject->GetTriggerName(), 2, 2, hCategory, hitem ); } } } } SectorIndex Index = CGlobalValue::GetInstance().m_SelectGrid; if( Index == -1 ) return; CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Index ); if( pSector == NULL ) return; CTEtTrigger *pTrigger = (CTEtTrigger *)pSector->GetTrigger(); if( pTrigger == NULL ) return; HTREEITEM hCategory = m_TreeCtrl.GetChildItem( m_hRootTree ); std::vector szVecCategoryList; while( hCategory != NULL ) { CString szName = m_TreeCtrl.GetItemText( hCategory ); hCategory = m_TreeCtrl.GetNextItem( hCategory ); CEtTriggerObject *pObject = pTrigger->GetTriggerFromName( szName ); if( pObject == NULL ) { szVecCategoryList.push_back( szName ); } else { bool bExist = false; for( DWORD i=0; iGetCategory() ) == NULL ) { bExist = true; break; } } if( !bExist ) { szVecCategoryList.push_back( pObject->GetCategory() ); } } } pTrigger->SortCategory( szVecCategoryList ); m_bCopyDrag = false; OutputDebug( "------------------------------------------------\n" ); for( DWORD i=0; iGetTriggerCount(); i++ ) { OutputDebug( "%d - %s ( %s )\n", i, pTrigger->GetTriggerFromIndex(i)->GetTriggerName(), pTrigger->GetTriggerFromIndex(i)->GetCategory() ); } CFormView::OnLButtonUp(nFlags, point); } void CTriggerPaneView::OnTriggerlistCopy() { for( DWORD i=0; iGetTriggerName(), TRUE, TRUE, TRUE ); if( hti ) { m_TreeCtrl.SetItemState( hti, 0, TVIS_CUT ); } } m_pVecClipObjectList.clear(); SectorIndex Index = CGlobalValue::GetInstance().m_SelectGrid; if( Index == -1 ) return; CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Index ); if( pSector == NULL ) return; CTEtTrigger *pTrigger = (CTEtTrigger *)pSector->GetTrigger(); if( pTrigger == NULL ) return; POSITION p = m_SelectItemList.GetHeadPosition(); HTREEITEM hti; CString szStr, szCategory; while(p) { hti = m_SelectItemList.GetNext(p); if( hti == m_hRootTree ) continue; szStr = m_TreeCtrl.GetItemText( hti ); CEtTriggerObject *pObject = pTrigger->GetTriggerFromName( szStr ); if( pObject ) { if( std::find( m_pVecClipObjectList.begin(), m_pVecClipObjectList.end(), pObject ) == m_pVecClipObjectList.end() ) { m_pVecClipObjectList.push_back( pObject ); } } else { for( DWORD i=0; iGetTriggerCount(); i++ ) { if( _stricmp( pTrigger->GetTriggerFromIndex(i)->GetCategory(), szStr ) == NULL ) { if( std::find( m_pVecClipObjectList.begin(), m_pVecClipObjectList.end(), pTrigger->GetTriggerFromIndex(i) ) == m_pVecClipObjectList.end() ) { m_pVecClipObjectList.push_back( pTrigger->GetTriggerFromIndex(i) ); } } } } } m_bClipObjectCut = false; } void CTriggerPaneView::OnTriggerlistCut() { for( DWORD i=0; iGetTriggerName(), TRUE, TRUE, TRUE ); if( hti ) { m_TreeCtrl.SetItemState( hti, 0, TVIS_CUT ); } } m_pVecClipObjectList.clear(); // TODO: Add your command handler code here SectorIndex Index = CGlobalValue::GetInstance().m_SelectGrid; if( Index == -1 ) return; CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Index ); if( pSector == NULL ) return; CTEtTrigger *pTrigger = (CTEtTrigger *)pSector->GetTrigger(); if( pTrigger == NULL ) return; POSITION p = m_SelectItemList.GetHeadPosition(); HTREEITEM hti; CString szStr, szCategory; while(p) { hti = m_SelectItemList.GetNext(p); if( hti == m_hRootTree ) continue; szStr = m_TreeCtrl.GetItemText( hti ); CEtTriggerObject *pObject = pTrigger->GetTriggerFromName( szStr ); if( pObject ) { if( std::find( m_pVecClipObjectList.begin(), m_pVecClipObjectList.end(), pObject ) == m_pVecClipObjectList.end() ) { m_TreeCtrl.SetItemState( hti, TVIS_CUT, TVIS_CUT ); m_pVecClipObjectList.push_back( pObject ); } } else { for( DWORD i=0; iGetTriggerCount(); i++ ) { if( _stricmp( pTrigger->GetTriggerFromIndex(i)->GetCategory(), szStr ) == NULL ) { if( std::find( m_pVecClipObjectList.begin(), m_pVecClipObjectList.end(), pTrigger->GetTriggerFromIndex(i) ) == m_pVecClipObjectList.end() ) { HTREEITEM hChild = m_TreeCtrl.FindItem( pTrigger->GetTriggerFromIndex(i)->GetTriggerName(), TRUE, TRUE, TRUE, hti ); if( hChild ) { m_TreeCtrl.SetItemState( hChild, TVIS_CUT, TVIS_CUT ); m_pVecClipObjectList.push_back( pTrigger->GetTriggerFromIndex(i) ); } } } } } } m_bClipObjectCut = true; } void CTriggerPaneView::OnTriggerlistPaste() { POSITION p = m_SelectItemList.GetHeadPosition(); HTREEITEM hti; CString szStr; while(p) { hti = m_SelectItemList.GetNext(p); if( hti == m_hRootTree ) return; szStr = m_TreeCtrl.GetItemText( hti ); break; } SectorIndex Index = CGlobalValue::GetInstance().m_SelectGrid; if( Index == -1 ) return; CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Index ); if( pSector == NULL ) return; CTEtTrigger *pTrigger = (CTEtTrigger *)pSector->GetTrigger(); if( pTrigger == NULL ) return; // TODO: Add your command handler code here if( m_bClipObjectCut ) { for( DWORD i=0; iGetTriggerName(), TRUE, TRUE, TRUE ); if( hTemp ) { m_TreeCtrl.SetItemState( hTemp, 0, TVIS_CUT ); } } HTREEITEM hParent; HTREEITEM hOrder; for( int i=(int)m_pVecClipObjectList.size()-1; i>=0; i-- ) { if( pTrigger->GetTriggerFromName( szStr ) ) { hParent = m_TreeCtrl.GetParentItem( hti ); hOrder = hti; CString szCategory = m_TreeCtrl.GetItemText( hParent ); ((CTEtTriggerObject*)m_pVecClipObjectList[i])->SetCategory( szCategory ); pTrigger->ChangeTriggerOrder( (CTEtTriggerObject*)m_pVecClipObjectList[i], (CTEtTriggerObject*)pTrigger->GetTriggerFromName( szStr ) ); } else { hParent = hti; hOrder = TVI_FIRST; ((CTEtTriggerObject*)m_pVecClipObjectList[i])->SetCategory( szStr ); pTrigger->ChangeTriggerOrder( (CTEtTriggerObject*)m_pVecClipObjectList[i], szStr ); } HTREEITEM hClip = m_TreeCtrl.FindItem( m_pVecClipObjectList[i]->GetTriggerName(), TRUE, TRUE, TRUE ); m_TreeCtrl.DeleteItem( hClip ); m_TreeCtrl.InsertItem( ((CTEtTriggerObject*)m_pVecClipObjectList[i])->GetTriggerName(), 2, 2, hParent, hOrder ); } m_pVecClipObjectList.clear(); } else { for( int i=(int)m_pVecClipObjectList.size()-1; i>=0; i-- ) { CTEtTriggerObject *pCopy = (CTEtTriggerObject *)pTrigger->AllocTriggerObject(); *pCopy = *(CTEtTriggerObject*)m_pVecClipObjectList[i]; CString szCopy; int nCount = 0; while(1) { szCopy.Format( "Copy to %s %d", pCopy->GetTriggerName(), nCount ); if( pTrigger->GetTriggerFromName( szCopy ) == NULL ) break; nCount++; } pCopy->SetTriggerName( szCopy ); pTrigger->InsertTrigger( pCopy ); m_pVecClipObjectList[i] = pCopy; HTREEITEM hParent; HTREEITEM hOrder; if( pTrigger->GetTriggerFromName( szStr ) ) { hParent = m_TreeCtrl.GetParentItem( hti ); hOrder = hti; CString szCategory = m_TreeCtrl.GetItemText( hParent ); ((CTEtTriggerObject*)m_pVecClipObjectList[i])->SetCategory( szCategory ); pTrigger->ChangeTriggerOrder( (CTEtTriggerObject*)m_pVecClipObjectList[i], (CTEtTriggerObject*)pTrigger->GetTriggerFromName( szStr ) ); } else { hParent = hti; hOrder = TVI_FIRST; ((CTEtTriggerObject*)m_pVecClipObjectList[i])->SetCategory( szStr ); pTrigger->ChangeTriggerOrder( (CTEtTriggerObject*)m_pVecClipObjectList[i], szStr ); } m_TreeCtrl.InsertItem( ((CTEtTriggerObject*)m_pVecClipObjectList[i])->GetTriggerName(), 2, 2, hParent, hOrder ); } } HTREEITEM hCategory = m_TreeCtrl.GetChildItem( m_hRootTree ); std::vector szVecCategoryList; while( hCategory != NULL ) { CString szName = m_TreeCtrl.GetItemText( hCategory ); hCategory = m_TreeCtrl.GetNextItem( hCategory ); CEtTriggerObject *pObject = pTrigger->GetTriggerFromName( szName ); if( pObject == NULL ) { szVecCategoryList.push_back( szName ); } else { bool bExist = false; for( DWORD i=0; iGetCategory() ) == NULL ) { bExist = true; break; } } if( !bExist ) { szVecCategoryList.push_back( pObject->GetCategory() ); } } } pTrigger->SortCategory( szVecCategoryList ); } void CTriggerPaneView::OnTvnKeydownTree1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMTVKEYDOWN pTVKeyDown = reinterpret_cast(pNMHDR); // TODO: Add your control notification handler code here if( pTVKeyDown->wVKey == VK_DELETE ) { OnTriggerlistDelete(); } else { if( GetAsyncKeyState( VK_CONTROL ) & 0x8000 ) { if( pTVKeyDown->wVKey == 0x43 ) { // Copy CalcSelectItem(); OnTriggerlistCopy(); } if( pTVKeyDown->wVKey == 0x58 ) { // Cut CalcSelectItem(); OnTriggerlistCut(); } if( pTVKeyDown->wVKey == 0x56 ) { // Paste CalcSelectItem(); OnTriggerlistPaste(); } } } *pResult = 0; } BOOL CTriggerPaneView::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class if( pMsg->message == WM_KEYDOWN ) { if( pMsg->wParam == VK_ESCAPE ) { for( DWORD i=0; iGetTriggerName(), TRUE, TRUE, TRUE ); if( hti ) { m_TreeCtrl.SetItemState( hti, 0, TVIS_CUT ); } } m_pVecClipObjectList.clear(); } } return CFormView::PreTranslateMessage(pMsg); }