362 lines
13 KiB
C
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__
|