// Copyright (C) 1996-1997 Microsoft Corporation. All rights reserved. #if _MSC_VER > 1000 #pragma once #endif #ifndef __SECWIN_H__ #define __SECWIN_H__ #undef WINUSERAPI #define WINUSERAPI #include "htmlhelp.h" #include "hhctrl.h" #include "tabctrl.h" #include "chistory.h" #include "system.h" #include "navui.h" // Replace with forward reference. // Sizebar class. #include "sizebar.h" // Tool Bar defines // ---------------- // Length of the text under each toolbar button #define MAX_TB_TEXT_LENGTH 64 // Select tab commands. Used by the tab accelerator table. #define IDC_SELECT_TAB_FIRST 0x9000 // Make sure this doesn't conflict with other WM_COMMANDS! #define IDC_SELECT_TAB_LAST (IDC_SELECT_TAB_FIRST + HH_MAX_TABS) // max number of toolbar buttons // #define MAX_TB_BUTTONS 20 #define MAX_TB_BUTTONS 18 // Dimensions of Coolbar Glyphs .. #define TB_BMP_CX 20 #define TB_BMP_CY 20 #define TB_BTN_CY TB_BMP_CY // TB button height #define TB_BTN_CX TB_BMP_CX // TB button width // End Tool Bar defines // -------------------- const int c_NUMNAVPANES = HH_MAX_TABS+1 ; //REVIEW: Why not use HH_MAX_TABS instead? #define HHFLAG_AUTOSYNC (1 << 0) #define HHFLAG_NOTIFY_ON_NAV_COMPLETE (1 << 1) #define DEFAULT_STYLE (WS_THICKFRAME | WS_OVERLAPPED) #define DEFAULT_NAV_WIDTH 250 #define DEFAULT_NOTES_HEIGHT 100 #define SIZE_BAR_WIDTH 7 const char WINDOW_SEPARATOR = '>'; const int TAB_PADDING = 8; // UI Cleanup. Was 4 now 8. extern RECT g_rcWorkArea; extern int g_cxScreen; extern int g_cyScreen; extern BOOL g_fOleInitialized; extern CRITICAL_SECTION g_cs; // per-instance typedef struct { int cbStruct; RECT rcPos; int iNavWidth; BOOL fHighlight; BOOL fLockSize; BOOL fNoToolBarText; BOOL fNotExpanded; int curNavType; } WINDOW_STATE; /////////////////////////////////////////////////////////// // // Forward References // class CContainer; // forward reference class CNotes; // forward reference class CSizeBar; // forward reference // WARNING! Do not add classes -- only add class members, or constructor // for CHHWinType will trash the class. class CHHWinType : public tagHH_WINTYPE MI2_COUNT(CHHWinType) { public: CHHWinType(LPCTSTR pszOwnerFile) :m_hAccel(NULL) { ZERO_INIT_CLASS(CHHWinType); cbStruct = sizeof(HH_WINTYPE); // Which CHM files "owns" this window type. m_szOwnerFile = pszOwnerFile ; #ifdef _CHECKMEM_ON_CLOSEWINDOW_ _CrtMemCheckpoint(&m_MemState) ; #endif } ~CHHWinType(); bool ReloadNavData(CHmData* phmdata) ; // Nasty hack for mso. Reloads nav pane from new chm. PCSTR GetCaption() const { return pszCaption; } DWORD GetExStyles() const { return dwExStyles; } DWORD GetStyles() const ; PCSTR GetTypeName() const { return pszType; } RECT* GetWinRect() { return &rcWindowPos; } BOOL IsProperty(UINT prop) const { return (fsWinProperties & prop); } BOOL IsUniCodeStrings() const { return fUniCodeStrings; } BOOL IsValidMember(UINT member) const { return (fsValidMembers & member); } void GetWindowRect(void) { if (IsValidWindow(*this)) ::GetWindowRect(*this, &rcWindowPos); } void GetClientRect(RECT* prc); // gets client area for host window int GetShowState() const { return nShowState; } int GetLeft() const { return rcWindowPos.left; } int GetTop() const { return rcWindowPos.top; } int GetRight() const { return rcWindowPos.right; } int GetBottom() const { return rcWindowPos.bottom; } int GetWidth() const { return RECT_WIDTH(rcWindowPos); } int GetHeight() const { return RECT_HEIGHT(rcWindowPos); } HWND GetHwnd() const { return hwndHelp; } HWND GetCallerHwnd() const { return hwndCaller; } HWND GetToolBarHwnd() const { return hwndToolBar; } HWND GetNavigationHwnd() const { return hwndNavigation; } HWND GetSizeBarHwnd() const { return m_pSizeBar->hWnd(); } HWND GetHTMLHwnd() const { return hwndHTML; } HWND GetTabCtrlHwnd() const // TabCtrlHwnd doesn't always exist. {return (m_pTabCtrl ? m_pTabCtrl->hWnd() : GetNavigationHwnd()); } int GetCurrentNavPaneIndex() ; int GetTabIndexFromNavPaneIndex(int iNavPaneIndex); PCSTR GetToc() const { return pszToc; } PCSTR GetIndex() const { return pszIndex; } PCSTR GetFile() const { return pszFile; } // Return the CHM file which owns this window type. LPCTSTR GetOwnerFile() const { return m_szOwnerFile.psz; } BOOL IsExpandedNavPane() const { return !fNotExpanded; } operator HWND() const { return hwndHelp; } operator RECT*() { return &rcWindowPos; } operator PCSTR() const { return pszType; } void SetUniCodeStrings(HH_WINTYPE* phhWinType) { fUniCodeStrings = phhWinType->fUniCodeStrings; } void SetTypeName(HH_WINTYPE* phhWinType); void SetValidMembers(HH_WINTYPE* phhWinType) { fsValidMembers = phhWinType->fsValidMembers; } void SetProperties(HH_WINTYPE* phhWinType) { if (IsValidMember(HHWIN_PARAM_PROPERTIES)) fsWinProperties = phhWinType->fsWinProperties; } void SetStyles(HH_WINTYPE* phhWinType) { if (IsValidMember(HHWIN_PARAM_STYLES)) dwStyles = phhWinType->dwStyles; } void SetExStyles(HH_WINTYPE* phhWinType) { if (IsValidMember(HHWIN_PARAM_EXSTYLES)) dwExStyles = phhWinType->dwExStyles; } void SetWindowRect(HH_WINTYPE* phhWinType) { if (IsValidMember(HHWIN_PARAM_RECT)) memcpy(&rcWindowPos, &phhWinType->rcWindowPos, sizeof(RECT)); } void SetDisplayState(HH_WINTYPE* phhWinType) { if (IsValidMember(HHWIN_PARAM_SHOWSTATE)) nShowState = phhWinType->nShowState; else nShowState = SW_SHOW; } void SetTabPos(HH_WINTYPE* phhWinType) { if (IsValidMember(HHWIN_PARAM_TABPOS)) tabpos = phhWinType->tabpos; else tabpos = HHWIN_NAVTAB_TOP; } void SetTabOrder(HH_WINTYPE* phhWinType); void SetCaption(HH_WINTYPE* phhWinType) { SetString(phhWinType->pszCaption, (PSTR*) &pszCaption); } void SetJump1(HH_WINTYPE* phhWinType); void SetJump2(HH_WINTYPE* phhWinType); void SetToc(HH_WINTYPE* phhWinType) { SetUrl(phhWinType->pszToc, (PSTR*) &pszToc); } void SetIndex(HH_WINTYPE* phhWinType) { SetUrl(phhWinType->pszIndex, (PSTR*) &pszIndex); } void SetFile(HH_WINTYPE* phhWinType) { SetUrl(phhWinType->pszFile, (PSTR*) &pszFile); } void SetNavExpansion(HH_WINTYPE* phhWinType) { if (IsValidMember(HHWIN_PARAM_EXPANSION)) fNotExpanded = phhWinType->fNotExpanded; } void SetNavWidth(HH_WINTYPE* phhWinType) { if (IsValidMember(HHWIN_PARAM_NAV_WIDTH)) iNavWidth = phhWinType->iNavWidth; } void SetCaller(HH_WINTYPE* phhWinType) { hwndCaller = phhWinType->hwndCaller; } void SetHome(HH_WINTYPE* phhWinType) { SetUrl(phhWinType->pszHome, (PSTR*) &pszHome); } void SetToolBar(HH_WINTYPE* phhWinType) { fsToolBarFlags = IsValidMember(HHWIN_PARAM_TB_FLAGS) ? phhWinType->fsToolBarFlags : HHWIN_DEF_BUTTONS; } void SetString(PCSTR pszSrcString, PSTR* ppszDst); void SetUrl(PCSTR pszSrcString, PSTR* ppszDst); void SetCurNavType(HH_WINTYPE* phhWinType) { if (IsValidMember(HHWIN_PARAM_CUR_TAB)) curNavType = phhWinType->curNavType ;} void SetLeft(int left) { rcWindowPos.left = left; } void SetTop(int top) { rcWindowPos.top = top; } void SetRight(int right) { rcWindowPos.right = right; } void SetBottom(int bottom) { rcWindowPos.bottom = bottom; } // General functions void AddExStyle(DWORD style) { dwExStyles |= style; } void AddStyle(DWORD style) { dwStyles |= style; } void AddToHistory(PCSTR pszTitle, PCSTR pszUrl); void AuthorMsg(UINT idStringFormatResource, PCSTR pszSubString = "") { ::AuthorMsg(idStringFormatResource, pszSubString, *this, NULL); } void CalcHtmlPaneRect(void); void CloseWindow(); void SaveState() ; void ReloadCleanup() ; void ProcessDetachSafeCleanup(); void CreateBookmarksTab() ; void CreateHistoryTab(void); void CreateCustomTab(int iPane, LPCOLESTR pszProgId); BOOL IsValidNavPane(int iTab); int GetValidNavPane(); // Returns the index of the first valid tab it finds. -1 if no valid tabs. BOOL AnyValidNavPane(void) {return GetValidNavPane() != -1; } int GetValidNavPaneCount() ; void CreateIndex(void); void CreateNavPane(int iPane) ; // Creates the appropriate NavPane if it doesn't already exist. void CreateOrShowHTMLPane(void); void CreateOrShowNavPane(void); void CreateSearchTab(void); void CreateSizeBar( void ); void CreateToc(void); int CreateToolBar(TBBUTTON* pabtn); void DestroySizeBar( void ); void doSelectTab(int newTabIndex); void OnNavigateComplete(LPCTSTR pszUrl); #ifndef CHIINDEX void OnPrint(void); #endif BOOL OnTrackNotifyCaller(int idAction); void SetActiveHelpWindow(void); void SetChmData(CHmData* phmData) { m_phmData = phmData; } void SetDisplayState(int nShow) { nShowState = nShow; } void SetTypeName(PCSTR pszSetType) { ASSERT(!pszType); pszType = lcStrDup(pszSetType); } void ToggleExpansion(bool bNotify=true); void UpdateInformationTypes(void); void WrapTB(); bool ManualTranslateAccelerator(char iChar); bool DynamicTranslateAccelerator(MSG* pMsg); int GetExtTabCount() ; EXTENSIBLE_TAB* GetExtTab(int pos) ; HFONT GetUIFont() const { return _Resource.GetUIFont(); } HFONT GetContentFont(); HFONT GetAccessableContentFont(); INT GetContentCharset(); UINT GetCodePage(void); void UpdateCmdUI(void); //--- Save/Restore focus during WM_ACTIVATE. bool RestoreCtrlWithFocus(); void SaveCtrlWithFocus(); HWND m_hwndLastFocus ; // The window handle of the control which had focus last. See WM_ACTIVATE in wndproc.cpp HWND m_hwndIndexEdit; HWND m_hwndIndexDisplay; HWND m_hwndNotes; HWND m_hwndListBox; CSizeBar* m_pSizeBar ;// moveable window in TRIPANE to size the HTML and NAV panes. // Tab classes HWND m_hwndControl; INavUI* m_aNavPane[c_NUMNAVPANES] ; CToc* m_ptocDynCast ; // We need a dynamic cast, but we don't have RTTI. Use this as a temp hack. HH_INFOTYPE* m_paInfoTypes; // Pointer to an array of Information Types RECT rcNav; RECT rcToolBar; RECT rcNotes; BOOL m_fNotesWindow; // TRUE to show the notes window BOOL m_fHighlight; BOOL m_bCancel; BOOL m_fLockSize; // TRUE to prevent show/hide from changing window size CTable* m_ptblBtnStrings; BOOL m_fNoToolBarText; CTabControl* m_pTabCtrl; CContainer* m_pCIExpContainer; CHmData* m_phmData; CHmData* m_phmDataOrg; // The original CHM before the ReloadNavData call. #ifdef _DEBUG CNotes* m_pNotes; #endif BOOL m_fActivated; HWND m_hwndFocused; // The window with the focus. HWND m_hWndSSCB; HWND m_hWndST; // // This is the total height in pels for margins + static text + combo-box. // ie. it's the distance between the bootm of the toolbar and the top of the hh child window that frames the nav pane. // int m_iSSCBHeight; private: // Filename of the CHM File which owns this window definition. CStr m_szOwnerFile; HMENU m_hMenuOptions; HACCEL m_hAccel ; // The accelerator table for this window. public: // Zoom support. // int m_iZoom; int m_iZoomMin; int m_iZoomMax; HRESULT Zoom(int iZoom); HRESULT GetZoomMinMax(void); void ZoomOut(void); void ZoomIn(void); // // Next/Prev in TOC support. // BOOL OnTocNext(BOOL bDoJump); BOOL OnTocPrev(BOOL bDoJump); // image lists HIMAGELIST m_hImageListGray; HIMAGELIST m_hImageList; // Memory checking class. #ifdef _DEBUG _CrtMemState m_MemState ; #endif }; extern CHHWinType** pahwnd; __inline CHHWinType* FindWindowIndex(HWND hwnd) { for (int i = 0; i < g_cWindowSlots; i++) { if (pahwnd && pahwnd[i] != NULL && pahwnd[i]->hwndHelp == hwnd) return pahwnd[i]; } return NULL; } CExCollection* GetCurrentCollection( HWND hwnd, LPCSTR lpszChmFilespec = NULL ); BOOL GetCurrentURL( CStr* pcszCurrentURL, HWND hWnd = NULL ); CHHWinType* CreateHelpWindow(PCSTR pszType, LPCTSTR pszFile, HWND hwndCaller, CHmData* phmData); HWND doDisplaySearch(HWND hwndCaller, LPCSTR pszFile, HH_FTS_QUERY* pFtsQuery); CHHWinType* FindCurWindow(); CHHWinType* FindHHWindowIndex(CContainer* m_pOuter); CHHWinType* FindHHWindowIndex(HWND hwndChild); CHHWinType* FindOrCreateWindowSlot(LPCTSTR pszType, LPCTSTR pszOwnerFile); CHHWinType* FindWindowType(PCSTR pszType, HWND hwndCaller, LPCTSTR pszOwnerFile); HWND OnKeywordSearch(HWND hwndCaller, PCSTR pszFile, HH_AKLINK* pakLink, BOOL fKLink = TRUE); void DeleteWindows() ; // These functions handle the HH_GET/SET_WINTYPE commands HWND GetWinType(HWND hwndCaller, LPCSTR pszFile, HH_WINTYPE** pphh) ; HWND SetWinType(LPCSTR pszFile, HH_WINTYPE* phhWinType, CHmData* pChmDataOrg = NULL) ; // Helper function for resizing the window. see wndproc.cpp void ResizeWindow(CHHWinType* phh, bool bRecalcHtmlFrame=true) ; #endif // __SECWIN_H__