//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ // //=============================================================================// // vkeyeditView.cpp : implementation of the CVkeyeditView class // #include "stdafx.h" #include "vkeyedit.h" #include "vkeyeditDoc.h" #include "vkeyeditView.h" #include #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CVkeyeditView IMPLEMENT_DYNCREATE(CVkeyeditView, CTreeView) BEGIN_MESSAGE_MAP(CVkeyeditView, CTreeView) //{{AFX_MSG_MAP(CVkeyeditView) ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged) //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CTreeView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CTreeView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CTreeView::OnFilePrintPreview) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CVkeyeditView construction/destruction CVkeyeditView::CVkeyeditView() { // TODO: add construction code here } CVkeyeditView::~CVkeyeditView() { } BOOL CVkeyeditView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs cs.style |= TVS_HASLINES|TVS_EDITLABELS|TVS_HASBUTTONS|TVS_LINESATROOT; return CTreeView::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CVkeyeditView drawing void CVkeyeditView::OnDraw(CDC* pDC) { CVkeyeditDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here } //DEL void CVkeyeditView::OnInitialUpdate() //DEL { //DEL CTreeView::OnInitialUpdate(); //DEL //DEL CTreeCtrl &tree = GetTreeCtrl(); //DEL //DEL // tree.InsertItem( _T("Test") ); //DEL //DEL //DEL // TODO: You may populate your TreeView with items by directly accessing //DEL // its tree control through a call to GetTreeCtrl(). //DEL } ///////////////////////////////////////////////////////////////////////////// // CVkeyeditView printing BOOL CVkeyeditView::OnPreparePrinting(CPrintInfo* pInfo) { // default preparation return DoPreparePrinting(pInfo); } void CVkeyeditView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add extra initialization before printing } void CVkeyeditView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add cleanup after printing } ///////////////////////////////////////////////////////////////////////////// // CVkeyeditView diagnostics #ifdef _DEBUG void CVkeyeditView::AssertValid() const { CTreeView::AssertValid(); } void CVkeyeditView::Dump(CDumpContext& dc) const { CTreeView::Dump(dc); } CVkeyeditDoc* CVkeyeditView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CVkeyeditDoc))); return (CVkeyeditDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CVkeyeditView message handlers void CVkeyeditView::CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType) { // TODO: Add your specialized code here and/or call the base class CTreeView::CalcWindowRect(lpClientRect, nAdjustType); } // Sort the item in reverse alphabetical order. static int CALLBACK MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { return strcmp( ((KeyValues*)(lParam1))->GetName(), ((KeyValues*)(lParam2))->GetName() ); } void CVkeyeditView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) { // TODO: Add your specialized code here and/or call the base class CTreeCtrl &theTree = GetTreeCtrl(); KeyValues *kv = (KeyValues *)pHint; if ( !kv || lHint != 1 ) return; theTree.DeleteAllItems(); while ( kv ) { InsertKeyValues( kv, TVI_ROOT ); kv = kv->GetNextKey(); } // The pointer to my tree control. TVSORTCB tvs; // Sort the tree control's items using my // callback procedure. tvs.hParent = TVI_ROOT; tvs.lpfnCompare = MyCompareProc; tvs.lParam = (LPARAM) &theTree; theTree.SortChildrenCB(&tvs); } bool CVkeyeditView::InsertKeyValues(KeyValues *kv, HTREEITEM hParent) { CTreeCtrl &theTree = GetTreeCtrl(); TVINSERTSTRUCT tvInsert; tvInsert.hParent = hParent; tvInsert.hInsertAfter = TVI_LAST; tvInsert.item.mask = TVIF_TEXT; tvInsert.item.lParam = (LPARAM)kv; tvInsert.item.pszText = (char*)kv->GetName(); HTREEITEM hItem = theTree.InsertItem( &tvInsert ); theTree.SetItemData(hItem, (DWORD) kv ); KeyValues * subkey = kv->GetFirstTrueSubKey(); while ( subkey ) { InsertKeyValues( subkey, hItem ); subkey = subkey->GetNextKey(); } // The pointer to my tree control. TVSORTCB tvs; // Sort the tree control's items using my // callback procedure. tvs.hParent = hParent; tvs.lpfnCompare = MyCompareProc; tvs.lParam = (LPARAM) &theTree; theTree.SortChildrenCB(&tvs); return true; } void CVkeyeditView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW *pNMTreeView = (NM_TREEVIEW*) pNMHDR; CTreeCtrl &tTree = this->GetTreeCtrl (); CTreeCtrl &theTree = this->GetTreeCtrl (); HTREEITEM hItem = pNMTreeView->itemNew.hItem; GetDocument()->UpdateAllViews ( this, 2, (CObject*)theTree.GetItemData(hItem) ); *pResult = 0; }