PAGES.H

/* 
* PAGES.H
* Patron Chapter 7
*
* Definitions and function prototypes for the Pages window control
* as well as the CPage and CTenant classes.
*
* Copyright (c)1993-1996 Microsoft Corporation, All Rights Reserved
*
* Kraig Brockschmidt, Software Design Engineer
* Microsoft Systems Developer Relations
*
* Internet : kraigb@microsoft.com
* Compuserve: >INTERNET:kraigb@microsoft.com
*/


#ifndef _PAGES_H_
#define _PAGES_H_

//We need this for UICursorLoad and new-style cursors.
#include <bttncur.h>


//Versioning.
#define VERSIONMAJOR 2
#define VERSIONMINOR 0
#define VERSIONCURRENT 0x00020000

//Classname
#define SZCLASSPAGES TEXT("pages")

#define HIMETRIC_PER_INCH 2540
#define LOMETRIC_PER_INCH 254
#define LOMETRIC_BORDER 60 //Border around page


//Window extra bytes and offsets
#define CBPAGESWNDEXTRA (sizeof(LONG))
#define PAGEWL_STRUCTURE 0



//CHAPTER7MOD

/*
* Tenant class describing an individual piece of data in a page.
* It knows where it sits, what object is inside of it, and what
* its identifer is such that it can find it's storage within a
* page.
*/

//Patron Objects clipboard format
typedef struct tagPATRONOBJECT
{
POINTL ptl; //Location of object
POINTL ptlPick; //Pick point from drag-drop operation
SIZEL szl; //Extents of object (absolute)
FORMATETC fe; //Actual object format
} PATRONOBJECT, *PPATRONOBJECT;



//Values for hit-testing, drawing, and resize-tracking tenants
#define CXYHANDLE 5

//Tenant creation types (not persistent)
typedef enum
{
TENANTTYPE_NULL=0,
TENANTTYPE_STATIC,
} TENANTTYPE, *PTENANTTYPE;


//State flags
#define TENANTSTATE_DEFAULT 0x00000000
#define TENANTSTATE_SELECTED 0x00000001


/*
* Persistent information we need to save for each tenant, which is
* done in the tenant list instead of with each tenant. Since this
* is a small structure it's best not to blow another stream for it
* (overhead). (fSetExtent used in compound documents later on.)
*/
typedef struct tagTENANTINFO
{
DWORD dwID;
RECTL rcl;
FORMATETC fe; //Excludes ptd
short fSetExtent; //Call IOleObject::SetExtent on Run
} TENANTINFO, *PTENANTINFO;


class CTenant
{
private:
HWND m_hWnd; //Pages window
DWORD m_dwID; //Persistent DWORD ID
DWORD m_cOpens; //Count calls to FOpen

BOOL m_fInitialized; //Something here?
LPUNKNOWN m_pObj; //The object here
LPSTORAGE m_pIStorage; //Sub-storage for tenant

FORMATETC m_fe; //Used to create the object
DWORD m_dwState; //State flags
RECTL m_rcl; //Space of this object
CLSID m_clsID; //Object class (for statics)
BOOL m_fSetExtent; //Call SetExtent on next run

class CPages *m_pPG; //Pages window

protected:
HRESULT CreateStatic(LPDATAOBJECT, LPFORMATETC
, LPUNKNOWN *);

public:
CTenant(DWORD, HWND, CPages *);
~CTenant(void);

DWORD GetID(void);
UINT GetStorageName(LPTSTR);
UINT UCreate(TENANTTYPE, LPVOID, LPFORMATETC, LPPOINTL
, LPSIZEL, LPSTORAGE, PPATRONOBJECT, DWORD);
BOOL FLoad(LPSTORAGE, PTENANTINFO);
void GetInfo(PTENANTINFO);
BOOL FOpen(LPSTORAGE);
void Close(BOOL);
BOOL Update(void);
void Destroy(LPSTORAGE);

void Select(BOOL);
BOOL Activate(LONG);
void Draw(HDC, DVTARGETDEVICE *, HDC, int, int
, BOOL, BOOL);
void Repaint(void);
void Invalidate(void);

void ObjectGet(LPUNKNOWN *);
void FormatEtcGet(LPFORMATETC, BOOL);
void SizeGet(LPSIZEL, BOOL);
void SizeSet(LPSIZEL, BOOL);
void RectGet(LPRECTL, BOOL);
void RectSet(LPRECTL, BOOL);
};


