Files
scummvm-cursorfix/engines/bagel/mfc/doc_template.cpp
2026-02-02 04:50:13 +01:00

129 lines
3.7 KiB
C++

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* 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 3 of the License, or
* (at your option) 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, see <http://www.gnu.org/licenses/>.
*
*/
#include "common/textconsole.h"
#include "bagel/mfc/afxwin.h"
namespace Bagel {
namespace MFC {
IMPLEMENT_DYNAMIC(CDocTemplate, CCmdTarget)
BEGIN_MESSAGE_MAP(CDocTemplate, CCmdTarget)
END_MESSAGE_MAP()
CDocTemplate::CDocTemplate(unsigned int nIDResource, const CRuntimeClass *pDocClass,
const CRuntimeClass *pFrameClass, const CRuntimeClass *pViewClass) {
assert(nIDResource != 0);
ASSERT(pDocClass == nullptr ||
pDocClass->IsDerivedFrom(RUNTIME_CLASS(CDocument)));
ASSERT(pFrameClass == nullptr ||
pFrameClass->IsDerivedFrom(RUNTIME_CLASS(CFrameWnd)));
ASSERT(pViewClass == nullptr ||
pViewClass->IsDerivedFrom(RUNTIME_CLASS(CView)));
m_nIDResource = nIDResource;
m_pDocClass = pDocClass;
m_pFrameClass = pFrameClass;
m_pViewClass = pViewClass;
}
CDocument *CDocTemplate::CreateNewDocument() {
assert(m_pDocClass);
CDocument *pDocument = (CDocument *)m_pDocClass->CreateObject();
assert(pDocument);
ASSERT_KINDOF(CDocument, pDocument);
AddDocument(pDocument);
return pDocument;
}
void CDocTemplate::AddDocument(CDocument *pDoc) {
ASSERT_VALID(pDoc);
assert(pDoc->m_pDocTemplate == nullptr); // no template attached yet
pDoc->m_pDocTemplate = this;
}
void CDocTemplate::RemoveDocument(CDocument *pDoc) {
ASSERT_VALID(pDoc);
assert(pDoc->m_pDocTemplate == this); // must be attached to us
pDoc->m_pDocTemplate = nullptr;
}
CFrameWnd *CDocTemplate::CreateNewFrame(CDocument *pDoc, CFrameWnd *pOther) {
if (pDoc != nullptr)
ASSERT_VALID(pDoc);
// Create a frame wired to the specified document
// Must have a resource ID to load from
assert(m_nIDResource != 0);
CCreateContext context;
context.m_pCurrentFrame = pOther;
context.m_pCurrentDoc = pDoc;
context.m_pNewViewClass = m_pViewClass;
context.m_pNewDocTemplate = this;
assert(m_pFrameClass);
CFrameWnd *pFrame = (CFrameWnd *)m_pFrameClass->CreateObject();
assert(pFrame);
ASSERT_KINDOF(CFrameWnd, pFrame);
assert(context.m_pNewViewClass);
// Create new from resource
if (!pFrame->LoadFrame(m_nIDResource,
WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE,
nullptr, &context))
{
warning("CDocTemplate couldn't create a frame.");
// frame will be deleted in PostNcDestroy cleanup
return nullptr;
}
return pFrame;
}
void CDocTemplate::InitialUpdateFrame(CFrameWnd *pFrame, CDocument *pDoc,
bool bMakeVisible) {
// Just delagate to implementation in CFrameWnd
pFrame->InitialUpdateFrame(pDoc, bMakeVisible);
}
void CDocTemplate::LoadTemplate() {
if (m_strDocStrings.IsEmpty() && !m_strDocStrings.LoadString(m_nIDResource)) {
warning("No document names in string for template #%d.",
m_nIDResource);
}
// TODO: If needed, menus and accelerators
}
void CDocTemplate::CloseAllDocuments(bool) {
POSITION pos = GetFirstDocPosition();
while (pos != NULL)
{
CDocument *pDoc = GetNextDoc(pos);
pDoc->OnCloseDocument();
}
}
} // namespace MFC
} // namespace Bagel