/*
 *  Arcanum Editor - ROM area editor
 *  Copyright (C) 1999  Lucas Wall <kthulhu@usa.net>
 *
 *  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 2 of the License, or
 *  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, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *
 *  If you make changes to the source and want to make the public you can
 *  mail the diferences to me <kthulhu@usa.net> and I'll add them to the
 *  main distribution. Of course your name will be added to the program with
 *  information about the changes you made.
 *
 *
 *  Packed on Thu Aug 19 03:02:24 1999
 *
 */


/*
 * File: RoomEd.cpp
 *
 * Changes:
 *
 * 19/08/99 Lucas Wall <kthulhu@usa.net>
 *          First source release. Its quite messy and has no
 *          comments. I never planed to release the source code... :-)
 *
 */


// RoomEd.cpp : implementation file
//

#include "stdafx.h"
#include "arcaed.h"
#include "RoomEd.h"
#include "ResetEd.h"

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


/////////////////////////////////////////////////////////////////////////////
// CRoomEd dialog


CRoomEd::CRoomEd(CWnd* pParent /*=NULL*/)
	: CDialog(CRoomEd::IDD, pParent)
{
	//{{AFX_DATA_INIT(CRoomEd)
	m_Clan = _T("");
	m_Description = _T("");
	m_Name = _T("");
	m_Owner = _T("");
	m_Vnum = 0;
	m_HitGain = 0;
	m_ManaGain = 0;
	m_ExitDescription = _T("");
	m_ExitKeyword = _T("");
	m_ExitVnum = 0;
	m_ExitAbajo = FALSE;
	m_ExitArriba = FALSE;
	m_ExitEste = FALSE;
	m_ExitNorte = FALSE;
	m_ExitOeste = FALSE;
	m_ExitSur = FALSE;
	m_ExitLlave = 0;
	m_ExtraEd = _T("");
	//}}AFX_DATA_INIT

	m_pDoc = NULL;
	m_maxvnum = m_minvnum = -999;
	m_index = -1;
	m_cursector = 0;
	m_roomflags = 0;

	m_imagelist.Create( 16, 16, ILC_COLOR, 2, 1 );
	m_imagelist.SetBkColor( RGB( 255, 255, 255 ) );
	m_imagelist.Add( AfxGetApp()->LoadIcon( IDI_OFF ) );
	m_imagelist.Add( AfxGetApp()->LoadIcon( IDI_ON ) );

	m_accel = LoadAccelerators( AfxGetInstanceHandle(),
		MAKEINTRESOURCE( IDR_ROOMED_ACC ) );
}


