Microsoft-3D-Movie-Maker/kauai/SRC/GOB.H

332 lines
7.5 KiB
C++

/* Copyright (c) Microsoft Corporation.
Licensed under the MIT License. */
/* Copyright (c) Microsoft Corporation.
Licensed under the MIT License. */
/***************************************************************************
Author: ShonK
Project: Kauai
Reviewed:
Copyright (c) Microsoft Corporation
Graphic object class.
***************************************************************************/
#ifndef GOB_H
#define GOB_H
enum
{
fgobNil = 0,
fgobSibling = 1, //for Constructors
fgobEnsureHwnd = 2, //for FInitScreen
fgobNoVis = 0, //for DrawTree
fgobAutoVis = 4, //for DrawTree
fgobUseVis = 8, //for DrawTree
};
// GOB invalidation types
enum
{
ginNil,
kginDraw,
kginMark,
kginSysInval,
kginDefault
};
const long krelOne = 0x00010000L; //denominator for relative rectangles
const long krelZero = 0;
#ifdef MAC
inline void GetClientRect(HWND hwnd, RCS *prcs)
{ *prcs = hwnd->port.portRect; }
inline void InvalHwndRcs(HWND hwnd, RCS *prcs)
{
PPRT pprt;
GetPort(&pprt);
SetPort(&hwnd->port);
InvalRect(prcs);
SetPort(pprt);
}
inline void ValidHwndRcs(HWND hwnd, RCS *prcs)
{
PPRT pprt;
GetPort(&pprt);
SetPort(&hwnd->port);
ValidRect(prcs);
SetPort(pprt);
}
#endif //MAC
#ifdef WIN
inline void InvalHwndRcs(HWND hwnd, RCS *prcs)
{ InvalidateRect(hwnd, prcs, fFalse); }
inline void ValidHwndRcs(HWND hwnd, RCS *prcs)
{ ValidateRect(hwnd, prcs); }
#endif //WIN
//coordinates
enum
{
cooLocal, //top-left is (0,0)
cooParent, //relative to parent
cooGpt, //relative to the UI port
cooHwnd, //relative to the enclosing hwnd
cooGlobal, //global coordinates
cooLim
};
/****************************************
GOB creation block
****************************************/
struct GCB
{
long _hid;
PGOB _pgob;
ulong _grfgob;
long _gin;
RC _rcAbs;
RC _rcRel;
GCB(void) {}
GCB(long hid, PGOB pgob, ulong grfgob = fgobNil, long gin = kginDefault,
RC *prcAbs = pvNil, RC *prcRel = pvNil)
{ Set(hid, pgob, grfgob, gin, prcAbs, prcRel); }
void Set(long hid, PGOB pgob, ulong grfgob = fgobNil, long gin = kginDefault,
RC *prcAbs = pvNil, RC *prcRel = pvNil);
};
typedef GCB *PGCB;
/****************************************
Graphics object
****************************************/
#define GOB_PAR CMH
#define kclsGOB 'GOB'
class GOB : public GOB_PAR
{
RTCLASS_DEC
CMD_MAP_DEC(GOB)
ASSERT
MARKMEM
friend class GTE;
private:
static PGOB _pgobScreen;
HWND _hwnd; //the OS window (may be nil)
PGPT _pgpt; //the graphics port (may be shared with _pgobPar)
PCURS _pcurs; // the cursor to show over this gob
RC _rcCur; //current position
RC _rcVis; //current visible rectangle (in its parent)
RC _rcAbs; //_rcAbs and _rcRel describe the position of this
RC _rcRel; //gob in its parent.
// tree management
PGOB _pgobPar;
PGOB _pgobChd;
PGOB _pgobSib;
// variables
PGL _pglrtvm;
void _SetRcCur(void);
HWND _HwndGetDptFromCoo(PT *pdpt, long coo);
protected:
static long _ginDefGob;
static long _gridLast;
long _grid;
long _ginDefault: 8;
long _fFreeing: 1;
long _fCreating: 1;
~GOB(void);
static HWND _HwndNewMdi(PSTN pstnTitle);
static void _DestroyHwnd(HWND hwnd);
void _Init(PGCB pgcb);
HWND _HwndGetRc(RC *prc);
virtual void _NewRc(void) {}
virtual void _ActivateHwnd(bool fActive) {}
public:
static bool FInitScreen(ulong grfgob, long ginDef);
static void ShutDown(void);
static PGOB PgobScreen(void) { return _pgobScreen; }
static PGOB PgobFromHwnd(HWND hwnd);
static PGOB PgobFromClsScr(long cls);
static PGOB PgobFromHidScr(long hid);
static void MakeHwndActive(HWND hwnd);
static void ActivateHwnd(HWND hwnd, bool fActive);
static HWND HwndMdiActive(void);
static PGOB PgobMdiActive(void);
static PGOB PgobFromPtGlobal(long xp, long yp, PT *pptLocal = pvNil);
static long GinDefault(void)
{ return _ginDefGob; }
GOB(GCB *pgcb);
GOB(long hid);
virtual void Release(void);
//hwnd stuff
bool FAttachHwnd(HWND hwnd);
bool FCreateAndAttachMdi(PSTN pstnTitle);
HWND Hwnd(void)
{ return _hwnd; }
HWND HwndContainer(void);
virtual void GetMinMax(RC *prcMinMax);
void SetHwndName(PSTN pstn);
// unique gob run-time id.
long Grid(void)
{ return _grid; }
//tree management
PGOB PgobPar(void)
{ return _pgobPar; }
PGOB PgobFirstChild(void)
{ return _pgobChd; }
PGOB PgobLastChild(void);
PGOB PgobNextSib(void)
{ return _pgobSib; }
PGOB PgobPrevSib(void);
PGOB PgobFromCls(long cls);
PGOB PgobChildFromCls(long cls);
PGOB PgobParFromCls(long cls);
PGOB PgobFromHid(long hid);
PGOB PgobChildFromHid(long hid);
PGOB PgobParFromHid(long hid);
PGOB PgobFromGrid(long grid);
void BringToFront(void);
void SendBehind(PGOB pgobBefore);
//rectangle management
void SetPos(RC *prcAbs, RC *prcRel = pvNil);
void GetPos(RC *prcAbs, RC *prcRel);
void GetRc(RC *prc, long coo);
void GetRcVis(RC *prc, long coo);
void SetRcFromHwnd(void);
virtual void Maximize(void);
void MapPt(PT *ppt, long cooSrc, long cooDst);
void MapRc(RC *prc, long cooSrc, long cooDst);
//variables
virtual PGL *Ppglrtvm(void);
PGPT Pgpt(void) { return _pgpt; }
void InvalRc(RC *prc, long gin = kginDefault);
void ValidRc(RC *prc, long gin = kginDefault);
bool FGetRcInval(RC *prc, long gin = kginDefault);
void Scroll(RC *prc, long dxp, long dyp, long gin,
RC *prcBad1 = pvNil, RC *prcBad2 = pvNil);
virtual void Clean(void);
virtual void DrawTree(PGPT pgpt, RC *prc, RC *prcUpdate, ulong grfgob);
virtual void DrawTreeRgn(PGPT pgpt, RC *prc, REGN *pregn, ulong grfgob);
virtual void Draw(PGNV pgnv, RC *prcClip);
//mouse handling and hit testing
void GetPtMouse(PT *ppt, bool *pfDown);
virtual PGOB PgobFromPt(long xp, long yp, PT *pptLocal = pvNil);
virtual bool FPtIn(long xp, long yp);
virtual bool FPtInBounds(long xp, long yp);
virtual void MouseDown(long xp, long yp, long cact, ulong grfcust);
virtual long ZpDragRc(RC *prc, bool fVert, long zp, long zpMin, long zpLim,
long zpMinActive, long zpLimActive);
void SetCurs(PCURS pcurs);
void SetCursCno(PRCA prca, CNO cno);
#ifdef MAC
virtual void TrackGrow(PEVT pevt);
#endif //MAC
//command functions
virtual bool FCmdCloseWnd(PCMD pcmd);
virtual bool FCmdTrackMouse(PCMD_MOUSE pcmd);
bool FCmdTrackMouseCore(PCMD pcmd)
{ return FCmdTrackMouse((PCMD_MOUSE)pcmd); }
virtual bool FCmdMouseMove(PCMD_MOUSE pcmd);
bool FCmdMouseMoveCore(PCMD pcmd)
{ return FCmdMouseMove((PCMD_MOUSE)pcmd); }
//key commands
virtual bool FCmdKey(PCMD_KEY pcmd);
bool FCmdKeyCore(PCMD pcmd)
{ return FCmdKey((PCMD_KEY)pcmd); }
virtual bool FCmdBadKey(PCMD_BADKEY pcmd);
bool FCmdBadKeyCore(PCMD pcmd)
{ return FCmdBadKey((PCMD_BADKEY)pcmd); }
virtual bool FCmdSelIdle(PCMD pcmd);
virtual bool FCmdActivateSel(PCMD pcmd);
// tool tips
virtual bool FEnsureToolTip(PGOB *ppgobCurTip, long xpMouse, long ypMouse);
// gob state (for automated testing)
virtual long LwState(void);
#ifdef DEBUG
void MarkGobTree(void);
#endif //DEBUG
};
/****************************************
Gob Tree Enumerator
****************************************/
enum
{
// inputs
fgteNil = 0x0000,
fgteSkipToSib = 0x0001, //legal to FNextGob
fgteBackToFront = 0x0002, //legal to Init
// outputs
fgtePre = 0x0010,
fgtePost = 0x0020,
fgteRoot = 0x0040
};
#define GTE_PAR BASE
#define kclsGTE 'GTE'
class GTE : public GTE_PAR
{
RTCLASS_DEC
ASSERT
private:
// enumeration states
enum
{
esStart,
esGoDown,
esGoRight,
esDone
};
long _es;
bool _fBackWards; //which way to walk sibling lists
PGOB _pgobRoot;
PGOB _pgobCur;
public:
GTE(void);
void Init(PGOB pgob, ulong grfgte);
bool FNextGob(PGOB *ppgob, ulong *pgrfgteOut, ulong grfgteIn);
};
#endif //!GOB_H