|
5 | 5 | #include <rime_api.h> |
6 | 6 |
|
7 | 7 | #include <string> |
| 8 | +#include <vector> |
8 | 9 |
|
9 | 10 | #include "jni-utils.h" |
10 | 11 | #include "objconv.h" |
@@ -117,6 +118,31 @@ class Rime { |
117 | 118 | return rime->get_state_label(session, optionName.c_str(), state); |
118 | 119 | } |
119 | 120 |
|
| 121 | + using CandidateItem = std::pair<std::string, std::string>; |
| 122 | + using CandidateList = std::vector<CandidateItem>; |
| 123 | + |
| 124 | + CandidateList getCandidates(int startIndex, int limit) { |
| 125 | + CandidateList result; |
| 126 | + result.reserve(limit); |
| 127 | + RimeCandidateListIterator iter{nullptr}; |
| 128 | + if (rime->candidate_list_from_index(session, &iter, startIndex)) { |
| 129 | + int count = 0; |
| 130 | + while (rime->candidate_list_next(&iter)) { |
| 131 | + if (count >= limit) break; |
| 132 | + std::string text(iter.candidate.text); |
| 133 | + std::string comment; |
| 134 | + if (iter.candidate.comment) { |
| 135 | + comment = iter.candidate.comment; |
| 136 | + } |
| 137 | + auto item = std::make_pair(text, comment); |
| 138 | + result.emplace_back(std::move(item)); |
| 139 | + ++count; |
| 140 | + } |
| 141 | + rime->candidate_list_end(&iter); |
| 142 | + } |
| 143 | + return std::move(result); |
| 144 | + } |
| 145 | + |
120 | 146 | void exit() { |
121 | 147 | rime->destroy_session(session); |
122 | 148 | session = 0; |
@@ -480,3 +506,25 @@ Java_com_osfans_trime_core_Rime_getRimeStateLabel(JNIEnv *env, |
480 | 506 | return env->NewStringUTF( |
481 | 507 | Rime::Instance().stateLabel(CString(env, option_name), state).c_str()); |
482 | 508 | } |
| 509 | + |
| 510 | +extern "C" JNIEXPORT jobjectArray JNICALL |
| 511 | +Java_com_osfans_trime_core_Rime_getRimeCandidates(JNIEnv *env, jclass clazz, |
| 512 | + jint start_index, |
| 513 | + jint limit) { |
| 514 | + if (!is_rime_running()) { |
| 515 | + return nullptr; |
| 516 | + } |
| 517 | + auto candidates = Rime::Instance().getCandidates(start_index, limit); |
| 518 | + int size = static_cast<int>(candidates.size()); |
| 519 | + jobjectArray array = |
| 520 | + env->NewObjectArray(size, GlobalRef->CandidateListItem, nullptr); |
| 521 | + for (int i = 0; i < size; i++) { |
| 522 | + auto &candidate = candidates[i]; |
| 523 | + auto item = JRef<>(env, env->NewObject(GlobalRef->CandidateListItem, |
| 524 | + GlobalRef->CandidateListItemInit, |
| 525 | + *JString(env, candidate.second), |
| 526 | + *JString(env, candidate.first))); |
| 527 | + env->SetObjectArrayElement(array, i, item); |
| 528 | + } |
| 529 | + return array; |
| 530 | +} |
0 commit comments