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

#include "stdafx.h"
#include "AreaEditor.h"

#include "AreaEditorDoc.h"

#include "MUDprogramView.h"
#include "AreaEditorView.h"
#include "defaults.h"


// constructor
CMUDprogram::CMUDprogram (CRuntimeClass* pViewClass, CAreaEditorDoc * pDoc) 
    : CMUDitem (pViewClass, pDoc) 
  {
  type = RAND_PROG;
  arglist = "100";
  comlist = "say This is a new program";
  } // end of constructor

void CMUDprogram::ChangeRHview (CAreaEditorView * pLHview, CView * pwhichView)
  {
  CMUDProgramView * pView = (CMUDProgramView *) pwhichView;

	ASSERT(pView->IsKindOf(RUNTIME_CLASS(CMUDProgramView)));

  pView->m_program = this;

  }

CString CMUDprogram::Summary (void)
  {

  CString strName = ProgramNameList.ReturnName (type, false);
  if (strName.Right (5) == "_prog")
    strName = strName.Left (strName.GetLength () - 5);

  return CFormat ("%s %s", 
                  (LPCTSTR) strName, 
                  (LPCTSTR) arglist);
  }

// add for a program adds one after the current one
CMUDitem * CMUDprogram::Add (CAreaEditorView * pView, const bool bSelect)
  {
  HTREEITEM hdlItem = m_pTreeCtrl->GetParentItem (m_hdlTreeItem);

  if (!hdlItem)
    return NULL;

  // find associated MUD item, if any
  CMUDitem * pItem = (CMUDitem *) m_pTreeCtrl->GetItemData (hdlItem);
  
  if (!pItem)
    return NULL; 

  return pItem->AddProgram (pView, this, bSelect);

  } // end of CMUDprogram::Add 

CString CMUDprogram::AddDescription (void)  // description of what add does
  {
  return "program";
  }   // end of CMUDprogram::AddDescription


// do a search for this item
BOOL CMUDprogram::Search (const CString strWanted, 
                       const int iFindType,
                       const BOOL bMatchCase)
    {
    
    // we only care about programs here
    if (iFindType != eFindProgram)
      return CMUDitem::Search (strWanted, iFindType, bMatchCase);

    CString strFound = comlist;

    // if not case-sensitive, make upper case
    if (!bMatchCase)
      strFound.MakeUpper ();

    return strFound.Find (strWanted) != -1;

    } // end of CMUDprogram::Search

#define DUPLICATE(arg) arg = RHside->arg

// copy function for duplicating programs
void CMUDprogram::Copy (const CMUDprogram * const RHside)
  {
  DUPLICATE (type);
  DUPLICATE (arglist);
  DUPLICATE (comlist);
  }

// clone this program
void CMUDprogram::Duplicate (CAreaEditorView * pView)
  {

  HTREEITEM hdlItem = m_pTreeCtrl->GetParentItem (m_hdlTreeItem);

  if (!hdlItem)
    return;

  // find associated MUD item, if any
  CMUDitem * pItem = (CMUDitem *) m_pTreeCtrl->GetItemData (hdlItem);
  
  if (!pItem)
    return; 

  CMUDprogram * newprogram = pItem->AddProgram (pView, this, false);

  if (newprogram)
    {
    newprogram->Copy (this);    // copy existing program over
    newprogram->m_pTreeCtrl->SetItemText (newprogram->m_hdlTreeItem, 
                                          newprogram->Summary ());
    newprogram->GoTo ();
    }

  } // end of CMUDprogram::Duplicate