areaeditor/
/*
** 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
*/

// ChooseObjectDlg.cpp : implementation file
//

#include "stdafx.h"
#include "AreaEditor.h"
#include "AreaEditorDoc.h"
#include "defaults.h"

#include "ChooseObjectDlg.h"
#include "FindInDialogDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CChooseObjectDlg dialog

CChooseObjectDlg::CChooseObjectDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CChooseObjectDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CChooseObjectDlg)
	m_strConditions = _T("");
	//}}AFX_DATA_INIT

  m_pDoc = NULL;
  m_iSelectedObject = -1;
  m_iItemType = eAny;
  m_iWantedType = 0;
  m_nFoundItem = -1;
}


void CChooseObjectDlg::DoDataExchange(CDataExchange* pDX)
{

  if (!pDX->m_bSaveAndValidate)
    {
    switch (m_iItemType)
      {
      case eAny: m_strConditions = ""; break;
      case eShopItem: m_strConditions = "Cost must be non-zero"; break;
      case eWearItem: m_strConditions = "Must have a \"wear\" flag set"; break;
      case eTakeItem: m_strConditions = "Must have a \"take\" flag set"; break;
      case eContainerItem: m_strConditions = "Must be a container"; break;
      }   // end of switch

    }   // end of not saving

	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CChooseObjectDlg)
	DDX_Control(pDX, IDC_AREA, m_ctlArea);
	DDX_Control(pDX, IDC_FIND_NEXT, m_ctlFindNext);
	DDX_Control(pDX, IDC_OBJECT_TYPE, m_ctlType);
	DDX_Control(pDX, IDOK, m_ctlOK);
	DDX_Control(pDX, IDC_VALUES, m_ctlValues);
	DDX_Control(pDX, IDC_STATS, m_ctlStats);
	DDX_Control(pDX, IDC_DESCRIPTION, m_ctlDescription);
	DDX_Control(pDX, IDC_OBJECT_LIST, m_ctlObjectList);
	DDX_Text(pDX, IDC_CONDITIONS, m_strConditions);
	//}}AFX_DATA_MAP

  if (!pDX->m_bSaveAndValidate)
    LoadComboBoxList (m_ctlType, ObjectItemList, m_iWantedType ? m_iWantedType : -1);
}


BEGIN_MESSAGE_MAP(CChooseObjectDlg, CDialog)
	//{{AFX_MSG_MAP(CChooseObjectDlg)
	ON_LBN_DBLCLK(IDC_OBJECT_LIST, OnDblclkObjectList)
	ON_LBN_SELCHANGE(IDC_OBJECT_LIST, OnSelchangeObjectList)
	ON_CBN_SELCHANGE(IDC_OBJECT_TYPE, OnSelchangeObjectType)
	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()

/////////////////////////////////////////////////////////////////////////////
// CChooseObjectDlg message handlers

void CChooseObjectDlg::OnDblclkObjectList() 
{
  OnOK ();
}

void CChooseObjectDlg::OnOK() 
{
// find which item they selected, and return its value

int nItem =  m_ctlObjectList.GetCurSel( );

if (nItem != LB_ERR)
  m_iSelectedObject = ((CMUDObject *) m_ctlObjectList.GetItemData (nItem))->vnum;
	
	CDialog::OnOK();
}

