216 lines
6.1 KiB
C++
216 lines
6.1 KiB
C++
///////////////////////////////////////////////////////////
|
|
//
|
|
//
|
|
// tabctrl - CTabControl controls encapsulates the system
|
|
// tab control.
|
|
//
|
|
//
|
|
/*
|
|
TODO:
|
|
Move tab ordering into this CTabControl.
|
|
*/
|
|
///////////////////////////////////////////////////////////
|
|
//
|
|
// Includes
|
|
//
|
|
#include "header.h"
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static const char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
#include "system.h"
|
|
#include "secwin.h"
|
|
|
|
// For ID_TAB_CONTROL
|
|
#include "resource.h"
|
|
|
|
// Our header
|
|
#include "tabctrl.h"
|
|
|
|
// So that we can get the width of the sizebar.
|
|
#include "sizebar.h"
|
|
|
|
#include "hha_strtable.h"
|
|
|
|
#include "cctlww.h"
|
|
|
|
///////////////////////////////////////////////////////////
|
|
//
|
|
// Constructor
|
|
//
|
|
|
|
CTabControl::CTabControl(HWND hwndParent, int tabpos, CHHWinType* phh)
|
|
{
|
|
ASSERT(IsValidWindow(hwndParent)) ;
|
|
m_phh = phh;
|
|
m_hWndParent = hwndParent ;
|
|
|
|
RECT rc;
|
|
CalcSize(&rc) ; // Get our size.
|
|
|
|
int tabstyle = 0;
|
|
if (tabpos == HHWIN_NAVTAB_LEFT)
|
|
tabstyle = TCS_VERTICAL;
|
|
else if (tabpos == HHWIN_NAVTAB_BOTTOM)
|
|
tabstyle = TCS_BOTTOM;
|
|
|
|
m_hWnd = W_CreateControlWindow (0, WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | tabstyle,
|
|
W_TabCtrl, NULL, rc.left, rc.top, RECT_WIDTH(rc), RECT_HEIGHT(rc),
|
|
hwndParent, (HMENU) ID_TAB_CONTROL, _Module.GetModuleInstance(), NULL );
|
|
|
|
W_EnableUnicode(m_hWnd, W_TabCtrl);
|
|
ZeroMemory(m_apTabText, sizeof(m_apTabText));
|
|
|
|
m_cTabs = 0;
|
|
if (m_phh->IsValidNavPane(HH_TAB_CONTENTS))
|
|
{
|
|
m_apTabText[m_cTabs] = lcStrDupW(GetStringResourceW(IDS_TAB_CONTENTS));
|
|
m_cTabs++;
|
|
}
|
|
if (m_phh->IsValidNavPane(HH_TAB_INDEX))
|
|
{
|
|
m_apTabText[m_cTabs] = lcStrDupW(GetStringResourceW(IDS_TAB_INDEX));
|
|
m_cTabs++;
|
|
}
|
|
if (m_phh->IsValidNavPane(HH_TAB_SEARCH))
|
|
{
|
|
m_apTabText[m_cTabs] = lcStrDupW(GetStringResourceW(IDS_TAB_SEARCH));
|
|
m_cTabs++;
|
|
}
|
|
if (m_phh->IsValidNavPane(HH_TAB_HISTORY))
|
|
{
|
|
m_apTabText[m_cTabs] = lcStrDupW(GetStringResourceW(IDS_TAB_HISTORY));
|
|
m_cTabs++;
|
|
}
|
|
|
|
// Turn on the Help Favorites Tab
|
|
if (m_phh->IsValidNavPane(HH_TAB_FAVORITES))
|
|
{
|
|
m_apTabText[m_cTabs] = lcStrDupW(GetStringResourceW(IDS_TAB_FAVORITES));
|
|
m_cTabs++;
|
|
}
|
|
|
|
// Add the Custom Tabs.
|
|
//int iNumCustomTabs = phh->GetExtTabCount();
|
|
int index = HH_TAB_CUSTOM_FIRST;
|
|
for (int j = HH_TAB_CUSTOM_FIRST ; j <= HH_TAB_CUSTOM_LAST ; j++)
|
|
{
|
|
if (m_phh->IsValidNavPane(j))
|
|
{
|
|
//TODO: You never know when any of Ralph's objects are valid and there is almost never a way to know.
|
|
// The failure condition below, should never have gotten this far. However, its not clear
|
|
// when we have valid system data to check against.
|
|
EXTENSIBLE_TAB* pExtTab = phh->GetExtTab(j - HH_TAB_CUSTOM_FIRST);
|
|
if (pExtTab && pExtTab->pszTabName && pExtTab->pszProgId)
|
|
{
|
|
//TODO:[paulde] EXTENSIBLE_TAB should be made Unicode, or at least a way to get the authored codepage
|
|
// [mikecole] Chanced the MultiByteToWideChar() call to use the CP info from the .CHM rather than ACP.
|
|
int cch = lstrlen(pExtTab->pszTabName) + 1;
|
|
PWSTR psz = (PWSTR)lcMalloc(cch*sizeof(WCHAR));
|
|
MultiByteToWideChar(phh->GetCodePage(), 0, pExtTab->pszTabName, -1, psz, cch);
|
|
m_apTabText[m_cTabs] = psz;
|
|
m_cTabs++ ;
|
|
}
|
|
else
|
|
{
|
|
// Reset the window type so that this tab no longer valid.
|
|
m_phh->fsWinProperties &= ~(HHWIN_PROP_TAB_CUSTOM1 << (j - HH_TAB_CUSTOM_FIRST));
|
|
}
|
|
}
|
|
}
|
|
|
|
#ifdef __TEST_CUSTOMTAB__
|
|
if (IsHelpAuthor(hwndParent)) {
|
|
m_apTabText[m_phh->tabOrder[HH_TAB_AUTHOR]] = lcStrDup(pGetDllStringResource(IDSHHA_TAB_AUTHOR));
|
|
m_cTabs++;
|
|
}
|
|
#endif
|
|
|
|
TC_ITEMW tie;
|
|
tie.mask = TCIF_TEXT;
|
|
tie.iImage = -1;
|
|
|
|
int i;
|
|
for (i = 0; i < m_cTabs; i++)
|
|
{
|
|
tie.pszText = (PWSTR) m_apTabText[i];
|
|
if (tie.pszText) {
|
|
tie.cchTextMax = lstrlenW( m_apTabText[i] );
|
|
W_TabCtrl_InsertItem(m_hWnd, i, &tie);
|
|
}
|
|
}
|
|
|
|
// see if we need to adjust vertical tab padding
|
|
//
|
|
char *pszTabVertSize = lcStrDup(GetStringResource(IDS_TAB_VERT_PADDING));
|
|
char *pszTabHorzSize = lcStrDup(GetStringResource(IDS_TAB_HORZ_PADDING));
|
|
|
|
if (pszTabVertSize && pszTabHorzSize)
|
|
{
|
|
if ((g_fDBCSSystem || g_langSystem == LANG_ARABIC || g_langSystem == LANG_HEBREW) && IsDigit((BYTE) *pszTabVertSize) && IsDigit((BYTE) *pszTabHorzSize))
|
|
W_TabCtrl_SetPadding(m_hWnd,Atoi(pszTabHorzSize),Atoi(pszTabVertSize));
|
|
|
|
lcFree(pszTabVertSize);
|
|
lcFree(pszTabHorzSize);
|
|
}
|
|
SendMessage(m_hWnd, WM_SETFONT, (WPARAM)_Resource.GetAccessableUIFont() , 0);
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
//
|
|
// Destructor
|
|
//
|
|
CTabControl::~CTabControl()
|
|
{
|
|
for (int i = 0; i < m_cTabs; i++) {
|
|
if (m_apTabText[i])
|
|
lcFree(m_apTabText[i]);
|
|
}
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////
|
|
//
|
|
// Operations
|
|
//
|
|
///////////////////////////////////////////////////////////
|
|
//
|
|
// ResizeWindow
|
|
//
|
|
void
|
|
CTabControl::ResizeWindow()
|
|
{
|
|
// Validate
|
|
ASSERT(IsValidWindow(hWnd())) ;
|
|
|
|
// Calculate our size.
|
|
RECT rc;
|
|
CalcSize(&rc); // This will be the navigation window.
|
|
|
|
// Size the window.
|
|
MoveWindow(hWnd(), rc.left, rc.top,
|
|
RECT_WIDTH(rc), RECT_HEIGHT(rc),
|
|
TRUE);
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
//
|
|
// Helper Functions
|
|
//
|
|
///////////////////////////////////////////////////////////
|
|
//
|
|
// CalcSize - This is where we calc the size of the tab control
|
|
//
|
|
void
|
|
CTabControl::CalcSize(RECT* prect)
|
|
{
|
|
// Currently this is simple. It will get more complicated.
|
|
::GetClientRect(m_hWndParent, prect);
|
|
|
|
// Subtract room for padding and room for the sizebar.
|
|
prect->right -= GetSystemMetrics(SM_CXSIZEFRAME)*2 - CSizeBar::Width();
|
|
prect->top += GetSystemMetrics(SM_CYSIZEFRAME)*2 ; // Add room on top to see the top edge.
|
|
}
|