This repository has been archived on 2025-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
CnC_Renegade/Code/Tools/LevelEdit/EditConversationDialog.cpp

830 lines
22 KiB
C++

/*
** Command & Conquer Renegade(tm)
** Copyright 2025 Electronic Arts Inc.
**
** This program is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
// EditConversationDialog.cpp : implementation file
//
#include "stdafx.h"
#include "leveledit.h"
#include "editconversationdialog.h"
#include "conversation.h"
#include "translatedb.h"
#include "translateobj.h"
#include "editconversationremarkdialog.h"
#include "playertype.h"
#include "orator.h"
#include "oratortypes.h"
#include "utils.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// Constants
/////////////////////////////////////////////////////////////////////////////
enum
{
COL_ORATOR = 0,
COL_REMARK
};
static const int ORATOR_MAX = 6;
typedef struct
{
int button_id;
int combo_id;
int check_id;
int icon_id;
} ORATOR_UI_INFO;
const ORATOR_UI_INFO ORATOR_CTRLS[ORATOR_MAX] =
{
{ IDC_ORATOR1_CHECK, IDC_ORATOR1_COMBO, IDC_ORATOR1_VISBLE_CHECK, IDI_ORATOR1 },
{ IDC_ORATOR2_CHECK, IDC_ORATOR2_COMBO, IDC_ORATOR2_VISBLE_CHECK, IDI_ORATOR2 },
{ IDC_ORATOR3_CHECK, IDC_ORATOR3_COMBO, IDC_ORATOR3_VISBLE_CHECK, IDI_ORATOR3 },
{ IDC_ORATOR4_CHECK, IDC_ORATOR4_COMBO, IDC_ORATOR4_VISBLE_CHECK, IDI_ORATOR4 },
{ IDC_ORATOR5_CHECK, IDC_ORATOR5_COMBO, IDC_ORATOR5_VISBLE_CHECK, IDI_ORATOR5 },
{ IDC_ORATOR6_CHECK, IDC_ORATOR6_COMBO, IDC_ORATOR6_VISBLE_CHECK, IDI_ORATOR6 },
};
/////////////////////////////////////////////////////////////////////////////
//
// EditConversationDialogClass
//
/////////////////////////////////////////////////////////////////////////////
EditConversationDialogClass::EditConversationDialogClass(CWnd* pParent /*=NULL*/)
: m_Conversation (NULL),
CDialog(EditConversationDialogClass::IDD, pParent)
{
//{{AFX_DATA_INIT(EditConversationDialogClass)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
return ;
}
/////////////////////////////////////////////////////////////////////////////
//
// ~EditConversationDialogClass
//
/////////////////////////////////////////////////////////////////////////////
EditConversationDialogClass::~EditConversationDialogClass (void)
{
REF_PTR_RELEASE (m_Conversation);
return ;
}
/////////////////////////////////////////////////////////////////////////////
//
// DoDataExchange
//
/////////////////////////////////////////////////////////////////////////////
void
EditConversationDialogClass::DoDataExchange (CDataExchange *pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(EditConversationDialogClass)
DDX_Control(pDX, IDC_REMARK_LIST, m_ListCtrl);
//}}AFX_DATA_MAP
return ;
}
BEGIN_MESSAGE_MAP(EditConversationDialogClass, CDialog)
//{{AFX_MSG_MAP(EditConversationDialogClass)
ON_NOTIFY(NM_DBLCLK, IDC_REMARK_LIST, OnDblclkRemarkList)
ON_NOTIFY(LVN_KEYDOWN, IDC_REMARK_LIST, OnKeydownRemarkList)
ON_BN_CLICKED(IDC_ADD, OnAdd)
ON_BN_CLICKED(IDC_INSERT, OnInsert)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_REMARK_LIST, OnItemchangedRemarkList)
ON_NOTIFY(LVN_DELETEITEM, IDC_REMARK_LIST, OnDeleteitemRemarkList)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//
// OnInitDialog
//
/////////////////////////////////////////////////////////////////////////////
BOOL
EditConversationDialogClass::OnInitDialog (void)
{
CDialog::OnInitDialog ();
//
// Create a new conversation if we don't already have one to edit
//
if (m_Conversation == NULL) {
m_Conversation = new ConversationClass;
OratorClass orator;
m_Conversation->Add_Orator (orator);
}
//
// Configure the state combo box
//
SendDlgItemMessage (IDC_STATE_COMBO, CB_ADDSTRING, 0, (LPARAM)"Idle");
SendDlgItemMessage (IDC_STATE_COMBO, CB_ADDSTRING, 0, (LPARAM)"Idle (Secondary)");
SendDlgItemMessage (IDC_STATE_COMBO, CB_ADDSTRING, 0, (LPARAM)"Search");
SendDlgItemMessage (IDC_STATE_COMBO, CB_ADDSTRING, 0, (LPARAM)"Combat");
SendDlgItemMessage (IDC_STATE_COMBO, CB_SETCURSEL, (WPARAM)m_Conversation->Get_AI_State ());
//
// Configure the orator controls
//
for (int index = 0; index < ORATOR_MAX; index ++) {
//
// Put the icon into the button control
//
HICON icon = ::LoadIcon (::AfxGetResourceHandle (), MAKEINTRESOURCE (ORATOR_CTRLS[index].icon_id));
SendDlgItemMessage (ORATOR_CTRLS[index].button_id, BM_SETIMAGE, IMAGE_ICON, (LPARAM)icon);
//
// Put the "visible" icon into the checkbox control
//
icon = (HICON)::LoadImage (::AfxGetResourceHandle (), MAKEINTRESOURCE (IDI_EYE2), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
SendDlgItemMessage (ORATOR_CTRLS[index].check_id, BM_SETIMAGE, IMAGE_ICON, (LPARAM)icon);
SendDlgItemMessage (ORATOR_CTRLS[index].check_id, BM_SETCHECK, (WPARAM)TRUE);
//
// Configure the orator type combo-box
//
int type_count = OratorTypeClass::Get_Count ();
for (int type_index = 0; type_index < type_count; type_index ++) {
//
// Lookup information about this orator type
//
const char *type_name = OratorTypeClass::Get_Description (type_index);
int type_id = OratorTypeClass::Get_ID (type_index);
int combobox_id = ORATOR_CTRLS[index].combo_id;
//
// Add this orator type to the combobox
//
int item_index = SendDlgItemMessage (combobox_id, CB_ADDSTRING, 0, (LPARAM)type_name);
SendDlgItemMessage (combobox_id, CB_SETITEMDATA, (WPARAM)item_index, (LPARAM)type_id);
}
//
// Select the first item by default
//
SendDlgItemMessage (ORATOR_CTRLS[index].combo_id, CB_SETCURSEL, (WPARAM)0);
}
//
// Configure the orator controls
//
bool is_locked = true;
int orator_count = m_Conversation->Get_Orator_Count ();
for (index = 0; index < orator_count; index ++) {
OratorClass *orator = m_Conversation->Get_Orator (index);
//
// Check the checkbox control and enable the combobox control
//
SendDlgItemMessage (ORATOR_CTRLS[index].button_id, BM_SETCHECK, (WPARAM)TRUE);
SendDlgItemMessage (ORATOR_CTRLS[index].check_id, BM_SETCHECK, (WPARAM)(!orator->Is_Invisible ()));
::EnableWindow (::GetDlgItem (m_hWnd, ORATOR_CTRLS[index].combo_id), TRUE);
::EnableWindow (::GetDlgItem (m_hWnd, ORATOR_CTRLS[index].check_id), TRUE);
//
// Select the current orator type in the combobox
//
int orator_type = orator->Get_Orator_Type ();
int item_index = Find_Combobox_Entry (orator_type);
if (item_index >= 0) {
SendDlgItemMessage (ORATOR_CTRLS[index].combo_id, CB_SETCURSEL, (WPARAM)item_index);
}
//
// If any of the orator types disagree, then don't lock the controls
//
if (orator_type != m_Conversation->Get_Orator (0)->Get_Orator_Type ()) {
is_locked = false;
}
}
//
// Configure the "lock" checkbox
//
HICON lock_icon = (HICON)::LoadImage (::AfxGetResourceHandle (), MAKEINTRESOURCE (IDI_LOCK), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
SendDlgItemMessage (IDC_LOCKED_CHECK, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)lock_icon);
SendDlgItemMessage (IDC_LOCKED_CHECK, BM_SETCHECK, (WPARAM)is_locked);
//
// Set the check state of the "Is Innate" and "Is Key" checkboxes
//
SendDlgItemMessage (IDC_INNATE_CHECK, BM_SETCHECK, (WPARAM)m_Conversation->Is_Innate ());
SendDlgItemMessage (IDC_KEY_CONVESATION_CHECK, BM_SETCHECK, (WPARAM)m_Conversation->Is_Key ());
//
// Configure the columns
//
m_ListCtrl.InsertColumn (COL_ORATOR, "Orator");
m_ListCtrl.InsertColumn (COL_REMARK, "Remark");
m_ListCtrl.SetExtendedStyle (m_ListCtrl.GetExtendedStyle () | LVS_EX_FULLROWSELECT);
//
// Choose an appropriate size for the columns
//
CRect rect;
m_ListCtrl.GetClientRect (&rect);
rect.right -= ::GetSystemMetrics (SM_CXVSCROLL) + 2;
m_ListCtrl.SetColumnWidth (COL_ORATOR, rect.Width () / 4);
m_ListCtrl.SetColumnWidth (COL_REMARK, (rect.Width () * 3) / 4);
//
// Fill in the conversation's name into the appropriate control
//
SetDlgItemText (IDC_CONVERSATION_NAME, m_Conversation->Get_Name ());
//
// Add all the remark's to the list control
//
int count = m_Conversation->Get_Remark_Count ();
for (index = 0; index < count; index ++) {
ConversationRemarkClass remark;
if (m_Conversation->Get_Remark_Info (index, remark)) {
Add_Entry (remark);
}
}
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
//
// OnDblclkRemarkList
//
/////////////////////////////////////////////////////////////////////////////
void
EditConversationDialogClass::OnDblclkRemarkList
(
NMHDR * pNMHDR,
LRESULT* pResult
)
{
(*pResult) = 0;
//
// Determine which entry the user double-clicked on
//
int sel_index = m_ListCtrl.GetNextItem (-1, LVNI_ALL | LVNI_SELECTED);
if (sel_index != -1) {
//
// Lookup the information about this entry
//
ConversationRemarkClass *remark = Get_Entry_Data (sel_index);
//
// Make a bitmask of the orators that are configured
//
int orator_bitmask = 0;
for (int index = 0; index < ORATOR_MAX; index ++) {
if (SendDlgItemMessage (ORATOR_CTRLS[index].button_id, BM_GETCHECK) == 1) {
orator_bitmask |= (1 << index);
}
}
//
// Show a dialog to the user that will let them choose an orator and
// a remark
//
EditConversationRemarkDialogClass dialog (this);
dialog.Set_Remark (*remark);
dialog.Set_Orator_Bitmask (orator_bitmask);
if (dialog.DoModal () == IDOK) {
//
// Get the new values from the dialog
//
(*remark) = dialog.Get_Remark ();
//
// Update the orator id in the list control
//
CString orator_text;
orator_text.Format ("%d", remark->Get_Orator_ID () + 1);
m_ListCtrl.SetItemText (sel_index, COL_ORATOR, orator_text);
//
// Update the text entry in the list control
//
TDBObjClass *translate_obj = TranslateDBClass::Find_Object (remark->Get_Text_ID ());
if (translate_obj != NULL) {
m_ListCtrl.SetItemText (sel_index, COL_REMARK, translate_obj->Get_English_String ());
}
}
}
return ;
}
/////////////////////////////////////////////////////////////////////////////
//
// OnKeydownRemarkList
//
/////////////////////////////////////////////////////////////////////////////
void
EditConversationDialogClass::OnKeydownRemarkList
(
NMHDR * pNMHDR,
LRESULT * pResult
)
{
LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;
(*pResult) = 0;
if (pLVKeyDow->wVKey == VK_DELETE) {
//
// Delete all the selected items
//
int index = -1;
while ((index = m_ListCtrl.GetNextItem (-1, LVNI_SELECTED | LVNI_ALL)) >= 0) {
m_ListCtrl.DeleteItem (index);
}
}
return ;
}
/////////////////////////////////////////////////////////////////////////////
//
// OnOK
//
/////////////////////////////////////////////////////////////////////////////
void
EditConversationDialogClass::OnOK (void)
{
CDialog::OnOK ();
//
// Read the state this conversation is active for
//
int ai_state = SendDlgItemMessage (IDC_STATE_COMBO, CB_GETCURSEL);
if (ai_state != CB_ERR) {
m_Conversation->Set_AI_State (SoldierAIState(ai_state));
}
//
// Pass the name onto the conversation
//
CString name;
GetDlgItemText (IDC_CONVERSATION_NAME, name);
m_Conversation->Set_Name (name);
//
// Start fresh
//
m_Conversation->Clear_Remarks ();
m_Conversation->Clear_Orators ();
//
// Get all the conversations from the list control and add them to the
// conversation manager
//
for (int index = 0; index < m_ListCtrl.GetItemCount (); index ++) {
ConversationRemarkClass *remark = Get_Entry_Data (index);
m_Conversation->Add_Remark (*remark);
}
//
// Build a list of orators for the conversation
//
for (index = 0; index < ORATOR_MAX; index ++) {
//
// Is this orator configured?
//
if (SendDlgItemMessage (ORATOR_CTRLS[index].button_id, BM_GETCHECK) == 1) {
bool is_invisible = (SendDlgItemMessage (ORATOR_CTRLS[index].check_id, BM_GETCHECK) != 1);
//
// Add the orator to the conversation
//
OratorClass orator;
orator.Set_ID (index);
orator.Set_Orator_Type (Get_Orator_Type (index));
orator.Set_Is_Invisible (is_invisible);
m_Conversation->Add_Orator (orator);
}
}
//
// Get the ID of the object to look at (if any)
//
int obj_id = GetDlgItemInt (IDC_OBJECT_ID);
m_Conversation->Set_Look_At_Obj_ID (obj_id);
//
// Read the users "innate" selection
//
bool is_innate = bool(SendDlgItemMessage (IDC_INNATE_CHECK, BM_GETCHECK) == 1);
m_Conversation->Set_Is_Innate (is_innate);
bool is_key = bool(SendDlgItemMessage (IDC_KEY_CONVESATION_CHECK, BM_GETCHECK) == 1);
m_Conversation->Set_Is_Key (is_key);
return ;
}
/////////////////////////////////////////////////////////////////////////////
//
// OnAdd
//
/////////////////////////////////////////////////////////////////////////////
void
EditConversationDialogClass::OnAdd (void)
{
//
// Make a bitmask of the orators that are configured
//
int orator_bitmask = 0;
for (int index = 0; index < ORATOR_MAX; index ++) {
if (SendDlgItemMessage (ORATOR_CTRLS[index].button_id, BM_GETCHECK) == 1) {
orator_bitmask |= (1 << index);
}
}
EditConversationRemarkDialogClass dialog (this);
dialog.Set_Orator_Bitmask (orator_bitmask);
if (dialog.DoModal () == IDOK) {
//
// Insert a new entry into the list control
//
Add_Entry (dialog.Get_Remark ());
}
return ;
}
/////////////////////////////////////////////////////////////////////////////
//
// Set_Conversation
//
/////////////////////////////////////////////////////////////////////////////
void
EditConversationDialogClass::Set_Conversation (ConversationClass *conversation)
{
REF_PTR_SET (m_Conversation, conversation);
return ;
}
/////////////////////////////////////////////////////////////////////////////
//
// Get_Entry_Data
//
/////////////////////////////////////////////////////////////////////////////
ConversationRemarkClass *
EditConversationDialogClass::Get_Entry_Data (int index)
{
return (ConversationRemarkClass *)m_ListCtrl.GetItemData (index);
}
/////////////////////////////////////////////////////////////////////////////
//
// Add_Entry
//
/////////////////////////////////////////////////////////////////////////////
void
EditConversationDialogClass::Add_Entry (const ConversationRemarkClass &remark, int insert_index)
{
//
// Insert this item into the list control
//
CString orator_text;
orator_text.Format ("%d", remark.Get_Orator_ID () + 1);
int item_index = m_ListCtrl.InsertItem (insert_index, orator_text);
if (item_index >= 0) {
//
// Lookup the text to display for this remark
//
TDBObjClass *translate_obj = TranslateDBClass::Find_Object (remark.Get_Text_ID ());
if (translate_obj != NULL) {
m_ListCtrl.SetItemText (item_index, COL_REMARK, translate_obj->Get_English_String ());
//
// Allocate a remark object to associate with this entry in the list control
//
ConversationRemarkClass *associated_remark = new ConversationRemarkClass (remark);
m_ListCtrl.SetItemData (item_index, (DWORD)associated_remark);
}
}
return ;
}
/////////////////////////////////////////////////////////////////////////////
//
// OnInsert
//
/////////////////////////////////////////////////////////////////////////////
void
EditConversationDialogClass::OnInsert (void)
{
int sel_index = m_ListCtrl.GetNextItem (-1, LVNI_ALL | LVNI_SELECTED);
if (sel_index != -1) {
//
// Make a bitmask of the orators that are configured
//
int orator_bitmask = 0;
for (int index = 0; index < ORATOR_MAX; index ++) {
if (SendDlgItemMessage (ORATOR_CTRLS[index].button_id, BM_GETCHECK) == 1) {
orator_bitmask |= (1 << index);
}
}
EditConversationRemarkDialogClass dialog (this);
dialog.Set_Orator_Bitmask (orator_bitmask);
if (dialog.DoModal () == IDOK) {
//
// Insert the new entry into the appropriate place in the list
//
Add_Entry (dialog.Get_Remark (), sel_index);
}
}
return ;
}
/////////////////////////////////////////////////////////////////////////////
//
// OnItemchangedRemarkList
//
/////////////////////////////////////////////////////////////////////////////
void
EditConversationDialogClass::OnItemchangedRemarkList
(
NMHDR * pNMHDR,
LRESULT * pResult
)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
(*pResult) = 0;
Update_Button_States ();
return ;
}
/////////////////////////////////////////////////////////////////////////////
//
// Update_Button_States
//
/////////////////////////////////////////////////////////////////////////////
void
EditConversationDialogClass::Update_Button_States (void)
{
int sel_index = m_ListCtrl.GetNextItem (-1, LVNI_ALL | LVNI_SELECTED);
::EnableWindow (::GetDlgItem (m_hWnd, IDC_INSERT), static_cast<bool>(sel_index != -1));
return ;
}
/////////////////////////////////////////////////////////////////////////////
//
// OnCommand
//
/////////////////////////////////////////////////////////////////////////////
BOOL
EditConversationDialogClass::OnCommand
(
WPARAM wParam,
LPARAM lParam
)
{
switch (LOWORD (wParam)) {
case IDC_ORATOR1_CHECK:
case IDC_ORATOR2_CHECK:
case IDC_ORATOR3_CHECK:
case IDC_ORATOR4_CHECK:
case IDC_ORATOR5_CHECK:
case IDC_ORATOR6_CHECK:
{
Update_Enable_State (LOWORD (wParam) - IDC_ORATOR1_CHECK);
Update_Remarks (LOWORD (wParam) - IDC_ORATOR1_CHECK);
}
break;
case IDC_ORATOR1_COMBO:
case IDC_ORATOR2_COMBO:
case IDC_ORATOR3_COMBO:
case IDC_ORATOR4_COMBO:
case IDC_ORATOR5_COMBO:
case IDC_ORATOR6_COMBO:
{
if (HIWORD (wParam) == CBN_SELCHANGE) {
Update_Player_Type_Combos (LOWORD (wParam) - IDC_ORATOR1_COMBO);
}
}
break;
}
return CDialog::OnCommand (wParam, lParam);
}
/////////////////////////////////////////////////////////////////////////////
//
// Update_Remarks
//
/////////////////////////////////////////////////////////////////////////////
void
EditConversationDialogClass::Update_Remarks (int orator_index)
{
BOOL is_checked = (SendDlgItemMessage (ORATOR_CTRLS[orator_index].button_id, BM_GETCHECK) == 1);
if (is_checked == false) {
//
// Remove any remarks made by the specified orator
//
int item_count = m_ListCtrl.GetItemCount ();
for (int index = 0; index < item_count; index ++) {
ConversationRemarkClass *remark = Get_Entry_Data (index);
//
// Remove this entry if it was made by the orator in question
//
if (remark != NULL && remark->Get_Orator_ID () == orator_index) {
m_ListCtrl.DeleteItem (index);
index --;
item_count --;
}
}
}
return ;
}
/////////////////////////////////////////////////////////////////////////////
//
// Update_Enable_State
//
/////////////////////////////////////////////////////////////////////////////
void
EditConversationDialogClass::Update_Enable_State (int orator_index)
{
BOOL is_checked = (SendDlgItemMessage (ORATOR_CTRLS[orator_index].button_id, BM_GETCHECK) == 1);
::EnableWindow (::GetDlgItem (m_hWnd, ORATOR_CTRLS[orator_index].combo_id), is_checked);
::EnableWindow (::GetDlgItem (m_hWnd, ORATOR_CTRLS[orator_index].check_id), is_checked);
return ;
}
/////////////////////////////////////////////////////////////////////////////
//
// Update_Player_Type_Combos
//
/////////////////////////////////////////////////////////////////////////////
void
EditConversationDialogClass::Update_Player_Type_Combos (int orator_index)
{
BOOL is_locked = (SendDlgItemMessage (IDC_LOCKED_CHECK, BM_GETCHECK) == 1);
if (is_locked) {
//
// Get the current selection
//
int curr_sel = SendDlgItemMessage (ORATOR_CTRLS[orator_index].combo_id, CB_GETCURSEL);
//
// Update all the combo boxes to reflect the current selection
//
for (int index = 0; index < ORATOR_MAX; index ++) {
SendDlgItemMessage (ORATOR_CTRLS[index].combo_id, CB_SETCURSEL, (WPARAM)curr_sel);
}
}
return ;
}
/////////////////////////////////////////////////////////////////////////////
//
// Get_Orator_Type
//
/////////////////////////////////////////////////////////////////////////////
int
EditConversationDialogClass::Get_Orator_Type (int orator_index)
{
int retval = -1;
//
// Get the current selection
//
int curr_sel = SendDlgItemMessage (ORATOR_CTRLS[orator_index].combo_id, CB_GETCURSEL);
if (curr_sel >= 0) {
retval = SendDlgItemMessage (ORATOR_CTRLS[orator_index].combo_id, CB_GETITEMDATA, (WPARAM)curr_sel);
}
return retval;
}
/////////////////////////////////////////////////////////////////////////////
//
// OnDeleteitemRemarkList
//
/////////////////////////////////////////////////////////////////////////////
void
EditConversationDialogClass::OnDeleteitemRemarkList
(
NMHDR * pNMHDR,
LRESULT * pResult
)
{
NM_LISTVIEW *pNMListView = (NM_LISTVIEW *)pNMHDR;
(*pResult) = 0;
//
// Lookup the associated remark object
//
ConversationRemarkClass *remark = NULL;
remark = (ConversationRemarkClass *)m_ListCtrl.GetItemData (pNMListView->iItem);
//
// Free the object
//
SAFE_DELETE (remark);
m_ListCtrl.SetItemData (pNMListView->iItem, 0);
return ;
}
/////////////////////////////////////////////////////////////////////////////
//
// Find_Combobox_Entry
//
/////////////////////////////////////////////////////////////////////////////
int
EditConversationDialogClass::Find_Combobox_Entry (int orator_type)
{
int retval = -1;
//
// Loop over all the entries in the combobox until we've found
// the one that's associated with the given orator type
//
int count = SendDlgItemMessage (IDC_ORATOR1_COMBO, CB_GETCOUNT);
for (int index = 0; index < count; index ++) {
//
// Is this the orator we are looking for?
//
int item_data = SendDlgItemMessage (IDC_ORATOR1_COMBO, CB_GETITEMDATA, (WPARAM)index);
if (item_data == orator_type) {
retval = index;
break;
}
}
return retval;
}