BOOL CChooseObjectDlg::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* Mobile is in
  CMUDObject * obj = FindObj (m_iSelectedObject);
  if (obj)
    m_pDoc = obj->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 CChooseObjectDlg::ReloadList (void)
  {

m_ctlObjectList. ResetContent ();

POSITION objectPos;
CMUDObject * object;

for (objectPos = m_pDoc->m_ObjectList.GetHeadPosition (); objectPos; )
  {

  bool bUseThis = false;

  object = m_pDoc->m_ObjectList.GetNext (objectPos);

  switch (m_iItemType)
    {
    case eAny: bUseThis = true; break;
    case eShopItem: bUseThis = object->cost > 0; break;
    case eWearItem: bUseThis = (object->wear_flags &
                                (
                                ITEM_WEAR_FINGER	  |
                                ITEM_WEAR_NECK		  |
                                ITEM_WEAR_BODY		  |
                                ITEM_WEAR_HEAD		  |
                                ITEM_WEAR_LEGS		  |
                                ITEM_WEAR_FEET		  |
                                ITEM_WEAR_HANDS		  |
                                ITEM_WEAR_ARMS		  |
                                ITEM_WEAR_SHIELD	  |
                                ITEM_WEAR_ABOUT		  |
                                ITEM_WEAR_WAIST		  |
                                ITEM_WEAR_WRIST		  |
                                ITEM_WIELD		      |
                                ITEM_HOLD		        |
                                ITEM_DUAL_WIELD		  |
                                ITEM_WEAR_EARS		  |
                                ITEM_WEAR_EYES		  |
                                ITEM_MISSILE_WIELD  
                                )) != 0; break;
    case eTakeItem: bUseThis = (object->wear_flags & ITEM_TAKE) != 0; break;
    case eContainerItem: bUseThis = object->item_type == ITEM_CONTAINER; break;
    }   // end of switch
    
  if (m_iWantedType && object->item_type != m_iWantedType)
    bUseThis = false;

  if (bUseThis)
    object->AddToListBox (m_ctlObjectList, "", object->vnum == m_iSelectedObject);
  }
	
  OnSelchangeObjectList ();

  } // end of CChooseObjectDlg::ReloadList

void CChooseObjectDlg::OnSelchangeObjectList() 
{
// find which item they selected, and return its value

int nItem =  m_ctlObjectList.GetCurSel( );

  m_ctlOK.EnableWindow (nItem != LB_ERR);

  if (nItem == LB_ERR)
    {
    m_ctlDescription.SetWindowText ("");
    m_ctlStats.SetWindowText ("");
    m_ctlValues.SetWindowText ("");
    return;
    }

  CMUDObject * object = (CMUDObject *) m_ctlObjectList.GetItemData (nItem);

  m_ctlDescription.SetWindowText (object->description);

  m_ctlStats.SetWindowText (CFormat ("Type: %s, weight: %i, Cost: %i",
                            (LPCTSTR) ObjectItemList.ReturnName (object->item_type, false),
                            object->weight, 
                            object->cost
    ));

  m_ctlValues.SetWindowText (object->ValueSummary ());
	
}

void CChooseObjectDlg::OnSelchangeObjectType() 
{
int nItem =  m_ctlType.GetCurSel( );

  if (nItem == LB_ERR)
    return;
	
  m_iWantedType = m_ctlType.GetItemData (nItem);
  
  ReloadList ();

}

void CChooseObjectDlg::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_ctlObjectList.SetCurSel(-1);    // force search from start
  OnSelchangeObjectList ();     // which means we can't do OK yet

  OnFindNext ();

}

void CChooseObjectDlg::OnFindNext() 
{
int nItem =  m_ctlObjectList.GetCurSel( );

if (nItem == LB_ERR)
  nItem = -1;


CString strItem;
for (nItem++; nItem < m_ctlObjectList.GetCount (); nItem++)

  {
  m_ctlObjectList.GetText(nItem, strItem);
  strItem.MakeLower ();
  strItem.TrimLeft ();
  strItem.TrimRight ();

  if (strItem.Find (m_strFindString) != -1)
    {
    m_ctlObjectList.SetCurSel(nItem);
    OnSelchangeObjectList ();
    m_nFoundItem = nItem;
    return;
    } // end of found a match
  } // end of looking at each item

CString strAgain;

  if (m_ctlObjectList.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 CChooseObjectDlg::OnSelchangeArea() 
{
int nItem = m_ctlArea.GetCurSel ();

  if (nItem != CB_ERR)
    {
    m_pDoc =  (CAreaEditorDoc *) m_ctlArea.GetItemData (nItem);
    ReloadList ();
    }
	
}