HRESULT COVTSF::_HandleCompositionBackspace(TfEditCookie ec, _In_ ITfContext *pContext) { ITfRange* pRangeComposition = nullptr; TF_SELECTION tfSelection; ULONG fetched = 0; BOOL isCovered = TRUE; // Start the new (std::nothrow) compositon if there is no composition. if (!_IsComposing()) { return S_OK; } // first, test where a keystroke would go in the document if we did an insert if (FAILED(pContext->GetSelection(ec, TF_DEFAULT_SELECTION, 1, &tfSelection, &fetched)) || fetched != 1) { return S_FALSE; } // is the insertion point covered by a composition? if (SUCCEEDED(_pComposition->GetRange(&pRangeComposition))) { isCovered = _IsRangeCovered(ec, tfSelection.range, pRangeComposition); pRangeComposition->Release(); if (!isCovered) { goto Exit; } } // // Add virtual key to composition processor engine // CCompositionProcessorEngine* pCompositionProcessorEngine = nullptr; pCompositionProcessorEngine = _pCompositionProcessorEngine; DWORD_PTR vKeyLen = pCompositionProcessorEngine->GetVirtualKeyLength(); if (vKeyLen) { pCompositionProcessorEngine->RemoveVirtualKey(vKeyLen - 1); if (pCompositionProcessorEngine->GetVirtualKeyLength()) { _HandleCompositionInputWorker(pCompositionProcessorEngine, ec, pContext); } else { _HandleCancel(ec, pContext); } } Exit: tfSelection.range->Release(); return S_OK; }
HRESULT COVTSF::_HandleCompositionInput(TfEditCookie ec, _In_ ITfContext *pContext, WCHAR wch) { ITfRange* pRangeComposition = nullptr; TF_SELECTION tfSelection; ULONG fetched = 0; BOOL isCovered = TRUE; CCompositionProcessorEngine* pCompositionProcessorEngine = nullptr; pCompositionProcessorEngine = _pCompositionProcessorEngine; if ((_pCandidateListUIPresenter != nullptr) && (_candidateMode != CANDIDATE_INCREMENTAL)) { _HandleCompositionFinalize(ec, pContext, FALSE); } // Start the new (std::nothrow) compositon if there is no composition. if (!_IsComposing()) { _StartComposition(pContext); } // first, test where a keystroke would go in the document if we did an insert if (pContext->GetSelection(ec, TF_DEFAULT_SELECTION, 1, &tfSelection, &fetched) != S_OK || fetched != 1) { return S_FALSE; } // is the insertion point covered by a composition? if (SUCCEEDED(_pComposition->GetRange(&pRangeComposition))) { isCovered = _IsRangeCovered(ec, tfSelection.range, pRangeComposition); pRangeComposition->Release(); if (!isCovered) { goto Exit; } } // Add virtual key to composition processor engine pCompositionProcessorEngine->AddVirtualKey(wch); _HandleCompositionInputWorker(pCompositionProcessorEngine, ec, pContext); Exit: tfSelection.range->Release(); return S_OK; }
void CIME::_UpdateLanguageBarOnSetFocus(_In_ ITfDocumentMgr *pDocMgrFocus) { BOOL needDisableButtons = FALSE; if (!pDocMgrFocus) { needDisableButtons = TRUE; } else { IEnumTfContexts* pEnumContext = nullptr; if (FAILED(pDocMgrFocus->EnumContexts(&pEnumContext)) || !pEnumContext) { needDisableButtons = TRUE; } else { ULONG fetched = 0; ITfContext* pContext = nullptr; if (FAILED(pEnumContext->Next(1, &pContext, &fetched)) || fetched != 1) { needDisableButtons = TRUE; } if (!pContext) { // context is not associated needDisableButtons = TRUE; } else { pContext->Release(); } } if (pEnumContext) { pEnumContext->Release(); } } CCompositionProcessorEngine* pCompositionProcessorEngine = nullptr; pCompositionProcessorEngine = _pCompositionProcessorEngine; pCompositionProcessorEngine->SetLanguageBarStatus(TF_LBI_STATUS_DISABLED, needDisableButtons); }
VOID COVTSF::_DeleteCandidateList(BOOL isForce, _In_opt_ ITfContext *pContext) { isForce;pContext; CCompositionProcessorEngine* pCompositionProcessorEngine = nullptr; pCompositionProcessorEngine = _pCompositionProcessorEngine; pCompositionProcessorEngine->PurgeVirtualKey(); if (_pCandidateListUIPresenter) { _pCandidateListUIPresenter->_EndCandidateList(); _candidateMode = CANDIDATE_NONE; _isCandidateWithWildcard = FALSE; } }
STDMETHODIMP CSearchCandidateProvider::GetSearchCandidates(BSTR bstrQuery, BSTR bstrApplicationID, _Outptr_result_maybenull_ ITfCandidateList **pplist) { bstrApplicationID;bstrQuery; HRESULT hr = E_FAIL; *pplist = nullptr; if (nullptr == _pTip) { return hr; } CCompositionProcessorEngine* pCompositionProcessorEngine = ((CSampleIME*)_pTip)->GetCompositionProcessorEngine(); if (nullptr == pCompositionProcessorEngine) { return hr; } CSampleImeArray<CCandidateListItem> candidateList; pCompositionProcessorEngine->GetCandidateList(&candidateList, TRUE, FALSE); int cCand = min(candidateList.Count(), FAKECANDIDATENUMBER); if (0 < cCand) { hr = CTipCandidateList::CreateInstance(pplist, cCand); if (FAILED(hr)) { return hr; } for (int iCand = 0; iCand < cCand; iCand++) { ITfCandidateString* pCandStr = nullptr; CTipCandidateString::CreateInstance(IID_ITfCandidateString, (void**)&pCandStr); ((CTipCandidateString*)pCandStr)->SetIndex(iCand); ((CTipCandidateString*)pCandStr)->SetString(candidateList.GetAt(iCand)->_ItemString.Get(), candidateList.GetAt(iCand)->_ItemString.GetLength()); ((CTipCandidateList*)(*pplist))->SetCandidate(&pCandStr); } } hr = S_OK; return hr; }
HRESULT COVTSF::_HandleCompositionPunctuation(TfEditCookie ec, _In_ ITfContext *pContext, WCHAR wch) { HRESULT hr = S_OK; if (_candidateMode != CANDIDATE_NONE && _pCandidateListUIPresenter) { DWORD_PTR candidateLen = 0; const WCHAR* pCandidateString = nullptr; candidateLen = _pCandidateListUIPresenter->_GetSelectedCandidateString(&pCandidateString); CStringRange candidateString; candidateString.Set(pCandidateString, candidateLen); if (candidateLen) { _AddComposingAndChar(ec, pContext, &candidateString); } } // // Get punctuation char from composition processor engine // CCompositionProcessorEngine* pCompositionProcessorEngine = nullptr; pCompositionProcessorEngine = _pCompositionProcessorEngine; WCHAR punctuation = pCompositionProcessorEngine->GetPunctuation(wch); CStringRange punctuationString; punctuationString.Set(&punctuation, 1); // Finalize character hr = _AddCharAndFinalize(ec, pContext, &punctuationString); if (FAILED(hr)) { return hr; } _HandleCancel(ec, pContext); return S_OK; }
HRESULT COVTSF::_HandleCompositionConvert(TfEditCookie ec, _In_ ITfContext *pContext, BOOL isWildcardSearch) { HRESULT hr = S_OK; COVTSFArray<CCandidateListItem> candidateList; // // Get candidate string from composition processor engine // CCompositionProcessorEngine* pCompositionProcessorEngine = nullptr; pCompositionProcessorEngine = _pCompositionProcessorEngine; pCompositionProcessorEngine->GetCandidateList(&candidateList, FALSE, isWildcardSearch); // If there is no candlidate listin the current reading string, we don't do anything. Just wait for // next char to be ready for the conversion with it. int nCount = candidateList.Count(); if (nCount) { if (_pCandidateListUIPresenter) { _pCandidateListUIPresenter->_EndCandidateList(); delete _pCandidateListUIPresenter; _pCandidateListUIPresenter = nullptr; _candidateMode = CANDIDATE_NONE; _isCandidateWithWildcard = FALSE; } // // create an instance of the candidate list class. // if (_pCandidateListUIPresenter == nullptr) { _pCandidateListUIPresenter = new (std::nothrow) CCandidateListUIPresenter(this, Global::AtomCandidateWindow, CATEGORY_CANDIDATE, pCompositionProcessorEngine->GetCandidateListIndexRange(), FALSE); if (!_pCandidateListUIPresenter) { return E_OUTOFMEMORY; } _candidateMode = CANDIDATE_ORIGINAL; } _isCandidateWithWildcard = isWildcardSearch; // we don't cache the document manager object. So get it from pContext. ITfDocumentMgr* pDocumentMgr = nullptr; if (SUCCEEDED(pContext->GetDocumentMgr(&pDocumentMgr))) { // get the composition range. ITfRange* pRange = nullptr; if (SUCCEEDED(_pComposition->GetRange(&pRange))) { hr = _pCandidateListUIPresenter->_StartCandidateList(_tfClientId, pDocumentMgr, pContext, ec, pRange, pCompositionProcessorEngine->GetCandidateWindowWidth()); pRange->Release(); } pDocumentMgr->Release(); } if (SUCCEEDED(hr)) { _pCandidateListUIPresenter->_SetText(&candidateList, FALSE); } } return hr; }