/**************************************************************************** TOOLBAR.CPP : Cicero Toolbar button management class History: 24-JAN-2000 CSLim Created ****************************************************************************/ #include "precomp.h" #include "common.h" #include "cicero.h" #include "cmode.h" #include "fmode.h" #include "hjmode.h" #include "pmode.h" #include "toolbar.h" #include "ui.h" #include "syshelp.h" #include "winex.h" /*--------------------------------------------------------------------------- CToolBar::CToolBar Ctor ---------------------------------------------------------------------------*/ CToolBar::CToolBar() { m_fToolbarInited = fFalse; m_pImeCtx = NULL; m_pCMode = NULL; m_pFMode = NULL; m_pHJMode = NULL; #if !defined(_WIN64) m_pPMode = NULL; #endif m_pSysHelp = NULL; } /*--------------------------------------------------------------------------- CToolBar::~CToolBar Dtor ---------------------------------------------------------------------------*/ CToolBar::~CToolBar() { m_pImeCtx = NULL; } /*--------------------------------------------------------------------------- CToolBar::Initialize Initialize Toolbar buttons. Add to Cic main toolbar. ---------------------------------------------------------------------------*/ BOOL CToolBar::Initialize() { ITfLangBarMgr *pLMgr = NULL; ITfLangBarItemMgr *pLItemMgr = NULL; DWORD dwThread = 0; HRESULT hr; if (IsCicero() == fFalse) return fFalse; // do nothing if (m_fToolbarInited) // already made it return fTrue; // do nothing // initialization if (FAILED(Cicero_CreateLangBarMgr(&pLMgr))) return fFalse; // error to create a object // Get Lang bar manager if (FAILED(pLMgr->GetThreadLangBarItemMgr(GetCurrentThreadId(), &pLItemMgr, &dwThread))) { pLMgr->Release(); DbgAssert(0); return fFalse; // error to create a object } // no need it. pLMgr->Release(); ////////////////////////////////////////////////////////////////////////// // Create Han/Eng toggle button if (!(m_pCMode = new CMode(this))) { hr = E_OUTOFMEMORY; return fFalse; } pLItemMgr->AddItem(m_pCMode); ////////////////////////////////////////////////////////////////////////// // Create Full/Half shape toggle button if (!(m_pFMode = new FMode(this))) { hr = E_OUTOFMEMORY; return fFalse; } pLItemMgr->AddItem(m_pFMode); ////////////////////////////////////////////////////////////////////////// // Create Hanja Conv button if (!(m_pHJMode = new HJMode(this))) { hr = E_OUTOFMEMORY; return fFalse; } pLItemMgr->AddItem(m_pHJMode); #if !defined(_WIN64) ////////////////////////////////////////////////////////////////////////// // Create IME Pad button if (IsWin64() == fFalse) { if (!(m_pPMode = new PMode(this))) { hr = E_OUTOFMEMORY; return fFalse; } pLItemMgr->AddItem(m_pPMode); } #endif // Update all button CheckEnable(); m_pCMode->UpdateButton(); m_pFMode->UpdateButton(); m_pHJMode->UpdateButton(); #if !defined(_WIN64) if (IsWin64() == fFalse) m_pPMode->UpdateButton(); #endif // SYSHelp support m_pSysHelp = new CSysHelpSink(SysInitMenu, OnSysMenuSelect, (VOID*)this); if (m_pSysHelp && pLItemMgr) m_pSysHelp->_Advise(pLItemMgr, GUID_LBI_HELP); m_fToolbarInited = fTrue; return fTrue; } /*--------------------------------------------------------------------------- CToolBar::CheckEnable ---------------------------------------------------------------------------*/ void CToolBar::CheckEnable() { if (m_pCMode == NULL || m_pFMode == NULL || m_pHJMode == NULL) return; #if !defined(_WIN64) if ((IsWin64() == fFalse) && m_pPMode == NULL) return; #endif if (m_pImeCtx == NULL) // empty or disabled(exclude cand ui) { m_pCMode->Enable(fFalse); m_pFMode->Enable(fFalse); m_pHJMode->Enable(fFalse); #if !defined(_WIN64) if (IsWin64() == fFalse) m_pPMode->Enable(fFalse); #endif } else { m_pCMode->Enable(fTrue); m_pFMode->Enable(fTrue); m_pHJMode->Enable(fTrue); #if !defined(_WIN64) if (IsWin64() == fFalse) m_pPMode->Enable(fTrue); #endif } } /*--------------------------------------------------------------------------- CToolBar::SetCurrentIC ---------------------------------------------------------------------------*/ void CToolBar::SetCurrentIC(PCIMECtx pImeCtx) { m_pImeCtx = pImeCtx; CheckEnable(); // enable or disable context // changed context - update all toolbar buttons Update(UPDTTB_ALL, fTrue); } /*--------------------------------------------------------------------------- CToolBar::Terminate Delete toolbar buttonsfrom Cic main toolbar. ---------------------------------------------------------------------------*/ void CToolBar::Terminate() { ITfLangBarMgr *pLMgr = NULL; ITfLangBarItemMgr *pLItemMgr = NULL; DWORD dwThread = 0; if (IsCicero() && m_fToolbarInited) { // initialization if (FAILED(Cicero_CreateLangBarMgr(&pLMgr))) return; // error to create a object if (FAILED(pLMgr->GetThreadLangBarItemMgr(GetCurrentThreadId(), &pLItemMgr, &dwThread))) { pLMgr->Release(); DbgAssert(0); return; // error to create a object } // no need it. pLMgr->Release(); #if !defined(_WIN64) if (m_pPMode && (IsWin64() == fFalse)) { pLItemMgr->RemoveItem(m_pPMode); SafeReleaseClear(m_pPMode); } #endif if (m_pHJMode) { pLItemMgr->RemoveItem(m_pHJMode); SafeReleaseClear(m_pHJMode); } if (m_pFMode) { pLItemMgr->RemoveItem(m_pFMode); SafeReleaseClear(m_pFMode); } if (m_pCMode) { pLItemMgr->RemoveItem(m_pCMode); SafeReleaseClear(m_pCMode); } // Release Syshelp if (m_pSysHelp) { m_pSysHelp->_Unadvise(pLItemMgr); SafeReleaseClear(m_pSysHelp); } pLItemMgr->Release(); //Toolbar uninited. m_fToolbarInited = fFalse; } } /*--------------------------------------------------------------------------- CToolBar::SetConversionMode Foward the call to CKorIMX ---------------------------------------------------------------------------*/ DWORD CToolBar::SetConversionMode(DWORD dwConvMode) { if (m_pImeCtx) return m_pImeCtx->SetConversionMode(dwConvMode); return 0; } /*--------------------------------------------------------------------------- CToolBar::GetConversionMode Foward the call to CKorIMX ---------------------------------------------------------------------------*/ DWORD CToolBar::GetConversionMode(PCIMECtx pImeCtx) { if (pImeCtx == NULL) pImeCtx = m_pImeCtx; if (pImeCtx) return pImeCtx->GetConversionMode(); return 0; } /*--------------------------------------------------------------------------- CToolBar::IsOn Foward the call to CKorIMX ---------------------------------------------------------------------------*/ BOOL CToolBar::IsOn(PCIMECtx pImeCtx) { if (pImeCtx == NULL) pImeCtx = m_pImeCtx; if (pImeCtx) return pImeCtx->IsOpen(); return fFalse; } /*--------------------------------------------------------------------------- CToolBar::SetOnOff Foward the call to CKorIMX ---------------------------------------------------------------------------*/ BOOL CToolBar::SetOnOff(BOOL fOn) { if (m_pImeCtx) { m_pImeCtx->SetOpen(fOn); return fOn; } return fFalse; } /*--------------------------------------------------------------------------- CToolBar::GetOwnerWnd Foward the call to CKorIMX ---------------------------------------------------------------------------*/ HWND CToolBar::GetOwnerWnd(PCIMECtx pImeCtx) { #if 0 if (pImeCtx == NULL) pImeCtx = m_pImeCtx; if (pImeCtx) return pImeCtx->GetUIWnd(); return 0; #endif return GetActiveUIWnd(); } /*--------------------------------------------------------------------------- CToolBar::GetOwnerWnd Update buttons. dwUpdate has update bits corresponding each button. ---------------------------------------------------------------------------*/ BOOL CToolBar::Update(DWORD dwUpdate, BOOL fRefresh) { DWORD dwFlag = TF_LBI_BTNALL; if (!IsCicero()) return fTrue; if (fRefresh) dwFlag |= TF_LBI_STATUS; if ((dwUpdate & UPDTTB_CMODE) && m_pCMode && m_pCMode->GetSink()) m_pCMode->GetSink()->OnUpdate(dwFlag); if ((dwUpdate & UPDTTB_FHMODE) && m_pFMode && m_pFMode->GetSink()) m_pFMode->GetSink()->OnUpdate(dwFlag); if ((dwUpdate & UPDTTB_HJMODE) && m_pHJMode && m_pHJMode->GetSink()) m_pHJMode->GetSink()->OnUpdate(dwFlag); #if !defined(_WIN64) if ((dwUpdate & UPDTTB_PAD) && m_pPMode && m_pPMode->GetSink()) m_pPMode->GetSink()->OnUpdate(dwFlag); #endif return fTrue; } /*--------------------------------------------------------------------------- CToolBar::OnSysMenuSelect Cicero Help menu callback ---------------------------------------------------------------------------*/ HRESULT CToolBar::OnSysMenuSelect(void *pv, UINT uiCmd) { UNREFERENCED_PARAMETER(pv); UNREFERENCED_PARAMETER(uiCmd); CHAR szHelpFileName[MAX_PATH]; CHAR szHelpCmd[MAX_PATH]; szHelpFileName[0] = '\0'; // Load Help display name OurLoadStringA(vpInstData->hInst, IDS_HELP_FILENAME, szHelpFileName, sizeof(szHelpFileName)/sizeof(CHAR)); wsprintf(szHelpCmd, "hh.exe %s", szHelpFileName); WinExec(szHelpCmd, SW_NORMAL); return S_OK; } /*--------------------------------------------------------------------------- CToolBar::SysInitMenu Cicero Help menu callback ---------------------------------------------------------------------------*/ HRESULT CToolBar::SysInitMenu(void *pv, ITfMenu* pMenu) { WCHAR szText[MAX_PATH]; HRESULT hr; szText[0] = L'\0'; if (pv == NULL || pMenu == NULL) return S_OK; // Load Help display name OurLoadStringW(vpInstData->hInst, IDS_HELP_DISPLAYNAME, szText, sizeof(szText)/sizeof(WCHAR)); hr = pMenu->AddMenuItem(UINT(-1), 0, NULL /*hbmpColor*/, NULL /*hbmpMask*/, szText, lstrlenW(szText), NULL); return hr; }