23#include <com/sun/star/awt/CharSet.hpp>
24#include <com/sun/star/awt/FontWeight.hpp>
25#include <com/sun/star/awt/FontUnderline.hpp>
26#include <com/sun/star/awt/XBitmap.hpp>
27#include <com/sun/star/beans/XPropertyState.hpp>
28#include <com/sun/star/beans/XPropertySet.hpp>
29#include <com/sun/star/container/XEnumerationAccess.hpp>
30#include <com/sun/star/container/XIndexReplace.hpp>
31#include <com/sun/star/i18n/BreakIterator.hpp>
32#include <com/sun/star/i18n/ScriptDirection.hpp>
33#include <com/sun/star/i18n/ScriptType.hpp>
34#include <com/sun/star/text/FontRelief.hpp>
35#include <com/sun/star/text/XTextField.hpp>
36#include <com/sun/star/text/XTextRange.hpp>
37#include <com/sun/star/style/LineSpacing.hpp>
38#include <com/sun/star/style/LineSpacingMode.hpp>
39#include <com/sun/star/style/ParagraphAdjust.hpp>
40#include <com/sun/star/style/TabStop.hpp>
41#include <com/sun/star/graphic/XGraphic.hpp>
50#include <osl/diagnose.h>
65 : meCharColor(css::beans::PropertyState_AMBIGUOUS_VALUE)
66 , meCharHeight(css::beans::PropertyState_AMBIGUOUS_VALUE)
67 , meFontName(css::beans::PropertyState_AMBIGUOUS_VALUE)
68 , meAsianOrComplexFont(css::beans::PropertyState_AMBIGUOUS_VALUE)
69 , meCharEscapement(css::beans::PropertyState_AMBIGUOUS_VALUE)
74 , mnAsianOrComplexFont(0xffff)
85 : meCharColor(css::beans::PropertyState_AMBIGUOUS_VALUE)
86 , meCharHeight(css::beans::PropertyState_AMBIGUOUS_VALUE)
87 , meFontName(css::beans::PropertyState_AMBIGUOUS_VALUE)
88 , meAsianOrComplexFont(css::beans::PropertyState_AMBIGUOUS_VALUE)
89 , meCharEscapement(css::beans::PropertyState_AMBIGUOUS_VALUE)
95 , mnAsianOrComplexFont(0xffff)
97 , mbLastPortion(bLast)
99 OUString aString( rXTextRange->getString() );
109 bool bRTL_endingParen =
false;
111 sal_uInt32 nFieldType = 0;
113 mXPropSet.set( rXTextRange, css::uno::UNO_QUERY );
114 mXPropState.set( rXTextRange, css::uno::UNO_QUERY );
117 if ( bPropSetsValid )
122 if ( nFieldType >> 28 == 4 )
128 bool bSymbol =
false;
132 sal_Int16 nCharset = 0;
134 if ( nCharset == css::awt::CharSet::SYMBOL )
149 if (bLast && !aString.isEmpty()
150 && aString[aString.getLength() - 1] ==
')'
154 bRTL_endingParen =
true;
158 for ( sal_Int32
i = 0;
i < aString.getLength();
i++ )
160 nChar =
static_cast<sal_uInt16
>(aString[
i ]);
168 case 128: nChar = 0x20AC;
break;
170 case 130: nChar = 0x201A;
break;
171 case 131: nChar = 0x0192;
break;
172 case 132: nChar = 0x201E;
break;
174 case 133: nChar = 0x2026;
break;
175 case 134: nChar = 0x2020;
break;
176 case 135: nChar = 0x2021;
break;
177 case 136: nChar = 0x02C6;
break;
178 case 137: nChar = 0x2030;
break;
179 case 138: nChar = 0x0160;
break;
180 case 139: nChar = 0x2039;
break;
181 case 140: nChar = 0x0152;
break;
182 case 142: nChar = 0x017D;
break;
183 case 145: nChar = 0x2018;
break;
185 case 146: nChar = 0x2019;
break;
187 case 147: nChar = 0x201C;
break;
189 case 148: nChar = 0x201D;
break;
191 case 149: nChar = 0x2022;
break;
192 case 150: nChar = 0x2013;
break;
193 case 151: nChar = 0x2014;
break;
194 case 152: nChar = 0x02DC;
break;
195 case 153: nChar = 0x2122;
break;
196 case 154: nChar = 0x0161;
break;
197 case 155: nChar = 0x203A;
break;
198 case 156: nChar = 0x0153;
break;
199 case 158: nChar = 0x017E;
break;
200 case 159: nChar = 0x0178;
break;
206 if ( bRTL_endingParen )
212 if ( bPropSetsValid )
232 for ( sal_uInt32
i = 0;
i <
nCount;
i++ )
245 mnFont =
static_cast<sal_uInt16
>(rFontCollection.
GetId( aFontDesc ));
264 if ( nScriptType != css::i18n::ScriptType::COMPLEX )
307 OUString aCharHeightName, aCharWeightName, aCharLocaleName, aCharPostureName;
308 switch( nScriptType )
310 case css::i18n::ScriptType::ASIAN :
312 aCharHeightName =
"CharHeightAsian";
313 aCharWeightName =
"CharWeightAsian";
314 aCharLocaleName =
"CharLocaleAsian";
315 aCharPostureName =
"CharPostureAsian";
318 case css::i18n::ScriptType::COMPLEX :
320 aCharHeightName =
"CharHeightComplex";
321 aCharWeightName =
"CharWeightComplex";
322 aCharLocaleName =
"CharLocaleComplex";
323 aCharPostureName =
"CharPostureComplex";
328 aCharHeightName =
"CharHeight";
329 aCharWeightName =
"CharWeight";
330 aCharLocaleName =
"CharLocale";
331 aCharPostureName =
"CharPosture";
349 if (
mAny >>= fFloat )
351 if ( fFloat >= css::awt::FontWeight::SEMIBOLD )
359 css::lang::Locale eLocale;
360 if (
mAny >>= eLocale )
365 css::awt::FontSlant aFS;
370 case css::awt::FontSlant_OBLIQUE :
371 case css::awt::FontSlant_ITALIC :
388 case css::awt::FontUnderline::SINGLE :
389 case css::awt::FontUnderline::DOUBLE :
390 case css::awt::FontUnderline::DOTTED :
394 if (
ePropState == css::beans::PropertyState_DIRECT_VALUE )
404 if (
ePropState == css::beans::PropertyState_DIRECT_VALUE )
411 if ( nVal != css::text::FontRelief::NONE )
414 if (
ePropState == css::beans::PropertyState_DIRECT_VALUE )
419 sal_uInt32 nSOColor = *( o3tl::doAccess<sal_uInt32>(
mAny) );
496 const css::uno::Reference< css::beans::XPropertySet > & rXPropSet, OUString& rURL )
498 sal_uInt32 nRetValue = 0;
503 auto aTextFieldType = o3tl::doAccess<OUString>(aAny);
504 if ( *aTextFieldType ==
"TextField" )
508 css::uno::Reference< css::text::XTextField > aXTextField;
509 if ( aAny >>= aXTextField )
511 if ( aXTextField.is() )
513 css::uno::Reference< css::beans::XPropertySet > xFieldPropSet( aXTextField, css::uno::UNO_QUERY );
514 if ( xFieldPropSet.is() )
516 OUString aFieldKind( aXTextField->getPresentation(
true ) );
517 if ( aFieldKind ==
"Date" )
527 nFormat = *o3tl::doAccess<sal_Int32>(aAny);
533 case 2 : nFormat = 0;
break;
536 case 3 : nFormat = 1;
break;
538 case 6 : nFormat = 2;
break;
540 nRetValue |= ( ( ( 1 << 4 ) | nFormat ) << 24 ) | 0x800000;
545 else if ( aFieldKind ==
"URL" )
548 rURL = *o3tl::doAccess<OUString>(aAny);
551 else if ( aFieldKind ==
"Page" )
553 nRetValue = 3 << 28 | 0x800000;
555 else if ( aFieldKind ==
"Pages" )
559 else if ( aFieldKind ==
"Time" )
569 nFormat = *o3tl::doAccess<sal_Int32>(aAny);
570 nRetValue |= ( ( ( 2 << 4 ) | nFormat ) << 24 ) | 0x800000;
575 else if ( aFieldKind ==
"File" )
579 else if ( aFieldKind ==
"Table" )
583 else if ( aFieldKind ==
"ExtTime" )
593 nFormat = *o3tl::doAccess<sal_Int32>(aAny);
600 case 2 : nFormat = 12;
break;
601 case 3 : nFormat = 9;
break;
603 case 4 : nFormat = 10;
break;
606 nRetValue |= ( ( ( 2 << 4 ) | nFormat ) << 24 ) | 0x800000;
611 else if ( aFieldKind ==
"ExtFile" )
615 else if ( aFieldKind ==
"Author" )
619 else if ( aFieldKind ==
"DateTime" )
621 nRetValue = 5 << 28 | 0x800000;
623 else if ( aFieldKind ==
"Header" )
625 nRetValue = 6 << 28 | 0x800000;
627 else if ( aFieldKind ==
"Footer" )
629 nRetValue = 7 << 28 | 0x800000;
642 if (
this != &rPortionObj )
651 PPTExBulletProvider* pProv)
653 , mbFirstParagraph(false)
654 , mbLastParagraph(false)
655 , meBullet(css::beans::PropertyState_AMBIGUOUS_VALUE)
658 , mbFixedLineSpacing(false)
659 , mnLineSpacingTop(0)
660 , mnLineSpacingBottom(0)
661 , mbForbiddenRules(false)
662 , mbParagraphPunctation(false)
680 , mbFirstParagraph( aParaFlags.bFirstParagraph )
681 , mbLastParagraph( aParaFlags.bLastParagraph )
682 , meBullet(css::beans::PropertyState_AMBIGUOUS_VALUE)
683 , meTextAdjust(css::beans::PropertyState_AMBIGUOUS_VALUE)
684 , meLineSpacing(css::beans::PropertyState_AMBIGUOUS_VALUE)
685 , meLineSpacingTop(css::beans::PropertyState_AMBIGUOUS_VALUE)
686 , meLineSpacingBottom(css::beans::PropertyState_AMBIGUOUS_VALUE)
687 , meForbiddenRules(css::beans::PropertyState_AMBIGUOUS_VALUE)
688 , meParagraphPunctation(css::beans::PropertyState_AMBIGUOUS_VALUE)
689 , meBiDi(css::beans::PropertyState_AMBIGUOUS_VALUE)
692 , mbFixedLineSpacing(false)
693 , mnLineSpacingTop(0)
694 , mnLineSpacingBottom(0)
695 , mbForbiddenRules(false)
696 , mbParagraphPunctation(false)
705 mXPropSet.set( rXTextContent, css::uno::UNO_QUERY );
707 mXPropState.set( rXTextContent, css::uno::UNO_QUERY );
712 css::uno::Reference< css::container::XEnumerationAccess > aXTextPortionEA( rXTextContent, css::uno::UNO_QUERY );
713 if ( aXTextPortionEA.is() )
715 css::uno::Reference< css::container::XEnumeration > aXTextPortionE( aXTextPortionEA->createEnumeration() );
716 if ( aXTextPortionE.is() )
718 while ( aXTextPortionE->hasMoreElements() )
720 css::uno::Reference< css::text::XTextRange > aXCursorText;
721 css::uno::Any aAny( aXTextPortionE->nextElement() );
722 if ( aAny >>= aXCursorText )
724 std::unique_ptr<PortionObj> pPortionObj(
new PortionObj( aXCursorText, !aXTextPortionE->hasMoreElements(), rFontCollection ));
725 if ( pPortionObj->Count() )
726 mvPortions.push_back( std::move(pPortionObj) );
741 for ( std::vector<std::unique_ptr<PortionObj> >::iterator it =
mvPortions.begin(); it !=
mvPortions.end(); ++it )
758 double fCharHeight = nFontHeight;
760 fCharHeight = fCharHeight * 0.2540;
761 double fQuo = fLen / fCharHeight;
785 css::uno::Reference< css::container::XIndexReplace > aXIndexReplace;
789 if ( (
mAny >>= aXIndexReplace ) && nNumberingDepth < aXIndexReplace->getCount() )
791 mAny = aXIndexReplace->getByIndex( nNumberingDepth );
792 auto aPropertySequence = o3tl::doAccess<css::uno::Sequence<css::beans::PropertyValue>>(
mAny);
794 if ( aPropertySequence->hasElements() )
800 uno::Reference<graphic::XGraphic> xGraphic;
801 for (
const css::beans::PropertyValue& rPropValue : *aPropertySequence )
807 nHorzAdjust = *o3tl::doAccess<sal_Int16>(rPropValue.Value);
810 OUString aString( *o3tl::doAccess<OUString>(rPropValue.Value) );
811 if ( !aString.isEmpty() )
816 aFontDesc = *o3tl::doAccess<css::awt::FontDescriptor>(rPropValue.Value);
822 if (
aFontDesc.Name.equalsIgnoreAsciiCase(
"StarSymbol") )
823 aFontDesc.CharSet = RTL_TEXTENCODING_MS_1252;
828 auto xBitmap = rPropValue.Value.get<uno::Reference<awt::XBitmap>>();
829 xGraphic.set(xBitmap, uno::UNO_QUERY);
833 if (
auto aSize = o3tl::tryAccess<css::awt::Size>(rPropValue.Value))
841 nStartWith = *o3tl::doAccess<sal_Int16>(rPropValue.Value);
844 else if (
aPropName ==
"FirstLineOffset" )
848 sal_uInt32 nSOColor = *o3tl::doAccess<sal_uInt32>(rPropValue.Value);
860 sPrefix = *o3tl::doAccess<OUString>(rPropValue.Value);
862 sSuffix = *o3tl::doAccess<OUString>(rPropValue.Value);
866 OSL_FAIL(
"Unknown Property" );
895 rtl_TextEncoding eChrSet =
aFontDesc.CharSet;
925 if ( nNumberingDepth & 1 )
927 else if ( nNumberingDepth == 4 )
1031 else if ( !
sSuffix.isEmpty() )
1071 if ( bGetPropStateValue )
1073 nDepth = *o3tl::doAccess<sal_Int16>(aAny);
1095 maTabStop = *o3tl::doAccess<css::uno::Sequence<css::style::TabStop>>(
mAny);
1096 sal_Int16 eTextAdjust = sal_Int16(css::style::ParagraphAdjust_LEFT);
1098 aAny >>= eTextAdjust;
1099 switch (
static_cast<css::style::ParagraphAdjust
>(eTextAdjust) )
1101 case css::style::ParagraphAdjust_CENTER :
1104 case css::style::ParagraphAdjust_RIGHT :
1107 case css::style::ParagraphAdjust_BLOCK :
1111 case css::style::ParagraphAdjust_LEFT :
1119 css::style::LineSpacing aLineSpacing
1120 = *o3tl::doAccess<css::style::LineSpacing>(
mAny);
1121 switch ( aLineSpacing.Mode )
1123 case css::style::LineSpacingMode::FIX :
1124 mnLineSpacing =
static_cast<sal_Int16
>(-( aLineSpacing.Height ) );
1127 case css::style::LineSpacingMode::MINIMUM :
1128 case css::style::LineSpacingMode::LEADING :
1129 mnLineSpacing =
static_cast<sal_Int16
>(-( aLineSpacing.Height ) );
1133 case css::style::LineSpacingMode::PROP :
1166 sal_Int16 nWritingMode = 0;
1167 mAny >>= nWritingMode;
1170 if ( ( eWritingMode == SvxFrameDirection::Horizontal_RL_TB )
1171 || ( eWritingMode == SvxFrameDirection::Vertical_RL_TB ) )
1202 for ( std::vector<std::unique_ptr<PortionObj> >::const_iterator it = rParagraphObj.
begin(); it != rParagraphObj.
end(); ++it )
1203 mvPortions.push_back( std::make_unique<PortionObj>( **it ) );
1231 for ( std::vector<std::unique_ptr<PortionObj> >::iterator it =
mvPortions.begin(); it !=
mvPortions.end(); ++it )
1238 if (
this != &rParagraphObj )
1250 std::vector<std::unique_ptr<ParagraphObj>>
maList;
1258 mnInstance(nInstance),
1259 mbHasExtendedBullets(false)
1264 int nInstance,
FontCollection& rFontCollection, PPTExBulletProvider& rProv ):
1267 css::uno::Reference< css::container::XEnumerationAccess > aXTextParagraphEA( rXTextRef, css::uno::UNO_QUERY );
1269 if ( aXTextParagraphEA.is() )
1271 css::uno::Reference< css::container::XEnumeration > aXTextParagraphE( aXTextParagraphEA->createEnumeration() );
1272 if ( aXTextParagraphE.is() )
1275 while ( aXTextParagraphE->hasMoreElements() )
1277 css::uno::Reference< css::text::XTextContent > aXParagraph;
1278 css::uno::Any aAny( aXTextParagraphE->nextElement() );
1279 if ( aAny >>= aXParagraph )
1281 if ( !aXTextParagraphE->hasMoreElements() )
1283 std::unique_ptr<ParagraphObj> pPara(
new ParagraphObj( aXParagraph, aParaFlags, rFontCollection, rProv ));
1284 mpImplTextObj->mbHasExtendedBullets |= pPara->bExtendedBulletsUsed;
1328 OUString aSubstName(
GetSubsFontName( rName, SubsFontFlags::ONLYONE | SubsFontFlags::MS ) );
1329 if ( !aSubstName.isEmpty() )
1348 xPPTBreakIter = css::i18n::BreakIterator::create( ::comphelper::getProcessComponentContext() );
1359 if( !rEntry.
Name.isEmpty() )
1361 const sal_uInt32 nFonts =
maFonts.size();
1363 for( sal_uInt32
i = 0;
i < nFonts;
i++ )
1377 pVDev->SetFont( aFont );
1380 sal_uInt16 nTxtHeight =
static_cast<sal_uInt16
>(aMetric.
GetAscent()) +
static_cast<sal_uInt16
>(aMetric.
GetDescent());
1384 double fScaling =
static_cast<double>(nTxtHeight) / 120.0;
1385 if ( ( fScaling > 0.50 ) && ( fScaling < 1.5 ) )
constexpr auto convertMasterUnitToMm100(N n)
constexpr auto convertMm100ToMasterUnit(N n)
static const AllSettings & GetSettings()
FontCollectionEntry & GetLast()
std::vector< FontCollectionEntry > maFonts
const FontCollectionEntry * GetById(sal_uInt32 nId)
VclPtr< VirtualDevice > pVDev
sal_uInt32 GetId(FontCollectionEntry &rFontDescriptor)
sal_uInt32 GetCount() const
static short GetScriptDirection(std::u16string_view rText)
tools::Long GetDescent() const
tools::Long GetAscent() const
css::beans::PropertyState meLineSpacingBottom
void ImplConstruct(const ParagraphObj &rParagraphObj)
sal_Int16 mnLineSpacingBottom
std::vector< std::unique_ptr< PortionObj > >::const_iterator begin() const
bool mbParagraphPunctation
std::vector< std::unique_ptr< PortionObj > > mvPortions
css::beans::PropertyState meBiDi
void ImplGetNumberingLevel(PPTExBulletProvider *pBuProv, sal_Int16 nDepth, bool bIsBullet, bool bGetPropStateValue)
css::beans::PropertyState meBullet
ParagraphObj & operator=(const ParagraphObj &rParagraphObj)
css::beans::PropertyState meLineSpacingTop
ParagraphObj(css::uno::Reference< css::text::XTextContent > const &rXTextContentRef, ParaFlags, FontCollection &rFontCollection, PPTExBulletProvider &rBuProv)
css::uno::Sequence< css::style::TabStop > maTabStop
void ImplGetParagraphValues(PPTExBulletProvider *pBuProv, bool bGetPropStateValue)
css::beans::PropertyState meForbiddenRules
sal_Int16 mnLineSpacingTop
sal_uInt32 ImplCalculateTextPositions(sal_uInt32 nCurrentTextPosition)
void Write(SvStream *pStrm)
void CalculateGraphicBulletSize(sal_uInt16 nFontHeight)
css::beans::PropertyState meParagraphPunctation
std::vector< std::unique_ptr< PortionObj > >::const_iterator end() const
css::beans::PropertyState meTextAdjust
css::beans::PropertyState meLineSpacing
std::unique_ptr< FieldEntry > mpFieldEntry
css::beans::PropertyState meCharColor
static sal_uInt32 ImplGetTextField(css::uno::Reference< css::text::XTextRange > &rXTextRangeRef, const css::uno::Reference< css::beans::XPropertySet > &rXPropSetRef, OUString &rURL)
css::beans::PropertyState meCharEscapement
PortionObj(css::uno::Reference< css::text::XTextRange > &rXTextRangeRef, bool bLast, FontCollection &rFontCollection)
css::beans::PropertyState meAsianOrComplexFont
css::lang::Locale meCharLocale
void ImplGetPortionValues(FontCollection &rFontCollection, bool bGetPropStateValue)
sal_uInt16 mnCharAttrHard
std::unique_ptr< sal_uInt16[]> mpText
PortionObj & operator=(const PortionObj &rPortionObj)
css::beans::PropertyState meCharHeight
void ImplConstruct(const PortionObj &rPortionObj)
sal_uInt32 ImplCalculateTextPositions(sal_uInt32 nCurrentTextPosition)
css::beans::PropertyState meFontName
void Write(SvStream *pStrm, bool bLast)
sal_Int16 mnCharEscapement
sal_uInt16 mnAsianOrComplexFont
bool ImplGetPropertyValue(const OUString &rString, bool bGetPropertyState)
css::beans::PropertyState ePropState
css::uno::Reference< css::beans::XPropertyState > mXPropState
css::uno::Reference< css::beans::XPropertySet > mXPropSet
static bool GetPropertyValue(css::uno::Any &rAny, const css::uno::Reference< css::beans::XPropertySet > &, const OUString &rPropertyName, bool bTestPropertyAvailability=false)
static css::beans::PropertyState GetPropertyState(const css::uno::Reference< css::beans::XPropertySet > &, const OUString &rPropertyName)
static sal_Int16 getScriptDirection(std::u16string_view Text, sal_Int32 nPos, sal_Int16 defaultScriptDirection)
constexpr tools::Long Height() const
void setWidth(tools::Long nWidth)
void setHeight(tools::Long nHeight)
constexpr tools::Long Width() const
SvStream & WriteUInt16(sal_uInt16 nUInt16)
sal_uInt32 ParagraphCount() const
TextObj(css::uno::Reference< css::text::XSimpleText > const &rXText, int nInstance, FontCollection &rFontCollection, PPTExBulletProvider &rBuProv)
void ImplCalculateTextPositions()
ParagraphObj * GetParagraph(int idx)
std::shared_ptr< ImplTextObj > mpImplTextObj
bool HasExtendedBullets() const
static VclPtr< reference_type > Create(Arg &&... arg)
void SetFontHeight(tools::Long nHeight)
void SetCharSet(rtl_TextEncoding)
void SetFamilyName(const OUString &rFamilyName)
UNOTOOLS_DLLPUBLIC bool IsOpenSymbol(std::u16string_view rFontName)
UNOTOOLS_DLLPUBLIC OUString GetSubsFontName(std::u16string_view rName, SubsFontFlags nFlags)
if(aStr !=aBuf) UpdateName_Impl(m_xFollowLb.get()
SvtScriptType GetScriptTypeOfLanguage(LanguageType nLang)
sal_Int16 FromSvtScriptTypeToI18N(SvtScriptType nItemType)
sal_Unicode bestFitOpenSymbolToMSFont(sal_Unicode cBullet, rtl_TextEncoding &r_ioChrSet, OUString &r_ioFontName)
std::shared_ptr< T > make_shared(Args &&... args)
static css::uno::Reference< css::i18n::XBreakIterator > xPPTBreakIter
void ImplInit(const OUString &rName)
std::vector< std::unique_ptr< ParagraphObj > > maList
ImplTextObj(int nInstance)
bool mbHasExtendedBullets
SvxNumType nNumberingType
css::awt::FontDescriptor aFontDesc
sal_uInt32 nMappedNumType
bool bExtendedBulletsUsed
sal_Int16 nBulletRealSize
SVX_NUM_FULL_WIDTH_ARABIC
SVX_NUM_CHARS_LOWER_LETTER_N
SVX_NUM_CHARS_LOWER_LETTER
SVX_NUM_CHARS_UPPER_LETTER
SVX_NUM_NUMBER_UPPER_ZH_TW
SVX_NUM_CHARS_UPPER_LETTER_N