void CRoomEd::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CRoomEd)
	DDX_Control(pDX, IDC_ROOMED_RESET_DOWN, m_ResetsDown);
	DDX_Control(pDX, IDC_ROOMED_RESET_UP, m_ResetsUp);
	DDX_Control(pDX, IDC_ROOMED_RESETS, m_Resets);
	DDX_Control(pDX, IDC_ROOMED_FLAGS, m_Flags);
	DDX_Control(pDX, IDC_ROOMED_EXIT_FLAGS, m_ExitFlags);
	DDX_Control(pDX, IDC_ROOMED_SECTORTYPE, m_SectorType);
	DDX_Control(pDX, IDC_ROOMED_EXTRAED_LIST, m_ExtraEdList);
	DDX_Control(pDX, IDC_ROOMED_EXIT_VNUM_SPIN, m_ExitVnumSpin);
	DDX_Control(pDX, IDC_ROOMED_EXIT_LLAVE_SPIN, m_ExitLlaveSpin);
	DDX_Control(pDX, IDC_ROOMED_VNUM_SPIN, m_VnumSpin);
	DDX_Control(pDX, IDC_ROOMED_MANA_SPIN, m_ManaGainSpin);
	DDX_Control(pDX, IDC_ROOMED_HIT_SPIN, m_HitGainSpin);
	DDX_Text(pDX, IDC_ROOMED_CLAN, m_Clan);
	DDX_Text(pDX, IDC_ROOMED_DESCRIPTION, m_Description);
	DDX_Text(pDX, IDC_ROOMED_NAME, m_Name);
	DDX_Text(pDX, IDC_ROOMED_OWNER, m_Owner);
	DDX_Text(pDX, IDC_ROOMED_VNUM, m_Vnum);
	DDV_MinMaxInt(pDX, m_Vnum, 0, 32767);
	DDX_Text(pDX, IDC_ROOMED_HIT, m_HitGain);
	DDV_MinMaxInt(pDX, m_HitGain, 0, 32767);
	DDX_Text(pDX, IDC_ROOMED_MANA, m_ManaGain);
	DDV_MinMaxInt(pDX, m_ManaGain, 0, 32767);
	DDX_Text(pDX, IDC_ROOMED_EXIT_DESCR, m_ExitDescription);
	DDX_Text(pDX, IDC_ROOMED_EXIT_KEYWORD, m_ExitKeyword);
	DDX_Text(pDX, IDC_ROOMED_EXIT_VNUM, m_ExitVnum);
	DDV_MinMaxInt(pDX, m_ExitVnum, 0, 32767);
	DDX_Check(pDX, IDC_ROOMED_ABAJO, m_ExitAbajo);
	DDX_Check(pDX, IDC_ROOMED_ARRIBA, m_ExitArriba);
	DDX_Check(pDX, IDC_ROOMED_ESTE, m_ExitEste);
	DDX_Check(pDX, IDC_ROOMED_NORTE, m_ExitNorte);
	DDX_Check(pDX, IDC_ROOMED_OESTE, m_ExitOeste);
	DDX_Check(pDX, IDC_ROOMED_SUR, m_ExitSur);
	DDX_Text(pDX, IDC_ROOMED_EXIT_LLAVE, m_ExitLlave);
	DDV_MinMaxInt(pDX, m_ExitLlave, -1, 32767);
	DDX_Text(pDX, IDC_ROOMED_EXTRAED, m_ExtraEd);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CRoomEd, CDialog)
	//{{AFX_MSG_MAP(CRoomEd)
	ON_BN_CLICKED(IDC_ROOMED_ABAJO, OnRoomedExit)
	ON_CBN_SELCHANGE(IDC_ROOMED_EXTRAED_LIST, OnSelchangeRoomedExtraedList)
	ON_BN_CLICKED(IDC_ROOMED_EXTRAED_ADD, OnRoomedExtraedAdd)
	ON_EN_CHANGE(IDC_ROOMED_EXTRAED, OnChangeRoomedExtraed)
	ON_CBN_SELCHANGE(IDC_ROOMED_SECTORTYPE, OnSelchangeRoomedSectortype)
	ON_NOTIFY(NM_CLICK, IDC_ROOMED_FLAGS, OnClickRoomedFlags)
	ON_NOTIFY(NM_CLICK, IDC_ROOMED_EXIT_FLAGS, OnClickRoomedExitFlags)
	ON_BN_CLICKED(IDC_ROOMED_EXTRAED_BORRAR, OnRoomedExtraedBorrar)
	ON_EN_CHANGE(IDC_ROOMED_VNUM, OnChangeRoomedVnum)
	ON_NOTIFY(NM_RCLICK, IDC_ROOMED_RESETS, OnRclickRoomedResets)
	ON_BN_CLICKED(IDC_ROOMED_RESET_UP, OnRoomedResetUp)
	ON_BN_CLICKED(IDC_ROOMED_RESET_DOWN, OnRoomedResetDown)
	ON_NOTIFY(NM_CLICK, IDC_ROOMED_RESETS, OnClickRoomedResets)
	ON_NOTIFY(NM_DBLCLK, IDC_ROOMED_RESETS, OnDblclkRoomedResets)
	ON_COMMAND(ID_EDIT_COPIARCUARTO, OnEditCopiarcuarto)
	ON_COMMAND(ID_EDIT_PEGARCUARTO, OnEditPegarcuarto)
	ON_BN_CLICKED(IDC_ROOMED_ARRIBA, OnRoomedExit)
	ON_BN_CLICKED(IDC_ROOMED_SUR, OnRoomedExit)
	ON_BN_CLICKED(IDC_ROOMED_ESTE, OnRoomedExit)
	ON_BN_CLICKED(IDC_ROOMED_NORTE, OnRoomedExit)
	ON_BN_CLICKED(IDC_ROOMED_OESTE, OnRoomedExit)
	//}}AFX_MSG_MAP
	ON_COMMAND(ID_RESETPOP_AGREGAR, OnResetsPopAgregar)
	ON_COMMAND(ID_RESETPOP_BORRAR, OnResetsPopBorrar)
	ON_COMMAND(ID_RESETPOP_EDITAR, OnResetsPopEditar)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CRoomEd message handlers

