/* ** AreaEditor - a program for editing SMAUG and ROM area files. ** Author: Nick Gammon ** http://www.gammon.com.au/ ** See Copyright Notice at the end of AreaEditor.h */ // ChooseRoomDlg.cpp : implementation file // #include "stdafx.h" #include "AreaEditor.h" #include "AreaEditorDoc.h" #include "ChooseRoomDlg.h" #include "FindInDialogDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CChooseRoomDlg dialog CChooseRoomDlg::CChooseRoomDlg(CWnd* pParent /*=NULL*/) : CDialog(CChooseRoomDlg::IDD, pParent) { //{{AFX_DATA_INIT(CChooseRoomDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT // m_RoomList = NULL; m_pDoc = NULL; m_iSelectedRoom = -1; m_nFoundItem = -1; } void CChooseRoomDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CChooseRoomDlg) DDX_Control(pDX, IDC_AREA, m_ctlArea); DDX_Control(pDX, IDC_FIND_NEXT, m_ctlFindNext); DDX_Control(pDX, IDOK, m_ctlOK); DDX_Control(pDX, IDC_FLAGS, m_ctlFlags); DDX_Control(pDX, IDC_ROOM_LIST, m_ctlRoomList); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CChooseRoomDlg, CDialog) //{{AFX_MSG_MAP(CChooseRoomDlg) ON_LBN_DBLCLK(IDC_ROOM_LIST, OnDblclkRoomList) ON_LBN_SELCHANGE(IDC_ROOM_LIST, OnSelchangeRoomList) ON_BN_CLICKED(IDC_FIND, OnFind) ON_BN_CLICKED(IDC_FIND_NEXT, OnFindNext) ON_CBN_SELCHANGE(IDC_AREA, OnSelchangeArea) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CChooseRoomDlg message handlers void CChooseRoomDlg::OnDblclkRoomList() { OnOK (); } void CChooseRoomDlg::OnOK() { // find which item they selected, and return its value int nItem = m_ctlRoomList.GetCurSel( ); if (nItem != LB_ERR) m_iSelectedRoom = ((CRoom *) m_ctlRoomList.GetItemData (nItem))->vnum; CDialog::OnOK(); } BOOL CChooseRoomDlg::OnInitDialog() { CDialog::OnInitDialog(); for (POSITION docPos = App.m_pDocTemplate->GetFirstDocPosition(); docPos != NULL; ) { CAreaEditorDoc * pDoc = (CAreaEditorDoc *) App.m_pDocTemplate->GetNextDoc(docPos); if (pDoc->m_Area) { int nItem = m_ctlArea.AddString (pDoc->m_Area->strAreaName); if (nItem != CB_ERR && nItem != CB_ERRSPACE) m_ctlArea.SetItemData (nItem, (DWORD) pDoc); // remember which document } } // end of doing each document // find which area the *selected* room is in CRoom * room = FindRoom (m_iSelectedRoom); if (room) m_pDoc = room->m_pDoc; // now select the correct area for (int i = 0; i < m_ctlArea.GetCount (); i++) if (m_ctlArea.GetItemData (i) == (DWORD) m_pDoc) { m_ctlArea.SetCurSel (i); break; } ReloadList (); m_ctlFindNext.EnableWindow (FALSE); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CChooseRoomDlg::ReloadList (void) { POSITION roomPos; CRoom * room; m_ctlRoomList.ResetContent (); for (roomPos = m_pDoc->m_RoomList.GetHeadPosition (); roomPos; ) { room = m_pDoc->m_RoomList.GetNext (roomPos); room->AddToListBox (m_ctlRoomList, "", room->vnum == m_iSelectedRoom); } OnSelchangeRoomList (); } void CChooseRoomDlg::OnSelchangeRoomList() { int nItem = m_ctlRoomList.GetCurSel( ); m_ctlOK.EnableWindow (nItem != LB_ERR); if (nItem == LB_ERR) return; CRoom * room = (CRoom *) m_ctlRoomList.GetItemData (nItem); m_ctlFlags.SetWindowText (convert_room_flags (room->room_flags)); } void CChooseRoomDlg::OnFind() { CFindInDialogDlg dlg; dlg.m_strFindWhat = m_strFindString; if (dlg.DoModal () != IDOK) return; m_strFindString = dlg.m_strFindWhat; m_strFindString.MakeLower (); m_strFindString.TrimLeft (); m_strFindString.TrimRight (); m_ctlFindNext.EnableWindow (TRUE); m_ctlRoomList.SetCurSel(-1); // force search from start OnSelchangeRoomList (); OnFindNext (); } void CChooseRoomDlg::OnFindNext() { int nItem = m_ctlRoomList.GetCurSel( ); if (nItem == LB_ERR) nItem = -1; CString strItem; for (nItem++; nItem < m_ctlRoomList.GetCount (); nItem++) { m_ctlRoomList.GetText(nItem, strItem); strItem.MakeLower (); strItem.TrimLeft (); strItem.TrimRight (); if (strItem.Find (m_strFindString) != -1) { m_ctlRoomList.SetCurSel(nItem); OnSelchangeRoomList (); m_nFoundItem = nItem; return; } // end of found a match } // end of looking at each item CString strAgain; if (m_ctlRoomList.GetCurSel() == m_nFoundItem && m_nFoundItem != -1) strAgain = " again"; ::AfxMessageBox (CFormat ("Could not find \"%s\"%s", (LPCTSTR) m_strFindString, (LPCTSTR) strAgain), MB_ICONINFORMATION); m_nFoundItem = -1; } void CChooseRoomDlg::OnSelchangeArea() { int nItem = m_ctlArea.GetCurSel (); if (nItem != CB_ERR) { m_pDoc = (CAreaEditorDoc *) m_ctlArea.GetItemData (nItem); ReloadList (); } }