activegs-ios/ActiveGS.exe/MainFrm.cpp

282 lines
6.0 KiB
C++

// MainFrm.cpp : implémentation de la classe CMainFrame
//
#include "../Common.win32/stdafx.h"
#include "ActiveGSApp.h"
#include "../common.win32/activecommon.h"
#include "../common/CEmulatorCtrl.h"
#include "mainfrm.h"
#include "../common/ki.h"
#include "../common/svnversion.h"
#include "../kegs/src/defcomm.h"
#include "../kegs/src/savestate.h"
#include "../kegs/src/driver.h"
#include "cgfiltyp.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CMainFrame
IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_WM_CREATE()
ON_WM_SETFOCUS()
ON_WM_DESTROY()
ON_WM_SIZING()
END_MESSAGE_MAP()
void associateActiceGSConfig(const char* _ext, const char* _desc, int _icon)
{
CGCFileTypeAccess TheFTA;
// get full file path to program executable file
TCHAR szProgPath[MAX_PATH * 2];
::GetModuleFileName(NULL, szProgPath, sizeof(szProgPath)/sizeof(TCHAR));
CString csTempText;
TheFTA.SetExtension(_ext);
// just pass file path in quotes on command line
csTempText = szProgPath;
csTempText += " \"%1\"";
TheFTA.SetShellOpenCommand(csTempText);
TheFTA.SetDocumentShellOpenCommand(csTempText);
CString classname("ActiveGS.");
classname += _ext;
TheFTA.SetDocumentClassName(classname);
TheFTA.SetDocumentDescription(_desc);
// use first icon in program
csTempText = szProgPath;
csTempText += ",";
csTempText += (char)(_icon+'0');
TheFTA.SetDocumentDefaultIcon(csTempText);
// set the necessary registry entries
TheFTA.RegSetAllInfo();
}
CMainFrame::CMainFrame(int _argc, char** _argv)
{
outputInfo("CMainFrame() (inst:%0X)\n",this);
// Répertoire par default = pour une appli, le répertoire courant
char windir[1024];
GetCurrentDirectory(1024,windir);
#ifndef ACTIVEGSKARATEKA
associateActiceGSConfig("activegsxml","ActiveGS Configuration file",0);
associateActiceGSConfig("nib","Apple II 5.25 Disk Image",1);
associateActiceGSConfig("dsk","Apple II 5.25 Disk Image",1);
associateActiceGSConfig("2mg","Apple II 3.5 Image",2);
associateActiceGSConfig("po","Apple II 3.5 Disk Image",2);
associateActiceGSConfig("do","Apple II 5.25 Disk Image",1);
#endif
void (*driver)() = NULL;
#ifdef VIRTUALAPPLE
extern void jniSetup(const char*);
jniSetup(NULL);
#else
#ifdef ACTIVEGSKARATEKA
extern void karateka_driver();
driver = karateka_driver;
#else
extern void activegs_driver();
driver = activegs_driver;
#endif
g_driver.init( driver );
#endif
CDownload::initPersistentPath();
option.initOptions();
m_wndView.config.setBaseURL(windir);
#ifdef VIRTUALAPPLE
m_wndView.config.xmlconfig =g_driver.activegsxml;
#else
#ifdef ACTIVEGSPOP
m_wndView.config.xmlconfig ="http://asset/pop.activegsxml";
#elif ACTIVEGSKARATEKA
m_wndView.config.xmlconfig ="http://asset/karateka.activegsxml";
#else
m_wndView.config.xmlconfig ="default.activegsxml";
m_wndView.config.processCommandLine(_argc,_argv);
#endif
#endif
RECT r;
r.left = 100;
r.top = 100;
r.right = r.left+X_A2_WINDOW_WIDTH;
#ifdef VIDEO_SINGLEHLINE
float w = X_A2_WINDOW_WIDTH*2;
#else
float w = X_A2_WINDOW_WIDTH;
#endif
r.right = r.left + w * 2;
#ifdef VIDEO_SINGLEVLINE
float h = X_A2_WINDOW_HEIGHT*2;
#else
float h = X_A2_WINDOW_HEIGHT;
#endif
r.bottom = r.top + h * 2;
const char* ver = ACTIVEGSVERSIONSTR;
Create(NULL, ver, WS_THICKFRAME | WS_SYSMENU,r, NULL,NULL, 0, NULL );
}
CMainFrame::~CMainFrame()
{
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
outputInfo("OnCreate (inst:%0X)\n",lpCreateStruct->hInstance);
m_wndView.CreateEmulatorWindow(this);
return 0;
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
return TRUE;
}
// diagnostics pour CMainFrame
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CFrameWnd::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CFrameWnd::Dump(dc);
}
#endif //_DEBUG
// gestionnaires de messages pour CMainFrame
void CMainFrame::OnSetFocus(CWnd* /*pOldWnd*/)
{
// passe le focus à la fenêtre d'affichage
m_wndView.SetFocus();
}
BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
/*
// laisser la priorité à la vue pour cette commande
if (m_wndView.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
return TRUE;
*/
// sinon, la gestion par défaut est utilisée
return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}
void CMainFrame::OnDestroy()
{
outputInfo("OnDestroy() (inst:%0X)\n",this);
CFrameWnd::OnDestroy();
}
extern void window_needs_full_refresh();
LRESULT CMainFrame::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if (message==WM_SIZE)
{
m_wndView.resize();
return 1;
}
else
if (message==WM_ERASEBKGND)
{
// prevent mainframe to refresh its background
return 1;
}
else
return CFrameWnd::DefWindowProc(message, wParam, lParam);
}
void CMainFrame::OnSizing(UINT nSide,LPRECT lpRect)
{
RECT rcClient, rcWindow;
GetClientRect( &rcClient);
GetWindowRect( &rcWindow);
int borderw = (rcWindow.right - rcClient.right) + (rcClient.left - rcWindow.left );
int borderh = (rcWindow.bottom - rcClient.bottom) + (rcClient.top - rcWindow.top );
// détermine le sens du resize (en x ou en y)
int deltax = (rcWindow.right-lpRect->right) + (rcWindow.left-lpRect->left);
if (deltax<0) deltax = -deltax;
int deltay = (rcWindow.bottom-lpRect->bottom) + (rcWindow.top-lpRect->top);
if (deltay<0) deltay = -deltay;
#ifdef VIDEO_SINGLEVLINE
int bottom = X_A2_WINDOW_HEIGHT*2;
#else
int bottom = X_A2_WINDOW_HEIGHT;
#endif
#ifdef VIDEO_SINGLEHLINE
int right = X_A2_WINDOW_WIDTH*2;
#else
int right = X_A2_WINDOW_WIDTH;
#endif
const float ratio = (float)right/(float)bottom;
int w = (lpRect->right - lpRect->left) - borderw ;
int h = (lpRect->bottom - lpRect->top) - borderh ;
if (deltax || deltay)
{
if (nSide !=6)
lpRect->bottom = lpRect->top + (int)(w/ratio) + borderh;
else
lpRect->right = lpRect->left + (int)(h*ratio) + borderw;
}
return CFrameWnd::OnSizing(nSide,lpRect);
}