BOOL CRoomEd::OnInitDialog() 
{
	int i, j, index;
	LV_ITEM itemdata;
	LV_COLUMN column;
	char buf[500];

	CDialog::OnInitDialog();

	m_VnumSpin.SetBuddy( GetDlgItem( IDC_ROOMED_VNUM ) );
	m_ManaGainSpin.SetBuddy( GetDlgItem( IDC_ROOMED_MANA ) );
	m_HitGainSpin.SetBuddy( GetDlgItem( IDC_ROOMED_HIT ) );
	m_ExitVnumSpin.SetBuddy( GetDlgItem( IDC_ROOMED_EXIT_VNUM ) );
	m_ExitLlaveSpin.SetBuddy( GetDlgItem( IDC_ROOMED_EXIT_LLAVE ) );

	m_VnumSpin.SetRange( 0, 32767 );
	m_ManaGainSpin.SetRange( 0, 32767 );
	m_HitGainSpin.SetRange( 0, 32767 );
	m_ExitVnumSpin.SetRange( 0, 32767 );
	m_ExitLlaveSpin.SetRange( -1, 32767 );

	m_ExitNorte = TRUE;
	m_ExitSur = FALSE;
	m_ExitEste = FALSE;
	m_ExitOeste = FALSE;
	m_ExitArriba = FALSE;
	m_ExitAbajo = FALSE;

	m_seldir = 0;
	m_ExitDescription = m_exits[0].m_description;
	m_ExitLlave = m_exits[0].m_key;
	m_ExitKeyword = m_exits[0].m_keyword;
	m_ExitVnum = m_exits[0].m_vnum;

	for ( i = 0; i < m_extradescr.GetSize(); i++ )
	{
		index = m_ExtraEdList.AddString( m_extradescr[i]->m_keyword );
		m_ExtraEdList.SetItemDataPtr( index, m_extradescr[i] );
	}

	if ( m_extradescr.GetSize() > 0 )
	{
		m_ExtraEdList.SelectString( -1, m_extradescr[0]->m_keyword );
		m_ExtraEd = m_extradescr[0]->m_description;
	}

	for ( i = 0; i < tables.m_sectortypes.GetSize(); i++ )
	{
		index = m_SectorType.AddString( tables.m_sectortypes[i]->m_text );
		m_SectorType.SetItemData( index, tables.m_sectortypes[i]->m_num );
		if ( tables.m_sectortypes[i]->m_num == m_cursector )
			m_SectorType.SetCurSel( index );
	}

	m_Flags.SetImageList( &m_imagelist, LVSIL_SMALL );
	for ( i = 0; i < tables.m_roomflags.GetSize(); i++ )
	{
		itemdata.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
		itemdata.iItem = i;
		itemdata.iSubItem = 0;
		itemdata.pszText = tables.m_roomflags[i]->m_text.GetBuffer(0);
		itemdata.lParam = tables.m_roomflags[i]->m_num;
		itemdata.iImage = m_roomflags & itemdata.lParam ? 1 : 0;
		m_Flags.InsertItem( &itemdata );
	}
	
	m_ExitFlags.SetImageList( &m_imagelist, LVSIL_SMALL );
	for ( i = 0; i < tables.m_exitflags.GetSize(); i++ )
	{
		itemdata.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
		itemdata.iItem = i;
		itemdata.iSubItem = 0;
		itemdata.pszText = tables.m_exitflags[i]->m_text.GetBuffer(0);
		itemdata.lParam = tables.m_exitflags[i]->m_num;
		itemdata.iImage = m_exits[0].m_flags & itemdata.lParam ? 1 : 0;
		m_ExitFlags.InsertItem( &itemdata );
	}

	CString text;
	text.LoadString( IDS_TYPE );
	column.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
	column.pszText = text.GetBuffer(0);
	column.cx = 40;
	column.iSubItem = 0;
	m_Resets.InsertColumn( 0, &column );

	column.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
	column.pszText = "arg1";
	column.cx = 55;
	column.iSubItem = 1;
	m_Resets.InsertColumn( 1, &column );

	column.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
	column.pszText = "arg2";
	column.cx = 55;
	column.iSubItem = 2;
	m_Resets.InsertColumn( 2, &column );

	column.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
	column.pszText = "arg3";
	column.cx = 55;
	column.iSubItem = 3;
	m_Resets.InsertColumn( 3, &column );

	column.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
	column.pszText = "arg4";
	column.cx = 55;
	column.iSubItem = 4;
	m_Resets.InsertColumn( 4, &column );

	for ( i = 0; i < m_resets.GetSize(); i++ )
	{
		buf[0] = m_resets[i]->m_type;
		buf[1] = 0;
		index = m_Resets.InsertItem( i, buf );
		for ( j = 0; j < 4; j++ )
		{
			itoa( m_resets[i]->m_num[j], buf, 10 );
			m_Resets.SetItemText( index, j+1, buf );
		}
	}

	m_ResetsUp.SetIcon( AfxGetApp()->LoadIcon( IDI_UP ) );
	m_ResetsDown.SetIcon( AfxGetApp()->LoadIcon( IDI_DOWN ) );
	m_ResetsDown.EnableWindow( FALSE );
	m_ResetsUp.EnableWindow( FALSE );

	UpdateData( FALSE );
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CRoomEd::OnRoomedExit() 
{
	int dir, i;
	DWORD botones[6], foco;
	LV_ITEM itemdata;

	botones[0] = (DWORD) GetDlgItem( IDC_ROOMED_NORTE );
	botones[1] = (DWORD) GetDlgItem( IDC_ROOMED_ESTE );
	botones[2] = (DWORD) GetDlgItem( IDC_ROOMED_SUR );
	botones[3] = (DWORD) GetDlgItem( IDC_ROOMED_OESTE );
	botones[4] = (DWORD) GetDlgItem( IDC_ROOMED_ARRIBA );
	botones[5] = (DWORD) GetDlgItem( IDC_ROOMED_ABAJO );
	foco = (DWORD) GetFocus();

	for ( dir = 0; dir < 6; dir++ )
		if ( botones[dir] == foco ) break;
	if ( dir >= 6 ) return;

	UpdateData( TRUE );

	m_ExitNorte = FALSE;	
	m_ExitSur = FALSE;	
	m_ExitEste = FALSE;	
	m_ExitOeste = FALSE;	
	m_ExitArriba = FALSE;	
	m_ExitAbajo = FALSE;	

	switch ( dir )
	{
	case 0: m_ExitNorte = TRUE; break;
	case 1: m_ExitEste = TRUE; break;
	case 2: m_ExitSur = TRUE; break;
	case 3: m_ExitOeste = TRUE; break;
	case 4: m_ExitArriba = TRUE; break;
	case 5: m_ExitAbajo = TRUE; break;
	}

	m_exits[m_seldir].m_description = m_ExitDescription;
	m_exits[m_seldir].m_key = m_ExitLlave;
	m_exits[m_seldir].m_keyword = m_ExitKeyword;
	m_exits[m_seldir].m_vnum = m_ExitVnum;
	m_seldir = dir;
	m_ExitDescription = m_exits[dir].m_description;
	m_ExitLlave = m_exits[dir].m_key;
	m_ExitKeyword = m_exits[dir].m_keyword;
	m_ExitVnum = m_exits[dir].m_vnum;

	for ( i = 0; i < tables.m_exitflags.GetSize(); i++ )
	{
		itemdata.mask = LVIF_IMAGE;
		itemdata.iItem = i;
		itemdata.iSubItem = 0;
		itemdata.iImage = m_exits[dir].m_flags & tables.m_exitflags[i]->m_num ? 1 : 0;
		m_ExitFlags.SetItem( &itemdata );
	}

	UpdateData( FALSE );

}

void CRoomEd::OnOK()
{
	char buf[500];
	CString text, tit;

	UpdateData( TRUE );

	if ( m_Vnum < m_minvnum || m_Vnum > m_maxvnum )
	{
		text.LoadString( IDS_VNUMRANGE );
		tit.LoadString( IDS_ERROR );
		sprintf( buf, text, m_minvnum, m_maxvnum );
		MessageBox( buf, tit, MB_ICONERROR );
		GotoDlgCtrl( GetDlgItem( IDC_ROOMED_VNUM ) );
		return;
	}

	if ( m_pDoc->FindRoom( m_Vnum, m_index ) != -1 )
	{
		text.LoadString( IDS_VNUMUSE );
		tit.LoadString( IDS_ERROR );
		MessageBox( text, tit, MB_ICONERROR );
		GotoDlgCtrl( GetDlgItem( IDC_ROOMED_VNUM ) );
		return;
	}

	m_exits[m_seldir].m_description = m_ExitDescription;
	m_exits[m_seldir].m_key = m_ExitLlave;
	m_exits[m_seldir].m_keyword = m_ExitKeyword;
	m_exits[m_seldir].m_vnum = m_ExitVnum;

	CDialog::OnOK();
}

void CRoomEd::OnSelchangeRoomedExtraedList() 
{
	CExtraDescr *extra;
	int index;

	if ( ( index = m_ExtraEdList.GetCurSel() ) == CB_ERR )
		return;

	extra = (CExtraDescr *) m_ExtraEdList.GetItemDataPtr( index );

	UpdateData( TRUE );
	m_ExtraEd = extra->m_description;
	UpdateData( FALSE );
}

void CRoomEd::OnRoomedExtraedAdd() 
{
	CString newkey;
	int index;
	CExtraDescr *extra;

	m_ExtraEdList.GetWindowText( newkey );

	if ( newkey == "" ) return;

	if ( ( index = m_ExtraEdList.FindStringExact( -1, newkey ) ) != CB_ERR )
	{
		m_ExtraEdList.SetCurSel( index );
		OnSelchangeRoomedExtraedList();
		return;
	}

	UpdateData( TRUE );

	extra = new CExtraDescr();
	extra->m_keyword = newkey;
	extra->m_description = m_ExtraEd;
	m_extradescr.Add( extra );
	index = m_ExtraEdList.AddString( extra->m_keyword );
	m_ExtraEdList.SetItemDataPtr( index, extra );
	m_ExtraEdList.SetCurSel( index );
	GotoDlgCtrl( GetDlgItem( IDC_ROOMED_EXTRAED ) );

	UpdateData( FALSE );

}

void CRoomEd::OnChangeRoomedExtraed() 
{
	CExtraDescr *extra;
	int index;

	if ( ( index = m_ExtraEdList.GetCurSel() ) == CB_ERR )
		return;

	extra = (CExtraDescr *) m_ExtraEdList.GetItemDataPtr( index );

	UpdateData( TRUE );
	extra->m_description = m_ExtraEd;
}

void CRoomEd::OnSelchangeRoomedSectortype() 
{
	int index = m_SectorType.GetCurSel();
	if ( index == CB_ERR ) return;
	m_cursector = m_SectorType.GetItemData( index );
}

void CRoomEd::OnClickRoomedFlags(NMHDR* pNMHDR, LRESULT* pResult) 
{
	int i;
	
	for ( i = 0; i < m_Flags.GetItemCount(); i++ )
	{
		if ( m_Flags.GetItemState( i, LVIS_SELECTED ) )
		{
			m_roomflags ^= m_Flags.GetItemData( i );

			LV_ITEM itemdata;
			itemdata.mask = LVIF_IMAGE;
			itemdata.iItem = i;
			itemdata.iSubItem = 0;
			itemdata.iImage = m_roomflags & m_Flags.GetItemData( i ) ? 1 : 0;
			m_Flags.SetItem( &itemdata );
		}
	}

	*pResult = 0;
}

void CRoomEd::OnClickRoomedExitFlags(NMHDR* pNMHDR, LRESULT* pResult) 
{
	int i;
	
	for ( i = 0; i < m_ExitFlags.GetItemCount(); i++ )
	{
		if ( m_ExitFlags.GetItemState( i, LVIS_SELECTED ) )
		{
			m_exits[m_seldir].m_flags ^= m_ExitFlags.GetItemData( i );

			LV_ITEM itemdata;
			itemdata.mask = LVIF_IMAGE;
			itemdata.iItem = i;
			itemdata.iSubItem = 0;
			itemdata.iImage = m_exits[m_seldir].m_flags & m_ExitFlags.GetItemData( i ) ? 1 : 0;
			m_ExitFlags.SetItem( &itemdata );
		}
	}

	*pResult = 0;
}

void CRoomEd::OnRoomedExtraedBorrar() 
{
	CString key;
	int index;
	CExtraDescr *extra;

	m_ExtraEdList.GetWindowText( key );
	if ( ( index = m_ExtraEdList.GetCurSel() ) == CB_ERR )
		return;
	m_ExtraEdList.DeleteString( index );

	for ( index = 0; index < m_extradescr.GetSize(); index++ )
		if ( m_extradescr[index]->m_keyword == key ) break;
	if ( index >= m_extradescr.GetSize() ) return;

	m_extradescr.RemoveAt( index );
	
	UpdateData( TRUE );

	m_ExtraEdList.SetCurSel( 0 );
	if ( m_extradescr.GetSize() > 0 )
	{
		extra = (CExtraDescr *) m_ExtraEdList.GetItemData( 0 );
		m_ExtraEd = extra->m_description;
	}
	else
		m_ExtraEd = "";

	UpdateData( FALSE );
}

void CRoomEd::OnChangeRoomedVnum() 
{
	int vnum = m_VnumSpin.GetPos();

	for ( int i = 0; i < m_Resets.GetItemCount(); i++ )
	{
		char buf[500];

		switch ( m_resets[i]->m_type )
		{
		case 'M':
		case 'O':
		case 'P':
			m_resets[i]->m_num[2] = vnum;
			itoa( m_resets[i]->m_num[2], buf, 10 );
			m_Resets.SetItemText( i, 3, buf );
			break;
		case 'D':
		case 'R':
			m_resets[i]->m_num[0] = vnum;
			itoa( m_resets[i]->m_num[0], buf, 10 );
			m_Resets.SetItemText( i, 1, buf );
			break;
		}
	}
}

void CRoomEd::OnRclickRoomedResets(NMHDR* pNMHDR, LRESULT* pResult) 
{
	POINT curPos;
	CMenu menu;
	int i;
	CString text;

	for ( i = 0; i < m_Resets.GetItemCount(); i++ )
		if ( m_Resets.GetItemState( i, LVIS_SELECTED ) )
			break;

	GetCursorPos( &curPos );
	menu.CreatePopupMenu();
	text.LoadString( IDS_MADD );
	menu.AppendMenu( MF_ENABLED, ID_RESETPOP_AGREGAR, text );
	text.LoadString( IDS_MDEL );
	menu.AppendMenu( i < m_Resets.GetItemCount() ? MF_ENABLED : MF_GRAYED, ID_RESETPOP_BORRAR, text );
	text.LoadString( IDS_MEDIT );
	menu.AppendMenu( i < m_Resets.GetItemCount() ? MF_ENABLED : MF_GRAYED, ID_RESETPOP_EDITAR, text );
	menu.TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON, curPos.x, curPos.y, this );

	*pResult = 0;
}

