/*
 *  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: ResetEd.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... :-)
 *
 */


// ResetEd.cpp : implementation file
//

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

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

/////////////////////////////////////////////////////////////////////////////
// CResetEd dialog


CResetEd::CResetEd(CWnd* pParent /*=NULL*/)
	: CDialog(CResetEd::IDD, pParent)
{
	//{{AFX_DATA_INIT(CResetEd)
	m_Arg1 = 0;
	m_Arg2 = 0;
	m_Max = 1;
	m_Min = 1;
	//}}AFX_DATA_INIT

	m_type = 0;
	for ( int i = 0; i < 4; i++ )
		m_num[i] = 0;
	m_vnum = 0;
	m_listnum2 = 0;
	m_listnum = 0;
	m_firstsel = TRUE;
	m_doc = NULL;
}


void CResetEd::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CResetEd)
	DDX_Control(pDX, IDC_RESETED_LIST2, m_List2);
	DDX_Control(pDX, IDC_RESETED_ARG2_LIST, m_Arg2List);
	DDX_Control(pDX, IDC_RESETED_ARG1_LIST, m_Arg1List);
	DDX_Control(pDX, IDC_RESETED_LIST, m_List);
	DDX_Control(pDX, IDC_RESETED_TEXT_LIST, m_TextList);
	DDX_Control(pDX, IDC_RESETED_TEXT_ARG2, m_TextArg2);
	DDX_Control(pDX, IDC_RESETED_TEXT_ARG1, m_TextArg1);
	DDX_Control(pDX, IDC_RESETED_TYPE, m_Type);
	DDX_Control(pDX, IDC_RESETED_MIN_SPIN, m_MinSpin);
	DDX_Control(pDX, IDC_RESETED_MAX_SPIN, m_MaxSpin);
	DDX_Control(pDX, IDC_RESETED_ARG2_SPIN, m_Arg2Spin);
	DDX_Control(pDX, IDC_RESETED_ARG1_SPIN, m_Arg1Spin);
	DDX_Text(pDX, IDC_RESETED_ARG1, m_Arg1);
	DDV_MinMaxInt(pDX, m_Arg1, 0, 32767);
	DDX_Text(pDX, IDC_RESETED_ARG2, m_Arg2);
	DDV_MinMaxInt(pDX, m_Arg2, 0, 32767);
	DDX_Text(pDX, IDC_RESETED_MAX, m_Max);
	DDV_MinMaxInt(pDX, m_Max, 0, 32767);
	DDX_Text(pDX, IDC_RESETED_MIN, m_Min);
	DDV_MinMaxInt(pDX, m_Min, 0, 32767);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CResetEd, CDialog)
	//{{AFX_MSG_MAP(CResetEd)
	ON_CBN_SELCHANGE(IDC_RESETED_TYPE, OnSelchangeResetedType)
	ON_CBN_SELCHANGE(IDC_RESETED_LIST, OnSelchangeResetedList)
	ON_CBN_SELCHANGE(IDC_RESETED_LIST2, OnSelchangeResetedList2)
	ON_CBN_SELCHANGE(IDC_RESETED_ARG1_LIST, OnSelchangeResetedArg1List)
	ON_CBN_SELCHANGE(IDC_RESETED_ARG2_LIST, OnSelchangeResetedArg2List)
	ON_EN_CHANGE(IDC_RESETED_ARG1, OnChangeResetedArg1)
	ON_EN_CHANGE(IDC_RESETED_ARG2, OnChangeResetedArg2)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CResetEd message handlers

