editeng/source/editeng/impedit2.cxx |   34 ++++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

New commits:
commit 81a5ba3cfc8b0d95724b38e7cc7cafdd83fb870d
Author:     Eike Rathke <er...@redhat.com>
AuthorDate: Thu Jan 20 13:54:52 2022 +0100
Commit:     Eike Rathke <er...@redhat.com>
CommitDate: Thu Jan 20 16:36:17 2022 +0100

    Related: tdf#139974 Try to find boundary for forced line break
    
    So we break at word or number boundary, e.g.
    
    1234567890+
    1234567890
    
    instead of
    
    1234567890+123456
    7890
    
    (which in the sample case also keeps a formula expression
    functional).
    
    Change-Id: Ied01d76d8e30822d6e70c1bc2c1ca8609b0e3778
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/128665
    Reviewed-by: Eike Rathke <er...@redhat.com>
    Tested-by: Jenkins

diff --git a/editeng/source/editeng/impedit2.cxx 
b/editeng/source/editeng/impedit2.cxx
index 0fd1c004263b..171aa676f009 100644
--- a/editeng/source/editeng/impedit2.cxx
+++ b/editeng/source/editeng/impedit2.cxx
@@ -48,6 +48,7 @@
 #include <com/sun/star/system/SystemShellExecute.hpp>
 #include <com/sun/star/system/SystemShellExecuteFlags.hpp>
 #include <com/sun/star/system/XSystemShellExecute.hpp>
+#include <com/sun/star/i18n/UnicodeType.hpp>
 
 #include <rtl/character.hxx>
 
@@ -2730,6 +2731,39 @@ EditPaM ImpEditEngine::ImpInsertText(const 
EditSelection& aCurSel, const OUStrin
             if (nChars > MAXCHARSINPARA)
             {
                 sal_Int32 nMaxNewChars = std::max<sal_Int32>(0, MAXCHARSINPARA 
- nExistingChars);
+                // Wherever we break, it may be wrong. However, try to find the
+                // previous non-alnum/non-letter character. Note this is only
+                // in the to be appended data, otherwise already existing
+                // characters would have to be moved and PaM to be updated.
+                // Restrict to 2*42, if not found by then assume other data or
+                // language-script uses only letters or idiographs.
+                sal_Int32 nPos = nMaxNewChars;
+                while (nPos-- > 0 && (nMaxNewChars - nPos) <= 84)
+                {
+                    switch (unicode::getUnicodeType(aLine[nPos]))
+                    {
+                        case css::i18n::UnicodeType::UPPERCASE_LETTER:
+                        case css::i18n::UnicodeType::LOWERCASE_LETTER:
+                        case css::i18n::UnicodeType::TITLECASE_LETTER:
+                        case css::i18n::UnicodeType::MODIFIER_LETTER:
+                        case css::i18n::UnicodeType::OTHER_LETTER:
+                        case css::i18n::UnicodeType::DECIMAL_DIGIT_NUMBER:
+                        case css::i18n::UnicodeType::LETTER_NUMBER:
+                        case css::i18n::UnicodeType::OTHER_NUMBER:
+                        case css::i18n::UnicodeType::CURRENCY_SYMBOL:
+                        break;
+                        default:
+                            {
+                                const sal_Unicode c = aLine[nPos];
+                                // Ignore NO-BREAK spaces, NBSP, NNBSP, ZWNBSP.
+                                if (c != 0x00A0 && c != 0x202F && c != 0xFEFF)
+                                {
+                                    nMaxNewChars = nPos + 1;    // line break 
after
+                                    nPos = 0;   // will break loop
+                                }
+                            }
+                    }
+                }
                 // Remaining characters end up in the next paragraph. Note that
                 // new nStart will be nEnd+1 below so decrement by one more.
                 nEnd -= (aLine.getLength() - nMaxNewChars + 1);

Reply via email to