int CRoomEd::ResetEd(CResetData * reset)
{
	CResetEd dlg;
	int i;
	
	dlg.m_type = reset->m_type;
	for ( i = 0; i < 4; i++ )
		dlg.m_num[i] = reset->m_num[i];
	dlg.m_vnum = m_VnumSpin.GetPos();
	dlg.m_doc = m_pDoc;

	if ( dlg.DoModal() == IDOK )
	{
		reset->m_type = dlg.m_type;
		for ( i = 0; i < 4; i++ )
			reset->m_num[i] = dlg.m_num[i];

		return IDOK;
	}

	return IDCANCEL;
}

void CRoomEd::OnResetsPopAgregar()
{
	CResetData *reset;
	char buf[500];

	reset = new CResetData();
	if ( ResetEd( reset ) == IDOK )
	{
		m_resets.Add( reset );
		buf[0] = reset->m_type;
		buf[1] = 0;
		int i = m_Resets.GetItemCount();
		int index = m_Resets.InsertItem( i, buf );
		for ( int j = 0; j < 4; j++ )
		{
			itoa( reset->m_num[j], buf, 10 );
			m_Resets.SetItemText( index, j+1, buf );
		}
	}
	else delete reset;
}

void CRoomEd::OnResetsPopBorrar()
{
	int i;

	for ( i = 0; i < m_Resets.GetItemCount(); i++ )
		if ( m_Resets.GetItemState( i, LVIS_SELECTED ) )
			break;
	if ( i >= m_Resets.GetItemCount() ) return;
	m_resets.RemoveAt( i );
	m_Resets.DeleteItem( i );
}

