text: // Copyright (c)1997-1999 Microsoft Corporation, All Rights Reserved
  
  #ifndef _proxyframe_h_
  #define _proxyframe_h_
  
  #include <docobj.h>
  #include <ocidl.h>
  #include <WinINet.h>
  #include "plgprot.h"
  #include "dhtmledit.h"
  
  // This was given in email from Josh Kaplan to Steve Isaac in response
  // to what command is necessary so that Trident won't clear the undo
  // stack on setAttribute calls. The command takes a BOOL -- True == good behavior
  #define IDM_GOOD_UNDO_BEHAVIOR 6049
  
  typedef struct _CommandMap
  {
  	DHTMLEDITCMDID typeLibCmdID;
  	ULONG cmdID;
  	BOOL bOutParam;
  
  } CommandMap;
  
  #ifdef LATE_BIND_URLMON_WININET
  typedef HRESULT (WINAPI *PFNCoInternetCombineUrl)(LPCWSTR,LPCWSTR,DWORD,LPWSTR,DWORD,DWORD*,DWORD);             
  typedef HRESULT (WINAPI *PFNCoInternetParseUrl)(LPCWSTR,PARSEACTION,DWORD,LPWSTR,DWORD,DWORD*,DWORD);
  typedef HRESULT (WINAPI *PFNCreateURLMoniker)(LPMONIKER,LPCWSTR,LPMONIKER FAR*);
  typedef HRESULT (WINAPI *PFNCoInternetGetSession)(DWORD,IInternetSession**,DWORD);
  typedef HRESULT (WINAPI *PFNURLOpenBlockingStream)(LPUNKNOWN,LPCSTR,LPSTREAM*,DWORD,LPBINDSTATUSCALLBACK);
  
  typedef BOOL (WINAPI *PFNDeleteUrlCacheEntry)(LPCSTR);
  typedef BOOL (WINAPI *PFNInternetCreateUrl)(LPURL_COMPONENTSA,DWORD,LPSTR,LPDWORD);
  typedef BOOL (WINAPI *PFNInternetCrackURL)(LPCSTR,DWORD,DWORD,LPURL_COMPONENTSA);
  #endif // LATE_BIND_URLMON_WININET
  
  
  
  class CDHTMLEdProtocolInfo;
  typedef CComObject<CDHTMLEdProtocolInfo> 	*PProtocolInfo;
  
  class CDHTMLSafe;
  
  
  typedef enum DENudgeDirection {
  	deNudgeUp = 8000,
  	deNudgeDown,
  	deNudgeLeft,
  	deNudgeRight,
  };
  
  
  class CProxyFrame : public IOleInPlaceFrame, public IOleCommandTarget,
  	public IBindStatusCallback, public IAuthenticate
  {
  public:
  		CProxyFrame(CDHTMLSafe* pCtl);
  		~CProxyFrame();
  
  		HRESULT Init(IUnknown* pUnk, IUnknown** ppUnkTriEdit);
  		HRESULT PreActivate();
  		HRESULT Activate();
  		void    UIDeactivate();
  		HRESULT Close();
  		HRESULT LoadInitialDoc();
  		HRESULT LoadDocument(BSTR path, BOOL bfIsURL = FALSE);
  		HRESULT FilterSourceCode ( BSTR bsSourceIn, BSTR* pbsSourceOut );
  		HRESULT Print( BOOL bfWithUI );
  		HRESULT SaveDocument(BSTR path);
  		HRESULT SetContextMenu(LPVARIANT pVarMenuStrings, LPVARIANT pVarMenuStates);
  		HRESULT SetContextMenuSA(LPVARIANT pVarMenuStrings, LPVARIANT pVarMenuStates);
  		HRESULT SetContextMenuDispEx(LPVARIANT pVarMenuStrings, LPVARIANT pVarMenuStates);
  		HRESULT GetBrowseMode ( VARIANT_BOOL  *pVal );
  		HRESULT SetBrowseMode ( VARIANT_BOOL  newVal );
  		HRESULT GetDocumentTitle ( CComBSTR&  bstrTitle );
  		HRESULT GetDivOnCr ( VARIANT_BOOL *pVal );
  		HRESULT SetDivOnCr ( VARIANT_BOOL newVal );
  		HRESULT GetBusy ( VARIANT_BOOL *pVal );
  		HRESULT RefreshDoc ( void );
  
  		HRESULT HrTridentSetPropBool(ULONG cmd, BOOL bVal);
  		HRESULT HrTridentGetPropBool(ULONG cmd, BOOL& bVal);
  
  		HRESULT HrMapCommand(DHTMLEDITCMDID typeLibCmdID, ULONG* cmdID, const GUID** ppguidCmdGroup, BOOL* bpInParam);
  		HRESULT HrExecCommand(const GUID* pguidCmdGroup, ULONG ucmdID, OLECMDEXECOPT cmdexecopt, VARIANT* pVarIn, VARIANT* pVarOut);
  		HRESULT HrMapExecCommand(DHTMLEDITCMDID deCommand, OLECMDEXECOPT cmdexecopt, VARIANT* pVarIn, VARIANT* pVarOut);
  		HRESULT HrExecGenericCommands(const GUID* pguidCmdGroup, ULONG cmdID, OLECMDEXECOPT cmdexecopt, LPVARIANT pVarInput, BOOL bOutParam);
  		HRESULT HrExecGetBlockFmtNames(LPVARIANT pVarInput);
  		HRESULT HrExecInsertTable(LPVARIANT pVarInput);
  		HRESULT HrExecGetColor(DHTMLEDITCMDID deCommand, ULONG ulMappedCommand, LPVARIANT pVarOutput);
  		HRESULT HrExecSetFontSize(LPVARIANT pVarInput);
  
  		HRESULT HrQueryStatus(const GUID* pguidCmdGroup, ULONG ucmdID, OLECMDF* cmdf);
  		HRESULT HrMapQueryStatus( DHTMLEDITCMDID ucmdID, DHTMLEDITCMDF* cmdf);
  
  		HRESULT HrGetDoc(IHTMLDocument2 **ppDoc);
  		HRESULT HrGetTableSafeArray(IDEInsertTableParam* pTable, LPVARIANT pVarIn);
  
  		HRESULT HrTranslateAccelerator(LPMSG lpmsg);
  		HRESULT HrHandleAccelerator(LPMSG lpmsg);
  		HRESULT HrNudge(DENudgeDirection dir);
  		HRESULT HrToggleAbsolutePositioned();
  		HRESULT HrHyperLink();
  		HRESULT HrIncreaseIndent();
  		HRESULT HrDecreaseIndent();
  
  		void UpdateObjectRects(void);
  		void SetParent ( HWND hwndControl );
  		void Show ( WPARAM nCmdShow );
  		LRESULT OnSetFocus(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
  
  		void OnReadyStateChanged(READYSTATE readyState);
  
  		inline CDHTMLSafe* GetControl() {
  			return m_pCtl;
  		};
  
  		inline BOOL IsCreated() {
  			return m_fCreated;
  		};
  
  		inline BOOL IsActivated() {
  			return m_fActivated;
  		};
  
  		inline SAFEARRAY* GetMenuStrings() {
  			return m_pMenuStrings;
  		};
  
  		inline SAFEARRAY* GetMenuStates() {
  			return m_pMenuStates;
  		};
  
  		HRESULT GetContainer ( LPOLECONTAINER* ppContainer );
  
  		HRESULT GetCurDocNameWOPath ( CComBSTR& bstrDocName );
  		HRESULT GetBaseURL ( CComBSTR& bstrBaseURL );
  		HRESULT SetBaseURL ( CComBSTR& bstrBaseURL );
  		HRESULT GetFilteredStream ( IStream** ppStream );
  		HRESULT GetSecurityURL (CComBSTR& bstrSecurityURL );
  
  protected:
  
  		HRESULT HrSetRuntimeProperties();
  		HRESULT HrSetDocLoadedProperties();
  		HRESULT SetBaseURLFromBaseHref ( void );
  		HRESULT SetBaseURLFromCurDocPath ( BOOL bfIsURL );
  		HRESULT SetBaseURLFromURL ( const CComBSTR& bstrURL );
  		HRESULT SetBaseURLFromFileName ( const CComBSTR& bstrFName );
  		HRESULT SetBaseUrlFromFileUrlComponents ( URL_COMPONENTS & urlc );
  		HRESULT SetBaseUrlFromUrlComponents ( URL_COMPONENTS & urlc );
  
  		typedef enum TriEditState {
  			ESTATE_NOTCREATED = 0,
  			ESTATE_CREATED,
  			ESTATE_PREACTIVATING,
  			ESTATE_ACTIVATING,
  			ESTATE_ACTIVATED,
  		} TriEditState;
  
  		void ChangeState(TriEditState state) { m_state = state; }
  		inline TriEditState GetState() { return m_state; }
  
  		HRESULT GetSelectionPos ( LPPOINT lpWhere );
  
  public: // properties
  
  		HRESULT HrSetPropActivateControls(BOOL activateControls);
  		HRESULT HrGetPropActivateControls(BOOL& activateControls);
  
  		HRESULT HrSetPropActivateApplets(BOOL activateApplets);
  		HRESULT HrGetPropActivateApplets(BOOL& activateApplets);
  
  		HRESULT HrSetPropActivateDTCs(BOOL activateDTCs);
  		HRESULT HrGetPropActivateDTCs(BOOL& activateDTCs);
  
  		HRESULT HrSetPropShowAllTags(BOOL showAllTags);
  		HRESULT HrGetPropShowAllTags(BOOL& showAllTags);
  
  		HRESULT HrSetPropShowBorders(BOOL showBorders);
  		HRESULT HrGetPropShowBorders(BOOL& showBorders);
  
  		HRESULT HrSetDisplay3D(BOOL bVal);
  		HRESULT HrGetDisplay3D(BOOL& bVal);
  
  		HRESULT HrSetScrollbars(BOOL bVal);
  		HRESULT HrGetScrollbars(BOOL& bVal);
  
  		HRESULT HrSetDisplayFlatScrollbars(BOOL bVal);
  		HRESULT HrGetDisplayFlatScrollbars(BOOL& bVal);
  
  		HRESULT HrSetDocumentHTML(BSTR bVal);
  		HRESULT HrGetDocumentHTML(BSTR* bVal);
  
  		HRESULT HrSetPreserveSource(BOOL bVal);
  		HRESULT HrGetPreserveSource(BOOL& bVal);
  
  		HRESULT HrSetAbsoluteDropMode(BOOL dropMode);
  		HRESULT HrGetAbsoluteDropMode(BOOL& dropMode);
  
  		HRESULT HrSetSnapToGrid(BOOL snapToGrid);
  		HRESULT HrGetSnapToGrid(BOOL& snapToGrid);
  
  		HRESULT HrSetSnapToGridX(LONG snapToGridX);
  		HRESULT HrGetSnapToGridX(LONG& snapToGridX);
  
  		HRESULT HrSetSnapToGridY(LONG snapToGridY);
  		HRESULT HrGetSnapToGridY(LONG& snapToGridY);
  
  		HRESULT HrGetIsDirty(BOOL& bVal);
  
  		HRESULT HrGetCurrentDocumentPath(BSTR* bVal);
  
  		// IBindStatusCallback trivial implementation, for synchronous transfer ONLY:
  		STDMETHOD(GetBindInfo)(DWORD*,BINDINFO*) { return E_NOTIMPL; }
  		STDMETHOD(OnStartBinding)(DWORD, IBinding*) { return S_OK; }
  		STDMETHOD(GetPriority)(LONG *pnPriority) { *pnPriority = THREAD_PRIORITY_NORMAL; return S_OK; }
  		STDMETHOD(OnProgress)(ULONG, ULONG, ULONG, LPCWSTR);
  		STDMETHOD(OnDataAvailable)(DWORD, DWORD, FORMATETC*, STGMEDIUM*) { return E_NOTIMPL; }
  		STDMETHOD(OnObjectAvailable)(REFIID, IUnknown*) { return E_NOTIMPL; }
  		STDMETHOD(OnLowResource)(DWORD) { return E_NOTIMPL; }
  		STDMETHOD(OnStopBinding)(HRESULT, LPCWSTR) { return S_OK; }
  
  		// IAuthenticate
  		STDMETHOD(Authenticate)(HWND *phwnd, LPWSTR *pszUserName, LPWSTR *pszPassword)
  		{ *phwnd = m_hWndObj; *pszUserName = NULL; *pszPassword = NULL; return S_OK; }
  
  public:
  		//Shared IUnknown implementation
          STDMETHODIMP         QueryInterface(REFIID, void **);
          STDMETHODIMP_(ULONG) AddRef(void);
          STDMETHODIMP_(ULONG) Release(void);
  
  		//IOleInPlaceFrame implementation
          STDMETHODIMP         GetWindow(HWND *);
          STDMETHODIMP         ContextSensitiveHelp(BOOL);
          STDMETHODIMP         GetBorder(LPRECT);
          STDMETHODIMP         RequestBorderSpace(LPCBORDERWIDTHS);
          STDMETHODIMP         SetBorderSpace(LPCBORDERWIDTHS);
          STDMETHODIMP         SetActiveObject(LPOLEINPLACEACTIVEOBJECT
                                   , LPCOLESTR);
          STDMETHODIMP         InsertMenus(HMENU, LPOLEMENUGROUPWIDTHS);
          STDMETHODIMP         SetMenu(HMENU, HOLEMENU, HWND);
          STDMETHODIMP         RemoveMenus(HMENU);
          STDMETHODIMP         SetStatusText(LPCOLESTR);
          STDMETHODIMP         EnableModeless(BOOL);
          STDMETHODIMP         TranslateAccelerator(LPMSG, WORD);
  
  		//IOleCommandTarget
          STDMETHODIMP QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds
              , OLECMD prgCmds[], OLECMDTEXT *pCmdText);
          
          STDMETHODIMP Exec(const GUID *pguidCmdGroup, DWORD nCmdID
              , DWORD nCmdexecopt, VARIANTARG *pvaIn, VARIANTARG *pvaOut);
  
  		HRESULT OnTriEditEvent ( const GUID& iidEventInterface, DISPID dispid );	
  
  		HWND	GetDocWindow () { return m_hWndObj; }
  		HRESULT GetScrollPos ( LPPOINT lpPos );
  		HRESULT CheckCrossZoneSecurity ( BSTR url );
  		HRESULT	CheckCrossZoneSecurityOfSelection ( void );
  		void	ClearSFSRedirect ( void ) { m_bfSFSRedirect = FALSE; }
  		BOOL	GetSFSRedirect ( void ) { return m_bfSFSRedirect; }
  
  		void	ClearLoadingFlag ( void ) { m_bfIsLoading = FALSE; }
  
  private:
  		HRESULT RegisterPluggableProtocol ( void );
  		HRESULT UnRegisterPluggableProtocol ( void );
  		HRESULT LoadBSTRDeferred ( BSTR bVal );
  		void AssureActivated ( void );
  		WCHAR* GetInitialHTML ( void );
  		void InitializeDocString ( void ) { m_bstrInitialDoc = GetInitialHTML (); }
  		BOOL IsMissingBackSlash ( BSTR path, BOOL bfIsURL );
  		HRESULT SetDirtyFlag ( BOOL bfMakeDirty );
  #ifdef LATE_BIND_URLMON_WININET
  		BOOL DynLoadLibraries ( void );
  		void DynUnloadLibraries ( void );
  #endif // LATE_BIND_URLMON_WININET
  
  private:
  
          ULONG           m_cRef;
  		TriEditState	m_state;
  
  		class CDHTMLSafe*m_pCtl; // back pointer to control
          class CSite*	m_pSite;  // Site holding object        
  
  		BOOL			m_fCreated;
  		BOOL			m_fActivated;
  		LPUNKNOWN		m_pUnkTriEdit;
          IOleInPlaceActiveObject *m_pIOleIPActiveObject;
  		HWND			m_hWndObj;			// Trident's window
  
  		READYSTATE		m_readyState;
  
  		DWORD			m_dwFilterFlags;	// Flags to use for the next filter in
  		DWORD			m_dwFilterOutFlags;	// Flags used on the last filter out
  
  		SAFEARRAY*		m_pMenuStrings;
  		SAFEARRAY*		m_pMenuStates;
  
  		BOOL m_fActivateApplets;			// takes affect at init only
  		BOOL m_fActivateControls;		// takes affect at init only
  		BOOL m_fActivateDTCs;			// takes affect at init only
  
  		BOOL m_fShowAllTags;				// can be set anytime
  		BOOL m_fShowBorders;				// can be set anytime
  
  		BOOL m_fDialogEditing;				// takes affect at init only
  		BOOL m_fDisplay3D;					// takes affect at init only
  		BOOL m_fScrollbars;					// takes affect at init only
  		BOOL m_fDisplayFlatScrollbars;		// takes affect at init only
  		BOOL m_fContextMenu;				// takes affect at init only
  
  		BOOL m_fPreserveSource;			// takes affect at init only
  
  		BOOL m_fAbsoluteDropMode;
  		BOOL m_fSnapToGrid;
  		LONG m_ulSnapToGridX;
  		LONG m_ulSnapToGridY;
  
  		CComBSTR m_bstrInitialDoc;
  		CComBSTR m_bstrCurDocPath;
  		CComBSTR m_bstrBaseURL;
  		VARIANT_BOOL	m_vbBrowseMode;
  		PProtocolInfo	m_pProtInfo;
  		WCHAR	m_wszProtocol[16];
  		WCHAR	m_wszProtocolPrefix[16];
  		BOOL	m_bfIsURL;
  		CComBSTR	m_bstrLoadText;
  		HWND	m_hwndRestoreFocus;
  		VARIANT_BOOL	m_vbUseDivOnCr;
  		BOOL	m_bfIsLoading;
  		BOOL	m_bfBaseURLFromBASETag;
  		BOOL	m_bfPreserveDirtyFlagAcrossBrowseMode;
  		HRESULT	m_hrDeferredLoadError;
  
  		BOOL	m_bfModeSwitched;
  		BOOL	m_bfReloadAttempted;
  		BOOL	m_bfSFSRedirect;
  
  #ifdef LATE_BIND_URLMON_WININET
  		HMODULE						m_hUlrMon;
  		HMODULE						m_hWinINet;
  
  public:
  		PFNCoInternetCombineUrl		m_pfnCoInternetCombineUrl;
  		PFNCoInternetParseUrl		m_pfnCoInternetParseUrl;
  		PFNCreateURLMoniker			m_pfnCreateURLMoniker;
  		PFNCoInternetGetSession		m_pfnCoInternetGetSession;
  		PFNURLOpenBlockingStream	m_pfnURLOpenBlockingStream;
  
  		PFNDeleteUrlCacheEntry		m_pfnDeleteUrlCacheEntry;
  		PFNInternetCreateUrl		m_pfnInternetCreateUrl;
  		PFNInternetCrackURL			m_pfnInternetCrackUrl;
  #endif // LATE_BIND_URLMON_WININET
  };
  
  #endif
  