496 lines
14 KiB
C++
496 lines
14 KiB
C++
//////////////////////////////////////////////////////////////////////////
|
||
//
|
||
//
|
||
// rescache.cpp --- Implementation file for CResourceCache
|
||
//
|
||
//
|
||
/*
|
||
*/
|
||
//////////////////////////////////////////////////////////////////////////
|
||
//
|
||
// Includes
|
||
//
|
||
#include "header.h"
|
||
|
||
// String Ids.
|
||
#include "strtable.h"
|
||
|
||
// Resource IDs
|
||
#include "resource.h"
|
||
|
||
//Our header
|
||
//#include "rescache.h"
|
||
|
||
//////////////////////////////////////////////////////////////////////////
|
||
//
|
||
// Globals
|
||
//
|
||
CResourceCache _Resource ;
|
||
|
||
//////////////////////////////////////////////////////////////////////////
|
||
//
|
||
// CResourceCache
|
||
//
|
||
//////////////////////////////////////////////////////////////////////////
|
||
//
|
||
// Constuctor
|
||
//
|
||
CResourceCache::CResourceCache()
|
||
: m_pszMsgBoxTitle(NULL),
|
||
m_hUIFontDefault(NULL),
|
||
m_hAccel(NULL),
|
||
m_bInitTabCtrlKeys(false),
|
||
m_hInstRichEdit(0),
|
||
m_hUIAccessableFontDefault(NULL)
|
||
{
|
||
}
|
||
|
||
//////////////////////////////////////////////////////////////////////////
|
||
//
|
||
// Destruct
|
||
//
|
||
CResourceCache::~CResourceCache()
|
||
{
|
||
CHECK_AND_FREE( m_pszMsgBoxTitle );
|
||
|
||
if ( m_hUIAccessableFontDefault && (m_hUIAccessableFontDefault != m_hUIFontDefault) )
|
||
{
|
||
DeleteObject(m_hUIAccessableFontDefault);
|
||
}
|
||
|
||
if (m_hUIFontDefault)
|
||
{
|
||
DeleteObject(m_hUIFontDefault);
|
||
}
|
||
|
||
// Get rid of our accelerator table.
|
||
if (m_hAccel)
|
||
{
|
||
DestroyAcceleratorTable(m_hAccel);
|
||
}
|
||
|
||
if (m_hInstRichEdit)
|
||
{
|
||
FreeLibrary(m_hInstRichEdit);
|
||
}
|
||
}
|
||
|
||
//////////////////////////////////////////////////////////////////////////
|
||
//
|
||
// Initialization Functions
|
||
//
|
||
//////////////////////////////////////////////////////////////////////////
|
||
//
|
||
// InitMsgBoxTitle
|
||
//
|
||
void
|
||
CResourceCache::InitMsgBoxTitle()
|
||
{
|
||
ASSERT(m_pszMsgBoxTitle == NULL) ;
|
||
m_pszMsgBoxTitle = lcStrDup(GetStringResource(IDS_MSGBOX_TITLE));
|
||
}
|
||
|
||
/////////////////////////////////////////////////////////////////////////
|
||
//
|
||
// Init the RichEdit control if we need it.
|
||
//
|
||
void
|
||
CResourceCache::InitRichEdit()
|
||
{
|
||
if ( (m_hInstRichEdit == 0) && (GetVersion() > 0x80000000) )
|
||
m_hInstRichEdit = LoadLibrary("riched20.dll");
|
||
}
|
||
|
||
//////////////////////////////////////////////////////////////////////////
|
||
//
|
||
// InitAcceleratorTable
|
||
//
|
||
void
|
||
CResourceCache::InitAcceleratorTable()
|
||
{
|
||
// Create the accelerator table.
|
||
ASSERT(m_hAccel == NULL) ;
|
||
m_hAccel = LoadAccelerators(_Module.GetResourceInstance(), MAKEINTRESOURCE(HH_ACCELERATORS));
|
||
ASSERT(m_hAccel) ;
|
||
}
|
||
|
||
#if 0
|
||
|
||
//////////////////////////////////////////////////////////////////////////
|
||
//
|
||
// InitDefaultFont
|
||
//
|
||
void
|
||
CResourceCache::InitDefaultFont(HDC hDC, HFONT* phFont)
|
||
{
|
||
HFONT hFont;
|
||
|
||
if (! phFont )
|
||
{
|
||
ASSERT(m_hfontDefault == NULL) ;
|
||
if ( m_hfontDefault )
|
||
return;
|
||
}
|
||
|
||
// Create a default font from our resource file
|
||
int dyHeight = 0;
|
||
PSTR pszFontName = (PSTR) GetStringResource(IDS_DEFAULT_RES_FONT);
|
||
|
||
HWND hwndDesktop = GetDesktopWindow();
|
||
HDC hdc = GetDC(hwndDesktop);
|
||
int YAspectMul;
|
||
if (!hdc)
|
||
{
|
||
ASSERT(0) ; //TODO: Fix
|
||
return ;
|
||
}
|
||
|
||
// Get current text metrics
|
||
TEXTMETRIC tm;
|
||
GetTextMetrics(hdc, &tm);
|
||
WORD defcharset = (WORD) tm.tmCharSet;
|
||
YAspectMul = GetDeviceCaps(hDC?hDC:hdc, LOGPIXELSY);
|
||
ReleaseDC(hwndDesktop, hdc);
|
||
|
||
PSTR pszPoint = StrChr(pszFontName, ',');
|
||
if (pszPoint)
|
||
{
|
||
*pszPoint = '\0';
|
||
pszPoint = FirstNonSpace(pszPoint + 1);
|
||
if (IsDigit((BYTE) *pszPoint))
|
||
{
|
||
dyHeight = MulDiv(YAspectMul, Atoi(pszPoint) * 2, 144);
|
||
}
|
||
}
|
||
|
||
if (!dyHeight)
|
||
dyHeight = YAspectMul / 6;
|
||
|
||
if(g_langSystem == LANG_RUSSIAN)
|
||
defcharset = RUSSIAN_CHARSET;
|
||
|
||
// For non-localized OCX on DBCS platforms, we need to increase font size by one point
|
||
//
|
||
if (g_fDBCSSystem && CompareString(LOCALE_SYSTEM_DEFAULT,NORM_IGNORECASE, pszFontName,-1,"Arial",-1) == 2)
|
||
dyHeight++; // increase size by one point
|
||
|
||
if (g_langSystem == LANG_THAI &&
|
||
CompareString(LOCALE_SYSTEM_DEFAULT,NORM_IGNORECASE, pszFontName,-1,"Arial",-1) == 2)
|
||
{
|
||
LONG dyHeightThai = MulDiv(YAspectMul, dyHeight * 2, 144);
|
||
hFont = CreateFont(-(dyHeightThai+1), 0, 0, 0, 0, 0, 0, 0,
|
||
THAI_CHARSET, OUT_DEFAULT_PRECIS,
|
||
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
|
||
DEFAULT_PITCH | FF_DONTCARE, "Angsana New"); //"AngsanaUPC");
|
||
}
|
||
else
|
||
if (g_langSystem == LANG_JAPANESE &&
|
||
CompareString(LOCALE_SYSTEM_DEFAULT,NORM_IGNORECASE, pszFontName,-1,"Arial",-1) == 2)
|
||
{
|
||
hFont = CreateFont(-dyHeight, 0, 0, 0, 0, 0, 0, 0,
|
||
SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS,
|
||
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
|
||
VARIABLE_PITCH | FF_MODERN, "MS P-Gothic");
|
||
}
|
||
else
|
||
if (g_langSystem == LANG_CHINESE &&
|
||
CompareString(LOCALE_SYSTEM_DEFAULT,NORM_IGNORECASE, pszFontName,-1,"Arial",-1) == 2)
|
||
{
|
||
hFont = CreateFont(-dyHeight, 0, 0, 0, 0, 0, 0, 0,
|
||
defcharset, OUT_DEFAULT_PRECIS,
|
||
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
|
||
VARIABLE_PITCH | FF_MODERN, "<22><><EFBFBD><EFBFBD>");
|
||
}
|
||
else
|
||
{
|
||
hFont = CreateFont(-dyHeight, 0, 0, 0, 0, 0, 0, 0,
|
||
defcharset, OUT_DEFAULT_PRECIS,
|
||
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
|
||
VARIABLE_PITCH | FF_MODERN, pszFontName);
|
||
}
|
||
ASSERT(hFont);
|
||
if ( phFont )
|
||
*phFont = hFont;
|
||
else
|
||
m_hfontDefault = hFont;
|
||
|
||
#ifdef _DEBUG
|
||
LOGFONT lf ;
|
||
int r = GetObject(m_hfontDefault, sizeof(lf), &lf) ;
|
||
#endif
|
||
}
|
||
|
||
#endif
|
||
|
||
//////////////////////////////////////////////////////////////////////////
|
||
//
|
||
// InitDefaultUIFont
|
||
//
|
||
// Init the font that will be used to render all strings that come from hhctrl.ocx resources.
|
||
//
|
||
void
|
||
CResourceCache::InitDefaultUIFont(HDC hDC, HFONT* phFont)
|
||
{
|
||
HFONT hFont;
|
||
HDC hdc;
|
||
int dyHeight = 0;
|
||
int YAspectMul;
|
||
WORD CharsetSpec = 0;
|
||
WORD DefCharset;
|
||
int iFontSpecResID = IDS_DEFAULT_RES_FONT;
|
||
PSTR pszFontName;
|
||
WCHAR *pwsFontName;
|
||
|
||
if (! phFont )
|
||
{
|
||
ASSERT(m_hUIFontDefault == NULL) ;
|
||
if ( m_hUIFontDefault )
|
||
return;
|
||
}
|
||
// Create a default font from our resource file. We use a different resource font spec depending
|
||
// on OS...
|
||
//
|
||
OSVERSIONINFO osvi;
|
||
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
|
||
GetVersionEx(&osvi);
|
||
|
||
#ifdef _DEBUG
|
||
char* sz1, *sz2, *sz3;
|
||
char szBuf[256];
|
||
char szBuf2[256];
|
||
if ( (GetKeyState(VK_SHIFT) < 0) )
|
||
{
|
||
sz1 = (PSTR)GetStringResource(IDS_DEFAULT_RES_FONT_NT5_WIN98);
|
||
sz2 = (PSTR)GetStringResource(IDS_DEFAULT_RES_FONT);
|
||
if ( _Module.m_Language.LoadSatellite() )
|
||
{
|
||
LANGID lid = _Module.m_Language.GetUiLanguage();
|
||
wsprintf(szBuf2, "Operating from Satalite DLL resources: mui\\%04x", lid);
|
||
sz3 = szBuf2;
|
||
}
|
||
else
|
||
sz3 = "Operating from hhctrl.ocx reources";
|
||
wsprintf(szBuf, "NT5/Win98 UIFont = %s\nNT4/Win95 UIFont = %s\n%s\n", sz1, sz2, sz3);
|
||
MsgBox(szBuf, MB_OK);
|
||
}
|
||
#endif
|
||
|
||
if ( (osvi.dwMajorVersion) == 5 || ((osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) && (osvi.dwMinorVersion == 10)) )
|
||
iFontSpecResID = IDS_DEFAULT_RES_FONT_NT5_WIN98;
|
||
|
||
if (g_bWinNT5)
|
||
{
|
||
if (! (pwsFontName = (WCHAR *) GetStringResourceW(iFontSpecResID)) || *pwsFontName == '\0' )
|
||
{
|
||
if (! (pwsFontName = (WCHAR *)GetStringResourceW(IDS_DEFAULT_RES_FONT)) || *pwsFontName == '\0' )
|
||
pwsFontName = L"MS Shell Dlg,8,0";
|
||
}
|
||
if (! (hdc = GetDC(NULL)) )
|
||
{
|
||
ASSERT(0) ;
|
||
return ;
|
||
}
|
||
// Get current text metrics
|
||
//
|
||
TEXTMETRIC tm;
|
||
GetTextMetrics(hdc, &tm);
|
||
DefCharset = (WORD) tm.tmCharSet;
|
||
YAspectMul = GetDeviceCaps(hDC?hDC:hdc, LOGPIXELSY);
|
||
ReleaseDC(NULL, hdc);
|
||
|
||
WCHAR *pwsComma = StrChrW(pwsFontName, ','); // Get point size specification.
|
||
if (pwsComma)
|
||
{
|
||
*pwsComma = '\0';
|
||
pwsComma = FirstNonSpaceW(pwsComma + 1);
|
||
if (IsDigit((BYTE) *pwsComma))
|
||
{
|
||
int hx = _wtoi(pwsComma);
|
||
|
||
dyHeight = MulDiv(YAspectMul, hx * 2, 144);
|
||
}
|
||
}
|
||
if ( (pwsComma = StrChrW(pwsComma, ',')) ) // Get charset specification.
|
||
{
|
||
pwsComma = FirstNonSpaceW(pwsComma + 1);
|
||
if (iswdigit((BYTE) *pwsComma))
|
||
{
|
||
// This indicates we are using a satalite DLL which means we want to trust the charset spec.
|
||
//
|
||
if ( _Module.m_Language.LoadSatellite() )
|
||
DefCharset = (CHAR)_wtoi(pwsComma);
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (! (pszFontName = (PSTR) GetStringResource(iFontSpecResID)) || *pszFontName == '\0' )
|
||
{
|
||
if (! (pszFontName = (PSTR)GetStringResource(IDS_DEFAULT_RES_FONT)) || *pszFontName == '\0' )
|
||
pszFontName = "MS Shell Dlg,8,0";
|
||
}
|
||
if (! (hdc = GetDC(NULL)) )
|
||
{
|
||
ASSERT(0) ;
|
||
return ;
|
||
}
|
||
// Get current text metrics
|
||
//
|
||
TEXTMETRIC tm;
|
||
GetTextMetrics(hdc, &tm);
|
||
DefCharset = (WORD) tm.tmCharSet;
|
||
YAspectMul = GetDeviceCaps(hDC?hDC:hdc, LOGPIXELSY);
|
||
ReleaseDC(NULL, hdc);
|
||
|
||
PSTR pszComma = StrChr(pszFontName, ','); // Get point size specification.
|
||
if (pszComma)
|
||
{
|
||
*pszComma = '\0';
|
||
pszComma = FirstNonSpace(pszComma + 1);
|
||
if (IsDigit((BYTE) *pszComma))
|
||
{
|
||
int hx = Atoi(pszComma);
|
||
|
||
dyHeight = MulDiv(YAspectMul, hx * 2, 144);
|
||
}
|
||
}
|
||
if ( (pszComma = StrChr(pszComma, ',')) ) // Get charset specification.
|
||
{
|
||
pszComma = FirstNonSpace(pszComma + 1);
|
||
if (IsDigit((BYTE) *pszComma))
|
||
{
|
||
// This indicates we are using a satalite DLL which means we want to trust the charset spec.
|
||
//
|
||
if ( _Module.m_Language.LoadSatellite() )
|
||
DefCharset = (CHAR)Atoi(pszComma);
|
||
}
|
||
}
|
||
}
|
||
if (!dyHeight)
|
||
dyHeight = YAspectMul / 6;
|
||
|
||
// Why is this here? We should have the correct defcharset from GetTextMetrics above correct?
|
||
//
|
||
if( g_langSystem == LANG_RUSSIAN )
|
||
DefCharset = RUSSIAN_CHARSET;
|
||
|
||
NONCLIENTMETRICS ncm;
|
||
|
||
// If we need to detect non-localized OCX on DBCS platforms, we need can use DefCharset vs CharsetSpec
|
||
// to see if they differ. <mikecole>
|
||
//
|
||
if (g_bWinNT5)
|
||
{
|
||
|
||
hFont = CreateFontW(-dyHeight, 0, 0, 0, 0, 0, 0, 0, DefCharset, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
|
||
DEFAULT_QUALITY, VARIABLE_PITCH | FF_MODERN, pwsFontName);
|
||
|
||
ncm.cbSize = sizeof(NONCLIENTMETRICS);
|
||
BOOL bRet = SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), (void*)&ncm, 0);
|
||
if ( bRet && (ncm.lfMenuFont.lfHeight < (-dyHeight)) )
|
||
{
|
||
m_hUIAccessableFontDefault = CreateFontW(ncm.lfMenuFont.lfHeight, 0, 0, 0, 0, 0, 0, 0, DefCharset,
|
||
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
|
||
VARIABLE_PITCH | FF_MODERN, pwsFontName);
|
||
}
|
||
else
|
||
m_hUIAccessableFontDefault = hFont;
|
||
}
|
||
else
|
||
{
|
||
hFont = CreateFont(-dyHeight, 0, 0, 0, 0, 0, 0, 0, DefCharset, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
|
||
DEFAULT_QUALITY, VARIABLE_PITCH | FF_MODERN, pszFontName);
|
||
|
||
ncm.cbSize = sizeof(NONCLIENTMETRICS);
|
||
BOOL bRet = SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), (void*)&ncm, 0);
|
||
if ( bRet && (ncm.lfMenuFont.lfHeight < (-dyHeight)) )
|
||
{
|
||
m_hUIAccessableFontDefault = CreateFont(ncm.lfMenuFont.lfHeight, 0, 0, 0, 0, 0, 0, 0, DefCharset,
|
||
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
|
||
VARIABLE_PITCH | FF_MODERN, pszFontName);
|
||
}
|
||
else
|
||
m_hUIAccessableFontDefault = hFont;
|
||
}
|
||
ASSERT(hFont);
|
||
if ( phFont )
|
||
*phFont = hFont;
|
||
else
|
||
m_hUIFontDefault = hFont;
|
||
|
||
#ifdef _DEBUG
|
||
LOGFONT lf ;
|
||
int r = GetObject(m_hUIFontDefault, sizeof(lf), &lf) ;
|
||
#endif
|
||
}
|
||
|
||
|
||
//////////////////////////////////////////////////////////////////////////
|
||
//
|
||
// InitTabCtrlKeys
|
||
//
|
||
void
|
||
CResourceCache::InitTabCtrlKeys()
|
||
{
|
||
#ifndef CHIINDEX
|
||
ASSERT(!m_bInitTabCtrlKeys) ;
|
||
|
||
// Zero out array
|
||
memset(m_TabCtrlKeys, NULL, c_NumTabCtrlKeys);
|
||
|
||
// Get the accelerators for the standard tabs
|
||
PCSTR psz = StrChr(GetStringResource(IDS_TAB_CONTENTS), '&');
|
||
if (psz)
|
||
m_TabCtrlKeys[HHWIN_NAVTYPE_TOC] = ToLower(psz[1]);
|
||
|
||
psz = StrChr(GetStringResource(IDS_TAB_INDEX), '&');
|
||
if (psz)
|
||
m_TabCtrlKeys[HHWIN_NAVTYPE_INDEX] = ToLower(psz[1]);
|
||
|
||
psz = StrChr(GetStringResource(IDS_TAB_SEARCH), '&');
|
||
if (psz)
|
||
m_TabCtrlKeys[HHWIN_NAVTYPE_SEARCH] = ToLower(psz[1]);
|
||
|
||
psz = StrChr(GetStringResource(IDS_TAB_HISTORY), '&');
|
||
if (psz)
|
||
m_TabCtrlKeys[HHWIN_NAVTYPE_HISTORY] = ToLower(psz[1]);
|
||
|
||
psz = StrChr(GetStringResource(IDS_TAB_FAVORITES), '&');
|
||
if (psz)
|
||
m_TabCtrlKeys[HHWIN_NAVTYPE_FAVORITES] = ToLower(psz[1]);
|
||
|
||
// Get the accelerators for menus and other none tab things.
|
||
psz = StrChr(GetStringResource(IDTB_OPTIONS), '&');
|
||
if (psz)
|
||
m_TabCtrlKeys[ACCEL_KEY_OPTIONS] = ToLower(psz[1]);
|
||
|
||
// Custom tab keys are initialized when the tabs are loaded.
|
||
|
||
// Finished initialization
|
||
m_bInitTabCtrlKeys = true ;
|
||
#endif
|
||
}
|
||
|
||
//////////////////////////////////////////////////////////////////////////
|
||
//
|
||
// Other Functions
|
||
//
|
||
//////////////////////////////////////////////////////////////////////////
|
||
//
|
||
// TabCtrlKeys -- Sets the tab accel keys for custom tabs
|
||
//
|
||
void
|
||
CResourceCache::TabCtrlKeys(int TabIndex, char ch) //Sets an accelerator key. Only used for custom tabs.
|
||
{
|
||
// Initialize, if needed.
|
||
if (!m_bInitTabCtrlKeys)
|
||
{
|
||
InitTabCtrlKeys() ;
|
||
}
|
||
|
||
if (TabIndex >= HH_TAB_CUSTOM_FIRST && TabIndex <= HH_TAB_CUSTOM_LAST)
|
||
{
|
||
m_TabCtrlKeys[TabIndex] = ch ;
|
||
}
|
||
}
|