void CRoomEd::OnResetsPopEditar()
{
	int i;
	char buf[500];

	for ( i = 0; i < m_Resets.GetItemCount(); i++ )
		if ( m_Resets.GetItemState( i, LVIS_SELECTED ) )
			break;
	if ( i >= m_Resets.GetItemCount() ) return;
	if ( ResetEd( m_resets[i] ) == IDOK )
	{
		buf[0] = m_resets[i]->m_type;
		buf[1] = 0;
		m_Resets.DeleteItem( i );
		int index = m_Resets.InsertItem( i, buf );
		for ( int j = 0; j < 4; j++ )
		{
			itoa( m_resets[i]->m_num[j], buf, 10 );
			m_Resets.SetItemText( index, j+1, buf );
		}
	}
}

void CRoomEd::OnRoomedResetUp() 
{
	int i, k;
	char buf[500];
	CResetData *reset;

	for ( i = 0; i < m_Resets.GetItemCount(); i++ )
		if ( m_Resets.GetItemState( i, LVIS_SELECTED ) )
			break;
	if ( i >= m_Resets.GetItemCount() ) return;
	if ( i <= 0 ) return;

	reset = m_resets[i-1];
	m_resets[i-1] = m_resets[i];
	m_resets[i] = reset;

	for ( k = i-1; k <= i; k++ )
	{
		buf[0] = m_resets[k]->m_type;
		buf[1] = 0;
		m_Resets.DeleteItem( k );
		int index = m_Resets.InsertItem( k, buf );
		for ( int j = 0; j < 4; j++ )
		{
			itoa( m_resets[k]->m_num[j], buf, 10 );
			m_Resets.SetItemText( index, j+1, buf );
		}
	}
	m_Resets.SetItemState( i-1, LVIS_SELECTED, LVIS_SELECTED );
	m_Resets.EnsureVisible( --i, FALSE );
	m_ResetsDown.EnableWindow( FALSE );
	m_ResetsUp.EnableWindow( FALSE );
	if ( i < m_Resets.GetItemCount() - 1 ) m_ResetsDown.EnableWindow();
	if ( i > 0 && i < m_Resets.GetItemCount() ) m_ResetsUp.EnableWindow();
}

