#include "../xvaga/wxinc.h"

#include "xvt.h"

#include <wx/filename.h>
#include <wx/snglinst.h>

extern int xvt_main(int argc, char** argv);

class TMainApp : public wxApp
{
	wxSingleInstanceChecker* m_sic;

protected:
	virtual bool OnInit();
  virtual int OnExit();
  void OnTimer(wxTimerEvent& evt);

  DECLARE_EVENT_TABLE()
  DECLARE_DYNAMIC_CLASS(TMainApp);
};

IMPLEMENT_DYNAMIC_CLASS(TMainApp, wxApp)

IMPLEMENT_APP(TMainApp)

#define TIMER_ID 883

BEGIN_EVENT_TABLE(TMainApp, wxApp)
  EVT_TIMER(TIMER_ID, TMainApp::OnTimer)
END_EVENT_TABLE()

void TMainApp::OnTimer(wxTimerEvent& evt)
{
  xvt_app_pre_create();
  xvt_main(argc, argv);
}

bool TMainApp::OnInit()
{
  wxFileName strWrk = argv[0];
  //const wxString strApp = strWrk.GetName().Lower();
  strWrk.MakeAbsolute();
  wxString strApp = strWrk.GetFullPath().Lower();
  strApp.Replace("\\", "_"); strApp.Replace("/", "_"); strApp.Replace(":", "_");
  m_sic = new wxSingleInstanceChecker(strApp);
  xvt_vobj_set_attr(NULL_WIN, ATTR_APPL_ALREADY_RUNNING, m_sic->IsAnotherRunning());

  // Non eseguo direttamente xvt_main per dar modo al main event loop di partire
	wxTimerEvent evt(TIMER_ID);
	AddPendingEvent(evt);
	return true;
}

int TMainApp::OnExit()
{
  delete m_sic;
  m_sic = NULL;

  return wxApp::OnExit();
}