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
/
typtrmap.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1998-03-26
|
7KB
|
256 lines
// typtrmap.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 "typtrmap.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTypedPtrMapView
IMPLEMENT_DYNCREATE(CTypedPtrMapView, CFormView)
CTypedPtrMapView::CTypedPtrMapView()
: CFormView(CTypedPtrMapView::IDD)
{
//{{AFX_DATA_INIT(CTypedPtrMapView)
m_strKey = "";
m_int = 0;
m_float = 0.0f;
m_str = "";
//}}AFX_DATA_INIT
}
CTypedPtrMapView::~CTypedPtrMapView()
{
}
void CTypedPtrMapView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
// Copy all of the assocations from the document's CTypedPtrMap
// to the listbox.
CString strKey;
CMyObject* pMyObject;
m_ctlList.ResetContent();
CMapStringToMyObject& map = GetDocument()->m_mapStringToMyObject;
POSITION pos = map.GetStartPosition();
while (pos != NULL)
{
map.GetNextAssoc(pos, strKey, pMyObject);
AddMapEntryToListBox(strKey, pMyObject);
}
}
void CTypedPtrMapView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTypedPtrMapView)
DDX_Control(pDX, IDC_LIST, m_ctlList);
DDX_Text(pDX, IDC_KEY, m_strKey);
DDX_Text(pDX, IDC_INT, m_int);
DDX_Text(pDX, IDC_FLOAT, m_float);
DDX_Text(pDX, IDC_STRING, m_str);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTypedPtrMapView, CFormView)
//{{AFX_MSG_MAP(CTypedPtrMapView)
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()
/////////////////////////////////////////////////////////////////////////////
// CTypedPtrMapView diagnostics
#ifdef _DEBUG
void CTypedPtrMapView::AssertValid() const
{
CFormView::AssertValid();
}
void CTypedPtrMapView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
CCollectDoc* CTypedPtrMapView::GetDocument() // non-debug version is inline
{
return STATIC_DOWNCAST(CCollectDoc, m_pDocument);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CTypedPtrMapView internal implementation
CString CTypedPtrMapView::FormatListBoxEntry(CString& strKey, CMyObject* pMyObject)
{
CString strListBoxEntry = strKey;
strListBoxEntry += _T(" >> ");
CString strMyObject;
pMyObject->FormatMyObject(strMyObject);
strListBoxEntry += strMyObject;
return strListBoxEntry;
}
int CTypedPtrMapView::FindKeyInListBox(CString& strKey)
{
CMyObject* pMyObject;
if (GetDocument()->m_mapStringToMyObject.Lookup(strKey, pMyObject) != TRUE)
return LB_ERR;
CString strListBoxEntry = FormatListBoxEntry(strKey, pMyObject);
return m_ctlList.FindString(-1, strListBoxEntry);
}
void CTypedPtrMapView::AddMapEntryToListBox(CString& strKey, CMyObject* pMyObject)
{
CString strListBoxEntry = FormatListBoxEntry(strKey, pMyObject);
m_ctlList.AddString(strListBoxEntry);
}
CMyObject* CTypedPtrMapView::ConstructMyObjectFromView()
{
CMyObject* pMyObject = new CMyObject;
pMyObject->m_int = m_int;
pMyObject->m_float = m_float;
pMyObject->m_str = m_str;
return pMyObject;
}
void CTypedPtrMapView::UpdateViewFromMyObject(CMyObject* pMyObject)
{
m_int = pMyObject->m_int;
m_float = pMyObject->m_float;
m_str = pMyObject->m_str;
UpdateData(FALSE); // update the value found in the map lookup
}
/////////////////////////////////////////////////////////////////////////////
// CTypedPtrMapView message handlers
void CTypedPtrMapView::OnAddOrUpdate()
{
if (UpdateData() != TRUE)
return;
// Add or replace entry in the listbox
int nSel = FindKeyInListBox(m_strKey);
if (nSel != LB_ERR)
m_ctlList.DeleteString(nSel);
CMyObject* pMyObject = ConstructMyObjectFromView();
AddMapEntryToListBox(m_strKey, pMyObject);
// Add or update association in the CTypedPtrMap
CMyObject* pTemp = GetDocument()->m_mapStringToMyObject[m_strKey];
delete pTemp; // delete old value
GetDocument()->m_mapStringToMyObject[m_strKey] = pMyObject;
}
void CTypedPtrMapView::OnFind()
{
if (UpdateData() != TRUE)
return;
CMyObject* pMyObject;
if (GetDocument()->m_mapStringToMyObject.Lookup(m_strKey, pMyObject) != TRUE)
{
AfxMessageBox(IDS_KEY_NOT_FOUND);
return;
}
UpdateViewFromMyObject(pMyObject);
}
void CTypedPtrMapView::OnRemove()
{
if (UpdateData() != TRUE)
return;
CMyObject* pMyObject;
CMapStringToMyObject& map = GetDocument()->m_mapStringToMyObject;
if (map.Lookup(m_strKey, pMyObject) != TRUE)
{
AfxMessageBox(IDS_KEY_NOT_FOUND);
return;
}
if (m_int != pMyObject->m_int
|| m_float != pMyObject->m_float
|| m_str != pMyObject->m_str)
{
UpdateViewFromMyObject(pMyObject);
AfxMessageBox(IDS_KEY_NOT_FOUND_CHOOSE_REMOVE_AGAIN);
return;
}
// Remove assocation from the listbox
int nSel = FindKeyInListBox(m_strKey);
ASSERT(nSel != LB_ERR);
m_ctlList.DeleteString(nSel);
// Remove the association from the CTypedPtrMap
map.RemoveKey(m_strKey);
// Delete the CMyObject
delete pMyObject;
}
void CTypedPtrMapView::OnRemoveAll()
{
CCollectDoc* pDoc = GetDocument();
POSITION pos = pDoc->m_mapStringToMyObject.GetStartPosition();
while (pos != NULL)
{
CString str;
CMyObject* pMyObject;
pDoc->m_mapStringToMyObject.GetNextAssoc(pos, str, pMyObject);
delete pMyObject;
}
pDoc->m_mapStringToMyObject.RemoveAll();
m_ctlList.ResetContent();
}
void CTypedPtrMapView::OnSelChangeList()
{
// Update the "key" field to reflect the new selection in the listbox.
CString str;
m_ctlList.GetText(m_ctlList.GetCurSel(), str);
m_strKey.Empty();
LPCTSTR lpsz = str;
while (*lpsz != ' ' || *(lpsz+1) != '>' || *(lpsz+2) != '>')
{
m_strKey += *lpsz;
lpsz++;
}
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();
}