typedef CTenant *PCTenant;

//Return codes for UCreate
#define UCREATE_FAILED 0
#define UCREATE_GRAPHICONLY 1
#define UCREATE_PLACEDOBJECT 2



typedef struct tagTENANTLIST
{
DWORD cTenants;
DWORD dwIDNext;
} TENANTLIST, *PTENANTLIST;

#define SZSTREAMTENANTLIST OLESTR("Tenant List")

//Delay timer used in mouse debouncing
#define IDTIMER_DEBOUNCE 120
//End CHAPTER7MOD



/*
* Page class describing an individual page and what things it
* contains, managing an IStorage for us.
*
* A DWORD is used to identify this page as the name of the storage
* is the string form of this ID. If we added a page every second,
* it would take 136 years to overrun this counter, so we can
* get away with saving it persistently. I hope this software is
* obsolete by then.
*/

class CPage
{
private:
DWORD m_dwID; //Persistent identifier
LPSTORAGE m_pIStorage; //Substorage for this page
//CHAPTER7MOD
HWND m_hWnd; //Pages window
DWORD m_cOpens; //Calls to FOpen

class CPages *m_pPG; //Pages window

DWORD m_dwIDNext;
DWORD m_cTenants;
HWND m_hWndTenantList; //Listbox; our tenant list

UINT m_iTenantCur;
PCTenant m_pTenantCur;

UINT m_uHTCode; //Last hit-test/mouse move
UINT m_uSizingFlags; //Restrictions on sizing
BOOL m_fTracking; //Tracking resize?
RECTL m_rclOrg; //Original before tracking
RECTL m_rcl; //Tracking rectangle
RECTL m_rclBounds; //Boundaries f/size tracking
HDC m_hDC; //Tracking hDC

BOOL m_fSizePending; //Waiting for debounce?
int m_cxyDist; //Debounce distance
UINT m_cDelay; //Debounce delay
POINTS m_ptDown; //Point of click to debounce
DWORD m_fTimer; //Timer active?

protected:
BOOL FTenantGet(UINT, PCTenant *, BOOL);
BOOL FTenantAdd(UINT, DWORD, PCTenant *);
LPDATAOBJECT TransferObjectCreate(LPPOINTL);

//PAGEMOUS.CPP
UINT TenantFromPoint(UINT, UINT, PCTenant *);
//End CHAPTER7MOD

public:
//CHAPTER7MOD
CPage(DWORD, HWND, class CPages *);
//End CHAPTER7MOD
~CPage(void);

DWORD GetID(void);
BOOL FOpen(LPSTORAGE);
void Close(BOOL);
BOOL Update(void);
void Destroy(LPSTORAGE);
UINT GetStorageName(LPTSTR);

//CHAPTER7MOD
void Draw(HDC, int, int, BOOL, BOOL);

BOOL TenantCreate(TENANTTYPE, LPVOID, LPFORMATETC
, PPATRONOBJECT, DWORD);
BOOL TenantDestroy(void);
BOOL TenantClip(BOOL);
BOOL FQueryObjectSelected(HMENU);

//PAGEMOUSE.CPP
BOOL OnLeftDown(UINT, UINT, UINT);
BOOL OnLeftDoubleClick(UINT, UINT, UINT);
BOOL OnLeftUp(UINT, UINT, UINT);
void OnMouseMove(UINT, int, int);
void OnTimer(UINT);
void StartSizeTracking(void);
void OnNCHitTest(UINT, UINT);
BOOL OnSetCursor(UINT);
//End CHAPTER7MOD
};

typedef CPage *PCPage;



/*
* Structures to save with the document describing the device
* configuration and pages that we have. This is followed by
* a list of DWORD IDs for the individual pages.
*/

typedef struct tagDEVICECONFIG
{
DWORD cb; //Size of structure
TCHAR szDriver[CCHDEVICENAME];
TCHAR szDevice[CCHDEVICENAME];
TCHAR szPort[CCHDEVICENAME];
DWORD cbDevMode; //Size of actual DEVMODE
DEVMODE dm; //Variable
} DEVICECONFIG, *PDEVICECONFIG;

