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 <erack@redhat.com> Tested-by: Jenkins
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user