- BORLAND/: Borland C++ 4.52 (chosen over 4.5 by byte-match: CODE/RP/CW32.LIB
is identical to 4.52's install lib). BCC32/TLINK32/TLIB/MAKE run natively on
Win11; CODE/BT/OPT.MAK is the shipped BTL4OPT.EXE's exact flag recipe
(extender = Borland PowerPack DPMI32, not Phar Lap TNT).
- restoration/source410/: the literal 1995-form reconstruction of the missing
BT game source (never mixed into CODE/). Round 1-3 state:
* 6 of 10 surviving original TUs COMPILE CLEAN under the period toolchain
(BTMSSN, BTCNSL, BTSCNRL, BTTEAM, BTL4MODE, BTL4ARND) - first builds
since 1996.
* BT_L4/BTL4APP.CPP pilot reconstruction: 12/12 functions, Fail() lands on
its binary-recorded line 400 exactly.
* BT/BTCNSL.HPP: console wire IDs recovered from the binary's ctors
(Killed=9, Damaged=10, ScoreUpdate=13, DeathWithoutHonor=15 [T1];
TeamScore=12 flagged [T4]).
* MUNGA/: 8 engine-header backfills back-dated from the BT412 WinTesla tree
(VDATA numbering decomp-verified; AUDREND's OpenAL-era virtual removed -
the period compiler is the drift detector).
* Tooling: backdate.py (WinTesla->1995 header transform), compile410.sh
(per-TU verification sweep under authentic OPT.MAK flags).
* README: corrected roadmap - MECH.HPP is the capstone grown with the mech
TU reconstructions; BTREG.CPP green = the header-family milestone.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
517 lines
14 KiB
C++
517 lines
14 KiB
C++
// ---------------------------------------------------------------------------
|
|
// Copyright (C) 1994 Borland International
|
|
// ---------------------------------------------------------------------------
|
|
#if !defined(_OCFHLPR_H)
|
|
#define _OCFHLPR_H
|
|
|
|
#include <ocf/ocfpch.h>
|
|
#include <ocf/ocapp.h>
|
|
#include <ocf/ocdoc.h>
|
|
#include <ocf/ocview.h>
|
|
#include <ocf/ocremvie.h>
|
|
#include <ocf/ocpart.h>
|
|
#include <windowsx.h>
|
|
|
|
//
|
|
// Forward ref.
|
|
//
|
|
class TOleWin;
|
|
|
|
|
|
//
|
|
// Prototypes of Accessors
|
|
//
|
|
TOcApp* GetOcApp();
|
|
|
|
|
|
//
|
|
// Encapsulates a clientDC configured for OLE operations
|
|
//
|
|
class OleClientDC {
|
|
public:
|
|
OleClientDC(TOleWin&, bool scale = true);
|
|
~OleClientDC();
|
|
|
|
//
|
|
// HDC conversion operator for convenience
|
|
//
|
|
operator HDC () const;
|
|
|
|
protected:
|
|
HDC Hdc; // Actual Handle to Device Context
|
|
HWND HWnd; // Handle of Window whose DC was retrieved
|
|
};
|
|
|
|
|
|
//
|
|
// Class encapsulating menu description for menu merging purposes
|
|
//
|
|
class MenuDescr : public TOcMenuDescr {
|
|
public:
|
|
MenuDescr(HMENU,
|
|
int fileGrp = 0, int editGrp = 0,
|
|
int contGrp = 0, int objGrp = 0,
|
|
int winGrp = 0, int hlpGrp = 0);
|
|
//
|
|
// HMENU conversion operator for easy handling
|
|
//
|
|
operator HMENU() const { return HMenu; }
|
|
|
|
private:
|
|
MenuDescr(const TOcMenuDescr&);
|
|
};
|
|
|
|
|
|
//
|
|
// Object which initializes OLE and creates the basic OCF Helper objects
|
|
// required by any application supporting Linking and Embedding
|
|
//
|
|
class TOleInit : public TOleAllocator {
|
|
public:
|
|
TOleInit(TRegList& regInfo,
|
|
TComponentFactory callback,
|
|
string& cmdLine, TRegLink* linkHead = 0,
|
|
HINSTANCE hInst = ::_hInstance);
|
|
~TOleInit();
|
|
|
|
protected:
|
|
TOcRegistrar* OcRegistrar;
|
|
TOcApp*& OcApp;
|
|
};
|
|
|
|
|
|
//
|
|
// Handles OCF messages/events for an OLE Frame Window
|
|
//
|
|
class TOleFrameWin {
|
|
public:
|
|
TOleFrameWin(HWND);
|
|
|
|
void OnCreate();
|
|
void OnDestroy();
|
|
void OnActivateApp(bool);
|
|
operator HWND() const {return Hwnd; };
|
|
protected:
|
|
HWND Hwnd;
|
|
};
|
|
|
|
|
|
//
|
|
// Object which handles OCF messages/events for an OLE Window and
|
|
// provide various default behaviour.
|
|
//
|
|
class TOleWin : public TOcMenuDescr {
|
|
public:
|
|
TOleWin(HWND hwnd);
|
|
|
|
operator HWND() const {return Hwnd; };
|
|
void SetWinMenu(const TOcMenuDescr& menuDescr);
|
|
HMENU GetWinMenu() const {return HMenu; };
|
|
HMENU GetMergedMenu() const {return MergedMenu; };
|
|
|
|
//
|
|
// Windows message handlers
|
|
//
|
|
void OnCreate();
|
|
void OnDestroy();
|
|
void OnSize();
|
|
void OnPaint(HDC hdc, PAINTSTRUCT& ps);
|
|
|
|
bool OnCommand(UINT);
|
|
void OnInitMenuPopup(HMENU hMenu, int item);
|
|
void OnInitMenu(HMENU hMenu);
|
|
|
|
bool OnLButtonDown(int x, int y, UINT keyFlags);
|
|
bool OnLButtonDblClk(int x, int y, UINT keyFlags);
|
|
bool OnRButtonDown(int x, int y, UINT keyFlags);
|
|
|
|
void OnActivate(bool);
|
|
void OnSetFocus(HWND lostFocus);
|
|
|
|
//
|
|
// OCF event handlers
|
|
//
|
|
const char far* OnOcViewTitle();
|
|
void OnOcViewSetTitle(const char far*);
|
|
bool OnOcViewSetSiteRect(TRect far*);
|
|
bool OnOcViewGetScale(TOcScaleFactor far*);
|
|
bool OnOcViewPartInvalid(TOcPartChangeInfo far*);
|
|
bool OnOcViewGetSiteRect(TRect far*);
|
|
bool OnOcViewDrop(TOcDragDrop far*);
|
|
LRESULT OnOcEvent(WPARAM wParam, LPARAM lParam);
|
|
|
|
//
|
|
// The following events are actually sent to the frame
|
|
// However, the latter can delegate to the OLE Window
|
|
//
|
|
bool OnOcAppInsMenus(TOcMenuDescr far* sharedMenu);
|
|
HMENU OnOcAppMenus(TOcMenuDescr far* menuDescr);
|
|
HMENU OnOcAppRestoreUI();
|
|
|
|
//
|
|
// OLE UI Dialog methods
|
|
//
|
|
void EditInsertObject();
|
|
void EditPasteSpecial();
|
|
void EditConvert();
|
|
void EditLinks();
|
|
|
|
//
|
|
// OCF Helper functions
|
|
//
|
|
bool Deactivate();
|
|
void SetSelection(TOcPart*);
|
|
void GetInsertPosition(TRect& rect);
|
|
void InvalidatePart(TOcInvalidate invalid);
|
|
bool PaintParts(HDC dc, bool erase, TRect& rect, bool metafile);
|
|
void GetLogPerUnit(TSize&);
|
|
void SetupDC(HDC dc, bool scale = true);
|
|
|
|
//
|
|
// Accessors
|
|
//
|
|
TOcDocument* GetOcDoc() {return OcDoc;}
|
|
TOcView* GetOcView() {return OcView;}
|
|
TOcRemView* GetOcRemView() {return TYPESAFE_DOWNCAST(OcView, TOcRemView);}
|
|
bool IsEmbedded() {return Embedded; }
|
|
bool SelectEmbedded();
|
|
|
|
//
|
|
// extra user info
|
|
//
|
|
void* GetUserInfo() {return UserInfo;}
|
|
void* SetUserInfo(void* ui);
|
|
|
|
protected:
|
|
HWND Hwnd;
|
|
TOcDocument* OcDoc;
|
|
TOcView* OcView;
|
|
TOcScaleFactor Scale;
|
|
TOcPart* DragPart;
|
|
bool Embedded;
|
|
TRect Pos;
|
|
bool ShowObjects;
|
|
HMENU MergedMenu;
|
|
void* UserInfo;
|
|
};
|
|
|
|
|
|
inline
|
|
OleClientDC::OleClientDC(TOleWin& win, bool scale)
|
|
:HWnd(win), Hdc(GetDC(win))
|
|
{
|
|
win.SetupDC(*this, scale);
|
|
}
|
|
|
|
|
|
inline
|
|
OleClientDC::operator HDC() const
|
|
{
|
|
return Hdc;
|
|
}
|
|
|
|
|
|
inline
|
|
OleClientDC::~OleClientDC()
|
|
{
|
|
ReleaseDC(HWnd, Hdc);
|
|
}
|
|
|
|
|
|
//
|
|
//
|
|
//
|
|
inline
|
|
MenuDescr::MenuDescr(HMENU menu, int fileGrp, int editGrp,
|
|
int contGrp, int objGrp,
|
|
int winGrp, int hlpGrp)
|
|
{
|
|
HMenu = menu;
|
|
Width[0] = fileGrp;
|
|
Width[1] = editGrp;
|
|
Width[2] = contGrp;
|
|
Width[3] = objGrp;
|
|
Width[4] = winGrp;
|
|
Width[5] = hlpGrp;
|
|
}
|
|
|
|
|
|
bool MergeContainerMenu(TOcMenuDescr& dst, const TOcMenuDescr& src);
|
|
bool MergeServerMenu(TOcMenuDescr& dst, const TOcMenuDescr& src);
|
|
|
|
|
|
// -------------------------------------------------------------------------
|
|
// Wrappers for common Windows routines
|
|
// -------------------------------------------------------------------------
|
|
bool GetOpenFileName(HWND owner, const char* filter, char* fileName,
|
|
int size, DWORD flags = OFN_OVERWRITEPROMPT);
|
|
bool GetSaveFileName(HWND owner, const char* filter, char* fileName,
|
|
int size, DWORD flags = OFN_OVERWRITEPROMPT);
|
|
|
|
|
|
|
|
// -------------------------------------------------------------------------
|
|
// Macros/templates to simplify OCF Event handling
|
|
// -------------------------------------------------------------------------
|
|
|
|
//
|
|
// Function template to send OCF events
|
|
//
|
|
template <class T> inline LRESULT
|
|
SendOCFEvent(HWND hwnd, int ocfCode, const T far* t = 0)
|
|
{
|
|
return SendMessage(hwnd, WM_OCEVENT, ocfCode, LPARAM(t));
|
|
}
|
|
|
|
|
|
// -------------------------------------------------------------------------
|
|
// Frame Events
|
|
// -------------------------------------------------------------------------
|
|
|
|
//
|
|
// LRESULT MainWnd_OnOcEvent(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|
//
|
|
#define HANDLE_WM_OCEVENT(hwnd, wParam, lParam, fn)\
|
|
(LRESULT)(fn)((hwnd), (wParam), (lParam))
|
|
|
|
//
|
|
// macros for WM_OCEVENT subdispatching
|
|
//
|
|
#define HANDLE_OCF(hwnd, message, fn) \
|
|
case (message): return (LRESULT)HANDLE_##message((hwnd), (lParam), (fn))
|
|
|
|
//
|
|
// bool Cls_OnOcAppInsMenus(HWND hwnd, TOcMenuDescr far* menuDescr)
|
|
//
|
|
#define HANDLE_OC_APPINSMENUS(hwnd, lParam, fn) \
|
|
(LRESULT)(UINT)(bool)(fn)((hwnd), (TOcMenuDescr far*)(lParam))
|
|
|
|
//
|
|
// bool Cls_OnOcAppMenus(HWND hwnd, TOcMenuDescr far* menuDescr)
|
|
//
|
|
#define HANDLE_OC_APPMENUS(hwnd, lParam, fn) \
|
|
(LRESULT)(UINT)(bool)(fn)((hwnd), (TOcMenuDescr far*)(lParam))
|
|
|
|
//
|
|
// bool Cls_OnOcAppProcessMsg(HWND hwnd, MSG far* msg)
|
|
//
|
|
#define HANDLE_OC_APPPROCESSMSG(hwnd, lParam, fn) \
|
|
(LRESULT)(UINT)(fn)((hwnd), (MSG far*)(lParam))
|
|
|
|
//
|
|
// bool Cls_OnOcAppFrameRect(HWND hwnd, TRect far* rect)
|
|
//
|
|
#define HANDLE_OC_APPFRAMERECT(hwnd, lParam, fn) \
|
|
(LRESULT)(UINT)(fn)((hwnd), (TRect far*)(lParam))
|
|
|
|
//
|
|
// bool Cls_OnOcAppBorderSpaceReq(HWND hwnd, TRect far* rect)
|
|
//
|
|
#define HANDLE_OC_APPBORDERSPACEREQ(hwnd, lParam, fn) \
|
|
(LRESULT)(UINT)(fn)((hwnd), (TRect far*)(lParam))
|
|
|
|
//
|
|
// bool Cls_OnOcAppBorderSpaceSet(HWND hwnd, TRect far* rect)
|
|
//
|
|
#define HANDLE_OC_APPBORDERSPACESET(hwnd, lParam, fn) \
|
|
(LRESULT)(UINT)(fn)((hwnd), (TRect far*)(lParam))
|
|
|
|
//
|
|
// void Cls_OnOcAppStatusText(HWND hwnd, const char far* text)
|
|
//
|
|
#define HANDLE_OC_APPSTATUSTEXT(hwnd, lParam, fn) \
|
|
((fn)((hwnd), (const char far*)(lParam)), 0L)
|
|
|
|
//
|
|
// void Cls_OnOcAppRestoreUI(HWND hwnd)
|
|
//
|
|
#define HANDLE_OC_APPRESTOREUI(hwnd, lParam, fn) \
|
|
((fn)((hwnd)), 0L)
|
|
|
|
//
|
|
// void Cls_OnOcAppDialogHelp(HWND hwnd, TOcDialogHelp far* dialogHelp)
|
|
//
|
|
#define HANDLE_OC_APPDIALOGHELP(hwnd, lParam, fn) \
|
|
((fn)((hwnd), (TOcDialogHelp far*)(lParam)), 0L)
|
|
|
|
//
|
|
// TOcView far* Cls_OnOcAppCreateComp(HWND hwnd, TDocTemplate far* docTemplate)
|
|
//
|
|
#define HANDLE_OC_APPCREATECOMP(hwnd, lParam, fn) \
|
|
(LRESULT)(fn)((hwnd), (TDocTemplate far*)(lParam))
|
|
|
|
//
|
|
// bool Cls_OnOcAppShutDown(HWND hwnd)
|
|
//
|
|
#define HANDLE_OC_APPSHUTDOWN(hwnd, lParam, fn) \
|
|
(LRESULT)(UINT)(fn)((hwnd))
|
|
|
|
|
|
// -------------------------------------------------------------------------
|
|
// View events
|
|
// -------------------------------------------------------------------------
|
|
|
|
//
|
|
// const char far* Cls_OnOcViewTitle(HWND hwnd)
|
|
//
|
|
#define HANDLE_OC_VIEWTITLE(hwnd, lParam, fn) \
|
|
(LRESULT)(fn)((hwnd))
|
|
|
|
//
|
|
// void Cls_OnOcViewSetTitle(HWND hwnd, const char far* title)
|
|
//
|
|
#define HANDLE_OC_VIEWSETTITLE(hwnd, lParam, fn) \
|
|
((fn)((hwnd), (const char far*)(lParam)), 0)
|
|
|
|
//
|
|
// bool Cls_OnOcViewBorderSpaceReq(HWND hwnd, TRect far* rect)
|
|
//
|
|
#define HANDLE_OC_VIEWBORDERSPACEREQ(hwnd, lParam, fn) \
|
|
(LRESULT)(UINT)(fn)((hwnd), (TRECT far*)(lParam))
|
|
|
|
//
|
|
// bool Cls_OnOcViewBorderSpaceSet(HWND hwnd, TRect far* rect)
|
|
//
|
|
#define HANDLE_OC_VIEWBORDERSPACESET(hwnd, lParam, fn) \
|
|
(LRESULT)(UINT)(fn)((hwnd), (TRECT far*)(lParam))
|
|
|
|
//
|
|
// bool Cls_OnOcViewDrop(HWND hwnd, TOcDragDrop far* dragDropInfo)
|
|
//
|
|
#define HANDLE_OC_VIEWDROP(hwnd, lParam, fn) \
|
|
(LRESULT)(fn)((hwnd), (TOcDragDrop far*)(lParam))
|
|
|
|
//
|
|
// bool Cls_OnOcViewDrag(HWND hwnd, TOcDragDrop far* dragDropInfo)
|
|
//
|
|
#define HANDLE_OC_VIEWDRAG(hwnd, lParam, fn) \
|
|
(LRESULT)(UINT)(fn)((hwnd), (TOcDragDrop far*)(lParam))
|
|
|
|
//
|
|
// bool Cls_OnOcViewScroll(HWND hwnd, TOcScrollDir far* scrollDir)
|
|
//
|
|
#define HANDLE_OC_VIEWSCROLL(hwnd, lParam, fn) \
|
|
(LRESULT)(UINT)(fn)((hwnd), (TOcScrollDir far*)(lParam))
|
|
|
|
//
|
|
// bool Cls_OnOcViewPartInvalid(HWND hwnd, TOcPartChangeInfo far* part)
|
|
//
|
|
#define HANDLE_OC_VIEWPARTINVALID(hwnd, lParam, fn) \
|
|
(LRESULT)(UINT)(fn)((hwnd), (TOcPartChangeInfo far*)(lParam))
|
|
|
|
//
|
|
// bool Cls_OnOcViewPaint(HWND hwnd, TOcViewPaint far* paintInfo)
|
|
//
|
|
#define HANDLE_OC_VIEWPAINT(hwnd, lParam, fn) \
|
|
(LRESULT)(UINT)(fn)((hwnd), (TOcViewPaint far*)(lParam))
|
|
|
|
//
|
|
// bool Cls_OnOcViewLoadPart(HWND hwnd, TOcSaveLoad far* loadInfo)
|
|
//
|
|
#define HANDLE_OC_VIEWLOADPART(hwnd, lParam, fn) \
|
|
(LRESULT)(UINT)(fn)((hwnd), (TOcSaveLoad far*)(lParam))
|
|
|
|
//
|
|
// bool Cls_OnOcViewSavePart(HWND hwnd, TOcSaveLoad far* saveInfo)
|
|
//
|
|
#define HANDLE_OC_VIEWSAVEPART(hwnd, lParam, fn) \
|
|
(LRESULT)(UINT)(fn)((hwnd), (TOcSaveLoad far*)(lParam))
|
|
|
|
//
|
|
// bool Cls_OnOcViewClose(HWND hwnd)
|
|
//
|
|
#define HANDLE_OC_VIEWCLOSE(hwnd, lParam, fn) \
|
|
(LRESULT)(UINT)(fn)((hwnd))
|
|
|
|
//
|
|
// bool Cls_OnOcViewInsMenus(HWND hwnd, TOcMenuDescr far* menuDescr)
|
|
//
|
|
#define HANDLE_OC_VIEWINSMENUS(hwnd, lParam, fn) \
|
|
(LRESULT)(UINT)(fn)((hwnd), (TOcMenuDescr far*)(lParam))
|
|
|
|
//
|
|
// bool Cls_OnOcViewShowTools(HWND hwnd, TOcToolBar far* toolBarInfo)
|
|
//
|
|
#define HANDLE_OC_VIEWWSHOWTOOLS(hwnd, lParam, fn) \
|
|
(LRESULT)(UINT)(fn)((hwnd), (TOcToolBar far*)(lParam))
|
|
|
|
//
|
|
// bool Cls_OnOcViewGetPalette(HWND hwnd, LOGPALETTE far* far* paletteInfo)
|
|
//
|
|
#define HANDLE_OC_VIEWGETPALETTE(hwnd, lParam, fn) \
|
|
(LRESULT)(UINT)(fn)((hwnd), (LOGPALETTE far* far*)(lParam))
|
|
|
|
//
|
|
// HANDLE Cls_OnOcViewClipData(HWND hwnd, TOcFormat far* formatInfo)
|
|
//
|
|
#define HANDLE_OC_VIEWCLIPDATA(hwnd, lParam, fn) \
|
|
(LRESULT)(fn)((hwnd), (TOcFormat far*)(lParam))
|
|
|
|
//
|
|
// bool Cls_OnOcViewPartSize(HWND hwnd, TRect far* rect)
|
|
//
|
|
#define HANDLE_OC_VIEWPARTSIZE(hwnd, lParam, fn) \
|
|
(LRESULT)(UINT)(fn)((hwnd), (TRECT far*)(lParam))
|
|
|
|
//
|
|
// bool Cls_OnOcViewOpenDoc(HWND hwnd, const char far* text)
|
|
//
|
|
#define HANDLE_OC_VIEWOPENDOC(hwnd, lParam, fn) \
|
|
(LRESULT)(UINT)(fn)((hwnd), (const char far*)(lParam))
|
|
|
|
//
|
|
// bool Cls_OnOcViewAttachWindow(HWND hwnd)
|
|
//
|
|
#define HANDLE_OC_VIEWATTACHWINDOW(hwnd, lParam, fn) \
|
|
(LRESULT)(UINT)(fn)((hwnd))
|
|
|
|
//
|
|
// bool Cls_OnOcViewSetScale(HWND hwnd, TOcScaleFactor* scaleInfo)
|
|
//
|
|
#define HANDLE_OC_VIEWSETSCALE(hwnd, lParam, fn) \
|
|
(LRESULT)(UINT)(fn)((hwnd), (TOcScaleFactor*)(lParam))
|
|
|
|
//
|
|
// bool Cls_OnOcViewGetScale(HWND hwnd, TOcScaleFactor* scaleInfo)
|
|
//
|
|
#define HANDLE_OC_VIEWGETSCALE(hwnd, lParam, fn) \
|
|
(LRESULT)(UINT)(fn)((hwnd), (TOcScaleFactor*)(lParam))
|
|
|
|
//
|
|
// bool Cls_OnOcViewGetSiteRect(HWND hwnd, TRect far* rect)
|
|
//
|
|
#define HANDLE_OC_VIEWGETSITERECT(hwnd, lParam, fn) \
|
|
(LRESULT)(UINT)(fn)((hwnd), (TRect far*)(lParam))
|
|
|
|
//
|
|
// bool Cls_OnOcViewSetSiteRect(HWND hwnd, TRect far* rect)
|
|
//
|
|
#define HANDLE_OC_VIEWSETSITERECT(hwnd, lParam, fn) \
|
|
(LRESULT)(UINT)(fn)((hwnd), (TRect far*)(lParam))
|
|
|
|
//
|
|
// bool Cls_OnOcViewGetItemName(HWND hwnd, TOcItemName far* ocItemName)
|
|
//
|
|
#define HANDLE_OC_VIEWGETITEMNAME(hwnd, lParam, fn) \
|
|
(LRESULT)(UINT)(fn)((hwnd), (TRect far*)(lParam))
|
|
|
|
//
|
|
// bool Cls_OnOcViewSetLink(HWND hwnd, TOcLinkView far* ocLinkView)
|
|
//
|
|
#define HANDLE_OC_VIEWSETLINK(hwnd, lParam, fn) \
|
|
(LRESULT)(UINT)(fn)((hwnd), (TRect far*)(lParam))
|
|
|
|
//
|
|
// bool Cls_OnOcViewBreakLink(HWND hwnd, TOcLinkView far* ocLinkView)
|
|
//
|
|
#define HANDLE_OC_VIEWBREAKLINK(hwnd, lParam, fn) \
|
|
(LRESULT)(UINT)(fn)((hwnd), (TRect far*)(lParam))
|
|
|
|
//
|
|
// bool Cls_OnOcViewPartActivate(HWND hwnd, TOcPart far* ocPart)
|
|
//
|
|
#define HANDLE_OC_VIEWPARTACTIVATE(hwnd, lParam, fn) \
|
|
(LRESULT)(UINT)(fn)((hwnd), (TRect far*)(lParam))
|
|
|
|
#endif // _OCFHLPR_H
|