/*
 *  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:26 1999
 *
 */


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


// SkillTrEdit.cpp : implementation file
//

#include "stdafx.h"
#include "arcaed.h"
#include "SkillTrEdit.h"

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

/////////////////////////////////////////////////////////////////////////////
// CSkillTrEdit dialog


CSkillTrEdit::CSkillTrEdit(CWnd* pParent /*=NULL*/)
	: CDialog(CSkillTrEdit::IDD, pParent)
{
	//{{AFX_DATA_INIT(CSkillTrEdit)
	m_Gold = 0;
	m_MaxLevel = 0;
	m_Mult = 0;
	//}}AFX_DATA_INIT
}


void CSkillTrEdit::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSkillTrEdit)
	DDX_Control(pDX, IDC_SKILLPR_CLASS, m_Class);
	DDX_Control(pDX, IDC_SKILLPR_MULT_SPIN, m_MultSpin);
	DDX_Control(pDX, IDC_SKILLPR_LEVEL_SPIN, m_MaxLevelSpin);
	DDX_Control(pDX, IDC_SKILLPR_GOLD_SPIN, m_GoldSpin);
	DDX_Control(pDX, IDC_SKILLPR_TEACH, m_Teach);
	DDX_Control(pDX, IDC_SKILLPR_SKILL, m_Skill);
	DDX_Control(pDX, IDC_SKILLPR_LIST, m_List);
	DDX_Text(pDX, IDC_SKILLPR_GOLD, m_Gold);
	DDV_MinMaxInt(pDX, m_Gold, 0, 30000);
	DDX_Text(pDX, IDC_SKILLPR_LEVEL, m_MaxLevel);
	DDV_MinMaxInt(pDX, m_MaxLevel, 0, 30000);
	DDX_Text(pDX, IDC_SKILLPR_MULT, m_Mult);
	DDV_MinMaxInt(pDX, m_Mult, 0, 30000);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CSkillTrEdit, CDialog)
	//{{AFX_MSG_MAP(CSkillTrEdit)
	ON_CBN_SELCHANGE(IDC_SKILLPR_CLASS, OnSelchangeSkillprClass)
	ON_BN_CLICKED(IDC_SKILLPR_ADD, OnSkillprAdd)
	ON_BN_CLICKED(IDC_SKILLPR_DEL, OnSkillprDel)
	ON_EN_CHANGE(IDC_SKILLPR_GOLD, OnChangeSkillprGold)
	ON_EN_CHANGE(IDC_SKILLPR_LEVEL, OnChangeSkillprLevel)
	ON_EN_CHANGE(IDC_SKILLPR_MULT, OnChangeSkillprMult)
	ON_CBN_SELCHANGE(IDC_SKILLPR_SKILL, OnSelchangeSkillprSkill)
	ON_CBN_SELCHANGE(IDC_SKILLPR_TEACH, OnSelchangeSkillprTeach)
	ON_LBN_SELCHANGE(IDC_SKILLPR_LIST, OnSelchangeSkillprList)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSkillTrEdit message handlers