void CRoomEd::OnRoomedResetDown() 
{
	int i, k;
	char buf[500];
	CResetData *reset;

	for ( i = 0; i < m_Resets.GetItemCount(); i++ )
		if ( m_Resets.GetItemState( i, LVIS_SELECTED ) )
			break;
	if ( i >= m_Resets.GetItemCount() - 1 ) return;

	reset = m_resets[i+1];
	m_resets[i+1] = m_resets[i];
	m_resets[i] = reset;

	for ( k = i; k <= i+1; k++ )
	{
		buf[0] = m_resets[k]->m_type;
		buf[1] = 0;
		m_Resets.DeleteItem( k );
		int index = m_Resets.InsertItem( k, buf );
		for ( int j = 0; j < 4; j++ )
		{
			itoa( m_resets[k]->m_num[j], buf, 10 );
			m_Resets.SetItemText( index, j+1, buf );
		}
	}
	m_Resets.SetItemState( i+1, LVIS_SELECTED, LVIS_SELECTED );
	m_Resets.EnsureVisible( ++i, FALSE );
	m_ResetsDown.EnableWindow( FALSE );
	m_ResetsUp.EnableWindow( FALSE );
	if ( i < m_Resets.GetItemCount() - 1 ) m_ResetsDown.EnableWindow();
	if ( i > 0 && i < m_Resets.GetItemCount() ) m_ResetsUp.EnableWindow();
}

