|
|
//depot/Lab06_N/windows/AdvCore/ctf/uim/nuictrl.cpp#50 - edit change 9353 (text)
//
// nui.cpp
//
#include "private.h"
#include "globals.h"
#include "nuictrl.h"
#include "xstring.h"
#include "immxutil.h"
#include "tim.h"
#include "profiles.h"
#include "ctffunc.h"
#include "slbarid.h"
#include "cregkey.h"
#include "cmydc.h"
#include "nuihkl.h"
#include "cresstr.h"
#include "slbarid.h"
#include "iconlib.h"
DBG_ID_INSTANCE(CLBarItemCtrl); DBG_ID_INSTANCE(CLBarItemHelp);
#define SHOW_BRANDINGICON 1
//---------------------------------------------------------------------------
//
// TF_RunInputCPL
//
//---------------------------------------------------------------------------
HRESULT WINAPI TF_RunInputCPL() { CicSystemModulePath fullpath; TCHAR szRunInputCPLCmd[MAX_PATH * 2]; UINT uLen = 0; HRESULT hr = E_FAIL;
if (IsOnNT51()) fullpath.Init(c_szRunInputCPLOnNT51); else if (IsOn98() || IsOn95()) fullpath.Init(c_szRunInputCPLOnWin9x); else fullpath.Init(c_szRunInputCPL);
if (!fullpath.GetLength()) return hr;
StringCchPrintf(szRunInputCPLCmd, ARRAYSIZE(szRunInputCPLCmd), c_szRunInputCPLCmdLine, fullpath.GetPath());
if (RunCPLSetting(szRunInputCPLCmd)) hr = S_OK;
return hr; }
//////////////////////////////////////////////////////////////////////////////
//
// CLBarItemCtrl
//
//////////////////////////////////////////////////////////////////////////////
//+---------------------------------------------------------------------------
//
// ctor
//
//----------------------------------------------------------------------------
CLBarItemCtrl::CLBarItemCtrl(SYSTHREAD *psfn) : CSysThreadRef(psfn) { Dbg_MemSetThisNameID(TEXT("CLBarItemCtrl"));
InitNuiInfo(CLSID_SYSTEMLANGBARITEM, GUID_LBI_CTRL, TF_LBI_STYLE_BTN_MENU | TF_LBI_STYLE_HIDDENSTATUSCONTROL | TF_LBI_STYLE_SHOWNINTRAY, 0, CRStr(IDS_NUI_LANGUAGE_TEXT));
SetToolTip(CRStr(IDS_NUI_LANGUAGE_TOOLTIP)); _meEto = 0; _Init(); }
//+---------------------------------------------------------------------------
//
// dtor
//
//----------------------------------------------------------------------------
CLBarItemCtrl::~CLBarItemCtrl() { HICON hIcon = GetIcon(); SetIcon(NULL); if (hIcon) DestroyIcon(hIcon); }
//----------------------------------------------------------------------------
//
// Init
//
//----------------------------------------------------------------------------
#define NLS_RESOURCE_LOCALE_KEY TEXT("Control Panel\\desktop\\ResourceLocale")
void CLBarItemCtrl::_Init() { if (GetSystemMetrics(SM_MIDEASTENABLED)) { char sz[10]; long cb = sizeof(sz);
//
// as we are releasing an enabled version, we need to check the
// resource locale as well.
//
sz[0] = '\0'; if( RegQueryValue( HKEY_CURRENT_USER, NLS_RESOURCE_LOCALE_KEY, sz, &cb) == ERROR_SUCCESS) if ((cb == 9) && (sz[6] == '0') && ((sz[7] == '1') || (sz[7] == 'd') || (sz[7] == 'D'))) _meEto = ETO_RTLREADING; }
TF_InitMlngInfo();
_AsmListUpdated(FALSE); }
//+---------------------------------------------------------------------------
//
// InitMenu
//
//----------------------------------------------------------------------------
STDAPI CLBarItemCtrl::InitMenu(ITfMenu *pMenu) { CThreadInputMgr *ptim; CAssemblyList *pAsmList; int i; int nCnt; INT cxSmIcon; INT cySmIcon; LOGFONT lf; int nMenuFontHeight;
cxSmIcon = cySmIcon = GetMenuIconHeight(&nMenuFontHeight);
if( !SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &lf, 0)) return E_FAIL;
lf.lfHeight = nMenuFontHeight; lf.lfWidth = 0; lf.lfWeight = FW_NORMAL;
if ((pAsmList = EnsureAssemblyList(_psfn)) == NULL) return E_FAIL;
nCnt = pAsmList->Count(); Assert(nCnt > 0);
ptim = CThreadInputMgr::_GetThisFromSYSTHREAD(_psfn);
for (i = 0; i < nCnt; i++) { CAssembly *pAsm = pAsmList->GetAssembly(i);
if (pAsm->IsEnabled(_psfn)) { BOOL bChecked = (pAsm->GetLangId() == GetCurrentAssemblyLangId(_psfn));
HICON hIcon = InatCreateIconBySize(pAsm->GetLangId(), cxSmIcon, cySmIcon, &lf); HBITMAP hbmp = NULL; HBITMAP hbmpMask = NULL; if (hIcon) { SIZE size = {cxSmIcon, cySmIcon};
if (!GetIconBitmaps(hIcon, &hbmp, &hbmpMask, &size)) return E_FAIL;
if (hIcon) DestroyIcon(hIcon); }
pMenu->AddMenuItem(IDM_ASM_MENU_START + i, bChecked ? TF_LBMENUF_CHECKED : 0, hbmp, hbmpMask, pAsm->GetLangName(), wcslen(pAsm->GetLangName()), NULL);
}
}
DWORD dwFlags; if (SUCCEEDED(CLangBarMgr::s_GetShowFloatingStatus(&dwFlags))) { if (dwFlags & (TF_SFT_MINIMIZED | TF_SFT_DESKBAND)) { LangBarInsertSeparator(pMenu); LangBarInsertMenu(pMenu, IDM_SHOWLANGBAR, CRStr(IDS_SHOWLANGBAR)); #if 0
if (dwFlags & TF_SFT_EXTRAICONSONMINIMIZED) LangBarInsertMenu(pMenu, IDM_NONOTIFICATIONICONS, CRStr(IDS_NOTIFICATIONICONS), TRUE); else LangBarInsertMenu(pMenu, IDM_NOTIFICATIONICONS, CRStr(IDS_NOTIFICATIONICONS), FALSE); LangBarInsertMenu(pMenu, IDM_SHOWINPUTCPL, CRStr(IDS_SHOWINPUTCPL)); #endif
} }
return S_OK; }
//+---------------------------------------------------------------------------
//
// OnMenuSelect
//
//----------------------------------------------------------------------------
STDAPI CLBarItemCtrl::OnMenuSelect(UINT uID) { CAssemblyList *pAsmList = EnsureAssemblyList(_psfn); switch (uID) { case IDM_SHOWLANGBAR: CLangBarMgr::s_ShowFloating(TF_SFT_SHOWNORMAL); break;
case IDM_NOTIFICATIONICONS: CLangBarMgr::s_ShowFloating(TF_SFT_EXTRAICONSONMINIMIZED); break;
case IDM_NONOTIFICATIONICONS: CLangBarMgr::s_ShowFloating(TF_SFT_NOEXTRAICONSONMINIMIZED); break;
case IDM_SHOWINPUTCPL: TF_RunInputCPL(); break;
default: if (uID >= IDM_ASM_MENU_START) { Assert((uID - IDM_ASM_MENU_START) < (UINT)pAsmList->Count()); CAssembly *pAsm = pAsmList->GetAssembly(uID - IDM_ASM_MENU_START); if (pAsm && (pAsm->GetLangId() != GetCurrentAssemblyLangId(_psfn))) ActivateAssembly(pAsm->GetLangId(), ACTASM_NONE); } break; } return S_OK; }
//+---------------------------------------------------------------------------
//
// OnShellLanguage
//
//----------------------------------------------------------------------------
void CLBarItemCtrl::OnShellLanguage(HKL hKL) { _UpdateLangIcon(hKL, FALSE); }
//+---------------------------------------------------------------------------
//
// UpdateLangIcon
//
//----------------------------------------------------------------------------
void CLBarItemCtrl::_UpdateLangIcon(HKL hKL, BOOL fNotify) { CLBarItemDeviceType *plbiDT = NULL; BOOL fIsPureIME; CThreadInputMgr *ptim; int nCnt; int i;
if (!hKL) hKL = GetKeyboardLayout(NULL);
_UpdateLangIconForCic(fNotify);
ptim = CThreadInputMgr::_GetThisFromSYSTHREAD(_psfn);
if (ptim && ptim->_GetFocusDocInputMgr()) { CAssembly *pAsm = GetCurrentAssembly(_psfn); if (!pAsm) return; fIsPureIME = pAsm->IsFEIMEActive(); } else { fIsPureIME = IsPureIMEHKL(hKL); }
if (fIsPureIME) { if (_psfn->plbim != NULL) { _psfn->plbim->_AddWin32IMECtrl(fNotify); } } else { if (_psfn->plbim != NULL) { _psfn->plbim->_RemoveWin32IMECtrl(); } }
#ifdef SHOW_BRANDINGICON
if (_psfn->plbim && _psfn->plbim->_GetLBarItemDeviceTypeArray()) { nCnt = _psfn->plbim->_GetLBarItemDeviceTypeArray()->Count();
for (i = 0; i < nCnt; i++) { plbiDT = _psfn->plbim->_GetLBarItemDeviceTypeArray()->Get(i); if (!plbiDT) continue;
if (plbiDT->IsKeyboardType()) { plbiDT->SetBrandingIcon(hKL, fNotify); break; } } } #endif SHOW_BRANDINGICON
if (fNotify && _plbiSink) _plbiSink->OnUpdate(TF_LBI_ICON); }
//+---------------------------------------------------------------------------
//
// AsmListUpdated
//
//----------------------------------------------------------------------------
void CLBarItemCtrl::_AsmListUpdated(BOOL fNotify) { CAssemblyList *pAsmList; int i; int nCntShowInMenu = 0; int nCnt;
if ((pAsmList = EnsureAssemblyList(_psfn)) == NULL) return;
nCnt = pAsmList->Count(); Assert(nCnt > 0);
for (i = 0; i < nCnt; i++) { CAssembly *pAsm = pAsmList->GetAssembly(i);
if (pAsm->IsEnabled(_psfn)) { nCntShowInMenu++; } }
ShowInternal((nCntShowInMenu > 1), fNotify); }
//+---------------------------------------------------------------------------
//
// UpdateLangIconForCic
//
//----------------------------------------------------------------------------
void CLBarItemCtrl::_UpdateLangIconForCic(BOOL fNotify) { HICON hIcon; LANGID langid = GetCurrentAssemblyLangId(_psfn);
if (langid == _langidForIcon) return;
_langidForIcon = langid;
hIcon = GetIcon(); SetIcon(NULL);
if (hIcon) DestroyIcon(hIcon);
hIcon = InatCreateIcon(_langidForIcon); SetIcon(hIcon); if (hIcon) { CAssembly *pAsm = GetCurrentAssembly(_psfn); if (pAsm != NULL) { SetToolTip(pAsm->GetLangName()); SetText(pAsm->GetLangName()); } }
if (fNotify && _plbiSink) _plbiSink->OnUpdate(TF_LBI_ICON | TF_LBI_TEXT | TF_LBI_TOOLTIP); }
//+---------------------------------------------------------------------------
//
// OnSysColorChanged
//
//----------------------------------------------------------------------------
void CLBarItemCtrl::OnSysColorChanged() { HICON hIcon = GetIcon(); SetIcon(NULL); if (hIcon) DestroyIcon(hIcon);
hIcon = InatCreateIcon(_langidForIcon); SetIcon(hIcon);
#ifdef WHISTLER_LATER
if (_plbiSink && GetFocus()) _plbiSink->OnUpdate(TF_LBI_ICON); #endif
}
//////////////////////////////////////////////////////////////////////////////
//
// CLBarItemHelp
//
//////////////////////////////////////////////////////////////////////////////
//+---------------------------------------------------------------------------
//
// ctor
//
//----------------------------------------------------------------------------
CLBarItemHelp::CLBarItemHelp(SYSTHREAD *psfn) : CLBarItemSystemButtonBase(psfn) { Dbg_MemSetThisNameID(TEXT("CLBarItemHelp"));
InitNuiInfo(CLSID_SYSTEMLANGBARITEM2, GUID_LBI_HELP, TF_LBI_STYLE_BTN_MENU | // TF_LBI_STYLE_HIDDENSTATUSCONTROL |
TF_LBI_STYLE_HIDEONNOOTHERITEMS, HELPBTN_ORDER, CRStr(IDS_IMEHELP));
SetToolTip(CRStr(IDS_NUI_HELP));
if (!IsInteractiveUserLogon()) SetStatusInternal(TF_LBI_STATUS_DISABLED);
}
//+---------------------------------------------------------------------------
//
// InitMenu
//
//----------------------------------------------------------------------------
STDAPI CLBarItemHelp::InitMenu(ITfMenu *pMenu) { int nCnt = 0; CThreadInputMgr *ptim;
UINT nTipCurMenuID = IDM_CUSTOM_MENU_START;
ptim = _psfn->ptim;
if (!_InsertCustomMenus(pMenu, &nTipCurMenuID)) goto InsertSysHelpItem;
//
// Insert separator.
//
if (nTipCurMenuID > IDM_CUSTOM_MENU_START) LangBarInsertSeparator(pMenu);
if (ptim && ptim->_GetFocusDocInputMgr()) { int i = 0; BOOL fInsert = FALSE; nCnt = ptim->_GetTIPCount(); for (i = 0; i < nCnt; i++) { const CTip *ptip = ptim->_GetCTip(i); ITfFnShowHelp *phelp; if (nCnt >= IDM_CUSTOM_MENU_START) { Assert(0); break; } if (!ptip->_pFuncProvider) continue; if (SUCCEEDED(ptip->_pFuncProvider->GetFunction(GUID_NULL, IID_ITfFnShowHelp, (IUnknown **)&phelp))) { BSTR bstr; if (SUCCEEDED(phelp->GetDisplayName(&bstr))) { LangBarInsertMenu(pMenu, i, bstr, FALSE); fInsert = TRUE; SysFreeString(bstr); } phelp->Release(); } } if (fInsert) LangBarInsertSeparator(pMenu); }
InsertSysHelpItem: LangBarInsertMenu(pMenu, nCnt, CRStr(IDS_LANGBARHELP), FALSE);
return S_OK; }
//+---------------------------------------------------------------------------
//
// OnMenuSelect
//
//----------------------------------------------------------------------------
STDAPI CLBarItemHelp::OnMenuSelect(UINT uID) { HRESULT hr = E_FAIL; CThreadInputMgr *ptim = CThreadInputMgr::_GetThis(); UINT ulCnt = 0;
if (ptim) ulCnt = ptim->_GetTIPCount();
if (uID >= IDM_CUSTOM_MENU_START) { int nMenuMapoCnt = _pMenuMap->Count(); int i; for (i = 0; i < nMenuMapoCnt; i++) { TIPMENUITEMMAP *ptmm; ptmm = _pMenuMap->GetPtr(i); if (ptmm->nTmpID == (UINT)uID) { hr = ptmm->plbSink->OnMenuSelect(ptmm->nOrgID); break; } } } else if (uID > ulCnt) { hr = E_UNEXPECTED; } else if (uID == ulCnt) { //
// show Langbar help
//
InvokeCicHelp(); hr = S_OK; } else { Assert(ptim); const CTip *ptip = ptim->_GetCTip(uID);
if (ptip->_pFuncProvider) { ITfFnShowHelp *phelp; if (SUCCEEDED(ptip->_pFuncProvider->GetFunction(GUID_NULL, IID_ITfFnShowHelp, (IUnknown **)&phelp))) { hr = phelp->Show(GetActiveWindow()); phelp->Release(); } } }
ClearMenuMap(); return hr; }
//+---------------------------------------------------------------------------
//
// InvokeCicHelp
//
//----------------------------------------------------------------------------
BOOL CLBarItemHelp::InvokeCicHelp() { return FullPathExec(c_szHHEXE, c_szHHEXELANGBARCHM, SW_SHOWNORMAL, TRUE); }
//+---------------------------------------------------------------------------
//
// GetIcon
//
//----------------------------------------------------------------------------
STDAPI CLBarItemHelp::GetIcon(HICON *phIcon) { *phIcon = LoadSmIcon(g_hInst, MAKEINTRESOURCE(ID_ICON_HELP)); return S_OK; }
|