BOOL CSkillTrEdit::OnInitDialog() 
{
	CDialog::OnInitDialog();

	int index, i;
	CString temp;

	m_GoldSpin.SetBuddy( GetDlgItem( IDC_SKILLPR_GOLD ) );
	m_MultSpin.SetBuddy( GetDlgItem( IDC_SKILLPR_MULT ) );
	m_MaxLevelSpin.SetBuddy( GetDlgItem( IDC_SKILLPR_LEVEL ) );
	m_GoldSpin.SetRange( 0, 30000 );
	m_MultSpin.SetRange( 0, 30000 );
	m_MaxLevelSpin.SetRange( 0, 30000 );

	temp.LoadString( IDS_NO );
	tch_no = m_Teach.AddString( temp );
	ASSERT( tch_no != CB_ERR && tch_no != CB_ERRSPACE );
	m_Teach.SetItemData( tch_no, FALSE );
	temp.LoadString( IDS_YES );
	tch_yes = m_Teach.AddString( temp );
	ASSERT( tch_yes != CB_ERR && tch_yes != CB_ERRSPACE );
	m_Teach.SetItemData( tch_yes, TRUE );
	
	for ( i = 0; i < tables.m_skills.GetSize(); i++ )
	{
		index = m_Skill.AddString( tables.m_skills[i]->m_text );
		ASSERT( index != CB_ERR && index != CB_ERRSPACE );
		m_Skill.SetItemData( index, i );
	}

	index = m_Class.AddString( "" );
	ASSERT( index != CB_ERR && index != CB_ERRSPACE );
	m_Class.SetItemData( index, -1 );
	for ( i = 0; i < tables.m_classes.GetSize(); i++ )
	{
		index = m_Class.AddString( tables.m_classes[i]->m_text );
		ASSERT( index != CB_ERR && index != CB_ERRSPACE );
		m_Class.SetItemData( index, i );
		if ( m_class == tables.m_classes[i]->m_text )
			m_Class.SetCurSel( i );
	}

	for ( i = 0; i < m_trskill.GetSize(); i++ )
	{
		index = m_List.AddString( m_trskill[i]->m_skill );
		ASSERT( index != LB_ERR && index != LB_ERRSPACE );
		m_List.SetItemData( index, i );
	}

	SetSelData();

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

void CSkillTrEdit::SetSelData()
{
	GetDlgItem( IDC_SKILLPR_SKILL )->EnableWindow( FALSE );
	GetDlgItem( IDC_SKILLPR_GOLD )->EnableWindow( FALSE );
	GetDlgItem( IDC_SKILLPR_LEVEL )->EnableWindow( FALSE );
	GetDlgItem( IDC_SKILLPR_MULT )->EnableWindow( FALSE );
	GetDlgItem( IDC_SKILLPR_TEACH )->EnableWindow( FALSE );

	int sel = m_List.GetCurSel();
	if ( sel == LB_ERR ) return;

	GetDlgItem( IDC_SKILLPR_SKILL )->EnableWindow();
	GetDlgItem( IDC_SKILLPR_GOLD )->EnableWindow();
	GetDlgItem( IDC_SKILLPR_LEVEL )->EnableWindow();
	GetDlgItem( IDC_SKILLPR_MULT )->EnableWindow();
	GetDlgItem( IDC_SKILLPR_TEACH )->EnableWindow();

	int data = m_List.GetItemData( sel );

	UpdateData( TRUE );
	
	m_Gold = m_trskill[data]->m_gold;
	m_MaxLevel = m_trskill[data]->m_maxlevel;
	m_Mult = m_trskill[data]->m_mult;

	if ( m_trskill[data]->m_teach )
		m_Teach.SetCurSel( tch_yes );
	else
		m_Teach.SetCurSel( tch_no );

	m_Skill.SetCurSel( m_Skill.FindStringExact( -1, m_trskill[data]->m_skill ) );

	UpdateData( FALSE );
}

void CSkillTrEdit::OnSelchangeSkillprClass() 
{
	int sel = m_Class.GetCurSel();
	if ( sel == CB_ERR ) return;

	int data = m_Class.GetItemData( sel );
	if ( data == -1 )
	{
		m_class = "";
		return;
	}
	m_class = tables.m_classes[data]->m_text;
}

void CSkillTrEdit::OnSkillprAdd() 
{
	CSkillPrac *prskill;

	prskill = new CSkillPrac();
	int pos = m_trskill.Add( prskill );
	int index = m_List.AddString( prskill->m_skill );
	ASSERT( index != LB_ERR && index != LB_ERRSPACE );
	m_List.SetItemData( index, pos );
	m_List.SetCurSel( index );
	SetSelData();
}

void CSkillTrEdit::OnSkillprDel() 
{
	int sel = m_List.GetCurSel();
	if ( sel == LB_ERR ) return;

	int data = m_List.GetItemData( sel );
	m_trskill.RemoveAt( data );
	m_List.DeleteString( sel );

	for ( int i = data; i < m_trskill.GetSize(); i++ )
	{
		sel = m_List.FindStringExact( -1, m_trskill[i]->m_skill );
		m_List.SetItemData( sel, i );
	}

	SetSelData();
}

void CSkillTrEdit::OnChangeSkillprGold() 
{
	int sel = m_List.GetCurSel();
	if ( sel == LB_ERR ) return;

	UpdateData( TRUE );
	int data = m_List.GetItemData( sel );
	m_trskill[data]->m_gold = m_Gold;
}

void CSkillTrEdit::OnChangeSkillprLevel() 
{
	int sel = m_List.GetCurSel();
	if ( sel == LB_ERR ) return;

	UpdateData( TRUE );
	int data = m_List.GetItemData( sel );
	m_trskill[data]->m_maxlevel = m_MaxLevel;
}

void CSkillTrEdit::OnChangeSkillprMult() 
{
	int sel = m_List.GetCurSel();
	if ( sel == LB_ERR ) return;

	UpdateData( TRUE );
	int data = m_List.GetItemData( sel );
	m_trskill[data]->m_mult = m_Mult;
}

void CSkillTrEdit::OnSelchangeSkillprSkill() 
{
	int selsk = m_Skill.GetCurSel();
	if ( selsk == CB_ERR ) return;
	int selli = m_List.GetCurSel();
	if ( selli == LB_ERR ) return;

	int datask = m_Skill.GetItemData( selsk );
	int datali = m_List.GetItemData( selli );

	m_trskill[datali]->m_skill = tables.m_skills[datask]->m_text;
	m_List.DeleteString( selli );
	selli = m_List.AddString( m_trskill[datali]->m_skill );
	ASSERT( selli != LB_ERR && selli != LB_ERRSPACE );
	m_List.SetItemData( selli, datali );
	m_List.SetCurSel( selli );
	SetSelData();
}

void CSkillTrEdit::OnSelchangeSkillprTeach() 
{
	int sel = m_Teach.GetCurSel();
	if ( sel == CB_ERR ) return;
	int selli = m_List.GetCurSel();
	if ( selli == LB_ERR ) return;

	int datali = m_List.GetItemData( selli );
	m_trskill[datali]->m_teach = m_Teach.GetItemData( sel );
}

void CSkillTrEdit::OnSelchangeSkillprList() 
{
	SetSelData();
}