home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tricks of the Windows Gam…ming Gurus (2nd Edition)
/
Disc2.iso
/
msdn_vcb
/
samples
/
vc98
/
mfc
/
advanced
/
collect
/
mapdwvw.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1998-03-26
|
7KB
|
249 lines
// mapdwvw.cpp : implementation file
//
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
#include "stdafx.h"
#include "collect.h"
#include "colledoc.h"
#include "mapdwvw.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMapDWordToMyStructView
IMPLEMENT_DYNCREATE(CMapDWordToMyStructView, CFormView)
CMapDWordToMyStructView::CMapDWordToMyStructView()
: CFormView(CMapDWordToMyStructView::IDD)
{
//{{AFX_DATA_INIT(CMapDWordToMyStructView)
m_int = 0;
m_float = 0.0f;
m_str = "";
m_dwKey = 0;
//}}AFX_DATA_INIT
}
CMapDWordToMyStructView::~CMapDWordToMyStructView()
{
}
void CMapDWordToMyStructView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
// Copy all of the assocations from the document's CMap to the listbox.
DWORD dwKey;
CMyStruct* pMyStruct;
m_ctlList.ResetContent();
CMapDWordToMyStruct& map = GetDocument()->m_mapDWordToMyStruct;
POSITION pos = map.GetStartPosition();
while (pos != NULL)
{
map.GetNextAssoc(pos, dwKey, pMyStruct);
AddMapEntryToListBox(dwKey, pMyStruct);
}
}
void CMapDWordToMyStructView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMapDWordToMyStructView)
DDX_Control(pDX, IDC_LIST, m_ctlList);
DDX_Text(pDX, IDC_INT, m_int);
DDX_Text(pDX, IDC_FLOAT, m_float);
DDX_Text(pDX, IDC_STRING, m_str);
DDX_Text(pDX, IDC_KEY, m_dwKey);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMapDWordToMyStructView, CFormView)
//{{AFX_MSG_MAP(CMapDWordToMyStructView)
ON_BN_CLICKED(IDC_ADD_OR_UPDATE, OnAddOrUpdate)
ON_BN_CLICKED(IDC_FIND, OnFind)
ON_BN_CLICKED(IDC_REMOVE, OnRemove)
ON_BN_CLICKED(IDC_REMOVE_ALL, OnRemoveAll)
ON_LBN_SELCHANGE(IDC_LIST, OnSelChangeList)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMapDWordToMyStructView diagnostics
#ifdef _DEBUG
void CMapDWordToMyStructView::AssertValid() const
{
CFormView::AssertValid();
}
void CMapDWordToMyStructView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
CCollectDoc* CMapDWordToMyStructView::GetDocument() // non-debug version is inline
{
return STATIC_DOWNCAST(CCollectDoc, m_pDocument);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMapDWordToMyStructView internal implementation
CString CMapDWordToMyStructView::FormatListBoxEntry(DWORD dwKey, CMyStruct* pMyStruct)
{
CString strListBoxEntry;
strListBoxEntry.Format(_T("%d"),dwKey);
strListBoxEntry += _T(" >> ");
CString strMyStruct;
pMyStruct->FormatMyStruct(strMyStruct);
strListBoxEntry += strMyStruct;
return strListBoxEntry;
}
int CMapDWordToMyStructView::FindKeyInListBox(DWORD dwKey)
{
for (int nSel = 0; nSel < m_ctlList.GetCount(); nSel++)
{
if (m_ctlList.GetItemData(nSel) == dwKey)
return nSel;
}
return LB_ERR;
}
void CMapDWordToMyStructView::AddMapEntryToListBox(DWORD dwKey, CMyStruct* pMyStruct)
{
CString strListBoxEntry = FormatListBoxEntry(dwKey, pMyStruct);
int nSel = m_ctlList.AddString(strListBoxEntry);
m_ctlList.SetItemData(nSel, dwKey);
}
CMyStruct* CMapDWordToMyStructView::ConstructMyStructFromView()
{
CMyStruct* pMyStruct = new CMyStruct;
pMyStruct->m_int = m_int;
pMyStruct->m_float = m_float;
pMyStruct->m_str = m_str;
return pMyStruct;
}
void CMapDWordToMyStructView::UpdateViewFromMyStruct(CMyStruct* pMyStruct)
{
m_int = pMyStruct->m_int;
m_float = pMyStruct->m_float;
m_str = pMyStruct->m_str;
UpdateData(FALSE); // update the value found in the map lookup
}
/////////////////////////////////////////////////////////////////////////////
// CMapDWordToMyStructView message handlers
void CMapDWordToMyStructView::OnAddOrUpdate()
{
if (UpdateData() != TRUE)
return;
// Add or replace entry in the listbox
int nSel = FindKeyInListBox(m_dwKey);
if (nSel != LB_ERR)
m_ctlList.DeleteString(nSel);
CMyStruct* pMyStruct = ConstructMyStructFromView();
AddMapEntryToListBox(m_dwKey, pMyStruct);
// Add or update association in the CMap
CMyStruct* pTemp = GetDocument()->m_mapDWordToMyStruct[m_dwKey];
delete pTemp; // delete old value
GetDocument()->m_mapDWordToMyStruct[m_dwKey] = pMyStruct;
}
void CMapDWordToMyStructView::OnFind()
{
if (UpdateData() != TRUE)
return;
CMyStruct* pMyStruct;
if (GetDocument()->m_mapDWordToMyStruct.Lookup(m_dwKey, pMyStruct) != TRUE)
{
AfxMessageBox(IDS_KEY_NOT_FOUND);
return;
}
UpdateViewFromMyStruct(pMyStruct);
}
void CMapDWordToMyStructView::OnRemove()
{
if (UpdateData() != TRUE)
return;
CMyStruct* pMyStruct;
CMapDWordToMyStruct& map = GetDocument()->m_mapDWordToMyStruct;
if (map.Lookup(m_dwKey, pMyStruct) != TRUE)
{
AfxMessageBox(IDS_KEY_NOT_FOUND);
return;
}
if (m_int != pMyStruct->m_int
|| m_float != pMyStruct->m_float
|| m_str != pMyStruct->m_str)
{
UpdateViewFromMyStruct(pMyStruct);
AfxMessageBox(IDS_KEY_NOT_FOUND_CHOOSE_REMOVE_AGAIN);
return;
}
// Remove assocation from the listbox
int nSel = FindKeyInListBox(m_dwKey);
ASSERT(nSel != LB_ERR);
m_ctlList.DeleteString(nSel);
// Remove the association from the CMap
map.RemoveKey(m_dwKey);
// Delete CMyStruct
delete pMyStruct;
}
void CMapDWordToMyStructView::OnRemoveAll()
{
CCollectDoc* pDoc = GetDocument();
POSITION pos = GetDocument()->m_mapDWordToMyStruct.GetStartPosition();
while (pos != NULL)
{
DWORD dwKey;
CMyStruct* pMyStruct;
pDoc->m_mapDWordToMyStruct.GetNextAssoc(pos, dwKey, pMyStruct);
delete pMyStruct;
}
pDoc->m_mapDWordToMyStruct.RemoveAll();
m_ctlList.ResetContent();
}
void CMapDWordToMyStructView::OnSelChangeList()
{
// Update the "key" field to reflect the new selection in the listbox.
m_dwKey = m_ctlList.GetItemData(m_ctlList.GetCurSel());
UpdateData(FALSE);
// Now that the key field has been updated to reflect the listbox selection,
// find the string in the map as though the user had hit the Find button.
OnFind();
}