void CRoomEd::OnClickRoomedResets(NMHDR* pNMHDR, LRESULT* pResult) 
{
	int i;

	m_ResetsDown.EnableWindow( FALSE );
	m_ResetsUp.EnableWindow( FALSE );
	for ( i = 0; i < m_Resets.GetItemCount(); i++ )
		if ( m_Resets.GetItemState( i, LVIS_SELECTED ) )
			break;
	if ( i < m_Resets.GetItemCount() - 1 ) m_ResetsDown.EnableWindow();
	if ( i > 0 && i < m_Resets.GetItemCount() ) m_ResetsUp.EnableWindow();

	
	*pResult = 0;
}

void CRoomEd::OnDblclkRoomedResets(NMHDR* pNMHDR, LRESULT* pResult) 
{
	*pResult = 0;
	OnResetsPopEditar();
}

void CRoomEd::OnEditCopiarcuarto() 
{
	UINT clfmt = RegisterClipboardFormat( "ARCAED_ROOM" );

	COleDataSource *source = new COleDataSource();
	UpdateData( TRUE );

	TRY
	{

		CSharedFile file( GMEM_ZEROINIT|GMEM_DDESHARE|GMEM_MOVEABLE );
		TRY
		{

			CArchive ar (&file, CArchive::store);
			TRY
			{
				ar << m_Clan << m_Description;
				ar << m_extradescr.GetSize();
				for ( int i = 0; i < m_extradescr.GetSize(); i++ )
				{
					ar << m_extradescr[i]->m_keyword;
					ar << m_extradescr[i]->m_description;
				}
				ar << m_HitGain << m_ManaGain << m_Name << m_Owner;
				ar << m_resets.GetSize();
				for ( i = 0; i < m_resets.GetSize(); i++ )
				{
					ar << m_resets[i]->m_type;
					for ( int j = 0; j < 4; j++ )
						ar << m_resets[i]->m_num[j];
				}
				ar << m_roomflags << m_cursector;
				
				ar.Close();
			}
			CATCH_ALL( eArWrite )
			{
				ASSERT( FALSE );
			}
			END_CATCH_ALL;

		}
		CATCH_ALL( eArError )
		{
			ASSERT( FALSE );
		}
		END_CATCH_ALL;

	source->CacheGlobalData( clfmt, file.Detach() );

	}
	CATCH_ALL( eShFileError )
	{
		ASSERT( FALSE );
	}
	END_CATCH_ALL;

	source->SetClipboard();

}

