#include "stdafx.h"
#include "AllSrvUI.h"
#include "AllSrvUISheet.h"
#include "DlgGameSelect.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
BEGIN_MESSAGE_MAP(CDlgGameSelect, CDialog)
ON_NOTIFY(LVN_DELETEITEM, IDC_GAME_LIST, OnDeleteItemGameList)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_GAME_LIST, OnItemChangedGameList)
ON_NOTIFY(NM_DBLCLK, IDC_GAME_LIST, OnDblClickGameList)
END_MESSAGE_MAP()
CDlgGameSelect::CDlgGameSelect(CAllSrvUISheet* pSheet)
: CDialog(CDlgGameSelect::IDD, pSheet)
{
m_spGame = pSheet->GetGame();
}
void CDlgGameSelect::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_GAME_LIST, m_listGames);
}
void CDlgGameSelect::PopulateGamesList()
{
CWaitCursor wait;
LPCSTR pszContext = "retrieving collection of games on server";
m_listGames.DeleteAllItems();
IAdminGamesPtr spGames;
HRESULT hr = GetSheet()->GetServer()->get_Games(&spGames);
if (FAILED(hr))
{
GetSheet()->HandleError(hr, pszContext, false);
EndDialog(IDCANCEL);
return;
}
IUnknownPtr spEnumUnk;
if (FAILED(hr = spGames->get__NewEnum(&spEnumUnk)))
{
GetSheet()->HandleError(hr, pszContext, false);
EndDialog(IDCANCEL);
return;
}
IEnumVARIANTPtr spEnum(spEnumUnk);
if (NULL == spEnum)
{
GetSheet()->HandleError(E_NOINTERFACE, pszContext, false);
EndDialog(IDCANCEL);
return;
}
int iIndex = 0;
CComVariant games[32];
do
{
ULONG cFetched;
if (FAILED(hr = spEnum->Next(sizeofArray(games), games, &cFetched)))
{
GetSheet()->HandleError(hr, pszContext, false);
EndDialog(IDCANCEL);
return;
}
for (ULONG i = 0; i < cFetched; ++i)
{
VARTYPE vt = V_VT(&games[i]);
if (VT_DISPATCH != vt && VT_UNKNOWN != vt)
{
GetSheet()->HandleError(DISP_E_TYPEMISMATCH, pszContext, false);
EndDialog(IDCANCEL);
return;
}
IAdminGamePtr spGame(V_DISPATCH(&games[i]));
if (NULL == spGame)
{
GetSheet()->HandleError(E_NOINTERFACE, pszContext, false);
EndDialog(IDCANCEL);
return;
}
games[i].Clear();
CComBSTR bstrName;
spGame->get_Name(&bstrName);
USES_CONVERSION;
m_listGames.InsertItem(iIndex, OLE2CT(bstrName));
m_listGames.SetItemData(iIndex, reinterpret_cast<DWORD>(spGame.Detach()));
++iIndex;
}
} while (S_FALSE != hr);
}
BOOL CDlgGameSelect::OnInitDialog()
{
CDialog::OnInitDialog();
m_listGames.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_LABELTIP);
m_listGames.InsertColumn(0, TEXT("Name"));
m_listGames.SetColumnWidth(0, LVSCW_AUTOSIZE_USEHEADER);
PopulateGamesList();
LPARAM lp = reinterpret_cast<LPARAM>(static_cast<IAdminGame*>(m_spGame));
LVFINDINFO lvfi = {LVFI_PARAM, NULL, lp};
int iSel = m_listGames.FindItem(&lvfi);
if (iSel > -1)
m_listGames.SetItemState(iSel, LVIS_SELECTED, LVIS_SELECTED);
return true;
}
void CDlgGameSelect::OnDeleteItemGameList(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMLV = (NM_LISTVIEW*)pNMHDR;
IAdminGame* pGame = reinterpret_cast<IAdminGame*>(pNMLV->lParam);
if (pGame)
pGame->Release();
*pResult = 0;
}
void CDlgGameSelect::OnItemChangedGameList(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMLV = (NM_LISTVIEW*)pNMHDR;
if (LVIS_SELECTED & pNMLV->uNewState)
m_spGame = reinterpret_cast<IAdminGame*>(pNMLV->lParam);
*pResult = 0;
}
void CDlgGameSelect::OnDblClickGameList(NMHDR* pNMHDR, LRESULT* pResult)
{
OnOK();
*pResult = 0;
}