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


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


// TrainEd.cpp : implementation file
//

#include "stdafx.h"
#include "arcaed.h"
#include "TrainEd.h"

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

/////////////////////////////////////////////////////////////////////////////
// CTrainEd dialog


CTrainEd::CTrainEd(CWnd* pParent /*=NULL*/)
	: CDialog(CTrainEd::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTrainEd)
	m_Msg = _T("");
	m_MsgPart = _T("");
	m_Room = 0;
	m_Time = 0;
	//}}AFX_DATA_INIT

	m_seltrain = -1;
	m_doc = NULL;

	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 ) );
}


void CTrainEd::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTrainEd)
	DDX_Control(pDX, IDC_TRAINED_TIME_SPIN, m_TimeSpin);
	DDX_Control(pDX, IDC_TRAINED_ROOM_SPIN, m_RoomSpin);
	DDX_Control(pDX, IDC_TRAINED_FLAGS, m_Flags);
	DDX_Control(pDX, IDC_TRAINED_DOWN, m_Down);
	DDX_Control(pDX, IDC_TRAINED_UP, m_Up);
	DDX_Control(pDX, IDC_TRAINED_LIST, m_List);
	DDX_Text(pDX, IDC_TRAINED_MSG, m_Msg);
	DDX_Text(pDX, IDC_TRAINED_MSGPART, m_MsgPart);
	DDX_Text(pDX, IDC_TRAINED_ROOM, m_Room);
	DDV_MinMaxInt(pDX, m_Room, 0, 32767);
	DDX_Text(pDX, IDC_TRAINED_TIME, m_Time);
	DDV_MinMaxInt(pDX, m_Time, 0, 32767);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CTrainEd, CDialog)
	//{{AFX_MSG_MAP(CTrainEd)
	ON_BN_CLICKED(IDC_TRAINED_NUEVO, OnTrainedNuevo)
	ON_LBN_SELCHANGE(IDC_TRAINED_LIST, OnSelchangeTrainedList)
	ON_EN_CHANGE(IDC_TRAINED_ROOM, OnChangeTrainedRoom)
	ON_EN_CHANGE(IDC_TRAINED_TIME, OnChangeTrainedTime)
	ON_EN_CHANGE(IDC_TRAINED_MSG, OnChangeTrainedMsg)
	ON_EN_CHANGE(IDC_TRAINED_MSGPART, OnChangeTrainedMsgpart)
	ON_NOTIFY(NM_CLICK, IDC_TRAINED_FLAGS, OnClickTrainedFlags)
	ON_BN_CLICKED(IDC_TRAINED_BORRAR, OnTrainedBorrar)
	ON_BN_CLICKED(IDC_TRAINED_INSERTAR, OnTrainedInsertar)
	ON_BN_CLICKED(IDC_TRAINED_UP, OnTrainedUp)
	ON_BN_CLICKED(IDC_TRAINED_DOWN, OnTrainedDown)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTrainEd message handlers

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

	m_Up.SetIcon( AfxGetApp()->LoadIcon( IDI_UP ) );
	m_Down.SetIcon( AfxGetApp()->LoadIcon( IDI_DOWN ) );

	m_RoomSpin.SetBuddy( GetDlgItem( IDC_TRAINED_ROOM ) );
	m_TimeSpin.SetBuddy( GetDlgItem( IDC_TRAINED_TIME ) );
	m_RoomSpin.SetRange( 0, 32767 );
	m_TimeSpin.SetRange( 0, 32767 );

	m_Flags.SetImageList( &m_imagelist, LVSIL_SMALL );
	MakeList();

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

void CTrainEd::MakeList()
{
	int i;
	char buf[500];

	for ( i = 0; i < m_traindata.GetSize(); i++ )
	{
		sprintf( buf, "%d\t%d %s", i, m_traindata[i]->m_room,
			m_doc->FindRoom( m_traindata[i]->m_room ) != -1 ? 
			m_doc->m_rooms[m_doc->FindRoom( m_traindata[i]->m_room )]->m_name : "" );
		m_List.AddString( buf );
	}

	m_List.SetCurSel( 0 );
	OnSelchangeTrainedList();

}

