From dd7c9e6fc7b5adb23180662b064d6ac6a265b1d4 Mon Sep 17 00:00:00 2001 From: Takashi Sawanaka Date: Sun, 18 Aug 2019 11:43:57 +0900 Subject: [PATCH] Improve UNICODE character support using icu.dll usable from Windows 10 Creators Update (6) --- Externals/crystaledit/editlib/ccrystaltextview2.cpp | 19 ++++++++++++++----- Externals/crystaledit/editlib/icu.hpp | 4 +--- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/Externals/crystaledit/editlib/ccrystaltextview2.cpp b/Externals/crystaledit/editlib/ccrystaltextview2.cpp index c0f3a9c45..ecdae52ae 100644 --- a/Externals/crystaledit/editlib/ccrystaltextview2.cpp +++ b/Externals/crystaledit/editlib/ccrystaltextview2.cpp @@ -148,6 +148,7 @@ MoveRight (bool bSelect) void CCrystalTextView:: MoveWordLeft (bool bSelect) { + int nLength = GetLineLength(m_ptCursorPos.y); PrepareSelBounds (); if (m_ptDrawSelStart != m_ptDrawSelEnd && !bSelect) { @@ -160,13 +161,17 @@ MoveWordLeft (bool bSelect) if (m_ptCursorPos.y == 0) return; m_ptCursorPos.y--; - m_ptCursorPos.x = GetLineLength (m_ptCursorPos.y); + m_ptCursorPos.x = nLength; } if (m_ptCursorPos.x > 0) { - m_iterWord.setText(reinterpret_cast(GetLineChars(m_ptCursorPos.y)), GetLineLength(m_ptCursorPos.y)); - m_ptCursorPos.x = m_iterWord.preceding(m_ptCursorPos.x); + const TCHAR *pszChars = GetLineChars(m_ptCursorPos.y); + m_iterWord.setText(reinterpret_cast(pszChars), nLength); + int nPos = m_iterWord.preceding(m_ptCursorPos.x); + if (xisspace(pszChars[nPos])) + nPos = m_iterWord.preceding(nPos); + m_ptCursorPos.x = nPos; } m_nIdealCharPos = CalculateActualOffset (m_ptCursorPos.y, m_ptCursorPos.x); @@ -202,8 +207,12 @@ MoveWordRight (bool bSelect) return; } - m_iterWord.setText(reinterpret_cast(GetLineChars(m_ptCursorPos.y)), GetLineLength(m_ptCursorPos.y)); - m_ptCursorPos.x = m_iterWord.following(m_ptCursorPos.x); + const TCHAR *pszChars = GetLineChars(m_ptCursorPos.y); + m_iterWord.setText(reinterpret_cast(pszChars), nLength); + int nPos = m_iterWord.following(m_ptCursorPos.x); + while (nPos < nLength && xisspace(pszChars[nPos])) + ++nPos; + m_ptCursorPos.x = nPos; m_nIdealCharPos = CalculateActualOffset (m_ptCursorPos.y, m_ptCursorPos.x); EnsureVisible (m_ptCursorPos); diff --git a/Externals/crystaledit/editlib/icu.hpp b/Externals/crystaledit/editlib/icu.hpp index 7491d1a76..d78687e41 100644 --- a/Externals/crystaledit/editlib/icu.hpp +++ b/Externals/crystaledit/editlib/icu.hpp @@ -130,6 +130,7 @@ public: { m_text = text; m_textLength = textLength; + m_i = 0; UErrorCode status = U_ZERO_ERROR; if (m_iter) ubrk_setText(m_iter, text, textLength, &status); @@ -233,9 +234,6 @@ private: && !iswspace(m_text[nPos])) nPos += (U16_IS_SURROGATE(m_text[nPos]) ? 2 : 1); } - - while (nPos < m_textLength && iswspace(m_text[nPos])) - nPos += (U16_IS_SURROGATE(m_text[nPos]) ? 2 : 1); m_i = nPos; } return m_i; -- 2.11.0