// Copyright (C) Microsoft Corporation 1996-1997, All Rights reserved.

#if _MSC_VER > 1000
#pragma once
#endif

#ifndef _CONTAIN_H_
#define _CONTAIN_H_

#include <servprov.h>
#include <docobj.h>

#ifndef INITGUIDS
#include <olectl.h>
#endif

#include "web.h"
#include "mshtmhst.h"

extern IServiceProvider *g_pExternalHostServiceProvider; 

typedef class CIPropertyNotifySink *PIPROPERTYNOTIFYSINK;
typedef class CIOleControlSite *PIOLECONTROLSITE;

class CAutomateContent;

class CDocHostUIHandler : public IDocHostUIHandler
{
private:
   ULONG m_cRef;

public:
   IUnknown * m_pOuter;

   CDocHostUIHandler(IUnknown * pOuter);
   STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppv);
   STDMETHODIMP_(ULONG) AddRef(void);
   STDMETHODIMP_(ULONG) Release(void);
   STDMETHODIMP ShowContextMenu(DWORD dwID, POINT *ppt, IUnknown *pcmdtReserved, IDispatch *pdispReserved);
   STDMETHODIMP GetHostInfo(DOCHOSTUIINFO *pInfo);
   STDMETHODIMP ShowUI(DWORD dwID, IOleInPlaceActiveObject *pActiveObject, IOleCommandTarget *pCommandTarget,
                     IOleInPlaceFrame *pFrame, IOleInPlaceUIWindow *pDoc);
   STDMETHODIMP HideUI(void);
   STDMETHODIMP UpdateUI(void);
   STDMETHODIMP EnableModeless(BOOL fEnable);
   STDMETHODIMP OnDocWindowActivate(BOOL fActivate);
   STDMETHODIMP OnFrameWindowActivate(BOOL fActivate);
   STDMETHODIMP ResizeBorder(LPCRECT prcBorder, IOleInPlaceUIWindow *pUIWindow, BOOL fRameWindow);
   STDMETHODIMP TranslateAccelerator(LPMSG lpMsg, const GUID *pguidCmdGroup, DWORD nCmdID);
   STDMETHODIMP GetOptionKeyPath(LPOLESTR *pchKey, DWORD dw);
   STDMETHODIMP GetDropTarget(IDropTarget *pDropTarget, IDropTarget **ppDropTarget);
   STDMETHODIMP GetExternal(IDispatch **ppDispatch);
   STDMETHODIMP TranslateUrl(DWORD dwTranslate, OLECHAR *pchURLIn, OLECHAR **ppchURLOut);
   STDMETHODIMP FilterDataObject(IDataObject *pDO, IDataObject **ppDORet);
};

class CDocHostShowUI : public IDocHostShowUI
{
private:
   ULONG m_cRef;

public:
   IUnknown * m_pOuter;

   CDocHostShowUI(IUnknown * pOuter);
   STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppv);
   STDMETHODIMP_(ULONG) AddRef(void);
   STDMETHODIMP_(ULONG) Release(void);

   STDMETHODIMP ShowHelp( HWND hwnd, LPOLESTR pszHelpFile, UINT uCommand, DWORD dwData, POINT ptMouse, IDispatch* pDispatchObjectHit );
   STDMETHODIMP ShowMessage( HWND hwnd, LPOLESTR lpstrText, LPOLESTR lpstrCaption, DWORD dwType, LPOLESTR lpstrHelpFile, DWORD dwHelpContext, LRESULT* plResult );
};


class CIOleItemContainer : public IOleItemContainer
{
private:
   ULONG m_cRef;

public:
   IUnknown * m_pOuter;
   CIOleItemContainer(IUnknown *);

   STDMETHODIMP QueryInterface(REFIID, LPVOID *);
   STDMETHODIMP_(ULONG) AddRef(void);
   STDMETHODIMP_(ULONG) Release(void);

   STDMETHODIMP ParseDisplayName(IBindCtx*,LPOLESTR,ULONG*,IMoniker**);

   STDMETHODIMP EnumObjects(DWORD,LPENUMUNKNOWN*);
   STDMETHODIMP LockContainer(BOOL);

   STDMETHODIMP GetObject(LPOLESTR,DWORD,IBindCtx*,REFIID,void**);
   STDMETHODIMP GetObjectStorage(LPOLESTR,IBindCtx*,REFIID,void**);
   STDMETHODIMP IsRunning(LPOLESTR);
};

class CIOleClientSite : public IOleClientSite
{
protected:
   ULONG          m_cRef;
   class CContainer    *m_pContainer;
   LPUNKNOWN         m_pUnkOuter;

public:
   CIOleClientSite(class CContainer *);
   ~CIOleClientSite(void);

