windows-nt/Source/XPSP1/NT/enduser/stuff/hhctrl/secwin.h
2020-09-26 16:20:57 +08:00

362 lines
13 KiB
C++

// 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__