// Copyright 1995-1997 Microsoft Corporation. All Rights Reserved. #if _MSC_VER > 1000 #pragma once #endif #ifndef _HHCTRL_H_ #define _HHCTRL_H_ #include "IPServer.H" #include "CtrlObj.H" #ifndef __IHHCtrl_FWD_DEFINED__ #include "hhIfc.H" #endif #include "Dispids.H" #include "internet.h" #include #include "sitemap.h" #include "hhamsgs.h" #include "cindex.h" #include "ctoc.h" #include "prthook.h" #include typedef struct tagHHCtrlCTLSTATE { char *bmpPath; DATE endDate; } HHCTRLCTLSTATE; enum BMP_DOWNLOAD_STATES { bdsNoBitsYet, bdsGotFileHeader, bdsGotBitmapInfo, bdsGettingBits, bdsBitsAreDone }; class CHtmlHelpControl; // forward reference class IWebBrowserAppImpl; // forward reference HWND JumpToUrl(IUnknown* pUnkOuter, HWND hwndParent, SITEMAP_ENTRY* pSiteMapEntry, CInfoType *pInfoType, CSiteMap* pSiteMap, SITE_ENTRY_URL* pUrl, IWebBrowserAppImpl* pWebApp = NULL); #if 0 //enable for subset filtering BOOL ChooseInformationTypes(CInfoType *pInfoType, CSiteMap* pSiteMap, HWND hwndParent, CHtmlHelpControl* phhctrl, CHHWinType* m_phh); #else BOOL ChooseInformationTypes(CInfoType *pInfoType, CSiteMap* pSiteMap, HWND hwndParent, CHtmlHelpControl* phhctrl); #endif void DisplayAuthorInfo(CInfoType *pInfoType, CSiteMap* pSiteMap, SITEMAP_ENTRY* pSiteMapEntry, HWND hwndParent, CHtmlHelpControl* phhctrl); HRESULT OnWordWheelLookup( PSTR pszKeywords, CExCollection* pExCollection, PCSTR pszDefaultTopic = NULL, POINT* ppt = NULL, HWND hWndParent = NULL, BOOL bDialog = TRUE, BOOL bKLink = TRUE, BOOL bTestMode = FALSE, BOOL bSkipCurrent = FALSE, BOOL bAlwaysShowList = FALSE, BOOL bAlphaSortHits = TRUE, PCSTR pszWindow = NULL); class CHtmlHelpControl : public CInternetControl, public IHHCtrl, public ISupportErrorInfo MI2_COUNT( CHtmlHelpControl ) { public: // IUnknown methods DECLARE_STANDARD_UNKNOWN(); // IDispatch methods DECLARE_STANDARD_DISPATCH(); // ISupportErrorInfo methods DECLARE_STANDARD_SUPPORTERRORINFO(); // IHHCtrl methods // OLE Control stuff follows: STDMETHOD(SetObjectRects)(LPCRECT lprcPosRect,LPCRECT lprcClipRect) ; CHtmlHelpControl(IUnknown *pUnkOuter); virtual ~CHtmlHelpControl(); #ifndef PPGS STDMETHOD(DoVerb)(LONG iVerb, LPMSG lpmsg, IOleClientSite *pActiveSite, LONG lindex, HWND hwndParent, LPCRECT lprcPosRect); #endif STDMETHOD_(void, OnClick)(THIS); // static creation function. all controls must have one of these! static IUnknown *Create(IUnknown *); private: // overridables that the control must implement. STDMETHOD(LoadBinaryState)(IStream *pStream); STDMETHOD(SaveBinaryState)(IStream *pStream); STDMETHOD(LoadTextState)(IPropertyBag *pPropertyBag, IErrorLog *pErrorLog); STDMETHOD(SaveTextState)(IPropertyBag *pPropertyBag, BOOL fWriteDefault); STDMETHOD(OnDraw)(DWORD dvaspect, HDC hdcDraw, LPCRECTL prcBounds, LPCRECTL prcWBounds, HDC hicTargetDev, BOOL fOptimize); STDMETHOD(SetClientSite)(IOleClientSite *pClientSite); // Exposed methods STDMETHOD(Click)(); STDMETHOD(HHClick)(); STDMETHOD(Print)(); STDMETHOD(syncURL)(BSTR pszUrl); STDMETHOD(TCard)(WPARAM wParam, LPARAM lParam); STDMETHOD(get_Image) (THIS_ BSTR* path); STDMETHOD(put_Image)(BSTR path); STDMETHOD(TextPopup)(BSTR pszText, BSTR pszFont, int horzMargins, int vertMargins, COLORREF clrForeground, COLORREF clrBackground); LRESULT WindowProc(UINT msg, WPARAM wParam, LPARAM lParam); void JumpToUrl(SITEMAP_ENTRY* pSiteMapEntry, CSiteMap* pSiteMap, SITE_ENTRY_URL* pUrl = NULL); void OnLButton(WPARAM wParam, LPARAM lParam); BOOL OnSetExtent(const SIZE *pSize); void ProcessPadding(PCSTR psz); BOOL RegisterClassData(void); void SetActionData(PCSTR psz); BOOL AfterCreateWindow(void); BOOL BeforeCreateWindow(DWORD *pdwWindowStyle, DWORD *pdwExWindowStyle, LPSTR pszWindowTitle); HRESULT InternalQueryInterface(REFIID, void **); HRESULT OnData( DISPID id, DWORD grfBSCF,IStream * bitstrm, DWORD amount ); BOOL OnSpecialKey(LPMSG); BOOL ShouldCreateWindow(); public: void doAboutBox(); BOOL ConvertToCacheFile(PCSTR pszSrc, PSTR pszDst); void FillGeneralInformation(HHA_GEN_INFO* pgetInfo); // BOOL ChooseInformationTypes(CSiteMap* pSiteMap, HWND hwndParent) { return ::ChooseInformationTypes(pSiteMap, hwndParent, this); } void DisplayAuthorInfo(CSiteMap* pSiteMap, SITEMAP_ENTRY* pSiteMapEntry) { ::DisplayAuthorInfo(m_pInfoType, pSiteMap, pSiteMapEntry, m_hwnd, this); } void OnKeywordSearch(int idCommand); BOOL OnCopySample(void); BOOL LocateSFLFile(PCSTR *,PCSTR *, BOOL); void AuthorMsg(UINT idStringFormatResource, PCSTR pszSubString = "") { ::AuthorMsg(idStringFormatResource, pszSubString, m_hwndParent, this); } _inline IUnknown* GetIUnknown() { return m_pUnkOuter; } HRESULT SendEvent(LPCTSTR pszEventString); BOOL OnAKLink(BOOL fKLink = TRUE, BOOL bTestMode = FALSE ); HWND GetHtmlHelpFrameWindow() ; // Tunnels from the ActiveX control through IE to get to the HWND of HHCTRL. UINT GetCodePage(void) { return m_CodePage; } INT GetCharset(void) { return m_Charset; } HFONT GetContentFont(void) { return m_hfont; } // TOC functions BOOL LoadContentsFile(PCSTR pszMasterFile); void OnHelpTopics(void); // Index functions BOOL LoadIndexFile(PCSTR pszMasterFile); void OnSizeIndex(LPRECT prc); HRESULT UpdateImage(); // Related Topics functions void OnRelatedMenu(); void OnRelatedCommand(int idCommand); // Splash functions void CreateSplash(void); // Button and Static text funcions void OnDrawStaticText(DRAWITEMSTRUCT* pdis); BOOL CreateOnClickButton(void); // private state information. HRESULT SetBmpPath(IStream *); CTRL_ACTION m_action; IMAGE_TYPE m_imgType; PCSTR m_pszActionData; int m_idBitmap; // bitmap to display PCSTR m_pszBitmap; // bitmap parameter PCSTR m_pszWebMap; // webmap file DWORD m_flags[MAX_FLAGS]; // author-specified flags HBRUSH m_hbrBackGround; // background brush COLORREF m_clrFont; // Font color BOOL m_fBuiltInImage; HGDIOBJ m_hImage; int m_hpadding; // horizontal padding around index, contents, and find int m_vpadding; // vertical padding around index, contents, and find HWND m_hwndHelp; // HTML Help window HWND m_hwndDisplayButton; // regular button handle PCSTR m_pszEventString; // string to send to event handler PCSTR m_pszFrame; // frame to display jump in PCSTR m_pszWindow; // window to display jump in PCSTR m_pszDefaultTopic; // where to jump if alink/klink fails class IWebBrowserAppImpl* m_pWebBrowserApp; // Pointer the IE object model CTable* m_ptblItems; // for A/KLinks CTable* m_ptblTitles; // for A/KLinks CTable* m_ptblURLs; // for A/KLinks CTable* m_ptblLocations; // for A/KLinks CSiteMap* m_pSiteMap; // used by Related Topics and Keyword Search CInfoType* m_pInfoType; IFont* m_pIFont; // REVIEW: using BOOLs increases data size, bitflags would increase // code size. Which is better (multiple data seg, single code seg)? BOOL m_fButton; BOOL m_fWinHelpPopup; BOOL m_fPopupMenu; // TRUE to display popup menu instead of dialog WCHAR* m_pwszButtonText; // bitmap or text RECT m_rcButton; // button window dimensions CToc* m_ptoc; CIndex* m_pindex; //CSearch* m_pSearch; BOOL m_fIcon; // bitmap is an icon or a cursor HHCTRLCTLSTATE m_state; HDC m_dc; BMP_DOWNLOAD_STATES m_readystate; DWORD m_oldSize; BYTE* m_pSelectedIndexInfoTypes; COLORREF m_clrFontDisabled; // disabled Font color (disabled) COLORREF m_clrFontLink; // Link Font color COLORREF m_clrFontLinkVisited; // Visited Link Font color COLORREF m_clrFontHover; // Hover Font color private: WNDPROC m_lpfnlStaticTextControlWndProc; static LRESULT StaticTextControlSubWndProc(HWND, UINT, WPARAM, LPARAM); char m_szRawAction[256]; char m_szFontSpec[256]; BOOL bSharedFont; UINT m_CodePage; INT m_Charset; HFONT m_hfont; // author-specified font to use for child windows RECT m_rect; }; BOOL LoadGif(PCSTR pszFile, HBITMAP* phbmp, HPALETTE* phpal, CHtmlHelpControl* phhctrl); BOOL ShortCut(CHtmlHelpControl* phhctrl, LPCSTR pszString1, LPCSTR pszString2, HWND hwndMsgOwner); #ifdef CHIINDEX #define PrintTopics #else void PrintTopics(int action, CToc* ptoc, IWebBrowserAppImpl* pWebApp, HWND hWndHelp = NULL); #endif // TODO: if you have an array of verbs, then add an extern here with the name // of it, so that you can include it in the DEFINE_CONTROLOBJECT. // ie. extern VERBINFO m_HHCtrlCustomVerbs []; extern const GUID *rgHHCtrlPropPages[]; DEFINE_CONTROLOBJECT(HHCtrl, &CLSID_HHCtrl, "HHCtrl", CHtmlHelpControl::Create, 1, &IID_IHHCtrl, "", // BUGBUG: change when OLE supports HtmlHelp files &DIID__HHCtrlEvents, OLEMISC_SETCLIENTSITEFIRST | OLEMISC_ACTIVATEWHENVISIBLE | OLEMISC_RECOMPOSEONRESIZE | OLEMISC_CANTLINKINSIDE | OLEMISC_INSIDEOUT, 0, RESID_TOOLBOX_BITMAP, "HHCtrlWndClass", 0, NULL, 0, NULL); #endif // _HHCTRL_H_