home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / vc98 / mfc / src / occimpl.h < prev    next >
C/C++ Source or Header  |  1998-06-16  |  18KB  |  490 lines

  1. // This is a part of the Microsoft Foundation Classes C++ library.
  2. // Copyright (C) 1992-1998 Microsoft Corporation
  3. // All rights reserved.
  4. //
  5. // This source code is only intended as a supplement to the
  6. // Microsoft Foundation Classes Reference and related
  7. // electronic documentation provided with the library.
  8. // See these sources for detailed information regarding the
  9. // Microsoft Foundation Classes product.
  10.  
  11. #ifndef _AFX_NO_OCC_SUPPORT
  12.  
  13. #include <oledb.h>
  14. #include "olebind.h"
  15. #include "ocdbid.h"
  16. #include "ocdb.h"
  17.  
  18. // MFC doesn't use the OLEDB 1.5 features of ATL and it causes
  19. // compile problems, so just make ATL think it's not version 1.5
  20. #if (OLEDBVER >= 0x0150)
  21. #undef OLEDBVER
  22. #define OLEDBVER 0x0100
  23. #endif
  24.  
  25. #define AtlTrace AfxTrace
  26. #include "atldbcli.h"
  27.  
  28. class CDataSourceControl;
  29. class CDataBoundProperty;
  30.  
  31. // CCmdTarget
  32.     class COleControlContainer;
  33.     class COleControlSite;
  34.  
  35. class COccManager;
  36. struct _AFX_OCC_DIALOG_INFO;
  37.  
  38. #define DISPID_DATASOURCE   0x80010001
  39. #define DISPID_DATAFIELD    0x80010002
  40.  
  41. interface AFX_NOVTABLE IDataSourceListener : public IUnknown
  42. {
  43. public:
  44.     virtual HRESULT STDMETHODCALLTYPE OnDataMemberChanged(BSTR bstrDM) = 0;
  45.     virtual HRESULT STDMETHODCALLTYPE OnDataMemberAdded(BSTR bstrDM) = 0;
  46.     virtual HRESULT STDMETHODCALLTYPE OnDataMemberRemoved(BSTR bstrDM) = 0;
  47. };
  48.  
  49. interface AFX_NOVTABLE IDataSource : public IUnknown
  50. {
  51. public:
  52.     virtual HRESULT STDMETHODCALLTYPE GetDataMember(BSTR bstrDM, const GUID __RPC_FAR* riid, IUnknown __RPC_FAR* __RPC_FAR* ppunk) = 0;
  53.     virtual HRESULT STDMETHODCALLTYPE GetDataMemberName(long lIndex, BSTR __RPC_FAR *pbstrDM) = 0;
  54.     virtual HRESULT STDMETHODCALLTYPE GetDataMemberCount(long __RPC_FAR *plCount) = 0;
  55.     virtual HRESULT STDMETHODCALLTYPE AddDataSourceListener(IDataSourceListener __RPC_FAR *pDSL) = 0;
  56.     virtual HRESULT STDMETHODCALLTYPE RemoveDataSourceListener(IDataSourceListener __RPC_FAR *pDSL) = 0;
  57. };
  58.  
  59. /////////////////////////////////////////////////////////////////////////////
  60. // OLE Databinding support class for data sources
  61.  
  62. interface IRowPosition;
  63.  
  64. class CDataSourceControl
  65. {
  66. private:
  67.     CDataSourceControl() {};
  68. public:
  69.     struct METAROWTYPE
  70.     {
  71.         DBCOLUMNID idColumnID;
  72.         DWORD dwColumnID;
  73.         LPSTR lpstrName;
  74.         DWORD dwName;
  75.         CPtrList* m_pClientList;
  76.     };
  77.  
  78.     CDataSourceControl(COleControlSite *pClientSite);
  79.     ~CDataSourceControl();
  80.     HRESULT Initialize();
  81.     virtual IUnknown* GetCursor();
  82.     HRESULT GetMetaData();
  83.     virtual void BindProp(COleControlSite* pClientSite, BOOL bBind = TRUE);
  84.     virtual void BindProp(CDataBoundProperty* pProperty, BOOL bBind = TRUE);
  85.     virtual void BindColumns();
  86.     BOOL CopyColumnID(DBCOLUMNID* pcidDst, DBCOLUMNID const *pcidSrc);
  87.     HRESULT GetBoundClientRow();
  88.     virtual HRESULT UpdateControls();
  89.     virtual HRESULT UpdateCursor();
  90.     COleVariant ToVariant(int nCol);
  91.  
  92.     COleControlSite *m_pClientSite;  // Back ptr to containing site
  93.     ICursorMove* m_pCursorMove;
  94.     ICursorUpdateARow* m_pCursorUpdateARow;
  95.     int m_nColumns;
  96.     METAROWTYPE* m_pMetaRowData;
  97.     CPtrList m_CursorBoundProps;
  98.     void* m_pVarData;
  99.     int m_nBindings;
  100.     DBCOLUMNBINDING *m_pColumnBindings;
  101.     VARIANT* m_pValues;
  102.     BOOL m_bUpdateInProgress;
  103.  
  104. // OLE/DB stuff
  105.     IDataSource*            m_pDataSource;
  106.     IRowPosition*           m_pRowPosition;
  107.     ATL::CRowset*           m_pRowset;
  108.     ATL::CDynamicAccessor*  m_pDynamicAccessor;
  109.  
  110.     DWORD m_dwRowsetNotify; // IRowsetNotify cookie
  111. };
  112.  
  113. /////////////////////////////////////////////////////////////////////////////
  114. // OLE Databinding support class for bound controls
  115.  
  116. class CDataBoundProperty
  117. {
  118. protected:
  119.     CDataBoundProperty() {};
  120. public:
  121.     CDataBoundProperty(CDataBoundProperty* pLast, DISPID dispid, WORD ctlid);
  122.     ~CDataBoundProperty() {};
  123.     void SetClientSite(COleControlSite *pClientSite);
  124.     void SetDSCSite(COleControlSite *pDSCSite);
  125.     void RemoveSource();
  126.     void Notify();
  127.     IUnknown* GetCursor();
  128.     CDataBoundProperty* GetNext();
  129.  
  130.     COleControlSite *m_pClientSite;  // Back ptr to containing site
  131.     WORD m_ctlid;
  132.     DISPID m_dispid;
  133.     COleControlSite *m_pDSCSite;
  134.     BOOL m_bOwnXferOut;
  135.     BOOL m_bIsDirty;
  136.     CDataBoundProperty* m_pNext;
  137. };
  138.  
  139. /////////////////////////////////////////////////////////////////////////////
  140. // Control containment helper functions
  141.  
  142. DLGTEMPLATE* _AfxSplitDialogTemplate(const DLGTEMPLATE* pTemplate,
  143.     CMapWordToPtr* pOleItemMap);
  144.  
  145. void _AfxZOrderOleControls(CWnd* pWnd, CMapWordToPtr* pOleItemMap);
  146.  
  147. /////////////////////////////////////////////////////////////////////////////
  148. // COleControlContainer - implementation class
  149.  
  150. class COleControlContainer : public CCmdTarget
  151. {
  152. public:
  153. // Constructors/destructors
  154.     COleControlContainer(CWnd*  pWnd);
  155.     virtual ~COleControlContainer();
  156.  
  157. // Operations
  158.     BOOL CreateControl(CWnd* pWndCtrl, REFCLSID clsid,
  159.         LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, UINT nID,
  160.         CFile* pPersist=NULL, BOOL bStorage=FALSE, BSTR bstrLicKey=NULL,
  161.         COleControlSite** ppNewSite=NULL);
  162.    // Overload to allow creation of default-sized controls
  163.     BOOL CreateControl(CWnd* pWndCtrl, REFCLSID clsid,
  164.         LPCTSTR lpszWindowName, DWORD dwStyle, const POINT* ppt,
  165.       const SIZE* psize, UINT nID, CFile* pPersist=NULL, BOOL bStorage=FALSE,
  166.       BSTR bstrLicKey=NULL, COleControlSite** ppNewSite=NULL);
  167.     virtual COleControlSite* FindItem(UINT nID) const;
  168.     virtual BOOL GetAmbientProp(COleControlSite* pSite, DISPID dispid,
  169.         VARIANT* pvarResult);
  170.     void CreateOleFont(CFont* pFont);
  171.     void FreezeAllEvents(BOOL bFreeze);
  172.     virtual void ScrollChildren(int dx, int dy);
  173.     virtual void OnUIActivate(COleControlSite* pSite);
  174.     virtual void OnUIDeactivate(COleControlSite* pSite);
  175.  
  176.     virtual void CheckDlgButton(int nIDButton, UINT nCheck);
  177.     virtual void CheckRadioButton(int nIDFirstButton, int nIDLastButton,
  178.         int nIDCheckButton);
  179.     virtual CWnd* GetDlgItem(int nID) const;
  180.     virtual void GetDlgItem(int nID, HWND* phWnd) const;
  181.     virtual UINT GetDlgItemInt(int nID, BOOL* lpTrans, BOOL bSigned) const;
  182.     virtual int GetDlgItemText(int nID, LPTSTR lpStr, int nMaxCount) const;
  183.     virtual LRESULT SendDlgItemMessage(int nID, UINT message, WPARAM wParam,
  184.         LPARAM lParam);
  185.     virtual void SetDlgItemInt(int nID, UINT nValue, BOOL bSigned);
  186.     virtual void SetDlgItemText(int nID, LPCTSTR lpszString);
  187.     virtual UINT IsDlgButtonChecked(int nIDButton) const;
  188. #ifndef _AFXDLL
  189.     virtual void AttachControlSite(CWnd* pWnd);
  190. #else
  191.     void AttachControlSite(CWnd* pWnd);
  192. #endif
  193.  
  194. // Attributes
  195.     CWnd* m_pWnd;
  196.     CMapPtrToPtr m_siteMap;
  197.     COLORREF m_crBack;
  198.     COLORREF m_crFore;
  199.     LPFONTDISP m_pOleFont;
  200.     COleControlSite* m_pSiteUIActive;
  201.  
  202. public:
  203.     // Interface maps
  204.     BEGIN_INTERFACE_PART(OleIPFrame, IOleInPlaceFrame)
  205.         INIT_INTERFACE_PART(COleControlContainer, OleIPFrame)
  206.         STDMETHOD(GetWindow)(HWND*);
  207.         STDMETHOD(ContextSensitiveHelp)(BOOL);
  208.         STDMETHOD(GetBorder)(LPRECT);
  209.         STDMETHOD(RequestBorderSpace)(LPCBORDERWIDTHS);
  210.         STDMETHOD(SetBorderSpace)(LPCBORDERWIDTHS);
  211.         STDMETHOD(SetActiveObject)(LPOLEINPLACEACTIVEOBJECT, LPCOLESTR);
  212.         STDMETHOD(InsertMenus)(HMENU, LPOLEMENUGROUPWIDTHS);
  213.         STDMETHOD(SetMenu)(HMENU, HOLEMENU, HWND);
  214.         STDMETHOD(RemoveMenus)(HMENU);
  215.         STDMETHOD(SetStatusText)(LPCOLESTR);
  216.         STDMETHOD(EnableModeless)(BOOL);
  217.         STDMETHOD(TranslateAccelerator)(LPMSG, WORD);
  218.     END_INTERFACE_PART(OleIPFrame)
  219.  
  220.     BEGIN_INTERFACE_PART(OleContainer, IOleContainer)
  221.         INIT_INTERFACE_PART(COleControlContainer, OleContainer)
  222.         STDMETHOD(ParseDisplayName)(LPBINDCTX, LPOLESTR, ULONG*, LPMONIKER*);
  223.         STDMETHOD(EnumObjects)(DWORD, LPENUMUNKNOWN*);
  224.         STDMETHOD(LockContainer)(BOOL);
  225.     END_INTERFACE_PART(OleContainer)
  226.  
  227.     DECLARE_INTERFACE_MAP()
  228.     DECLARE_DISPATCH_MAP()
  229. };
  230.  
  231.  
  232. /////////////////////////////////////////////////////////////////////////////
  233. // COleControlSite - implementation class
  234.  
  235. #define VT_MFCFORCEPUTREF   0x8000  // force DISPATCH_PROPERTYPUTREF
  236.  
  237. class COleControlSite : public CCmdTarget
  238. {
  239. public:
  240. // Constructors/destructors
  241.     COleControlSite(COleControlContainer* pCtrlCont);
  242.     ~COleControlSite();
  243.  
  244. // Operations
  245.     HRESULT CreateControl(CWnd* pWndCtrl, REFCLSID clsid,
  246.         LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, UINT nID,
  247.         CFile* pPersist=NULL, BOOL bStorage=FALSE, BSTR bstrLicKey=NULL);
  248.    // Overload to allow creation of default-sized controls
  249.     HRESULT CreateControl(CWnd* pWndCtrl, REFCLSID clsid,
  250.         LPCTSTR lpszWindowName, DWORD dwStyle, const POINT* ppt,
  251.       const SIZE* psize, UINT nID, CFile* pPersist=NULL, BOOL bStorage=FALSE,
  252.       BSTR bstrLicKey=NULL);
  253.     virtual BOOL DestroyControl();
  254.     UINT GetID();
  255.     BOOL GetEventIID(IID* piid);
  256.     virtual HRESULT DoVerb(LONG nVerb, LPMSG lpMsg = NULL);
  257.     BOOL IsDefaultButton();
  258.     DWORD GetDefBtnCode();
  259.     void SetDefaultButton(BOOL bDefault);
  260.     void GetControlInfo();
  261.     BOOL IsMatchingMnemonic(LPMSG lpMsg);
  262.     void SendMnemonic(LPMSG lpMsg);
  263.     void FreezeEvents(BOOL bFreeze);
  264.  
  265.     virtual void InvokeHelperV(DISPID dwDispID, WORD wFlags, VARTYPE vtRet,
  266.         void* pvRet, const BYTE* pbParamInfo, va_list argList);
  267.     virtual void SetPropertyV(DISPID dwDispID, VARTYPE vtProp, va_list argList);
  268.     virtual void AFX_CDECL InvokeHelper(DISPID dwDispID, WORD wFlags, VARTYPE vtRet,
  269.         void* pvRet, const BYTE* pbParamInfo, ...);
  270.     virtual void GetProperty(DISPID dwDispID, VARTYPE vtProp, void* pvProp) const;
  271.     virtual void AFX_CDECL SetProperty(DISPID dwDispID, VARTYPE vtProp, ...);
  272.     virtual BOOL AFX_CDECL SafeSetProperty(DISPID dwDispID, VARTYPE vtProp, ...);
  273.  
  274.     virtual DWORD GetStyle() const;
  275.     virtual DWORD GetExStyle() const;
  276.     virtual BOOL ModifyStyle(DWORD dwRemove, DWORD dwAdd, UINT nFlags);
  277.     virtual BOOL ModifyStyleEx(DWORD dwRemove, DWORD dwAdd, UINT nFlags);
  278.     virtual void SetWindowText(LPCTSTR lpszString);
  279.     virtual void GetWindowText(CString& str) const;
  280.     virtual int GetWindowText(LPTSTR lpszStringBuf, int nMaxCount) const;
  281.     virtual int GetWindowTextLength() const;
  282.     virtual int GetDlgCtrlID() const;
  283.     virtual int SetDlgCtrlID(int nID);
  284.     virtual void MoveWindow(int x, int y, int nWidth, int nHeight,
  285.         BOOL bRepaint);
  286.     virtual BOOL SetWindowPos(const CWnd* pWndInsertAfter, int x, int y,
  287.         int cx, int cy, UINT nFlags);
  288.     virtual BOOL ShowWindow(int nCmdShow);
  289.     virtual BOOL IsWindowEnabled() const;
  290.     virtual BOOL EnableWindow(BOOL bEnable);
  291.     virtual CWnd* SetFocus();
  292.     virtual void EnableDSC();
  293.     virtual void BindDefaultProperty(DISPID dwDispID, VARTYPE vtProp, LPCTSTR szFieldName, CWnd* pDSCWnd);
  294.     virtual void BindProperty(DISPID dwDispId, CWnd* pWndDSC);
  295.  
  296. // Overridables
  297.     virtual BOOL QuickActivate();
  298.  
  299. // Attributes
  300.     COleControlContainer* m_pCtrlCont;
  301.     HWND m_hWnd;
  302.     CWnd* m_pWndCtrl;
  303.     UINT m_nID;
  304.     CRect m_rect;
  305.     IID m_iidEvents;
  306.     LPOLEOBJECT m_pObject;
  307.     LPOLEINPLACEOBJECT m_pInPlaceObject;
  308.     LPOLEINPLACEACTIVEOBJECT m_pActiveObject;
  309.     COleDispatchDriver m_dispDriver;
  310.     DWORD m_dwEventSink;
  311.     DWORD m_dwPropNotifySink;
  312.     DWORD m_dwStyleMask;
  313.     DWORD m_dwStyle;
  314.     DWORD m_dwMiscStatus;
  315.     CONTROLINFO m_ctlInfo;
  316.  
  317.     // Databound control stuff
  318.     DWORD m_dwNotifyDBEvents; // INotifyDBEvents sink cookie
  319.     CDataSourceControl* m_pDataSourceControl;
  320.     CDataBoundProperty* m_pBindings;
  321.     union {
  322.         COleControlSite *m_pDSCSite;
  323.         WORD m_ctlidRowSource;
  324.     };
  325.     DISPID m_defdispid;
  326.     UINT m_dwType;
  327.     CString m_strDataField;
  328.     BOOL m_bIgnoreNotify;
  329.     BOOL m_bIsDirty;
  330.     VARIANT m_varResult;
  331.  
  332. protected:
  333. // Implementation
  334.     BOOL SetExtent();
  335.     HRESULT CreateOrLoad(REFCLSID clsid, CFile* pPersist, BOOL bStorage,
  336.         BSTR bstrLicKey);
  337.     DWORD ConnectSink(REFIID iid, LPUNKNOWN punkSink);
  338.     void DisconnectSink(REFIID iid, DWORD dwCookie);
  339.     void AttachWindow();
  340.     void DetachWindow();
  341.     BOOL OnEvent(AFX_EVENT* pEvent);
  342.     HRESULT GetCursor(DISPID dispid, LPUNKNOWN* ppcursorOut, LPVOID *ppcidOut);
  343.  
  344. public:
  345. // Interface maps
  346.     BEGIN_INTERFACE_PART(OleClientSite, IOleClientSite)
  347.         INIT_INTERFACE_PART(COleControlSite, OleClientSite)
  348.         STDMETHOD(SaveObject)();
  349.         STDMETHOD(GetMoniker)(DWORD, DWORD, LPMONIKER*);
  350.         STDMETHOD(GetContainer)(LPOLECONTAINER*);
  351.         STDMETHOD(ShowObject)();
  352.         STDMETHOD(OnShowWindow)(BOOL);
  353.         STDMETHOD(RequestNewObjectLayout)();
  354.     END_INTERFACE_PART(OleClientSite)
  355.  
  356.     BEGIN_INTERFACE_PART(OleIPSite, IOleInPlaceSite)
  357.         INIT_INTERFACE_PART(COleControlSite, OleIPSite)
  358.         STDMETHOD(GetWindow)(HWND*);
  359.         STDMETHOD(ContextSensitiveHelp)(BOOL);
  360.         STDMETHOD(CanInPlaceActivate)();
  361.         STDMETHOD(OnInPlaceActivate)();
  362.         STDMETHOD(OnUIActivate)();
  363.         STDMETHOD(GetWindowContext)(LPOLEINPLACEFRAME*,
  364.             LPOLEINPLACEUIWINDOW*, LPRECT, LPRECT, LPOLEINPLACEFRAMEINFO);
  365.         STDMETHOD(Scroll)(SIZE);
  366.         STDMETHOD(OnUIDeactivate)(BOOL);
  367.         STDMETHOD(OnInPlaceDeactivate)();
  368.         STDMETHOD(DiscardUndoState)();
  369.         STDMETHOD(DeactivateAndUndo)();
  370.         STDMETHOD(OnPosRectChange)(LPCRECT);
  371.     END_INTERFACE_PART(OleIPSite)
  372.  
  373.     BEGIN_INTERFACE_PART(OleControlSite, IOleControlSite)
  374.         INIT_INTERFACE_PART(COleControlSite, OleControlSite)
  375.         STDMETHOD(OnControlInfoChanged)();
  376.         STDMETHOD(LockInPlaceActive)(BOOL fLock);
  377.         STDMETHOD(GetExtendedControl)(LPDISPATCH* ppDisp);
  378.         STDMETHOD(TransformCoords)(POINTL* lpptlHimetric,
  379.             POINTF* lpptfContainer, DWORD flags);
  380.         STDMETHOD(TranslateAccelerator)(LPMSG lpMsg, DWORD grfModifiers);
  381.         STDMETHOD(OnFocus)(BOOL fGotFocus);
  382.         STDMETHOD(ShowPropertyFrame)();
  383.     END_INTERFACE_PART(OleControlSite)
  384.  
  385.     BEGIN_INTERFACE_PART(AmbientProps, IDispatch)
  386.         INIT_INTERFACE_PART(COleControlSite, AmbientProps)
  387.         STDMETHOD(GetTypeInfoCount)(unsigned int*);
  388.         STDMETHOD(GetTypeInfo)(unsigned int, LCID, ITypeInfo**);
  389.         STDMETHOD(GetIDsOfNames)(REFIID, LPOLESTR*, unsigned int, LCID, DISPID*);
  390.         STDMETHOD(Invoke)(DISPID, REFIID, LCID, unsigned short, DISPPARAMS*,
  391.                           VARIANT*, EXCEPINFO*, unsigned int*);
  392.     END_INTERFACE_PART(AmbientProps)
  393.  
  394.     BEGIN_INTERFACE_PART(PropertyNotifySink, IPropertyNotifySink)
  395.         INIT_INTERFACE_PART(COleControlSite, PropertyNotifySink)
  396.         STDMETHOD(OnChanged)(DISPID dispid);
  397.         STDMETHOD(OnRequestEdit)(DISPID dispid);
  398.     END_INTERFACE_PART(PropertyNotifySink)
  399.  
  400.     BEGIN_INTERFACE_PART(EventSink, IDispatch)
  401.         INIT_INTERFACE_PART(COleControlSite, EventSink)
  402.         STDMETHOD(GetTypeInfoCount)(unsigned int*);
  403.         STDMETHOD(GetTypeInfo)(unsigned int, LCID, ITypeInfo**);
  404.         STDMETHOD(GetIDsOfNames)(REFIID, LPOLESTR*, unsigned int, LCID, DISPID*);
  405.         STDMETHOD(Invoke)(DISPID, REFIID, LCID, unsigned short, DISPPARAMS*,
  406.                           VARIANT*, EXCEPINFO*, unsigned int*);
  407.     END_INTERFACE_PART(EventSink)
  408.  
  409.     BEGIN_INTERFACE_PART(BoundObjectSite, IBoundObjectSite)
  410.         STDMETHOD(GetCursor)(DISPID dispid, LPLPCURSOR ppcursorOut, LPVOID *ppcidOut);
  411.     END_INTERFACE_PART(BoundObjectSite)
  412.  
  413.     BEGIN_INTERFACE_PART(NotifyDBEvents, INotifyDBEvents)
  414.         STDMETHOD(OKToDo)(DWORD dwEventWhat, ULONG cReasons, DBNOTIFYREASON rgReasons[]);
  415.         STDMETHOD(Cancelled)(DWORD dwEventWhat, ULONG cReasons, DBNOTIFYREASON rgReasons[]);
  416.         STDMETHOD(SyncBefore)(DWORD dwEventWhat, ULONG cReasons, DBNOTIFYREASON rgReasons[]);
  417.         STDMETHOD(AboutToDo)(DWORD dwEventWhat, ULONG cReasons, DBNOTIFYREASON rgReasons[]);
  418.         STDMETHOD(FailedToDo)(DWORD dwEventWhat, ULONG cReasons, DBNOTIFYREASON rgReasons[]);
  419.         STDMETHOD(SyncAfter)(DWORD dwEventWhat, ULONG cReasons, DBNOTIFYREASON rgReasons[]);
  420.         STDMETHOD(DidEvent)(DWORD dwEventWhat, ULONG cReasons, DBNOTIFYREASON rgReasons[]);
  421.  
  422.         // Not part of i/f - just a helper
  423.         HRESULT FireEvent(DWORD dwEventWhat, ULONG cReasons,
  424.             DBNOTIFYREASON rgReasons[], DSCSTATE nState);
  425.     END_INTERFACE_PART(NotifyDBEvents)
  426.  
  427.     BEGIN_INTERFACE_PART(RowsetNotify, IRowsetNotify)
  428.         STDMETHOD(OnFieldChange)(IRowset* pRowset, HROW hRow, ULONG cColumns, ULONG rgColumns[], DBREASON eReason, DBEVENTPHASE ePhase, BOOL fCantDeny);
  429.         STDMETHOD(OnRowChange)(IRowset* pRowset, ULONG cRows, const HROW rghRows[], DBREASON eReason, DBEVENTPHASE ePhase, BOOL fCantDeny);
  430.         STDMETHOD(OnRowsetChange)(IRowset* pRowset, DBREASON eReason, DBEVENTPHASE ePhase, BOOL fCantDeny);
  431.     END_INTERFACE_PART(RowsetNotify)
  432.  
  433.     DECLARE_INTERFACE_MAP()
  434. };
  435.  
  436. /////////////////////////////////////////////////////////////////////////////
  437. // OLE control container manager
  438.  
  439. class COccManager : public CNoTrackObject
  440. {
  441. // Operations
  442. public:
  443.     // Event handling
  444.     virtual BOOL OnEvent(CCmdTarget* pCmdTarget, UINT idCtrl, AFX_EVENT* pEvent,
  445.         AFX_CMDHANDLERINFO* pHandlerInfo);
  446.  
  447.     // Internal object creation
  448.     virtual COleControlContainer* CreateContainer(CWnd* pWnd);
  449.     virtual COleControlSite* CreateSite(COleControlContainer* pCtrlCont);
  450.  
  451.     // Dialog creation
  452.     virtual const DLGTEMPLATE* PreCreateDialog(_AFX_OCC_DIALOG_INFO* pOccDialogInfo,
  453.         const DLGTEMPLATE* pOrigTemplate);
  454.     virtual void PostCreateDialog(_AFX_OCC_DIALOG_INFO* pOccDialogInfo);
  455.     virtual DLGTEMPLATE* SplitDialogTemplate(const DLGTEMPLATE* pTemplate,
  456.         DLGITEMTEMPLATE** ppOleDlgItems);
  457.     virtual BOOL CreateDlgControls(CWnd* pWndParent, LPCTSTR lpszResourceName,
  458.         _AFX_OCC_DIALOG_INFO* pOccDialogInfo);
  459.     virtual BOOL CreateDlgControls(CWnd* pWndParent, void* lpResource,
  460.         _AFX_OCC_DIALOG_INFO* pOccDialogInfo);
  461.  
  462.     // Dialog manager
  463.     virtual BOOL IsDialogMessage(CWnd* pWndDlg, LPMSG lpMsg);
  464.     static BOOL AFX_CDECL IsLabelControl(CWnd* pWnd);
  465.     static BOOL AFX_CDECL IsMatchingMnemonic(CWnd* pWnd, LPMSG lpMsg);
  466.     static void AFX_CDECL SetDefaultButton(CWnd* pWnd, BOOL bDefault);
  467.     static DWORD AFX_CDECL GetDefBtnCode(CWnd* pWnd);
  468.  
  469. // Implementation
  470. protected:
  471.     // Dialog creation
  472.     HWND CreateDlgControl(CWnd* pWndParent, HWND hwAfter, BOOL bDialogEx,
  473.         LPDLGITEMTEMPLATE pDlgItem, WORD nMsg, BYTE* lpData, DWORD cb);
  474.  
  475.     // Databinding
  476.     void BindControls(CWnd* pWndParent);
  477.  
  478.     // Dialog manager
  479.     static void AFX_CDECL UIActivateControl(CWnd* pWndNewFocus);
  480.     static void AFX_CDECL UIDeactivateIfNecessary(CWnd* pWndOldFocus, CWnd* pWndNewFocus);
  481. };
  482.  
  483. struct _AFX_OCC_DIALOG_INFO
  484. {
  485.     DLGTEMPLATE* m_pNewTemplate;
  486.     DLGITEMTEMPLATE** m_ppOleDlgItems;
  487. };
  488.  
  489. #endif // !_AFX_NO_OCC_SUPPORT
  490.