   STDMETHODIMP QueryInterface(REFIID, LPVOID *);
   STDMETHODIMP_(ULONG) AddRef(void);
   STDMETHODIMP_(ULONG) Release(void);

   STDMETHODIMP SaveObject(void);
   STDMETHODIMP GetMoniker(DWORD, DWORD, LPMONIKER *);
   STDMETHODIMP GetContainer(LPOLECONTAINER *);
   STDMETHODIMP ShowObject(void);
   STDMETHODIMP OnShowWindow(BOOL);
   STDMETHODIMP RequestNewObjectLayout(void);
};

typedef CIOleClientSite *PIOLECLIENTSITE;

class CIAdviseSink : public IAdviseSink2
{
protected:
   ULONG          m_cRef;
   class CContainer  *m_pContainer;
   LPUNKNOWN         m_pUnkOuter;

public:
   CIAdviseSink(class CContainer *);
   ~CIAdviseSink(void);

   STDMETHODIMP QueryInterface(REFIID, LPVOID *);
   STDMETHODIMP_(ULONG) AddRef(void);
   STDMETHODIMP_(ULONG) Release(void);

   STDMETHODIMP_(void)  OnDataChange(LPFORMATETC, LPSTGMEDIUM);
   STDMETHODIMP_(void)  OnViewChange(DWORD, LONG);
   STDMETHODIMP_(void)  OnRename(LPMONIKER);
   STDMETHODIMP_(void)  OnSave(void);
   STDMETHODIMP_(void)  OnClose(void);
   STDMETHODIMP_(void)  OnLinkSrcChange(LPMONIKER);
};


typedef CIAdviseSink *PIADVISESINK;


class CIOleInPlaceSite : public IOleInPlaceSite
{
protected:
   ULONG          m_cRef;
   class CContainer   *m_pContainer;

public:
   LPUNKNOWN         m_pUnkOuter;

   CIOleInPlaceSite(class CContainer *);
   ~CIOleInPlaceSite(void);

   STDMETHODIMP QueryInterface(REFIID, LPVOID *);
   STDMETHODIMP_(ULONG) AddRef(void);
   STDMETHODIMP_(ULONG) Release(void);

   STDMETHODIMP GetWindow(HWND *);
   STDMETHODIMP ContextSensitiveHelp(BOOL);
   STDMETHODIMP CanInPlaceActivate(void);
   STDMETHODIMP OnInPlaceActivate(void);
   STDMETHODIMP OnUIActivate(void);
   STDMETHODIMP GetWindowContext(LPOLEINPLACEFRAME *
               , LPOLEINPLACEUIWINDOW *, LPRECT, LPRECT
               , LPOLEINPLACEFRAMEINFO);
   STDMETHODIMP Scroll(SIZE);
   STDMETHODIMP OnUIDeactivate(BOOL);
   STDMETHODIMP OnInPlaceDeactivate(void);
   STDMETHODIMP DiscardUndoState(void);
   STDMETHODIMP DeactivateAndUndo(void);
   STDMETHODIMP OnPosRectChange(LPCRECT);
};

typedef CIOleInPlaceSite *PIOLEINPLACESITE;


class CIOleInPlaceFrame : public IOleInPlaceFrame
{
protected:
   ULONG          m_cRef;
   class CContainer  *m_pContainer;

public:
   LPUNKNOWN         m_pUnkOuter;

   CIOleInPlaceFrame(class CContainer *);
   ~CIOleInPlaceFrame(void);

   STDMETHODIMP QueryInterface (REFIID riid, LPVOID FAR* ppv);
   STDMETHODIMP_(ULONG) AddRef ();
   STDMETHODIMP_(ULONG) Release ();

   STDMETHODIMP GetWindow (HWND FAR* lphwnd);
   STDMETHODIMP ContextSensitiveHelp (BOOL fEnterMode);

   // *** IOleInPlaceUIWindow methods ***
   STDMETHODIMP GetBorder (LPRECT lprectBorder);
   STDMETHODIMP RequestBorderSpace (LPCBORDERWIDTHS lpborderwidths);
   STDMETHODIMP SetBorderSpace (LPCBORDERWIDTHS lpborderwidths);
   //@@WTK WIN32, UNICODE
   //STDMETHODIMP SetActiveObject (LPOLEINPLACEACTIVEOBJECT lpActiveObject,LPCSTR lpszObjName);
   STDMETHODIMP SetActiveObject (LPOLEINPLACEACTIVEOBJECT lpActiveObject,LPCOLESTR lpszObjName);

   // *** IOleInPlaceFrame methods ***
   STDMETHODIMP InsertMenus (HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths);
   STDMETHODIMP SetMenu (HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject);
   STDMETHODIMP RemoveMenus (HMENU hmenuShared);
   //@@WTK WIN32, UNICODE
   //STDMETHODIMP SetStatusText (LPCSTR lpszStatusText);
   STDMETHODIMP SetStatusText (LPCOLESTR lpszStatusText);
   STDMETHODIMP EnableModeless (BOOL fEnable);
   STDMETHODIMP TranslateAccelerator (LPMSG lpmsg, WORD wID);
};

