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