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

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.
}