BOOL CResetEd::OnInitDialog() 
{
	CDialog::OnInitDialog();
	CString text;

	int index;

	m_Arg1Spin.SetBuddy( GetDlgItem( IDC_RESETED_ARG1 ) );
	m_Arg1Spin.SetRange( 0, 32767 );
	m_Arg2Spin.SetBuddy( GetDlgItem( IDC_RESETED_ARG2 ) );
	m_Arg2Spin.SetRange( 0, 32767 );
	m_MaxSpin.SetBuddy( GetDlgItem( IDC_RESETED_MAX ) );
	m_MaxSpin.SetRange( 0, 32767 );
	m_MinSpin.SetBuddy( GetDlgItem( IDC_RESETED_MIN ) );
	m_MinSpin.SetRange( 0, 32767 );

	text.LoadString( IDS_RESETM );
	index = m_Type.AddString( text );
	ASSERT( index != CB_ERR && index != CB_ERRSPACE );
	m_Type.SetItemData( index, 'M' );
	text.LoadString( IDS_RESETO );
	index = m_Type.AddString( text );
	ASSERT( index != CB_ERR && index != CB_ERRSPACE );
	m_Type.SetItemData( index, 'O' );
	text.LoadString( IDS_RESETP );
	index = m_Type.AddString( text );
	ASSERT( index != CB_ERR && index != CB_ERRSPACE );
	m_Type.SetItemData( index, 'P' );
	text.LoadString( IDS_RESETG );
	index = m_Type.AddString( text );
	ASSERT( index != CB_ERR && index != CB_ERRSPACE );
	m_Type.SetItemData( index, 'G' );
	text.LoadString( IDS_RESETE );
	index = m_Type.AddString( text );
	ASSERT( index != CB_ERR && index != CB_ERRSPACE );
	m_Type.SetItemData( index, 'E' );
	text.LoadString( IDS_RESETD );
	index = m_Type.AddString( text );
	ASSERT( index != CB_ERR && index != CB_ERRSPACE );
	m_Type.SetItemData( index, 'D' );
	text.LoadString( IDS_RESETR );
	index = m_Type.AddString( text );
	ASSERT( index != CB_ERR && index != CB_ERRSPACE );
	m_Type.SetItemData( index, 'R' );
	for ( index = 0; index < 7; index ++ )
	{
		if ( (DWORD) m_type == m_Type.GetItemData( index ) )
		{
			m_Type.SetCurSel( index );
			break;
		}
	}
	m_firstsel = TRUE;
	OnSelchangeResetedType();

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

void CResetEd::OnSelchangeResetedType() 
{
	int sel, i, index;
	CString text;

	UpdateData( TRUE );
	text.LoadString( IDS_NOTHING );
	m_TextArg1.SetWindowText( text );
	m_Arg1 = 0;
	GetDlgItem( IDC_RESETED_ARG1 )->EnableWindow( FALSE );
	m_Arg1List.ResetContent();
	m_Arg1List.EnableWindow( FALSE );
	m_TextArg2.SetWindowText( text );
	m_Arg2 = 0;
	GetDlgItem( IDC_RESETED_ARG2 )->EnableWindow( FALSE );
	m_Arg2List.ResetContent();
	m_Arg2List.EnableWindow( FALSE );
	m_Max = 0;
	GetDlgItem( IDC_RESETED_MAX )->EnableWindow( FALSE );
	m_Min = 0;
	GetDlgItem( IDC_RESETED_MIN )->EnableWindow( FALSE );
	m_TextList.SetWindowText( text );
	m_List.ResetContent();
	m_List.EnableWindow( FALSE );
	m_List2.ResetContent();
	m_List2.EnableWindow( FALSE );
	GetDlgItem( IDOK )->EnableWindow( FALSE );
	UpdateData( FALSE );

	if ( ( sel = m_Type.GetCurSel() ) == CB_ERR )
	{
		m_firstsel = FALSE;
		return;
	}

	m_type = (char) m_Type.GetItemData( sel );
	GetDlgItem( IDOK )->EnableWindow();

	if ( m_firstsel )
		m_firstsel = FALSE;
	else 
	{
		for ( i = 0; i < 4; i++ )
			m_num[i] = 0;

		if ( m_type == 'M' || m_type == 'P' || m_type == 'G'
			|| m_type == 'E' )
		{
			m_num[1] = 1;
			m_num[3] = 1;
		}
	}

	switch ( m_type )
	{
	case 'M':
		text.LoadString( IDS_MOB );
		m_TextArg1.SetWindowText( text );
		GetDlgItem( IDC_RESETED_ARG1 )->EnableWindow();
		m_Arg1 = m_num[0];
		m_Arg1List.EnableWindow();
		MakeMobList( m_Arg1List, m_num[0] );
		GetDlgItem( IDC_RESETED_MAX )->EnableWindow();
		m_Max = m_num[1];
		GetDlgItem( IDC_RESETED_MIN )->EnableWindow();
		m_Min = m_num[3];
		break;
	case 'O':
		text.LoadString( IDS_OBJECT );
		m_TextArg1.SetWindowText( text );
		GetDlgItem( IDC_RESETED_ARG1 )->EnableWindow();
		m_Arg1 = m_num[0];
		m_Arg1List.EnableWindow();
		MakeObjList( m_Arg1List, m_num[0] );
		break;
	case 'P':
		text.LoadString( IDS_OBJECT );
		m_TextArg1.SetWindowText( text );
		GetDlgItem( IDC_RESETED_ARG1 )->EnableWindow();
		m_Arg1 = m_num[0];
		m_Arg1List.EnableWindow();
		MakeObjList( m_Arg1List, m_num[0] );
		text.LoadString( IDS_TOOBJ );
		m_TextArg2.SetWindowText( text );
		GetDlgItem( IDC_RESETED_ARG2 )->EnableWindow();
		m_Arg2 = m_num[2];
		m_Arg2List.EnableWindow();
		MakeObjList( m_Arg2List, m_num[0] );
		GetDlgItem( IDC_RESETED_MAX )->EnableWindow();
		m_Max = m_num[1];
		GetDlgItem( IDC_RESETED_MIN )->EnableWindow();
		m_Min = m_num[3];
		break;
	case 'G':
		text.LoadString( IDS_OBJECT );
		m_TextArg1.SetWindowText( text );
		GetDlgItem( IDC_RESETED_ARG1 )->EnableWindow();
		m_Arg1 = m_num[0];
		m_Arg1List.EnableWindow();
		MakeObjList( m_Arg1List, m_num[0] );
		GetDlgItem( IDC_RESETED_MAX )->EnableWindow();
		m_Max = m_num[1];
		GetDlgItem( IDC_RESETED_MIN )->EnableWindow();
		m_Min = m_num[3];
		break;
	case 'E':
		text.LoadString( IDS_OBJECT );
		m_TextArg1.SetWindowText( text );
		GetDlgItem( IDC_RESETED_ARG1 )->EnableWindow();
		m_Arg1 = m_num[0];
		m_Arg1List.EnableWindow();
		MakeObjList( m_Arg1List, m_num[0] );
		GetDlgItem( IDC_RESETED_MAX )->EnableWindow();
		m_Max = m_num[1];
		GetDlgItem( IDC_RESETED_MIN )->EnableWindow();
		m_Min = m_num[3];
		m_List.EnableWindow();
		text.LoadString( IDS_POSITION );
		m_TextList.SetWindowText( text );
		m_listnum = m_num[2];
		for ( i = 0; i < tables.m_wearpos.GetSize(); i++ )
		{
			index = m_List.AddString( tables.m_wearpos[i]->m_text );
			ASSERT( index != CB_ERR && index != CB_ERRSPACE );
			m_List.SetItemData( index, tables.m_wearpos[i]->m_num );
			if ( m_listnum == tables.m_wearpos[i]->m_num )
				m_List.SetCurSel( index );
		}
		break;
	case 'D':
		m_List.EnableWindow();
		text.LoadString( IDS_DIRECTION );
		m_TextList.SetWindowText( text );
		m_listnum = m_num[1];
		for ( i = 0; i < tables.m_dirname.GetSize(); i++ )
		{
			index = m_List.AddString( tables.m_dirname[i]->m_text );
			ASSERT( index != CB_ERR && index != CB_ERRSPACE );
			m_List.SetItemData( index, tables.m_dirname[i]->m_num );
			if ( m_listnum == tables.m_dirname[i]->m_num )
				m_List.SetCurSel( index );
		}
		m_List2.EnableWindow();
		m_listnum2 = m_num[2];
		text.LoadString( IDS_NOTHING );
		index = m_List2.AddString( text );
		ASSERT( index != CB_ERR && index != CB_ERRSPACE );
		m_List2.SetItemData( index, 0 );
		if ( m_listnum2 == 0 ) m_List2.SetCurSel( index );
		text.LoadString( IDS_CLOSED );
		index = m_List2.AddString( text );
		ASSERT( index != CB_ERR && index != CB_ERRSPACE );
		m_List2.SetItemData( index, 1 );
		if ( m_listnum2 == 1 ) m_List2.SetCurSel( index );
		text.LoadString( IDS_LOCKED );
		index = m_List2.AddString( text );
		ASSERT( index != CB_ERR && index != CB_ERRSPACE );
		m_List2.SetItemData( index, 2 );
		if ( m_listnum2 == 2 ) m_List2.SetCurSel( index );
		break;
	case 'R':
		break;
	}

	UpdateData( FALSE );
}

void CResetEd::OnOK() 
{
	switch ( m_type )
	{
	case 'M':
		m_num[0] = m_Arg1Spin.GetPos();
		m_num[1] = m_MaxSpin.GetPos();
		m_num[2] = m_vnum;
		m_num[3] = m_MinSpin.GetPos();
		break;
	case 'O':
		m_num[0] = m_Arg1Spin.GetPos();
		m_num[1] = 0;
		m_num[2] = m_vnum;
		m_num[3] = 0;
		break;
	case 'P':
		m_num[0] = m_Arg1Spin.GetPos();
		m_num[1] = m_MaxSpin.GetPos();
		m_num[2] = m_Arg2Spin.GetPos();
		m_num[3] = m_MinSpin.GetPos();
		break;
	case 'G':
		m_num[0] = m_Arg1Spin.GetPos();
		m_num[1] = m_MaxSpin.GetPos();
		m_num[2] = 0;
		m_num[3] = m_MinSpin.GetPos();
		break;
	case 'E':
		m_num[0] = m_Arg1Spin.GetPos();
		m_num[1] = m_MaxSpin.GetPos();
		m_num[2] = m_listnum;
		m_num[3] = m_MinSpin.GetPos();
		break;
	case 'D':
		m_num[0] = m_vnum;
		m_num[1] = m_listnum;
		m_num[2] = m_listnum2;
		m_num[3] = 0;
		break;
	case 'R':
		m_num[0] = m_vnum;
		m_num[1] = 0;
		m_num[2] = 0;
		m_num[3] = 0;
		break;
	}
	
	CDialog::OnOK();
}

void CResetEd::OnSelchangeResetedList() 
{
	int sel = m_List.GetCurSel();
	if ( sel == CB_ERR ) return;
	m_listnum = m_List.GetItemData( sel );
}

void CResetEd::OnSelchangeResetedList2() 
{
	int sel = m_List2.GetCurSel();
	if ( sel == CB_ERR ) return;
	m_listnum2 = m_List2.GetItemData( sel );
}

void CResetEd::MakeMobList(CComboBox & list, int vnum)
{
	int i, index;
	char buf[500];

	for ( i = 0; i < m_doc->m_mobs.GetSize(); i++ )
	{
		sprintf( buf, "%s (%i)", m_doc->m_mobs[i]->m_short_descr,
			m_doc->m_mobs[i]->m_vnum );
		index = list.AddString( buf );
		ASSERT( index != CB_ERR && index != CB_ERRSPACE );
		list.SetItemData( index, m_doc->m_mobs[i]->m_vnum );
		if ( vnum == m_doc->m_mobs[i]->m_vnum )
			list.SetCurSel( index );
	}
}

void CResetEd::MakeObjList(CComboBox & list, int vnum)
{
	int i, index;
	char buf[500];

	for ( i = 0; i < m_doc->m_objs.GetSize(); i++ )
	{
		sprintf( buf, "%s (%i)", m_doc->m_objs[i]->m_short_descr,
			m_doc->m_objs[i]->m_vnum );
		index = list.AddString( buf );
		ASSERT( index != CB_ERR && index != CB_ERRSPACE );
		list.SetItemData( index, m_doc->m_objs[i]->m_vnum );
		if ( vnum == m_doc->m_objs[i]->m_vnum )
			list.SetCurSel( index );
	}
}

void CResetEd::OnSelchangeResetedArg1List() 
{
	int sel = m_Arg1List.GetCurSel();
	if ( sel == CB_ERR ) return;
	UpdateData( TRUE );
	m_Arg1 = m_Arg1List.GetItemData( sel );
	UpdateData( FALSE );
}

void CResetEd::OnSelchangeResetedArg2List() 
{
	int sel = m_Arg2List.GetCurSel();
	if ( sel == CB_ERR ) return;
	UpdateData( TRUE );
	m_Arg2 = m_Arg2List.GetItemData( sel );
	UpdateData( FALSE );
}

void CResetEd::OnChangeResetedArg1() 
{
	int i, num;

	num = m_Arg1Spin.GetPos();
	for ( i = 0; i < m_Arg1List.GetCount(); i++ )
		if ( (DWORD) num == m_Arg1List.GetItemData( i ) )
			break;
	if ( i >= m_Arg1List.GetCount() ) i = -1;
	m_Arg1List.SetCurSel( i );
}

void CResetEd::OnChangeResetedArg2() 
{
	int i, num;

	num = m_Arg2Spin.GetPos();
	for ( i = 0; i < m_Arg2List.GetCount(); i++ )
		if ( (DWORD) num == m_Arg2List.GetItemData( i ) )
			break;
	if ( i >= m_Arg2List.GetCount() ) i = -1;
	m_Arg2List.SetCurSel( i );
}