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::_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; }