- 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>
254 lines
8.8 KiB
C++
254 lines
8.8 KiB
C++
//----------------------------------------------------------------------------
|
|
// ObjectWindows
|
|
// (C) Copyright 1992, 1994 by Borland International, All Rights Reserved
|
|
//
|
|
// Basic behavior for a class owning tiled gadgets.
|
|
//----------------------------------------------------------------------------
|
|
#if !defined(OWL_GADGETWI_H)
|
|
#define OWL_GADGETWI_H
|
|
|
|
#if !defined(OWL_WINDOW_H)
|
|
# include <owl/window.h>
|
|
#endif
|
|
#if !defined(OWL_GADGET_H)
|
|
# include <owl/gadget.h>
|
|
#endif
|
|
#if !defined(OWL_GDIOBJEC_H)
|
|
# include <owl/gdiobjec.h>
|
|
#endif
|
|
|
|
//
|
|
// class TGadgetWindowFont
|
|
// ----- -----------------
|
|
//
|
|
// specify the point size of the font (not the size in pixels) and whether it
|
|
// is bold and/or italic. you get a variable width sans serif font(typically
|
|
// Helvetica)
|
|
//
|
|
class _OWLCLASS TGadgetWindowFont : public TFont {
|
|
public:
|
|
TGadgetWindowFont(int pointSize = 10,
|
|
bool bold = false,
|
|
bool italic = false);
|
|
};
|
|
|
|
//
|
|
// class TGadgetWindow
|
|
// ----- -------------
|
|
//
|
|
// - maintains a list of tiled Gadgets
|
|
// - you specify whether the Gadgets are tiled horizontally or vertically
|
|
// - a font that the Gadgets should use
|
|
// - you can specify left, right, top, and bottom margins. the Gadgets are
|
|
// situated within the inner rectangle (area excluding borders and
|
|
// margins). margins can be specified in pixels, layout units (based on
|
|
// the window font), or border units (width or height of a thin window
|
|
// border)
|
|
// - you can specify that the Gadget window shrink wrap itself to "fit"
|
|
// around its Gadgets in either the width or height or both (default for
|
|
// horizontally tiled Gadgets is shrink wrap height and default for
|
|
// vertically tiled Gadgets is shrink wrap width)
|
|
//
|
|
class _OWLCLASS TGadgetWindow : public TWindow {
|
|
public:
|
|
enum TTileDirection {Horizontal, Vertical};
|
|
|
|
TGadgetWindow(TWindow* parent = 0,
|
|
TTileDirection direction = Horizontal,
|
|
TFont* font = new TGadgetWindowFont,
|
|
TModule* module = 0);
|
|
|
|
~TGadgetWindow(); // deletes the font
|
|
|
|
//
|
|
// override TWindow member function and choose initial size if shrink
|
|
// wrapping was requested
|
|
//
|
|
bool Create();
|
|
|
|
//
|
|
// changes the margins and initiates a layout session
|
|
//
|
|
void SetMargins(TMargins& margins);
|
|
|
|
TTileDirection GetDirection() const {return Direction;}
|
|
virtual void SetDirection(TTileDirection direction);
|
|
|
|
TFont& GetFont() {return *Font;}
|
|
uint GetFontHeight() const {return FontHeight;}
|
|
|
|
//
|
|
// Gadgets always get notified when a left button down occurs within their
|
|
// bounding rectangle. if you want mouse drags and a mouse up then you
|
|
// need to capture the mouse
|
|
//
|
|
bool GadgetSetCapture(TGadget& gadget); // fails if already captured
|
|
void GadgetReleaseCapture(TGadget& gadget); // ignores other gadgets
|
|
|
|
//
|
|
// Hint mode settings & action used by contained gadgets
|
|
//
|
|
enum THintMode {NoHints, PressHints, EnterHints};
|
|
void SetHintMode(THintMode hintMode) // default is PressHints
|
|
{HintMode = hintMode;}
|
|
THintMode GetHintMode() {return HintMode;}
|
|
|
|
void SetHintCommand(int id); // (id <= 0) to clear
|
|
|
|
enum TPlacement {Before, After};
|
|
|
|
//
|
|
// insert a Gadget. you can specify a sibling Gadget that the new Gadget
|
|
// is to be inserted before or after
|
|
//
|
|
// if "sibling" is 0 then the new Gadget is inserted at the beginning or
|
|
// the end. the default is to insert the new Gadget at the end
|
|
//
|
|
// caller needs to also call LayoutSession() after inserting gadgets if
|
|
// this window has already been created
|
|
//
|
|
virtual void Insert(TGadget& gadget, TPlacement = After, TGadget* sibling = 0);
|
|
|
|
//
|
|
// removes (unlinks) a gadget from the gadget window. The gadget is
|
|
// returned but not destroyed. returns 0 if gadget is not in window
|
|
//
|
|
// caller needs to also call LayoutSession() after removing gadgets if
|
|
// this gadget window has already been created
|
|
//
|
|
virtual TGadget* Remove(TGadget& gadget);
|
|
|
|
//
|
|
// iterates over the Gadgets invoking their CommandEnable() member function
|
|
//
|
|
bool IdleAction(long idleCount);
|
|
|
|
//
|
|
// sent by a Gadget when its size has changed. initiates a layout session
|
|
//
|
|
void GadgetChangedSize(TGadget& gadget);
|
|
|
|
//
|
|
// begins a layout session
|
|
//
|
|
// default behavior is just to tiles the Gadgets
|
|
//
|
|
// typically initiated by a change in margins, adding/deleting Gadgets,
|
|
// or a Gadget changing size
|
|
//
|
|
virtual void LayoutSession();
|
|
|
|
//
|
|
// simply sets the corresponding member data
|
|
//
|
|
void SetShrinkWrap(bool shrinkWrapWidth, bool shrinkWrapHeight);
|
|
|
|
TGadget* FirstGadget() const {return Gadgets;}
|
|
TGadget* NextGadget(TGadget& gadget) const {return gadget.Next;}
|
|
TGadget* GadgetFromPoint(TPoint& point) const;
|
|
TGadget* GadgetWithId(int id) const;
|
|
|
|
protected:
|
|
TGadget* Gadgets; // Linked list of gadgets
|
|
TFont* Font; // Font used for size calculations
|
|
TBrush* BkgndBrush; // background brush
|
|
TGadget* Capture; // Gadget that has captured the mouse
|
|
TGadget* AtMouse; // Last Gadget at mouse position
|
|
TMargins Margins;
|
|
uint NumGadgets : 8;
|
|
uint FontHeight : 8;
|
|
bool ShrinkWrapWidth : 8;
|
|
bool ShrinkWrapHeight : 8;
|
|
uint WideAsPossible : 8; // # of "WideAsPossible" gadgets
|
|
bool DirtyLayout : 8;
|
|
TTileDirection Direction : 8;
|
|
THintMode HintMode : 8;
|
|
|
|
//
|
|
// called by Paint(). iterates over the Gadgets and asks each one to draw
|
|
//
|
|
// override this to implement a specific look (e.g. separator line,
|
|
// raised, ...)
|
|
//
|
|
virtual void PaintGadgets(TDC& dc, bool erase, TRect& rect);
|
|
|
|
//
|
|
// if shrink wrapping was requested returns the size needed to accomodate
|
|
// the borders, margins, and the widest/highest Gadget; otherwise the
|
|
// current width/height are returned
|
|
//
|
|
// override this member function if you want to leave extra room for a
|
|
// specific look (e.g. separator line, raised, ...)
|
|
//
|
|
// if you override GetDesiredSize() you will probably also need to
|
|
// override GetInnerRect()
|
|
//
|
|
virtual void GetDesiredSize(TSize& size);
|
|
|
|
//
|
|
// computes the area inside of the borders and margins
|
|
//
|
|
// override this if you want to leave extra room for a specific look
|
|
// (e.g. separator line, raised, ...)
|
|
//
|
|
// if you override GetInnerRect() you will probably also need to override
|
|
// GetDesiredSize()
|
|
//
|
|
virtual void GetInnerRect(TRect& rect);
|
|
|
|
//
|
|
// a layout unit is defined by dividing the window font "em" into 8
|
|
// vertical and 8 horizontal segments
|
|
//
|
|
int LayoutUnitsToPixels(int units);
|
|
|
|
//
|
|
// returns the left, right, top, and bottom margins converted to pixels
|
|
//
|
|
void GetMargins(TMargins& margins,
|
|
int& left, int& right, int& top, int& bottom);
|
|
|
|
//
|
|
// tiles the Gadgets in the direction requested (horizontal or vertical)
|
|
//
|
|
// calls member function PositionGadget() to allow derived classes an
|
|
// opportunity to adjust the spacing between Gadgets
|
|
//
|
|
virtual TRect TileGadgets();
|
|
|
|
//
|
|
// selects the font into the DC and calls PaintGadgets()
|
|
//
|
|
void Paint(TDC& dc, bool erase, TRect& rect);
|
|
|
|
virtual void PositionGadget(TGadget* previous, TGadget* next, TPoint& point);
|
|
|
|
//
|
|
// message response functions
|
|
//
|
|
void EvLButtonDown(uint modKeys, TPoint& point);
|
|
void EvLButtonUp(uint modKeys, TPoint& point);
|
|
void EvLButtonDblClk(uint modKeys, TPoint& point);
|
|
void EvMouseMove(uint modKeys, TPoint& point);
|
|
HBRUSH EvCtlColor(HDC hDC, HWND /*hWndChild*/, uint /*ctlType*/);
|
|
void EvSize(uint sizeType, TSize& size);
|
|
void EvSysColorChange();
|
|
|
|
private:
|
|
TRect TileHorizontally();
|
|
TRect TileVertically();
|
|
|
|
friend class TGadget;
|
|
|
|
//
|
|
// hidden to prevent accidental copying or assignment
|
|
//
|
|
TGadgetWindow(const TGadgetWindow&);
|
|
TGadgetWindow& operator =(const TGadgetWindow&);
|
|
|
|
DECLARE_RESPONSE_TABLE(TGadgetWindow);
|
|
DECLARE_CASTABLE;
|
|
};
|
|
|
|
#endif // OWL_GADGETWI_H
|