//Offset to cbDevMode
#define CBSEEKOFFSETCBDEVMODE (sizeof(DWORD) \
+(3*CCHDEVICENAME*sizeof(TCHAR)))


//CHAPTER7MOD
//Combined OLE and Patron device structures.
typedef struct tagCOMBINEDEVICE
{
DVTARGETDEVICE td;
DEVICECONFIG dc;
} COMBINEBDEVICE, *PCOMBINEDEVICE;
//End CHAPTER7MOD


typedef struct tagPAGELIST
{
DWORD cPages;
DWORD iPageCur;
DWORD dwIDNext;
} PAGELIST, *PPAGELIST;


//PAGEWIN.CPP
LRESULT APIENTRY PagesWndProc(HWND, UINT, WPARAM, LPARAM);
BOOL APIENTRY AbortProc(HDC, int);
BOOL APIENTRY PrintDlgProc(HWND, UINT, WPARAM, LPARAM);
void RectConvertMappings(LPRECT, HDC, BOOL);


class CPages : public CWindow
{
friend LRESULT APIENTRY PagesWndProc(HWND, UINT, WPARAM, LPARAM);
friend BOOL APIENTRY PrintDlgProc(HWND, UINT, WPARAM, LPARAM);

friend class CPage;
friend class CTenant;

protected:
//CHAPTER7MOD
PCPage m_pPageCur; //Current page
//End CHAPTER7MOD
UINT m_iPageCur; //Current page
UINT m_cPages; //Number of pages

HWND m_hWndPageList; //Listbox with page list
HFONT m_hFont; //Page font
BOOL m_fSystemFont; //m_hFont system object?

UINT m_cx; //Page size in LOMETRIC
UINT m_cy;

UINT m_xMarginLeft; //Unusable margins,
UINT m_xMarginRight; //in LOMETRIC
UINT m_yMarginTop;
UINT m_yMarginBottom;

UINT m_xPos; //Viewport scroll pos,
UINT m_yPos; //both in *PIXELS*

DWORD m_dwIDNext; //Next ID for a page.
LPSTORAGE m_pIStorage; //Root storage

//CHAPTER7MOD
UINT m_cf; //Clipboard format
BOOL m_fDirty;
//End CHAPTER7MOD

protected:
void Draw(HDC, BOOL, BOOL);
void UpdateScrollRanges(void);
BOOL ConfigureForDevice(void);
BOOL FPageGet(UINT, PCPage *, BOOL);
BOOL FPageAdd(UINT, DWORD, BOOL);

//CHAPTER7MOD
void CalcBoundingRect(LPRECT, BOOL);
//End CHAPTER7MOD

public:
//CHAPTER7MOD
CPages(HINSTANCE, UINT);
//End CHAPTER7MOD
~CPages(void);

BOOL FInit(HWND, LPRECT, DWORD, UINT, LPVOID);

BOOL FIStorageSet(LPSTORAGE, BOOL, BOOL);
BOOL FIStorageUpdate(BOOL);

BOOL Print(HDC, LPTSTR, DWORD, UINT, UINT, UINT);

void RectGet(LPRECT);
void RectSet(LPRECT, BOOL);
void SizeGet(LPRECT);
void SizeSet(LPRECT, BOOL);

UINT PageInsert(UINT);
UINT PageDelete(UINT);
UINT CurPageGet(void);
UINT CurPageSet(UINT);
UINT NumPagesGet(void);

BOOL DevModeSet(HGLOBAL, HGLOBAL);
HGLOBAL DevModeGet(void);

//CHAPTER7MOD
BOOL FIsDirty(void);
BOOL DevReadConfig(PCOMBINEDEVICE *, HDC *);
BOOL TenantCreate(TENANTTYPE, LPVOID, LPFORMATETC
, PPATRONOBJECT, DWORD);
BOOL TenantDestroy(void);
BOOL TenantClip(BOOL);
BOOL FQueryObjectSelected(HMENU);
//End CHAPTER7MOD
};

typedef CPages *PCPages;


//Fixed names of streams in the Pages IStorage
#define SZSTREAMPAGELIST OLESTR("Page List")
#define SZSTREAMDEVICECONFIG OLESTR("Device Configuration")


#endif //_PAGES_H_