// ListaDlg.cpp : implementation file
//



#include "stdafx.h"
#include "editor.h"
#include "ListaDlg.h"
#include "editdlg.h"



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



/////////////////////////////////////////////////////////////////////////////
// CListaDlg dialog




CListaDlg::CListaDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CListaDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CListaDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}



void CListaDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CListaDlg)
	DDX_Control(pDX, IDC_LIST1, m_oLOcorr);
	//}}AFX_DATA_MAP
}



BEGIN_MESSAGE_MAP(CListaDlg, CDialog)
	//{{AFX_MSG_MAP(CListaDlg)
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
	ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
	ON_BN_CLICKED(IDC_BUTTON4, OnButton4)
	ON_BN_CLICKED(IDC_BUTTON5, OnButton5)
	ON_WM_DESTROY()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()



void CListaDlg::mIncluiLinha ( DWORD dwTempo, DWORD dwEvento )
{
   // pergunta quando, se dwTempo for -1

   if ( dwTempo == (DWORD) -1 ) {

      CEditorDlg
         oDlg;
      oDlg.DoModal ();

      // se eh para cancelar
      if ( ! oDlg.m_bEditou )
         return;

      dwTempo = oDlg.m_dwTempo;
   }

   
   // adiciona uma linha no fim da lista de eventos


   // formata tempo e evento
   char
      szLinha [ 1000 ];

   if ( dwEvento == 1 )  // define linha
      sprintf ( szLinha, "%04d - terminar partida", dwTempo );
   else
      sprintf ( szLinha, "%04d - criar interventor", dwTempo );


   // apaga evento que seja no mesmo tempo que o que vai ser inserido
   // define oque procurar
   char
      szTempo [ 300 ];
   sprintf ( szTempo, "%04d", dwTempo );
   // procura na lista
   int
      nSemelhante = m_oLOcorr.FindString( 0, szTempo );
   // se achou apaga
   if ( nSemelhante != LB_ERR )    // se achou
      m_oLOcorr.DeleteString( nSemelhante ); // apaga

   
   // inclui
   m_oLOcorr.AddString ( szLinha );

}



/////////////////////////////////////////////////////////////////////////////
// CListaDlg message handlers




void CListaDlg::mEdita ()
{
   // edita
   DoModal ();
}




void CListaDlg::OnButton1() 
{
	// adiciona o sinal de criacao de elemento interventor na lista de eventos

   mIncluiLinha ( -1, 2 );
}




void CListaDlg::OnButton2() 
{
	// remove um certo evento selecionado

   // verifica se existe selecao
   int 
      nSel = m_oLOcorr.GetCurSel ();
   if ( nSel != LB_ERR ) {
      
      m_oLOcorr.DeleteString( nSel ); // apaga
      
      // tenta selecionar proximo item, se falhou tenta o ultimo (se nao conseguir
      // deseleciona tudo)
      if ( m_oLOcorr.SetCurSel ( nSel ) == LB_ERR )
         m_oLOcorr.SetCurSel ( m_oLOcorr.GetCount () - 1 );
   }
   else
      AfxMessageBox ( "Selecione o item que deve ser removido.\n\nPara isso, clique sobre o item na lista de ocorrências." );
}




void CListaDlg::OnButton3() 
{
	// adiciona o sinal de fim da partida na lista de eventos

   mIncluiLinha ( -1, 1 );
}




void CListaDlg::OnButton4() 
{
	
   // salva arquivo
	
   
   // abre dialogo para pedir arquivo

   // define o objeto da caixa de abertura
	CFileDialog
		oCx ( FALSE, NULL, "dp\\*.mco", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT |
	   		OFN_LONGNAMES,
	   		"MCOE (*.mco) | *.mco | Todos Arquivos (*.*) | *.* ||",
	   		NULL );

   // se selecionou arquivo
   if ( oCx.DoModal () == IDOK ) {
	
      // tenta salvar arquivo de fase

      FILE
         *pstArq = fopen ( oCx.GetPathName (), "wt" );
      // falhou -> sai
      if ( pstArq == NULL ) {
         AfxMessageBox ( "Erro ao tentar gravar arquivo." );
         return;
      }


      // varre lista - salvando itens
      for ( int ncL = 0; ncL < m_oLOcorr.GetCount (); ncL ++ ) {

         // pega item
         CString
            oszLinha;
         m_oLOcorr.GetText ( ncL, oszLinha );

         // verifica qual eh o evento
         DWORD
            dwEvento = 0;
         // se eh termina partida
         if ( oszLinha.Find ( "termina" ) != -1 )
            dwEvento = 1;
         else
            dwEvento = 2;

         // acha o tempo da linha
         // acha delimitador
         int
            nPosDelimit = oszLinha.Find ( " - " );
         CString
            oszTempo = oszLinha.Left ( nPosDelimit );

         fprintf ( pstArq, "%s %d\n", oszTempo.GetBuffer ( oszTempo.GetLength () ), dwEvento );
      }

      // fecha arquivo
      fclose ( pstArq );
   }
}



   
void CListaDlg::OnButton5() 
{
	
   // carrega arquivo
	
   
   // abre dialogo para pedir arquivo

   // define o objeto da caixa de abertura
	CFileDialog
		oCx ( TRUE, NULL, "dp\\*.mco", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT |
	   		OFN_LONGNAMES,
	   		"MCOE (*.mco) | *.mco | Todos Arquivos (*.*) | *.* ||",
	   		NULL );

   
   // se selecionou arquivo
   if ( oCx.DoModal () == IDOK ) {

      // apaga conteudo da lista

      m_oLOcorr.ResetContent ();

      // tenta carregar arquivo de fase

      FILE
         *pstArq = fopen ( oCx.GetPathName (), "rt" );
      // falhou -> sai
      if ( pstArq == NULL ) {
         AfxMessageBox ( "Arquivo não foi lido - será editado um novo arquivo." );
         return;
      }

      // le eventos que devem ocorrer durante a fase
      // le ateh o fim do arquivo
      while ( ! feof ( pstArq ) ) {

         // le tempo em que deve ocorrer e o evento relacionado
         DWORD
            dwTempo,
            dwEvento;
         fscanf ( pstArq, "%d", &dwTempo );
         fscanf ( pstArq, "%d", &dwEvento );

         mIncluiLinha ( dwTempo, dwEvento );
      }

      // fecha arquivo
      fclose ( pstArq );
   }
}



void CListaDlg::OnDestroy() 
{
	// terminando... pergunta se eh para salvar
   
   // se a lista tem algum item
   if ( m_oLOcorr.GetCount () > 0 )
      
      // pergunta se eh para salvar
      if ( AfxMessageBox ( "Terminando;\nsalvar lista em arquivo?", MB_YESNO, 0 ) == IDYES )

         // se sim -> executa salvamento
         OnButton4();	
   
   CDialog::OnDestroy();
}
