From be8a33c0f03b83357d2ae37dda6bf65313267cea Mon Sep 17 00:00:00 2001 From: Caolán McNamara Date: Mon, 21 Sep 2020 20:44:04 +0100 Subject: tdf#132970 SMP bullets mangled working: a) bullet preview b) writer rendering c) save to odt a) load from odt Change-Id: I2f85576389fe4f0437f81799c14dfd98c8c40b2e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/103129 Tested-by: Jenkins Reviewed-by: Noel Grandin --- cui/source/dialogs/cuicharmap.cxx | 3 ++- cui/source/tabpages/numpages.cxx | 7 ++++--- editeng/source/outliner/outliner.cxx | 3 ++- include/editeng/numitem.hxx | 7 ++++--- sd/source/ui/dlg/BulletAndPositionDlg.cxx | 2 +- sw/source/core/edit/edattr.cxx | 5 ++++- sw/source/core/text/porfld.cxx | 4 ++-- sw/source/core/text/porfld.hxx | 2 +- sw/source/core/unocore/unosett.cxx | 19 +++++++++++-------- sw/source/filter/html/htmlnumreader.cxx | 2 +- sw/source/filter/ww8/rtfattributeoutput.cxx | 5 ++++- sw/source/filter/ww8/wrtw8num.cxx | 3 ++- sw/source/ui/misc/outline.cxx | 3 ++- xmloff/source/style/xmlnume.cxx | 9 +++++---- xmloff/source/style/xmlnumi.cxx | 11 ++++++++--- 15 files changed, 53 insertions(+), 32 deletions(-) diff --git a/cui/source/dialogs/cuicharmap.cxx b/cui/source/dialogs/cuicharmap.cxx index 13d3c8e7658b..5042a2079210 100644 --- a/cui/source/dialogs/cuicharmap.cxx +++ b/cui/source/dialogs/cuicharmap.cxx @@ -209,7 +209,8 @@ void SvxCharacterMap::SetChar( sal_UCS4 c ) sal_UCS4 SvxCharacterMap::GetChar() const { - return m_aShowChar.GetText().toChar(); + sal_Int32 nIndexUtf16 = 0; + return m_aShowChar.GetText().iterateCodePoints(&nIndexUtf16); } void SvxCharacterMap::DisableFontSelection() diff --git a/cui/source/tabpages/numpages.cxx b/cui/source/tabpages/numpages.cxx index 6086cb0d0679..141021652ac4 100644 --- a/cui/source/tabpages/numpages.cxx +++ b/cui/source/tabpages/numpages.cxx @@ -1928,7 +1928,7 @@ IMPL_LINK_NOARG(SvxNumOptionsTabPage, BulletHdl_Impl, weld::Button&, void) sal_uInt16 nMask = 1; const vcl::Font* pFmtFont = nullptr; bool bSameBullet = true; - sal_Unicode cBullet = 0; + sal_UCS4 cBullet = 0; bool bFirst = true; for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++) { @@ -1971,7 +1971,7 @@ IMPL_LINK_NOARG(SvxNumOptionsTabPage, BulletHdl_Impl, weld::Button&, void) { SvxNumberFormat aNumFmt(pActNum->GetLevel(i)); aNumFmt.SetBulletFont(&aActBulletFont); - aNumFmt.SetBulletChar( static_cast(aMap.GetChar()) ); + aNumFmt.SetBulletChar(aMap.GetChar()); pActNum->SetLevel(i, aNumFmt); } _nMask <<= 1; @@ -2164,7 +2164,8 @@ static long lcl_DrawBullet(VirtualDevice* pVDev, aBulletColor.Invert(); aFont.SetColor(aBulletColor); pVDev->SetFont( aFont ); - OUString aText(rFmt.GetBulletChar()); + sal_UCS4 cChar = rFmt.GetBulletChar(); + OUString aText(&cChar, 1); long nY = nYStart; nY -= ((aTmpSize.Height() - rSize.Height())/ 2); pVDev->DrawText( Point(nXStart, nY), aText ); diff --git a/editeng/source/outliner/outliner.cxx b/editeng/source/outliner/outliner.cxx index 27d86600aa3d..ca97d103c012 100644 --- a/editeng/source/outliner/outliner.cxx +++ b/editeng/source/outliner/outliner.cxx @@ -1839,7 +1839,8 @@ void Outliner::ImplCalcBulletText( sal_Int32 nPara, bool bRecalcLevel, bool bRec aBulletText += pFmt->GetPrefix(); if( pFmt->GetNumberingType() == SVX_NUM_CHAR_SPECIAL ) { - aBulletText += OUStringChar(pFmt->GetBulletChar()); + sal_UCS4 cChar = pFmt->GetBulletChar(); + aBulletText += OUString(&cChar, 1); } else if( pFmt->GetNumberingType() != SVX_NUM_NUMBER_NONE ) { diff --git a/include/editeng/numitem.hxx b/include/editeng/numitem.hxx index 38dbfe90370a..46b34bd41abe 100644 --- a/include/editeng/numitem.hxx +++ b/include/editeng/numitem.hxx @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -113,7 +114,7 @@ private: sal_uInt8 nInclUpperLevels; // Take over numbers from the previous level. sal_uInt16 nStart; // Start of counting - sal_Unicode cBullet; // Symbol + sal_UCS4 cBullet; // Symbol sal_uInt16 nBulletRelSize; // percentage size of bullets Color nBulletColor; // Bullet color @@ -180,8 +181,8 @@ public: void SetBulletFont(const vcl::Font* pFont); const vcl::Font* GetBulletFont() const {return pBulletFont.get();} - void SetBulletChar(sal_Unicode cSet){cBullet = cSet;} - sal_Unicode GetBulletChar()const {return cBullet;} + void SetBulletChar(sal_UCS4 cSet){cBullet = cSet;} + sal_UCS4 GetBulletChar()const {return cBullet;} void SetBulletRelSize(sal_uInt16 nSet) {nBulletRelSize = std::max(nSet,sal_uInt16(SVX_NUM_REL_SIZE_MIN));} sal_uInt16 GetBulletRelSize() const { return nBulletRelSize;} void SetBulletColor(Color nSet){nBulletColor = nSet;} diff --git a/sd/source/ui/dlg/BulletAndPositionDlg.cxx b/sd/source/ui/dlg/BulletAndPositionDlg.cxx index cfc7db7ed050..4fa14144beae 100644 --- a/sd/source/ui/dlg/BulletAndPositionDlg.cxx +++ b/sd/source/ui/dlg/BulletAndPositionDlg.cxx @@ -962,7 +962,7 @@ IMPL_LINK_NOARG(SvxBulletAndPositionDlg, BulletHdl_Impl, weld::Button&, void) { SvxNumberFormat aNumFmt(pActNum->GetLevel(i)); aNumFmt.SetBulletFont(&aActBulletFont); - aNumFmt.SetBulletChar(static_cast(aMap.GetChar())); + aNumFmt.SetBulletChar(aMap.GetChar()); pActNum->SetLevel(i, aNumFmt); } _nMask <<= 1; diff --git a/sw/source/core/edit/edattr.cxx b/sw/source/core/edit/edattr.cxx index fb982cd8552c..f5c332a72bfc 100644 --- a/sw/source/core/edit/edattr.cxx +++ b/sw/source/core/edit/edattr.cxx @@ -617,7 +617,10 @@ static bool lcl_IsNoEndTextAttrAtPos(SwRootFrame const& rLayout, if( SVX_NUM_BITMAP != rNumFormat.GetNumberingType() ) { if ( SVX_NUM_CHAR_SPECIAL == rNumFormat.GetNumberingType() ) - sExp = OUString(rNumFormat.GetBulletChar()); + { + sal_UCS4 cBullet = rNumFormat.GetBulletChar(); + sExp = OUString(&cBullet, 1); + } else sExp = pPropsNode->GetNumString(true, MAXLEVEL, &rLayout); } diff --git a/sw/source/core/text/porfld.cxx b/sw/source/core/text/porfld.cxx index d411c9e17377..6b9e1647b591 100644 --- a/sw/source/core/text/porfld.cxx +++ b/sw/source/core/text/porfld.cxx @@ -734,14 +734,14 @@ void SwNumberPortion::Paint( const SwTextPaintInfo &rInf ) const } } -SwBulletPortion::SwBulletPortion( const sal_Unicode cBullet, +SwBulletPortion::SwBulletPortion( const sal_UCS4 cBullet, const OUString& rBulletFollowedBy, std::unique_ptr pFont, const bool bLft, const bool bCntr, const sal_uInt16 nMinDst, const bool bLabelAlignmentPosAndSpaceModeActive ) - : SwNumberPortion( OUStringChar(cBullet) + rBulletFollowedBy, + : SwNumberPortion( OUString(&cBullet, 1) + rBulletFollowedBy, std::move(pFont), bLft, bCntr, nMinDst, bLabelAlignmentPosAndSpaceModeActive ) { diff --git a/sw/source/core/text/porfld.hxx b/sw/source/core/text/porfld.hxx index ec70c66d2024..cac7cbc25071 100644 --- a/sw/source/core/text/porfld.hxx +++ b/sw/source/core/text/porfld.hxx @@ -143,7 +143,7 @@ public: class SwBulletPortion : public SwNumberPortion { public: - SwBulletPortion( const sal_Unicode cCh, + SwBulletPortion( const sal_UCS4 cCh, const OUString& rBulletFollowedBy, std::unique_ptr pFnt, const bool bLeft, diff --git a/sw/source/core/unocore/unosett.cxx b/sw/source/core/unocore/unosett.cxx index 9664ff2ad735..26905258e56b 100644 --- a/sw/source/core/unocore/unosett.cxx +++ b/sw/source/core/unocore/unosett.cxx @@ -1411,14 +1411,16 @@ uno::Sequence SwXNumberingRules::GetPropertiesForNumFormat { if(SVX_NUM_CHAR_SPECIAL == rFormat.GetNumberingType()) { + sal_UCS4 cBullet = rFormat.GetBulletChar(); + //BulletId - nINT16 = rFormat.GetBulletChar(); + nINT16 = cBullet; aPropertyValues.push_back(comphelper::makePropertyValue("BulletId", nINT16)); const vcl::Font* pFont = rFormat.GetBulletFont(); //BulletChar - aUString = OUString(rFormat.GetBulletChar()); + aUString = OUString(&cBullet, 1); aPropertyValues.push_back(comphelper::makePropertyValue("BulletChar", aUString)); //BulletFontName @@ -1790,18 +1792,19 @@ void SwXNumberingRules::SetPropertiesToNumFormat( { OUString aChar; rProp.Value >>= aChar; - if(aChar.getLength() == 1) - { - aFormat.SetBulletChar(aChar.toChar()); - } - else if(aChar.isEmpty()) + if (aChar.isEmpty()) { // If w:lvlText's value is null - set bullet char to zero aFormat.SetBulletChar(u'\0'); } else { - bWrongArg = true; + sal_Int32 nIndexUtf16 = 0; + sal_UCS4 cBullet = aChar.iterateCodePoints(&nIndexUtf16); + if (aChar.getLength() == nIndexUtf16) + aFormat.SetBulletChar(cBullet); + else + bWrongArg = true; } } else if (rProp.Name == UNO_NAME_GRAPHIC) diff --git a/sw/source/filter/html/htmlnumreader.cxx b/sw/source/filter/html/htmlnumreader.cxx index 196057ca765a..e3dab319f9a6 100644 --- a/sw/source/filter/html/htmlnumreader.cxx +++ b/sw/source/filter/html/htmlnumreader.cxx @@ -41,7 +41,7 @@ using namespace css; //
    -HTMLOptionEnum const aHTMLULTypeTable[] = +HTMLOptionEnum const aHTMLULTypeTable[] = { { OOO_STRING_SVTOOLS_HTML_ULTYPE_disc, HTML_BULLETCHAR_DISC }, { OOO_STRING_SVTOOLS_HTML_ULTYPE_circle, HTML_BULLETCHAR_CIRCLE }, diff --git a/sw/source/filter/ww8/rtfattributeoutput.cxx b/sw/source/filter/ww8/rtfattributeoutput.cxx index ac952d8d983c..9f6068bdf057 100644 --- a/sw/source/filter/ww8/rtfattributeoutput.cxx +++ b/sw/source/filter/ww8/rtfattributeoutput.cxx @@ -3038,7 +3038,10 @@ void RtfAttributeOutput::ParaNumRule_Impl(const SwTextNode* pTextNd, sal_Int32 n OUString sText; if (SVX_NUM_CHAR_SPECIAL == pFormat->GetNumberingType() || SVX_NUM_BITMAP == pFormat->GetNumberingType()) - sText = OUString(pFormat->GetBulletChar()); + { + sal_UCS4 cBullet = pFormat->GetBulletChar(); + sText = OUString(&cBullet, 1); + } else sText = pTextNd->GetNumString(); diff --git a/sw/source/filter/ww8/wrtw8num.cxx b/sw/source/filter/ww8/wrtw8num.cxx index a7f4276fbdc6..3c133772a68d 100644 --- a/sw/source/filter/ww8/wrtw8num.cxx +++ b/sw/source/filter/ww8/wrtw8num.cxx @@ -484,7 +484,8 @@ void MSWordExportBase::NumberingLevel( SVX_NUM_BITMAP == rFormat.GetNumberingType()) { // Use bullet - sNumStr = OUString(rFormat.GetBulletChar()); + sal_UCS4 cBullet = rFormat.GetBulletChar(); + sNumStr = OUString(&cBullet, 1); } else { diff --git a/sw/source/ui/misc/outline.cxx b/sw/source/ui/misc/outline.cxx index d95731321120..099b901148cf 100644 --- a/sw/source/ui/misc/outline.cxx +++ b/sw/source/ui/misc/outline.cxx @@ -840,7 +840,8 @@ static long lcl_DrawBullet(vcl::RenderContext* pVDev, const SwNumFormat& rFormat aBulletColor.Invert(); aFont.SetColor(aBulletColor); pVDev->SetFont( aFont ); - OUString aText(rFormat.GetBulletChar()); + sal_UCS4 cBullet = rFormat.GetBulletChar(); + OUString aText(&cBullet, 1); long nY = nYStart; nY -= ((aTmpSize.Height() - rSize.Height())/ 2); pVDev->DrawText( Point(nXStart, nY), aText ); diff --git a/xmloff/source/style/xmlnume.cxx b/xmloff/source/style/xmlnume.cxx index 3eca9cda1bc1..9dd157122b1a 100644 --- a/xmloff/source/style/xmlnume.cxx +++ b/xmloff/source/style/xmlnume.cxx @@ -50,7 +50,7 @@ #include #include #include - +#include using namespace ::com::sun::star; using namespace ::com::sun::star::uno; @@ -90,7 +90,7 @@ void SvxXMLNumRuleExport::exportLevelStyle( sal_Int32 nLevel, sal_Int16 nStartValue = 1, nDisplayLevels = 1, nBullRelSize = 0; - sal_Unicode cBullet = 0xf095; + sal_UCS4 cBullet = 0xf095; OUString sBulletFontName, sBulletFontStyleName ; FontFamily eBulletFontFamily = FAMILY_DONTKNOW; FontPitch eBulletFontPitch = PITCH_DONTKNOW; @@ -127,7 +127,8 @@ void SvxXMLNumRuleExport::exportLevelStyle( sal_Int32 nLevel, rProp.Value >>= sValue; if( !sValue.isEmpty() ) { - cBullet = sValue[0]; + sal_Int32 nIndexUtf16 = 0; + cBullet = sValue.iterateCodePoints(&nIndexUtf16); } } else if( rProp.Name == "BulletRelSize" ) @@ -278,7 +279,7 @@ void SvxXMLNumRuleExport::exportLevelStyle( sal_Int32 nLevel, cBullet = 0xF000 + 149; } // text:bullet-char="..." - sTmp.append( cBullet ); + sTmp.append(OUString(&cBullet, 1)); GetExport().AddAttribute( XML_NAMESPACE_TEXT, XML_BULLET_CHAR, sTmp.makeStringAndClear() ); } diff --git a/xmloff/source/style/xmlnumi.cxx b/xmloff/source/style/xmlnumi.cxx index 9fdba383d98e..bed36cb693da 100644 --- a/xmloff/source/style/xmlnumi.cxx +++ b/xmloff/source/style/xmlnumi.cxx @@ -45,6 +45,8 @@ #include +#include + #include #include #include @@ -152,7 +154,7 @@ class SvxXMLListLevelStyleContext_Impl : public SvXMLImportContext rtl_TextEncoding eBulletFontEncoding; sal_Int16 eImageVertOrient; - sal_Unicode cBullet; + sal_UCS4 cBullet; sal_Int16 nRelSize; Color m_nColor; @@ -292,7 +294,10 @@ SvxXMLListLevelStyleContext_Impl::SvxXMLListLevelStyleContext_Impl( break; case XML_ELEMENT(TEXT, XML_BULLET_CHAR): if (!sValue.isEmpty()) - cBullet = sValue[0]; + { + sal_Int32 nIndexUtf16 = 0; + cBullet = sValue.iterateCodePoints(&nIndexUtf16); + } break; case XML_ELEMENT(XLINK, XML_HREF): if( bImage ) @@ -490,7 +495,7 @@ Sequence SvxXMLListLevelStyleContext_Impl::GetProperties() // Must append 'cBullet' even if it is zero // if 'bBullet' is true and 'cBullet' is zero - BulletChar property must be 0. pProps[nPos].Name = "BulletChar"; - pProps[nPos++].Value <<= OUString( cBullet ); + pProps[nPos++].Value <<= OUString(&cBullet, 1); pProps[nPos].Name = "BulletFont"; pProps[nPos++].Value <<= aFDesc; -- cgit v1.2.3