void CTrainEd::OnSelchangeTrainedList()
{
	m_Flags.DeleteAllItems();
	if ( ( m_seltrain = m_List.GetCurSel() ) == LB_ERR )
	{
		m_seltrain = -1;
		GetDlgItem( IDC_TRAINED_INSERTAR )->EnableWindow( FALSE );
		GetDlgItem( IDC_TRAINED_BORRAR )->EnableWindow( FALSE );
		GetDlgItem( IDC_TRAINED_UP )->EnableWindow( FALSE );
		GetDlgItem( IDC_TRAINED_DOWN )->EnableWindow( FALSE );

		m_Flags.EnableWindow( FALSE );
		GetDlgItem( IDC_TRAINED_MSG )->EnableWindow( FALSE );
		GetDlgItem( IDC_TRAINED_MSGPART )->EnableWindow( FALSE );
		GetDlgItem( IDC_TRAINED_ROOM )->EnableWindow( FALSE );
		GetDlgItem( IDC_TRAINED_TIME )->EnableWindow( FALSE );
		GetDlgItem( IDC_TRAINED_MSG )->SetWindowText( "" );
		GetDlgItem( IDC_TRAINED_MSGPART )->SetWindowText( "" );
		GetDlgItem( IDC_TRAINED_ROOM )->SetWindowText( "0" );
		GetDlgItem( IDC_TRAINED_TIME )->SetWindowText( "0" );
		return;
	}

	GetDlgItem( IDC_TRAINED_INSERTAR )->EnableWindow();
	GetDlgItem( IDC_TRAINED_BORRAR )->EnableWindow();
	GetDlgItem( IDC_TRAINED_UP )->EnableWindow( FALSE );
	GetDlgItem( IDC_TRAINED_DOWN )->EnableWindow( FALSE );
	if ( m_seltrain > 0 )
		GetDlgItem( IDC_TRAINED_UP )->EnableWindow();
	if ( m_seltrain < m_traindata.GetSize() - 1 )
		GetDlgItem( IDC_TRAINED_DOWN )->EnableWindow();

	m_Flags.EnableWindow();
	GetDlgItem( IDC_TRAINED_MSG )->EnableWindow();
	GetDlgItem( IDC_TRAINED_MSGPART )->EnableWindow();
	GetDlgItem( IDC_TRAINED_ROOM )->EnableWindow();
	GetDlgItem( IDC_TRAINED_TIME )->EnableWindow();

	UpdateData( TRUE );
	SetFlags();
	m_Msg = m_traindata[m_seltrain]->m_msg;
	m_MsgPart = m_traindata[m_seltrain]->m_msgpart;
	m_Room = m_traindata[m_seltrain]->m_room;
	m_Time = m_traindata[m_seltrain]->m_time;
	UpdateData( FALSE );

}

void CTrainEd::SetFlags()
{
	int i;
	LV_ITEM itemdata;

	for ( i = 0; i < tables.m_train_flags.GetSize(); i++ )
	{
		itemdata.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
		itemdata.iItem = i;
		itemdata.iSubItem = 0;
		itemdata.pszText = tables.m_train_flags[i]->m_text.GetBuffer(0);
		itemdata.lParam = tables.m_train_flags[i]->m_num;
		itemdata.iImage = m_traindata[m_seltrain]->m_flags & itemdata.lParam ? 1 : 0;
		m_Flags.InsertItem( &itemdata );
	}
}

void CTrainEd::OnTrainedNuevo() 
{
	CTrainData *train;
	int index, i;
	char buf[500];

	train = new CTrainData();
	i = m_traindata.Add( train );
	sprintf( buf, "%d\t%d %s", i, m_traindata[i]->m_room,
		m_doc->FindRoom( m_traindata[i]->m_room ) != -1 ? 
		m_doc->m_rooms[m_doc->FindRoom( m_traindata[i]->m_room )]->m_name : "" );
	index = m_List.AddString( buf );
	ASSERT( index != LB_ERR && index != LB_ERRSPACE );
	m_List.SetCurSel( index );
	OnSelchangeTrainedList();

}

void CTrainEd::OnChangeTrainedRoom() 
{
	char buf[500];

	if ( m_seltrain == -1 ) return;

	UpdateData( TRUE );
	m_traindata[m_seltrain]->m_room = m_RoomSpin.GetPos();
	sprintf( buf, "%d\t%d %s", m_seltrain, m_traindata[m_seltrain]->m_room,
		m_doc->FindRoom( m_traindata[m_seltrain]->m_room ) != -1 ? 
		m_doc->m_rooms[m_doc->FindRoom( m_traindata[m_seltrain]->m_room )]->m_name : "" );
	m_List.DeleteString( m_seltrain );
	m_List.InsertString( m_seltrain, buf );
	m_List.SetItemData( m_seltrain, m_seltrain );
	m_List.SetCurSel( m_seltrain );
}