class CIOleControlSite : public IOleControlSite
{
protected:
   ULONG          m_cRef;
   class CContainer* m_pContainer;
   LPUNKNOWN         m_pUnkOuter;

public:
   CIOleControlSite(class CContainer *);
   ~CIOleControlSite(void);

   STDMETHODIMP QueryInterface(REFIID, LPVOID *);
   STDMETHODIMP_(ULONG) AddRef(void);
   STDMETHODIMP_(ULONG) Release(void);

   STDMETHODIMP OnControlInfoChanged(void);
   STDMETHODIMP LockInPlaceActive(BOOL);
   STDMETHODIMP GetExtendedControl(LPDISPATCH *);
   STDMETHODIMP TransformCoords(POINTL *, POINTF *, DWORD);
   STDMETHODIMP TranslateAccelerator(LPMSG, DWORD);
   STDMETHODIMP OnFocus(BOOL);
   STDMETHODIMP ShowPropertyFrame(void);
};

typedef CIOleInPlaceFrame *PIOLEINPLACEFRAME;

/***************************************************************************/

class CContainer : public IServiceProvider
{
   friend CIOleClientSite;
   friend CIAdviseSink;
   friend CIOleInPlaceSite;
   friend CIOleInPlaceFrame;

   //CONTROLMOD
   // friend CIOleControlSite;
   // friend CIPropertyNotifySink;
   //End CONTROLMOD

public:
   BOOL              m_OleInited;
   ULONG             m_cRef;
   IStorage*            m_pIStorage;
   LPOLEOBJECT          m_pOleObject;
   HWND m_hWnd;
   BOOL                 m_bIE4;

   //Our interfaces
   PIADVISESINK         m_pIAdviseSink;
   PIOLEINPLACESITE     m_pIOleInPlaceSite;
   PIOLECLIENTSITE      m_pIOleClientSite;
   PIOLEINPLACEFRAME    m_pIOleInPlaceFrame;
   CIOleItemContainer * m_pIOleItemContainer;
   CAutomateContent *      m_pIDispatch;
   PIOLECONTROLSITE     m_pIOleControlSite;
   // CHtmlHelpCallback *  m_pCallback;
   IDocHostUIHandler*   m_pCDocHostUIHandler;
   IDocHostShowUI*      m_pCDocHostShowUI;
   IOleInPlaceActiveObject   *m_pInPlaceActive;
   DWORD             m_dwEventCookie;

public:
   CContainer();
   ~CContainer(void);

   HRESULT ShutDown(void);

   class IWebBrowserImpl*      m_pWebBrowser;
   class IWebBrowserAppImpl*   m_pWebBrowserApp;
   class DWebBrowserEventsImpl* m_pWebBrowserEvents;
   LPOLECOMMANDTARGET       m_pIE3CmdTarget;
   void     UIDeactivateIE();
   HRESULT  Create(HWND hWnd, LPRECT lpRect, BOOL bInstallEventSink = TRUE);
   void     SetFocus(BOOL bForceActivation = FALSE);
   void     SizeIt(int width, int height);
   LRESULT  ForwardMessage(UINT msg, WPARAM wParam, LPARAM lParam);
   unsigned TranslateMessage(MSG * pMsg);
   BOOL     IsUIActive(void) { return m_pInPlaceActive != NULL; }
   HWND  m_hwndChild;

   // IUnknown
   //
   STDMETHODIMP QueryInterface(REFIID, LPVOID *);
   STDMETHODIMP_(ULONG) AddRef(void);
   STDMETHODIMP_(ULONG) Release(void);

   // IServiceProvider

   STDMETHOD(QueryService)(REFGUID, REFIID, LPVOID *);

#ifdef _DEBUG
   BOOL m_fDeleting;
#endif
};


typedef CContainer *PCONTAINER;

#if 0

class CIPropertyNotifySink : public IPropertyNotifySink
{
protected:
   ULONG       m_cRef;
   class CContainer  *m_pContainer;
   LPUNKNOWN      m_pUnkOuter;

public:
   CIPropertyNotifySink(class CContainer *, LPUNKNOWN);
   ~CIPropertyNotifySink(void);

   STDMETHODIMP QueryInterface(REFIID, LPVOID *);
   STDMETHODIMP_(ULONG) AddRef(void);
   STDMETHODIMP_(ULONG) Release(void);

   STDMETHODIMP OnChanged(DISPID);
   STDMETHODIMP OnRequestEdit(DISPID);
};

#endif

#endif //_CONTAIN_H_