Complete disaster-recovery snapshot: engine/game source, game data assets, VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive. Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false, no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
239 lines
4.9 KiB
C++
239 lines
4.9 KiB
C++
// EditWnd.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "mw4gameed.h"
|
|
#include "EditWnd.h"
|
|
#include <direct.h>
|
|
|
|
#define __mbsrchr(s,c) (char*)_mbsrchr((const unsigned char*)(s),(c))
|
|
|
|
extern CMW4GameEdApp theApp;
|
|
|
|
static DWORD CALLBACK MyStreamInCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
|
|
{
|
|
CFile* pFile = (CFile*) dwCookie;
|
|
|
|
*pcb = pFile->Read(pbBuff, cb);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static DWORD CALLBACK MyStreamOutCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
|
|
{
|
|
CFile* pFile = (CFile*) dwCookie;
|
|
|
|
pFile->Write(pbBuff, cb);
|
|
*pcb = cb;
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CEditWnd
|
|
|
|
CEditWnd::CEditWnd()
|
|
{
|
|
CloseCallback = NULL;
|
|
}
|
|
|
|
CEditWnd::CEditWnd(char* string)
|
|
{
|
|
path = string;
|
|
}
|
|
|
|
CEditWnd::~CEditWnd()
|
|
{
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CEditWnd, CEditorChildWnd)
|
|
//{{AFX_MSG_MAP(CEditWnd)
|
|
ON_WM_CREATE()
|
|
ON_WM_SIZE()
|
|
ON_WM_CLOSE()
|
|
ON_WM_VSCROLL()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CEditWnd message handlers
|
|
|
|
BOOL CEditWnd::PreCreateWindow(CREATESTRUCT& cs)
|
|
{
|
|
cs.style |= WS_CHILD | WS_OVERLAPPEDWINDOW;
|
|
|
|
return CWnd::PreCreateWindow(cs);
|
|
}
|
|
|
|
int CEditWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
if (CWnd::OnCreate(lpCreateStruct) == -1)
|
|
return -1;
|
|
|
|
RECT r;
|
|
GetClientRect(&r);
|
|
editWnd.Create(ES_LEFT | ES_MULTILINE | ES_WANTRETURN | ES_AUTOVSCROLL | WS_CHILD | WS_VISIBLE,r,this,0);
|
|
|
|
editWnd.SetBackgroundColor(TRUE,RGB(255,255,0));
|
|
|
|
LoadFile();
|
|
|
|
return 0;
|
|
}
|
|
|
|
void CEditWnd::OnSize(UINT nType, int cx, int cy)
|
|
{
|
|
CEditorChildWnd::OnSize(nType, cx, cy);
|
|
|
|
editWnd.SetWindowPos(NULL,0,0,cx,cy,SWP_NOZORDER);
|
|
}
|
|
|
|
void CEditWnd::OnClose()
|
|
{
|
|
MessageBeep(MB_ICONQUESTION);
|
|
if (MessageBox("Save this data?","Save",MB_ICONQUESTION | MB_YESNO) == IDYES)
|
|
{
|
|
if (path)
|
|
{
|
|
CFile cFile(path,CFile::modeCreate | CFile::modeWrite);
|
|
EDITSTREAM es;
|
|
|
|
es.dwCookie = (DWORD) &cFile;
|
|
es.pfnCallback = MyStreamOutCallback;
|
|
editWnd.StreamOut(SF_TEXT, es);
|
|
cFile.Close();
|
|
if (CloseCallback)
|
|
CloseCallback((char*)(LPCTSTR)path);
|
|
}
|
|
else
|
|
{
|
|
char scriptPath[MAX_PATH],oldDir[MAX_PATH],path[MAX_PATH],*p;
|
|
OPENFILENAME ofn;
|
|
|
|
_getcwd(oldDir,MAX_PATH - 1);
|
|
|
|
strcpy(path,theApp.missionFileName);
|
|
p = __mbsrchr(path,'\\');
|
|
*p = 0;
|
|
_chdir(path);
|
|
|
|
memset(&scriptPath,0,MAX_PATH);
|
|
memset(&ofn,0,sizeof(ofn));
|
|
|
|
ofn.lStructSize = sizeof(ofn);
|
|
ofn.hwndOwner = NULL;
|
|
ofn.lpstrFilter = "ABL files {*.ABL}\0*.abl\0All Files {*.*}\0*.*\0\0";
|
|
ofn.lpstrFile = scriptPath;
|
|
ofn.nMaxFile = MAX_PATH;
|
|
ofn.lpstrDefExt = "abl";
|
|
|
|
if (GetSaveFileName(&ofn))
|
|
{
|
|
CFile cFile(ofn.lpstrFile,CFile::modeCreate | CFile::modeWrite);
|
|
EDITSTREAM es;
|
|
|
|
es.dwCookie = (DWORD) &cFile;
|
|
es.pfnCallback = MyStreamOutCallback;
|
|
editWnd.StreamOut(SF_TEXT, es);
|
|
cFile.Close();
|
|
if (CloseCallback && !CloseCallback(ofn.lpstrFile))
|
|
return;
|
|
}
|
|
else
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
LoadFile();
|
|
|
|
ShowWindow(SW_HIDE);
|
|
// CEditorChildWnd::OnClose();
|
|
}
|
|
|
|
void CEditWnd::LoadFile(char* filepath)
|
|
{
|
|
if (filepath)
|
|
path = filepath;
|
|
|
|
if (path)
|
|
{
|
|
CFile cFile;
|
|
EDITSTREAM es;
|
|
|
|
if (cFile.Open(path,CFile::modeRead,NULL))
|
|
{
|
|
es.dwCookie = (DWORD) &cFile;
|
|
es.pfnCallback = MyStreamInCallback;
|
|
editWnd.StreamIn(SF_TEXT, es);
|
|
cFile.Close();
|
|
}
|
|
}
|
|
}
|
|
|
|
void CEditWnd::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
|
|
{
|
|
|
|
CEditorChildWnd::OnVScroll(nSBCode, nPos, pScrollBar);
|
|
}
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CEditCtrl
|
|
|
|
CEditCtrl::CEditCtrl()
|
|
{
|
|
}
|
|
|
|
CEditCtrl::~CEditCtrl()
|
|
{
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CEditCtrl, CRichEditCtrl)
|
|
//{{AFX_MSG_MAP(CEditCtrl)
|
|
ON_CONTROL_REFLECT(EN_CHANGE, OnChange)
|
|
ON_WM_CREATE()
|
|
ON_WM_VSCROLL()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CEditCtrl message handlers
|
|
|
|
int CEditCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
if (CRichEditCtrl::OnCreate(lpCreateStruct) == -1)
|
|
return -1;
|
|
|
|
SetEventMask(GetEventMask() | ENM_CHANGE);
|
|
ShowScrollBar(SB_VERT);
|
|
|
|
return 0;
|
|
}
|
|
|
|
void CEditCtrl::OnChange()
|
|
{
|
|
SCROLLINFO scroll;
|
|
|
|
scroll.cbSize = sizeof(scroll);
|
|
scroll.fMask = SIF_DISABLENOSCROLL | SIF_RANGE;// | SIF_PAGE;
|
|
scroll.nMin = 0;
|
|
scroll.nMax = GetLineCount();
|
|
// scroll.nPage = ;
|
|
|
|
SetScrollInfo(SB_VERT,&scroll);
|
|
}
|
|
|
|
|
|
void CEditCtrl::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
|
|
{
|
|
if (nSBCode == SB_THUMBTRACK)
|
|
{
|
|
LineScroll(GetFirstVisibleLine() - GetScrollPos(SB_VERT));
|
|
}
|
|
else
|
|
SetScrollPos(SB_VERT,GetFirstVisibleLine());
|
|
|
|
CRichEditCtrl::OnVScroll(nSBCode, nPos, pScrollBar);
|
|
}
|