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; }
VOID CBaseDictionaryEngine::MergeSortByFindKeyCode(_Inout_ CSampleImeArray<CCandidateListItem> *pItemList, int leftRange, int rightRange) { int candidateCount = CalculateCandidateCount(leftRange, rightRange); if (candidateCount > 2) { int mid = leftRange + (candidateCount / 2); MergeSortByFindKeyCode(pItemList, leftRange, mid); MergeSortByFindKeyCode(pItemList, mid, rightRange); CSampleImeArray<CCandidateListItem> ListItemTemp; int leftRangeTemp = 0; int midTemp = 0; for (leftRangeTemp = leftRange, midTemp = mid; leftRangeTemp != mid || midTemp != rightRange;) { CStringRange* psrgLeftTemp = nullptr; CStringRange* psrgMidTemp = nullptr; psrgLeftTemp = &pItemList->GetAt(leftRangeTemp)->_FindKeyCode; psrgMidTemp = &pItemList->GetAt(midTemp)->_FindKeyCode; CCandidateListItem* pLI = nullptr; pLI = ListItemTemp.Append(); if (pLI) { if (leftRangeTemp == mid) { *pLI = *pItemList->GetAt(midTemp++); } else if (midTemp == rightRange || CStringRange::Compare(_locale, psrgLeftTemp, psrgMidTemp) != CSTR_GREATER_THAN) { *pLI = *pItemList->GetAt(leftRangeTemp++); } else { *pLI = *pItemList->GetAt(midTemp++); } } } leftRangeTemp = leftRange; for (UINT count = 0; count < ListItemTemp.Count(); count++) { *pItemList->GetAt(leftRangeTemp++) = *ListItemTemp.GetAt(count); } } else if (candidateCount == 2) { CStringRange *psrgLeft = nullptr; CStringRange *psrgLeftNext = nullptr; psrgLeft = &pItemList->GetAt(leftRange )->_FindKeyCode; psrgLeftNext = &pItemList->GetAt(leftRange+1)->_FindKeyCode; if (CStringRange::Compare(_locale, psrgLeft, psrgLeftNext) == CSTR_GREATER_THAN) { CCandidateListItem ListItem; ListItem = *pItemList->GetAt(leftRange); *pItemList->GetAt(leftRange ) = *pItemList->GetAt(leftRange+1); *pItemList->GetAt(leftRange+1) = ListItem; } } }