void CTrainEd::OnChangeTrainedTime() 
{
	if ( m_seltrain == -1 ) return;

	UpdateData( TRUE );
	m_traindata[m_seltrain]->m_time = m_TimeSpin.GetPos();
}

void CTrainEd::OnChangeTrainedMsg() 
{
	if ( m_seltrain == -1 ) return;

	UpdateData( TRUE );
	m_traindata[m_seltrain]->m_msg = m_Msg;
}

void CTrainEd::OnChangeTrainedMsgpart() 
{
	if ( m_seltrain == -1 ) return;

	UpdateData( TRUE );
	m_traindata[m_seltrain]->m_msgpart = m_MsgPart;
}

void CTrainEd::OnClickTrainedFlags(NMHDR* pNMHDR, LRESULT* pResult) 
{
	int i;
	
	if ( m_seltrain == -1 ) return;

	for ( i = 0; i < m_Flags.GetItemCount(); i++ )
	{
		if ( m_Flags.GetItemState( i, LVIS_SELECTED ) )
		{
			m_traindata[m_seltrain]->m_flags ^= m_Flags.GetItemData( i );

			LV_ITEM itemdata;
			itemdata.mask = LVIF_IMAGE;
			itemdata.iItem = i;
			itemdata.iSubItem = 0;
			itemdata.iImage = m_traindata[m_seltrain]->m_flags & m_Flags.GetItemData( i ) ? 1 : 0;
			m_Flags.SetItem( &itemdata );
		}
	}
	
	*pResult = 0;
}

void CTrainEd::OnTrainedBorrar() 
{
	if ( m_seltrain == -1 ) return;
	m_traindata.RemoveAt( m_seltrain );
	m_List.DeleteString( m_seltrain );
	if ( m_List.SetCurSel( m_seltrain ) == LB_ERR )
		m_List.SetCurSel( m_seltrain - 1 );
	OnSelchangeTrainedList();
}

void CTrainEd::OnTrainedInsertar() 
{
	CTrainData *train;
	char buf[500];
	int i;

	if ( m_seltrain == -1 ) return;

	train = new CTrainData();
	m_traindata.InsertAt( m_seltrain, train );

	for ( i = m_seltrain; i < m_traindata.GetSize(); i++ )
	{
		sprintf( buf, "%d\t%d %s", i, m_traindata[i]->m_room,
			m_doc->FindRoom( m_traindata[i]->m_room ) != -1 ? 
			m_doc->m_rooms[m_doc->FindRoom( m_traindata[i]->m_room )]->m_name : "" );
		m_List.DeleteString( i );
		m_List.InsertString( i, buf );
	}

	m_List.SetCurSel( m_seltrain );
	OnSelchangeTrainedList();
}

void CTrainEd::OnTrainedUp() 
{
	int i;
	CTrainData *train;
	char buf[500];

	if ( m_seltrain < 1 ) return;

	train = m_traindata[m_seltrain];
	m_traindata[m_seltrain] = m_traindata[m_seltrain-1];
	m_traindata[m_seltrain-1] = train;

	m_seltrain--;
	for ( i = m_seltrain; i < m_seltrain+2; i++ )
	{
		sprintf( buf, "%d\t%d %s", i, m_traindata[i]->m_room,
			m_doc->FindRoom( m_traindata[i]->m_room ) != -1 ? 
			m_doc->m_rooms[m_doc->FindRoom( m_traindata[i]->m_room )]->m_name : "" );
		m_List.DeleteString( i );
		m_List.InsertString( i, buf );
	}

	m_List.SetCurSel( m_seltrain );
	OnSelchangeTrainedList();
}

void CTrainEd::OnTrainedDown() 
{
	int i;
	CTrainData *train;
	char buf[500];

	if ( m_seltrain > m_traindata.GetSize() - 2 ) return;

	train = m_traindata[m_seltrain];
	m_traindata[m_seltrain] = m_traindata[m_seltrain+1];
	m_traindata[m_seltrain+1] = train;

	for ( i = m_seltrain; i < m_seltrain+2; i++ )
	{
		sprintf( buf, "%d\t%d %s", i, m_traindata[i]->m_room,
			m_doc->FindRoom( m_traindata[i]->m_room ) != -1 ? 
			m_doc->m_rooms[m_doc->FindRoom( m_traindata[i]->m_room )]->m_name : "" );
		m_List.DeleteString( i );
		m_List.InsertString( i, buf );
	}
	m_seltrain++;

	m_List.SetCurSel( m_seltrain );
	OnSelchangeTrainedList();
}