static void setTextImpl(JNIEnv* env, jclass, jint address, jstring text) { UErrorCode status = U_ZERO_ERROR; const UChar* chars = env->GetStringChars(text, NULL); ubrk_setText(breakIterator(address), chars, env->GetStringLength(text), &status); env->ReleaseStringChars(text, chars); icu4jni_error(env, status); }
static void NativeBreakIterator_setTextImpl(JNIEnv* env, jclass, jint address, jstring javaText) { ScopedJavaUnicodeString text(env, javaText); UnicodeString& s(text.unicodeString()); UErrorCode status = U_ZERO_ERROR; ubrk_setText(breakIterator(address), s.getBuffer(), s.length(), &status); icu4jni_error(env, status); }
static jint cloneImpl(JNIEnv* env, jclass, jint address) { UErrorCode status = U_ZERO_ERROR; jint bufferSize = U_BRK_SAFECLONE_BUFFERSIZE; UBreakIterator* it = ubrk_safeClone(breakIterator(address), NULL, &bufferSize, &status); icu4jni_error(env, status); return reinterpret_cast<uintptr_t>(it); }
static jint nextImpl(JNIEnv* env, jclass, jint address, jint n) { UBreakIterator* bi = breakIterator(address); if (n < 0) { while (n++ < -1) { ubrk_previous(bi); } return ubrk_previous(bi); } else if (n == 0) { return ubrk_current(bi); } else { while (n-- > 1) { ubrk_next(bi); } return ubrk_next(bi); } return -1; }
QPointF CustomEdit::startPoint(const QPointF &hitPoint) const { // Prefer to select something even though the tap hit between words MBreakIterator breakIterator(text()); if (breakIterator.isBoundary(cursorPosition(hitPoint))) { // Hit the boundary -> try to find a word nearby QList<QPoint> baseOffsets; baseOffsets << QPoint(3,0) << QPoint(-3,0) << QPoint(0,-3) << QPoint(0,3); for (int i=1; i<=4; i++) { // Check each direction at 3,6,9 and 12 pixel distances -> a change to get the closest one Q_FOREACH(QPoint offset, baseOffsets) { QPointF checkPoint = hitPoint + i*offset; int checkPos = cursorPosition(checkPoint); if (checkPos >= 0 && !breakIterator.isBoundary(checkPos)) { return checkPoint; } } }
static jintArray nLineBreakOpportunities(JNIEnv* env, jclass, jstring javaLocaleName, jcharArray inputText, jint length, jintArray recycle) { jintArray ret; std::vector<jint> breaks; ScopedIcuLocale icuLocale(env, javaLocaleName); if (icuLocale.valid()) { UErrorCode status = U_ZERO_ERROR; BreakIterator* it = BreakIterator::createLineInstance(icuLocale.locale(), status); if (!U_SUCCESS(status) || it == NULL) { if (it) { delete it; } } else { ScopedBreakIterator breakIterator(env, it, inputText, length); for (int loc = breakIterator->first(); loc != BreakIterator::DONE; loc = breakIterator->next()) { breaks.push_back(loc); } } } breaks.push_back(-1); // sentinel terminal value if (recycle != NULL && static_cast<size_t>(env->GetArrayLength(recycle)) >= breaks.size()) { ret = recycle; } else { ret = env->NewIntArray(breaks.size()); } if (ret != NULL) { env->SetIntArrayRegion(ret, 0, breaks.size(), &breaks.front()); } return ret; }
static jboolean isBoundaryImpl(JNIEnv*, jclass, jint address, jint offset) { return ubrk_isBoundary(breakIterator(address), offset); }
static void closeBreakIteratorImpl(JNIEnv* env, jclass, jint address) { ubrk_close(breakIterator(address)); }
static jint lastImpl(JNIEnv*, jclass, jint address) { return ubrk_last(breakIterator(address)); }
static jint previousImpl(JNIEnv*, jclass, jint address) { return ubrk_previous(breakIterator(address)); }
static jint currentImpl(JNIEnv*, jclass, jint address) { return ubrk_current(breakIterator(address)); }
static jint followingImpl(JNIEnv*, jclass, jint address, jint offset) { return ubrk_following(breakIterator(address), offset); }
static jint NativeBreakIterator_firstImpl(JNIEnv*, jclass, jint address) { return ubrk_first(breakIterator(address)); }
static jint NativeBreakIterator_precedingImpl(JNIEnv*, jclass, jint address, jint offset) { return ubrk_preceding(breakIterator(address), offset); }