void CRoomEd::OnEditPegarcuarto() 
{
	int i, j, index;
	LV_ITEM itemdata;
	char buf[500];

	UINT clfmt = RegisterClipboardFormat( "ARCAED_ROOM" );

	COleDataObject source;
	if ( !source.AttachClipboard() ) return;
	CFile *pFile = source.GetFileData( clfmt );
	if ( pFile == NULL ) return;
	UpdateData( TRUE );

	TRY
	{

		CArchive ar( pFile, CArchive::load );
		TRY
		{
			int num, i;
			CExtraDescr *extradesc;
			CResetData *reset;

			ar >> m_Clan;
			ar >> m_Description;
			m_extradescr.RemoveAll();
			ar >> num;
			for ( i = 0; i < num; i++ )
			{
				extradesc = new CExtraDescr();
				ar >> extradesc->m_keyword;
				ar >> extradesc->m_description;
				m_extradescr.Add( extradesc );
			}
			ar >> m_HitGain >> m_ManaGain >> m_Name >> m_Owner;
			m_resets.RemoveAll();
			ar >> num;
			for ( i = 0; i < num; i++ )
			{
				reset = new CResetData();
				ar >> reset->m_type;
				for ( j = 0; j < 4; j++ )
					ar >> reset->m_num[j];
				m_resets.Add( reset );
			}
			ar >> m_roomflags >> m_cursector;
			ar.Close();

		}
		CATCH_ALL( eArRead )
		{
			ASSERT( FALSE );
		}
		END_CATCH_ALL;

	}
	CATCH_ALL( eArClose )
	{
		ASSERT( FALSE );
	}
	END_CATCH_ALL;

	m_ExtraEdList.ResetContent();
	for ( i = 0; i < m_extradescr.GetSize(); i++ )
	{
		index = m_ExtraEdList.AddString( m_extradescr[i]->m_keyword );
		m_ExtraEdList.SetItemDataPtr( index, m_extradescr[i] );
	}

	if ( m_extradescr.GetSize() > 0 )
	{
		m_ExtraEdList.SelectString( -1, m_extradescr[0]->m_keyword );
		m_ExtraEd = m_extradescr[0]->m_description;
	}

	m_SectorType.ResetContent();
	for ( i = 0; i < tables.m_sectortypes.GetSize(); i++ )
	{
		index = m_SectorType.AddString( tables.m_sectortypes[i]->m_text );
		m_SectorType.SetItemData( index, tables.m_sectortypes[i]->m_num );
		if ( tables.m_sectortypes[i]->m_num == m_cursector )
			m_SectorType.SetCurSel( index );
	}

	m_Flags.DeleteAllItems();
	for ( i = 0; i < tables.m_roomflags.GetSize(); i++ )
	{
		itemdata.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
		itemdata.iItem = i;
		itemdata.iSubItem = 0;
		itemdata.pszText = tables.m_roomflags[i]->m_text.GetBuffer(0);
		itemdata.lParam = tables.m_roomflags[i]->m_num;
		itemdata.iImage = m_roomflags & itemdata.lParam ? 1 : 0;
		m_Flags.InsertItem( &itemdata );
	}
	
	m_Resets.DeleteAllItems();
	for ( i = 0; i < m_resets.GetSize(); i++ )
	{
		buf[0] = m_resets[i]->m_type;
		buf[1] = 0;
		index = m_Resets.InsertItem( i, buf );
		for ( j = 0; j < 4; j++ )
		{
			itoa( m_resets[i]->m_num[j], buf, 10 );
			m_Resets.SetItemText( index, j+1, buf );
		}
	}

	m_ResetsDown.EnableWindow( FALSE );
	m_ResetsUp.EnableWindow( FALSE );
	UpdateData( FALSE );

	delete pFile;

}

BOOL CRoomEd::PreTranslateMessage(MSG* pMsg) 
{
	if ( TranslateAccelerator( this->m_hWnd, m_accel, pMsg ) )
		return TRUE;
	
	return CDialog::PreTranslateMessage(pMsg);
}