diff options
Diffstat (limited to 'svx/source/svdraw/svdmodel.cxx')
-rw-r--r-- | svx/source/svdraw/svdmodel.cxx | 669 |
1 files changed, 321 insertions, 348 deletions
diff --git a/svx/source/svdraw/svdmodel.cxx b/svx/source/svdraw/svdmodel.cxx index 1e95644654aa..f429953dc28a 100644 --- a/svx/source/svdraw/svdmodel.cxx +++ b/svx/source/svdraw/svdmodel.cxx @@ -19,7 +19,6 @@ #include <svx/svdmodel.hxx> #include <cassert> -#include <math.h> #include <sal/log.hxx> #include <rtl/ustrbuf.hxx> #include <com/sun/star/lang/XComponent.hpp> @@ -29,6 +28,7 @@ #include <unotools/pathoptions.hxx> #include <svl/whiter.hxx> #include <svl/asiancfg.hxx> +#include <svx/compatflags.hxx> #include <svx/xbtmpit.hxx> #include <svx/xlndsit.hxx> #include <svx/xlnedit.hxx> @@ -38,7 +38,6 @@ #include <svx/xlnstit.hxx> #include <editeng/editeng.hxx> #include <svx/xtable.hxx> -#include <svx/svdtrans.hxx> #include <svx/svdpage.hxx> #include <svx/svdlayer.hxx> #include <svx/svdundo.hxx> @@ -50,6 +49,7 @@ #include <svx/svdoutl.hxx> #include <svx/dialmgr.hxx> #include <svx/strings.hrc> +#include <svx/theme/IThemeColorChanger.hxx> #include <svdoutlinercache.hxx> #include <svx/sdasitm.hxx> #include <officecfg/Office/Common.hxx> @@ -70,101 +70,114 @@ #include <libxml/xmlwriter.h> #include <sfx2/viewsh.hxx> #include <o3tl/enumrange.hxx> -#include <tools/diagnose_ex.h> +#include <comphelper/diagnose_ex.hxx> +#include <tools/UnitConversion.hxx> +#include <docmodel/theme/Theme.hxx> +#include <svx/ColorSets.hxx> +#include <svx/svditer.hxx> +#include <svx/svdoashp.hxx> -using namespace ::com::sun::star; -using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::lang; +using namespace ::com::sun::star; struct SdrModelImpl { SfxUndoManager* mpUndoManager; SdrUndoFactory* mpUndoFactory; - bool mbAnchoredTextOverflowLegacy; // tdf#99729 compatibility flag + bool mbLegacyFontwork; // tdf#148000 compatibility flag + bool mbConnectorUseSnapRect; // tdf#149756 compatibility flag + bool mbIgnoreBreakAfterMultilineField; ///< tdf#148966 compatibility flag + std::shared_ptr<model::Theme> mpTheme; + std::shared_ptr<svx::IThemeColorChanger> mpThemeColorChanger; + + SdrModelImpl() + : mpUndoManager(nullptr) + , mpUndoFactory(nullptr) + , mbAnchoredTextOverflowLegacy(false) + , mbLegacyFontwork(false) + , mbConnectorUseSnapRect(false) + , mbIgnoreBreakAfterMultilineField(false) + , mpTheme(new model::Theme("Office")) + {} + + void initTheme() + { + auto const* pColorSet = svx::ColorSets::get().getColorSet(u"LibreOffice"); + if (pColorSet) + { + std::shared_ptr<model::ColorSet> pDefaultColorSet(new model::ColorSet(*pColorSet)); + mpTheme->setColorSet(pDefaultColorSet); + } + } }; -void SdrModel::ImpCtor( - SfxItemPool* pPool, - ::comphelper::IEmbeddedHelper* _pEmbeddedHelper, - bool bDisablePropertyFiles) -{ - mpImpl.reset(new SdrModelImpl); - mpImpl->mpUndoManager=nullptr; - mpImpl->mpUndoFactory=nullptr; - mpImpl->mbAnchoredTextOverflowLegacy = false; - mbInDestruction = false; - m_aObjUnit=SdrEngineDefaults::GetMapFraction(); - m_eObjUnit=SdrEngineDefaults::GetMapUnit(); - m_eUIUnit=FieldUnit::MM; - m_aUIScale=Fraction(1,1); - m_nUIUnitDecimalMark=0; - m_pLayerAdmin=nullptr; - m_pItemPool=pPool; - m_bMyPool=false; - m_pEmbeddedHelper=_pEmbeddedHelper; - m_pDrawOutliner=nullptr; - m_pHitTestOutliner=nullptr; - m_pRefOutDev=nullptr; - m_pDefaultStyleSheet=nullptr; - mpDefaultStyleSheetForSdrGrafObjAndSdrOle2Obj = nullptr; - m_pLinkManager=nullptr; - m_pUndoStack=nullptr; - m_pRedoStack=nullptr; - m_nMaxUndoCount=16; - m_pCurrentUndoGroup=nullptr; - m_nUndoLevel=0; - mbUndoEnabled=true; - mbChanged = false; - m_bPagNumsDirty=false; - m_bMPgNumsDirty=false; - m_bTransportContainer = false; - m_bSwapGraphics=false; - m_bPasteResize=false; - m_bReadOnly=false; - m_nDefaultTabulator=0; - m_bTransparentTextFrames=false; - m_bStarDrawPreviewMode = false; - mpForbiddenCharactersTable = nullptr; - mbModelLocked = false; - mpOutlinerCache = nullptr; - mbKernAsianPunctuation = false; - mbAddExtLeading = false; - mnHandoutPageCount = 0; - - mbDisableTextEditUsesCommonUndoManager = false; - - if (!utl::ConfigManager::IsFuzzing()) - mnCharCompressType = static_cast<CharCompressType>(officecfg::Office::Common::AsianLayout::CompressCharacterDistance:: - get()); - else - mnCharCompressType = CharCompressType::NONE; - - if ( pPool == nullptr ) - { - m_pItemPool=new SdrItemPool(nullptr); +SdrModel::SdrModel(SfxItemPool* pPool, comphelper::IEmbeddedHelper* pEmbeddedHelper, bool bDisablePropertyFiles) + : m_eObjUnit(SdrEngineDefaults::GetMapUnit()) + , m_eUIUnit(FieldUnit::MM) + , m_aUIScale(Fraction(1,1)) + , m_nUIUnitDecimalMark(0) + , m_pLayerAdmin(new SdrLayerAdmin) + , m_pItemPool(pPool) + , m_pEmbeddedHelper(pEmbeddedHelper) + , mnDefTextHgt(SdrEngineDefaults::GetFontHeight()) + , m_pRefOutDev(nullptr) + , m_pDefaultStyleSheet(nullptr) + , mpDefaultStyleSheetForSdrGrafObjAndSdrOle2Obj(nullptr) + , m_pLinkManager(nullptr) + , m_nUndoLevel(0) + , m_bIsWriter(true) + , m_bThemedControls(true) + , mbUndoEnabled(true) + , mbChanged(false) + , m_bPagNumsDirty(false) + , m_bMPgNumsDirty(false) + , m_bTransportContainer(false) + , m_bReadOnly(false) + , m_bTransparentTextFrames(false) + , m_bSwapGraphics(false) + , m_bPasteResize(false) + , m_bStarDrawPreviewMode(false) + , mbDisableTextEditUsesCommonUndoManager(false) + , mbVOCInvalidationIsReliable(false) + , m_nDefaultTabulator(0) + , m_nMaxUndoCount(16) + , m_pTextChain(new TextChain) + , mpImpl(new SdrModelImpl) + , mnCharCompressType(CharCompressType::NONE) + , mnHandoutPageCount(0) + , mbModelLocked(false) + , mbKernAsianPunctuation(false) + , mbAddExtLeading(false) + , mbInDestruction(false) +{ + if (!comphelper::IsFuzzing()) + { + mnCharCompressType = static_cast<CharCompressType>( + officecfg::Office::Common::AsianLayout::CompressCharacterDistance::get()); + } + + if (m_pItemPool == nullptr) + { + m_pItemPool = new SdrItemPool(nullptr); // Outliner doesn't have its own Pool, so use the EditEngine's - SfxItemPool* pOutlPool=EditEngine::CreatePool(); + rtl::Reference<SfxItemPool> pOutlPool=EditEngine::CreatePool(); // OutlinerPool as SecondaryPool of SdrPool - m_pItemPool->SetSecondaryPool(pOutlPool); + m_pItemPool->SetSecondaryPool(pOutlPool.get()); // remember that I created both pools myself - m_bMyPool=true; + m_bIsWriter = false; } m_pItemPool->SetDefaultMetric(m_eObjUnit); // using static SdrEngineDefaults only if default SvxFontHeight item is not available - const SfxPoolItem* pPoolItem = m_pItemPool->GetPoolDefaultItem( EE_CHAR_FONTHEIGHT ); - if ( pPoolItem ) + const SfxPoolItem* pPoolItem = m_pItemPool->GetUserDefaultItem( EE_CHAR_FONTHEIGHT ); + if (pPoolItem) mnDefTextHgt = static_cast<const SvxFontHeightItem*>(pPoolItem)->GetHeight(); - else - mnDefTextHgt = SdrEngineDefaults::GetFontHeight(); - m_pItemPool->SetPoolDefaultItem( makeSdrTextWordWrapItem( false ) ); + m_pItemPool->SetUserDefaultItem( makeSdrTextWordWrapItem( false ) ); SetTextDefaults(); - m_pLayerAdmin.reset(new SdrLayerAdmin); m_pLayerAdmin->SetModel(this); ImpSetUIUnit(); @@ -181,31 +194,13 @@ void SdrModel::ImpCtor( m_pChainingOutliner = SdrMakeOutliner( OutlinerMode::TextObject, *this ); ImpSetOutlinerDefaults(m_pChainingOutliner.get(), true); - // Make a TextChain - m_pTextChain.reset(new TextChain); - /* End Text Chaining related code */ - - ImpCreateTables(bDisablePropertyFiles || utl::ConfigManager::IsFuzzing()); -} + ImpCreateTables(bDisablePropertyFiles || comphelper::IsFuzzing()); -SdrModel::SdrModel( - SfxItemPool* pPool, - ::comphelper::IEmbeddedHelper* pPers, - bool bDisablePropertyFiles) -: -#ifdef DBG_UTIL - // SdrObjectLifetimeWatchDog: - maAllIncarnatedObjects(), -#endif - maMaPag(), - maPages() -{ - ImpCtor(pPool,pPers,bDisablePropertyFiles); + mpImpl->initTheme(); } -SdrModel::~SdrModel() +void SdrModel::implDtorClearModel() { - mbInDestruction = true; Broadcast(SdrHint(SdrHintKind::ModelCleared)); @@ -220,19 +215,20 @@ SdrModel::~SdrModel() m_pCurrentUndoGroup.reset(); ClearModel(true); +} + +SdrModel::~SdrModel() +{ + implDtorClearModel(); #ifdef DBG_UTIL // SdrObjectLifetimeWatchDog: if(!maAllIncarnatedObjects.empty()) { - SAL_WARN("svx","SdrModel::~SdrModel: Not all incarnations of SdrObjects deleted, possible memory leak (!)"); - // copy to std::vector - calling SdrObject::Free will change maAllIncarnatedObjects - const std::vector< const SdrObject* > maRemainingObjects(maAllIncarnatedObjects.begin(), maAllIncarnatedObjects.end()); - for(auto pSdrObject : maRemainingObjects) - { - SdrObject* pCandidate(const_cast<SdrObject*>(pSdrObject)); - SdrObject::Free(pCandidate); - } + SAL_WARN("svx", + "SdrModel::~SdrModel: Not all incarnations of SdrObjects deleted, possible memory leak"); + for (const auto & pObj : maAllIncarnatedObjects) + SAL_WARN("svx", "leaked instance of " << typeid(*pObj).name()); } #endif @@ -249,27 +245,17 @@ SdrModel::~SdrModel() // the DrawingEngine may need it in its destructor if( mxStyleSheetPool.is() ) { - Reference< XComponent > xComponent( dynamic_cast< cppu::OWeakObject* >( mxStyleSheetPool.get() ), UNO_QUERY ); + uno::Reference<lang::XComponent> xComponent( getXWeak( mxStyleSheetPool.get() ), uno::UNO_QUERY ); if( xComponent.is() ) try { xComponent->dispose(); } - catch( RuntimeException& ) + catch (uno::RuntimeException&) { } mxStyleSheetPool.clear(); } - if (m_bMyPool) - { - // delete Pools if they're mine - SfxItemPool* pOutlPool=m_pItemPool->GetSecondaryPool(); - SfxItemPool::Free(m_pItemPool); - // OutlinerPool has to be deleted after deleting ItemPool, because - // ItemPool contains SetItems that themselves reference Items from OutlinerPool. - SfxItemPool::Free(pOutlPool); - } - mpForbiddenCharactersTable.reset(); delete mpImpl->mpUndoFactory; @@ -295,27 +281,24 @@ void SdrModel::SetMaxUndoActionCount(sal_uInt32 nCount) { if (nCount<1) nCount=1; m_nMaxUndoCount=nCount; - if (m_pUndoStack) { - while (m_pUndoStack->size()>m_nMaxUndoCount) { - m_pUndoStack->pop_back(); - } - } + while (m_aUndoStack.size()>m_nMaxUndoCount) + m_aUndoStack.pop_back(); } void SdrModel::ClearUndoBuffer() { - m_pUndoStack.reset(); - m_pRedoStack.reset(); + m_aUndoStack.clear(); + m_aRedoStack.clear(); } bool SdrModel::HasUndoActions() const { - return m_pUndoStack && !m_pUndoStack->empty(); + return !m_aUndoStack.empty(); } bool SdrModel::HasRedoActions() const { - return m_pRedoStack && !m_pRedoStack->empty(); + return !m_aRedoStack.empty(); } void SdrModel::Undo() @@ -328,15 +311,13 @@ void SdrModel::Undo() { if(HasUndoActions()) { - SfxUndoAction* pDo = m_pUndoStack->front().get(); + SfxUndoAction* pDo = m_aUndoStack.front().get(); const bool bWasUndoEnabled = mbUndoEnabled; mbUndoEnabled = false; pDo->Undo(); - if(!m_pRedoStack) - m_pRedoStack.reset(new std::deque<std::unique_ptr<SfxUndoAction>>); - std::unique_ptr<SfxUndoAction> p = std::move(m_pUndoStack->front()); - m_pUndoStack->pop_front(); - m_pRedoStack->emplace_front(std::move(p)); + std::unique_ptr<SfxUndoAction> p = std::move(m_aUndoStack.front()); + m_aUndoStack.pop_front(); + m_aRedoStack.emplace_front(std::move(p)); mbUndoEnabled = bWasUndoEnabled; } } @@ -352,15 +333,13 @@ void SdrModel::Redo() { if(HasRedoActions()) { - SfxUndoAction* pDo = m_pRedoStack->front().get(); + SfxUndoAction* pDo = m_aRedoStack.front().get(); const bool bWasUndoEnabled = mbUndoEnabled; mbUndoEnabled = false; pDo->Redo(); - if(!m_pUndoStack) - m_pUndoStack.reset(new std::deque<std::unique_ptr<SfxUndoAction>>); - std::unique_ptr<SfxUndoAction> p = std::move(m_pRedoStack->front()); - m_pRedoStack->pop_front(); - m_pUndoStack->emplace_front(std::move(p)); + std::unique_ptr<SfxUndoAction> p = std::move(m_aRedoStack.front()); + m_aRedoStack.pop_front(); + m_aUndoStack.emplace_front(std::move(p)); mbUndoEnabled = bWasUndoEnabled; } } @@ -376,7 +355,7 @@ void SdrModel::Repeat(SfxRepeatTarget& rView) { if(HasUndoActions()) { - SfxUndoAction* pDo = m_pUndoStack->front().get(); + SfxUndoAction* pDo = m_aUndoStack.front().get(); if(pDo->CanRepeat(rView)) { pDo->Repeat(rView); @@ -397,15 +376,12 @@ void SdrModel::ImpPostUndoAction(std::unique_ptr<SdrUndoAction> pUndo) } else { - if (!m_pUndoStack) - m_pUndoStack.reset(new std::deque<std::unique_ptr<SfxUndoAction>>); - m_pUndoStack->emplace_front(std::move(pUndo)); - while (m_pUndoStack->size()>m_nMaxUndoCount) + m_aUndoStack.emplace_front(std::move(pUndo)); + while (m_aUndoStack.size()>m_nMaxUndoCount) { - m_pUndoStack->pop_back(); + m_aUndoStack.pop_back(); } - if (m_pRedoStack!=nullptr) - m_pRedoStack->clear(); + m_aRedoStack.clear(); } } @@ -620,7 +596,7 @@ void SdrModel::ClearModel(bool bCalledFromDestructor) { DeleteMasterPage( static_cast<sal_uInt16>(i) ); } - maMaPag.clear(); + maMasterPages.clear(); MasterPageListChanged(); m_pLayerAdmin->ClearLayers(); @@ -629,18 +605,18 @@ void SdrModel::ClearModel(bool bCalledFromDestructor) SdrModel* SdrModel::AllocModel() const { SdrModel* pModel=new SdrModel(); - pModel->SetScaleUnit(m_eObjUnit,m_aObjUnit); + pModel->SetScaleUnit(m_eObjUnit); return pModel; } -SdrPage* SdrModel::AllocPage(bool bMasterPage) +rtl::Reference<SdrPage> SdrModel::AllocPage(bool bMasterPage) { return new SdrPage(*this,bMasterPage); } void SdrModel::SetTextDefaults() const { - SetTextDefaults( m_pItemPool, mnDefTextHgt ); + SetTextDefaults( m_pItemPool.get(), mnDefTextHgt ); } void SdrModel::SetTextDefaults( SfxItemPool* pItemPool, sal_Int32 nDefTextHgt ) @@ -650,7 +626,7 @@ void SdrModel::SetTextDefaults( SfxItemPool* pItemPool, sal_Int32 nDefTextHgt ) SvxFontItem aSvxFontItemCJK(EE_CHAR_FONTINFO_CJK); SvxFontItem aSvxFontItemCTL(EE_CHAR_FONTINFO_CTL); LanguageType nLanguage; - if (!utl::ConfigManager::IsFuzzing()) + if (!comphelper::IsFuzzing()) nLanguage = Application::GetSettings().GetLanguageTag().getLanguageType(); else nLanguage = LANGUAGE_ENGLISH_US; @@ -662,7 +638,7 @@ void SdrModel::SetTextDefaults( SfxItemPool* pItemPool, sal_Int32 nDefTextHgt ) aSvxFontItem.SetStyleName(OUString()); aSvxFontItem.SetPitch( aFont.GetPitch()); aSvxFontItem.SetCharSet( aFont.GetCharSet() ); - pItemPool->SetPoolDefaultItem(aSvxFontItem); + pItemPool->SetUserDefaultItem(aSvxFontItem); // get DEFAULTFONT_CJK_TEXT and set at pool as dynamic default vcl::Font aFontCJK(OutputDevice::GetDefaultFont(DefaultFontType::CJK_TEXT, nLanguage, GetDefaultFontFlags::OnlyOne)); @@ -671,7 +647,7 @@ void SdrModel::SetTextDefaults( SfxItemPool* pItemPool, sal_Int32 nDefTextHgt ) aSvxFontItemCJK.SetStyleName(OUString()); aSvxFontItemCJK.SetPitch( aFontCJK.GetPitch()); aSvxFontItemCJK.SetCharSet( aFontCJK.GetCharSet()); - pItemPool->SetPoolDefaultItem(aSvxFontItemCJK); + pItemPool->SetUserDefaultItem(aSvxFontItemCJK); // get DEFAULTFONT_CTL_TEXT and set at pool as dynamic default vcl::Font aFontCTL(OutputDevice::GetDefaultFont(DefaultFontType::CTL_TEXT, nLanguage, GetDefaultFontFlags::OnlyOne)); @@ -680,15 +656,15 @@ void SdrModel::SetTextDefaults( SfxItemPool* pItemPool, sal_Int32 nDefTextHgt ) aSvxFontItemCTL.SetStyleName(OUString()); aSvxFontItemCTL.SetPitch( aFontCTL.GetPitch() ); aSvxFontItemCTL.SetCharSet( aFontCTL.GetCharSet()); - pItemPool->SetPoolDefaultItem(aSvxFontItemCTL); + pItemPool->SetUserDefaultItem(aSvxFontItemCTL); // set dynamic FontHeight defaults - pItemPool->SetPoolDefaultItem( SvxFontHeightItem(nDefTextHgt, 100, EE_CHAR_FONTHEIGHT ) ); - pItemPool->SetPoolDefaultItem( SvxFontHeightItem(nDefTextHgt, 100, EE_CHAR_FONTHEIGHT_CJK ) ); - pItemPool->SetPoolDefaultItem( SvxFontHeightItem(nDefTextHgt, 100, EE_CHAR_FONTHEIGHT_CTL ) ); + pItemPool->SetUserDefaultItem( SvxFontHeightItem(nDefTextHgt, 100, EE_CHAR_FONTHEIGHT ) ); + pItemPool->SetUserDefaultItem( SvxFontHeightItem(nDefTextHgt, 100, EE_CHAR_FONTHEIGHT_CJK ) ); + pItemPool->SetUserDefaultItem( SvxFontHeightItem(nDefTextHgt, 100, EE_CHAR_FONTHEIGHT_CTL ) ); // set FontColor defaults - pItemPool->SetPoolDefaultItem( SvxColorItem(SdrEngineDefaults::GetFontColor(), EE_CHAR_COLOR) ); + pItemPool->SetUserDefaultItem( SvxColorItem(SdrEngineDefaults::GetFontColor(), EE_CHAR_COLOR) ); } SdrOutliner& SdrModel::GetDrawOutliner(const SdrTextObj* pObj) const @@ -717,8 +693,8 @@ void SdrModel::ImpSetOutlinerDefaults( SdrOutliner* pOutliner, bool bInit ) if( bInit ) { pOutliner->EraseVirtualDevice(); - pOutliner->SetUpdateMode(false); - pOutliner->SetEditTextObjectPool(m_pItemPool); + pOutliner->SetUpdateLayout(false); + pOutliner->SetEditTextObjectPool(m_pItemPool.get()); pOutliner->SetDefTab(m_nDefaultTabulator); } @@ -730,7 +706,7 @@ void SdrModel::ImpSetOutlinerDefaults( SdrOutliner* pOutliner, bool bInit ) if ( !GetRefDevice() ) { - MapMode aMapMode(m_eObjUnit, Point(0,0), m_aObjUnit, m_aObjUnit); + MapMode aMapMode(m_eObjUnit); pOutliner->SetRefMapMode(aMapMode); } } @@ -866,94 +842,31 @@ void SdrModel::ImpSetUIUnit() m_aUIScale = Fraction(1,1); } - // set start values m_nUIUnitDecimalMark = 0; - sal_Int64 nMul(1); - sal_Int64 nDiv(1); - - // normalize on meters resp. inch - switch (m_eObjUnit) - { - case MapUnit::Map100thMM : m_nUIUnitDecimalMark+=5; break; - case MapUnit::Map10thMM : m_nUIUnitDecimalMark+=4; break; - case MapUnit::MapMM : m_nUIUnitDecimalMark+=3; break; - case MapUnit::MapCM : m_nUIUnitDecimalMark+=2; break; - case MapUnit::Map1000thInch: m_nUIUnitDecimalMark+=3; break; - case MapUnit::Map100thInch : m_nUIUnitDecimalMark+=2; break; - case MapUnit::Map10thInch : m_nUIUnitDecimalMark+=1; break; - case MapUnit::MapInch : m_nUIUnitDecimalMark+=0; break; - case MapUnit::MapPoint : nDiv=72; break; // 1Pt = 1/72" - case MapUnit::MapTwip : nDiv=144; m_nUIUnitDecimalMark++; break; // 1Twip = 1/1440" - case MapUnit::MapPixel : break; - case MapUnit::MapSysFont : break; - case MapUnit::MapAppFont : break; - case MapUnit::MapRelative : break; - default: break; - } // switch - // 1 mile = 8 furlong = 63.360" = 1.609.344,0mm - // 1 furlong = 10 chains = 7.920" = 201.168,0mm - // 1 chain = 4 poles = 792" = 20.116,8mm - // 1 pole = 5 1/2 yd = 198" = 5.029,2mm - // 1 yd = 3 ft = 36" = 914,4mm - // 1 ft = 12 " = 1" = 304,8mm + o3tl::Length eFrom = MapToO3tlLength(m_eObjUnit, o3tl::Length::invalid); + o3tl::Length eTo; + switch (m_eUIUnit) { - case FieldUnit::NONE : break; - // metric - case FieldUnit::MM_100TH: m_nUIUnitDecimalMark-=5; break; - case FieldUnit::MM : m_nUIUnitDecimalMark-=3; break; - case FieldUnit::CM : m_nUIUnitDecimalMark-=2; break; - case FieldUnit::M : m_nUIUnitDecimalMark+=0; break; - case FieldUnit::KM : m_nUIUnitDecimalMark+=3; break; - // Inch - case FieldUnit::TWIP : nMul=144; m_nUIUnitDecimalMark--; break; // 1Twip = 1/1440" - case FieldUnit::POINT : nMul=72; break; // 1Pt = 1/72" - case FieldUnit::PICA : nMul=6; break; // 1Pica = 1/6" - case FieldUnit::INCH : break; // 1" = 1" - case FieldUnit::FOOT : nDiv*=12; break; // 1Ft = 12" - case FieldUnit::MILE : nDiv*=6336; m_nUIUnitDecimalMark++; break; // 1mile = 63360" - // other - case FieldUnit::CUSTOM : break; - case FieldUnit::PERCENT: m_nUIUnitDecimalMark+=2; break; - // TODO: Add code to handle the following if needed (added to remove warning) - case FieldUnit::CHAR : break; - case FieldUnit::LINE : break; - case FieldUnit::PIXEL : break; - case FieldUnit::DEGREE : break; - case FieldUnit::SECOND : break; - case FieldUnit::MILLISECOND : break; + case FieldUnit::CHAR: + case FieldUnit::LINE: + eTo = o3tl::Length::invalid; + break; + case FieldUnit::PERCENT: + m_nUIUnitDecimalMark += 2; + [[fallthrough]]; + default: + eTo = FieldToO3tlLength(m_eUIUnit, o3tl::Length::invalid); } // switch - // check if mapping is from metric to inch and adapt - const bool bMapInch(IsInch(m_eObjUnit)); - const bool bUIMetr(IsMetric(m_eUIUnit)); - - if (bMapInch && bUIMetr) - { - m_nUIUnitDecimalMark += 4; - nMul *= 254; - } - - // check if mapping is from inch to metric and adapt - const bool bMapMetr(IsMetric(m_eObjUnit)); - const bool bUIInch(IsInch(m_eUIUnit)); - - if (bMapMetr && bUIInch) + sal_Int32 nMul = 1, nDiv = 1; + if (eFrom != o3tl::Length::invalid && eTo != o3tl::Length::invalid) { - m_nUIUnitDecimalMark -= 4; - nDiv *= 254; + const auto& [mul, div] = o3tl::getConversionMulDiv(eFrom, eTo); + nMul = mul; + nDiv = div; } - - // use temporary fraction for reduction (fallback to 32bit here), - // may need to be changed in the future, too - if(1 != nMul || 1 != nDiv) - { - const Fraction aTemp(static_cast< tools::Long >(nMul), static_cast< tools::Long >(nDiv)); - nMul = aTemp.GetNumerator(); - nDiv = aTemp.GetDenominator(); - } - // #i89872# take Unit of Measurement into account if(1 != m_aUIScale.GetDenominator() || 1 != m_aUIScale.GetNumerator()) { @@ -981,19 +894,6 @@ void SdrModel::ImpSetUIUnit() m_aUIUnitStr = GetUnitString(m_eUIUnit); } -void SdrModel::SetScaleUnit(MapUnit eMap, const Fraction& rFrac) -{ - if (m_eObjUnit!=eMap || m_aObjUnit!=rFrac) { - m_eObjUnit=eMap; - m_aObjUnit=rFrac; - m_pItemPool->SetDefaultMetric(m_eObjUnit); - ImpSetUIUnit(); - ImpSetOutlinerDefaults( m_pDrawOutliner.get() ); - ImpSetOutlinerDefaults( m_pHitTestOutliner.get() ); - ImpReformatAllTextObjects(); - } -} - void SdrModel::SetScaleUnit(MapUnit eMap) { if (m_eObjUnit!=eMap) { @@ -1006,17 +906,6 @@ void SdrModel::SetScaleUnit(MapUnit eMap) } } -void SdrModel::SetScaleFraction(const Fraction& rFrac) -{ - if (m_aObjUnit!=rFrac) { - m_aObjUnit=rFrac; - ImpSetUIUnit(); - ImpSetOutlinerDefaults( m_pDrawOutliner.get() ); - ImpSetOutlinerDefaults( m_pHitTestOutliner.get() ); - ImpReformatAllTextObjects(); - } -} - void SdrModel::SetUIUnit(FieldUnit eUnit) { if (m_eUIUnit!=eUnit) { @@ -1118,8 +1007,7 @@ OUString SdrModel::GetMetricString(tools::Long nVal, bool bNoUnitChars, sal_Int3 nDecimalMark = nNumDigits; } - OUStringBuffer aBuf; - aBuf.append(static_cast<sal_Int32>(fLocalValue + 0.5)); + OUStringBuffer aBuf = OUString::number(static_cast<sal_Int32>(fLocalValue + 0.5)); if(nDecimalMark < 0) { @@ -1267,10 +1155,10 @@ void SdrModel::RecalcPageNums(bool bMaster) { if(bMaster) { - sal_uInt16 nCount=sal_uInt16(maMaPag.size()); + sal_uInt16 nCount=sal_uInt16(maMasterPages.size()); sal_uInt16 i; for (i=0; i<nCount; i++) { - SdrPage* pPg=maMaPag[i]; + SdrPage* pPg = maMasterPages[i].get(); pPg->SetPageNum(i); } m_bMPgNumsDirty=false; @@ -1280,7 +1168,7 @@ void SdrModel::RecalcPageNums(bool bMaster) sal_uInt16 nCount=sal_uInt16(maPages.size()); sal_uInt16 i; for (i=0; i<nCount; i++) { - SdrPage* pPg=maPages[i]; + SdrPage* pPg = maPages[i].get(); pPg->SetPageNum(i); } m_bPagNumsDirty=false; @@ -1289,9 +1177,11 @@ void SdrModel::RecalcPageNums(bool bMaster) void SdrModel::InsertPage(SdrPage* pPage, sal_uInt16 nPos) { - sal_uInt16 nCount=GetPageCount(); - if (nPos>nCount) nPos=nCount; - maPages.insert(maPages.begin()+nPos,pPage); + sal_uInt16 nCount = GetPageCount(); + if (nPos > nCount) + nPos = nCount; + + maPages.insert(maPages.begin() + nPos, pPage); PageListChanged(); pPage->SetInserted(); pPage->SetPageNum(nPos); @@ -1307,33 +1197,32 @@ void SdrModel::InsertPage(SdrPage* pPage, sal_uInt16 nPos) void SdrModel::DeletePage(sal_uInt16 nPgNum) { - SdrPage* pPg=RemovePage(nPgNum); - delete pPg; + RemovePage(nPgNum); } -SdrPage* SdrModel::RemovePage(sal_uInt16 nPgNum) +rtl::Reference<SdrPage> SdrModel::RemovePage(sal_uInt16 nPgNum) { - SdrPage* pPg=maPages[nPgNum]; + rtl::Reference<SdrPage> pPg = maPages[nPgNum]; maPages.erase(maPages.begin()+nPgNum); PageListChanged(); - if (pPg!=nullptr) { + if (pPg) { pPg->SetInserted(false); } m_bPagNumsDirty=true; SetChanged(); - SdrHint aHint(SdrHintKind::PageOrderChange, pPg); + SdrHint aHint(SdrHintKind::PageOrderChange, pPg.get()); Broadcast(aHint); return pPg; } void SdrModel::MovePage(sal_uInt16 nPgNum, sal_uInt16 nNewPos) { - SdrPage* pPg=maPages[nPgNum]; - if (pPg!=nullptr) { + rtl::Reference<SdrPage> pPg = std::move(maPages[nPgNum]); + if (pPg) { maPages.erase(maPages.begin()+nPgNum); // shortcut to avoid two broadcasts PageListChanged(); pPg->SetInserted(false); - InsertPage(pPg,nNewPos); + InsertPage(pPg.get(), nNewPos); } else RemovePage(nPgNum); @@ -1343,7 +1232,7 @@ void SdrModel::InsertMasterPage(SdrPage* pPage, sal_uInt16 nPos) { sal_uInt16 nCount=GetMasterPageCount(); if (nPos>nCount) nPos=nCount; - maMaPag.insert(maMaPag.begin()+nPos,pPage); + maMasterPages.insert(maMasterPages.begin()+nPos,pPage); MasterPageListChanged(); pPage->SetInserted(); pPage->SetPageNum(nPos); @@ -1359,14 +1248,13 @@ void SdrModel::InsertMasterPage(SdrPage* pPage, sal_uInt16 nPos) void SdrModel::DeleteMasterPage(sal_uInt16 nPgNum) { - SdrPage* pPg=RemoveMasterPage(nPgNum); - delete pPg; + RemoveMasterPage(nPgNum); } -SdrPage* SdrModel::RemoveMasterPage(sal_uInt16 nPgNum) +rtl::Reference<SdrPage> SdrModel::RemoveMasterPage(sal_uInt16 nPgNum) { - SdrPage* pRetPg=maMaPag[nPgNum]; - maMaPag.erase(maMaPag.begin()+nPgNum); + rtl::Reference<SdrPage> pRetPg = std::move(maMasterPages[nPgNum]); + maMasterPages.erase(maMasterPages.begin()+nPgNum); MasterPageListChanged(); if(pRetPg) @@ -1384,24 +1272,24 @@ SdrPage* SdrModel::RemoveMasterPage(sal_uInt16 nPgNum) m_bMPgNumsDirty=true; SetChanged(); - SdrHint aHint(SdrHintKind::PageOrderChange, pRetPg); + SdrHint aHint(SdrHintKind::PageOrderChange, pRetPg.get()); Broadcast(aHint); return pRetPg; } void SdrModel::MoveMasterPage(sal_uInt16 nPgNum, sal_uInt16 nNewPos) { - SdrPage* pPg=maMaPag[nPgNum]; - maMaPag.erase(maMaPag.begin()+nPgNum); + rtl::Reference<SdrPage> pPg = std::move(maMasterPages[nPgNum]); + maMasterPages.erase(maMasterPages.begin()+nPgNum); MasterPageListChanged(); - if (pPg!=nullptr) { + if (pPg) { pPg->SetInserted(false); - maMaPag.insert(maMaPag.begin()+nNewPos,pPg); + maMasterPages.insert(maMasterPages.begin()+nNewPos,pPg); MasterPageListChanged(); } m_bMPgNumsDirty=true; SetChanged(); - SdrHint aHint(SdrHintKind::PageOrderChange, pPg); + SdrHint aHint(SdrHintKind::PageOrderChange, pPg.get()); Broadcast(aHint); } @@ -1447,7 +1335,7 @@ void SdrModel::CopyPages(sal_uInt16 nFirstPageNum, sal_uInt16 nLastPageNum, sal_uInt16 nDestNum=nDestPos; for (nCopyNum=0; nCopyNum<nCopyCnt; nCopyNum++) { - SdrPage* pPg=pPagePtrs[nCopyNum]; + rtl::Reference<SdrPage> pPg = pPagePtrs[nCopyNum]; sal_uInt16 nPageNum2=pPg->GetPageNum(); if (!bMoveNoCopy) { @@ -1456,7 +1344,7 @@ void SdrModel::CopyPages(sal_uInt16 nFirstPageNum, sal_uInt16 nLastPageNum, // Clone to local model pPg = pPg1->CloneSdrPage(*this); - InsertPage(pPg,nDestNum); + InsertPage(pPg.get(), nDestNum); if (bUndo) AddUndo(GetSdrUndoFactory().CreateUndoCopyPage(*pPg)); nDestNum++; @@ -1471,7 +1359,7 @@ void SdrModel::CopyPages(sal_uInt16 nFirstPageNum, sal_uInt16 nLastPageNum, AddUndo(GetSdrUndoFactory().CreateUndoSetPageNum(*GetPage(nPageNum2),nPageNum2,nDestNum)); pPg=RemovePage(nPageNum2); - InsertPage(pPg,nDestNum); + InsertPage(pPg.get(), nDestNum); nDestNum++; } @@ -1560,19 +1448,19 @@ void SdrModel::Merge(SdrModel& rSourceModel, { // Always Clone to new model const SdrPage* pPg1(rSourceModel.GetMasterPage(i)); - SdrPage* pPg(pPg1->CloneSdrPage(*this)); + rtl::Reference<SdrPage> pPg = pPg1->CloneSdrPage(*this); if(!bTreadSourceAsConst) { // if requested, delete original/modify original model - delete rSourceModel.RemoveMasterPage(i); + rSourceModel.RemoveMasterPage(i); } if (pPg!=nullptr) { // Now append all of them to the end of the DstModel. // Don't use InsertMasterPage(), because everything is // inconsistent until all are in. - maMaPag.insert(maMaPag.begin()+nDstMasterPageCnt, pPg); + maMasterPages.insert(maMasterPages.begin()+nDstMasterPageCnt, pPg); MasterPageListChanged(); pPg->SetInserted(); m_bMPgNumsDirty=true; @@ -1593,16 +1481,16 @@ void SdrModel::Merge(SdrModel& rSourceModel, { // Always Clone to new model const SdrPage* pPg1(rSourceModel.GetPage(nSourcePos)); - SdrPage* pPg(pPg1->CloneSdrPage(*this)); + rtl::Reference<SdrPage> pPg = pPg1->CloneSdrPage(*this); if(!bTreadSourceAsConst) { // if requested, delete original/modify original model - delete rSourceModel.RemovePage(nSourcePos); + rSourceModel.RemovePage(nSourcePos); } if (pPg!=nullptr) { - InsertPage(pPg,nDestPos); + InsertPage(pPg.get(),nDestPos); if (bUndo) AddUndo(GetSdrUndoFactory().CreateUndoNewPage(*pPg)); if(pPg->TRG_HasMasterPage()) @@ -1680,7 +1568,17 @@ void SdrModel::SetStarDrawPreviewMode(bool bPreview) } } -uno::Reference< uno::XInterface > const & SdrModel::getUnoModel() +void SdrModel::setTheme(std::shared_ptr<model::Theme> const& pTheme) +{ + mpImpl->mpTheme = pTheme; +} + +std::shared_ptr<model::Theme> const& SdrModel::getTheme() const +{ + return mpImpl->mpTheme; +} + +uno::Reference< frame::XModel > const & SdrModel::getUnoModel() { if( !mxUnoModel.is() ) mxUnoModel = createUnoModel(); @@ -1688,7 +1586,7 @@ uno::Reference< uno::XInterface > const & SdrModel::getUnoModel() return mxUnoModel; } -void SdrModel::setUnoModel( const css::uno::Reference< css::uno::XInterface >& xModel ) +void SdrModel::setUnoModel(const uno::Reference<frame::XModel>& xModel) { mxUnoModel = xModel; } @@ -1705,11 +1603,10 @@ void SdrModel::adaptSizeAndBorderForAllPages( // to do this for higher-level (derived) Models (e.g. Draw/Impress) } -uno::Reference< uno::XInterface > SdrModel::createUnoModel() +uno::Reference< frame::XModel > SdrModel::createUnoModel() { OSL_FAIL( "SdrModel::createUnoModel() - base implementation should not be called!" ); - css::uno::Reference< css::uno::XInterface > xInt; - return xInt; + return nullptr; } void SdrModel::setLock( bool bLock ) @@ -1739,7 +1636,7 @@ void SdrModel::MigrateItemSet( const SfxItemSet* pSourceSet, SfxItemSet* pDestSe while(nWhich) { - if(SfxItemState::SET == pSourceSet->GetItemState(nWhich, false, &pPoolItem)) + if(SfxItemState::SET == aWhichIter.GetItemState(false, &pPoolItem)) { std::unique_ptr<SfxPoolItem> pResultItem; @@ -1771,10 +1668,7 @@ void SdrModel::MigrateItemSet( const SfxItemSet* pSourceSet, SfxItemSet* pDestSe // set item if( pResultItem ) - { - pDestSet->Put(*pResultItem); - pResultItem.reset(); - } + pDestSet->Put(std::move(pResultItem)); else pDestSet->Put(*pPoolItem); } @@ -1822,14 +1716,40 @@ void SdrModel::SetAddExtLeading( bool bEnabled ) } } -void SdrModel::SetAnchoredTextOverflowLegacy(bool bEnabled) +void SdrModel::SetCompatibilityFlag(SdrCompatibilityFlag eFlag, bool bEnabled) { - mpImpl->mbAnchoredTextOverflowLegacy = bEnabled; + switch (eFlag) + { + case SdrCompatibilityFlag::AnchoredTextOverflowLegacy: + mpImpl->mbAnchoredTextOverflowLegacy = bEnabled; + break; + case SdrCompatibilityFlag::LegacyFontwork: + mpImpl->mbLegacyFontwork = bEnabled; + break; + case SdrCompatibilityFlag::ConnectorUseSnapRect: + mpImpl->mbConnectorUseSnapRect = bEnabled; + break; + case SdrCompatibilityFlag::IgnoreBreakAfterMultilineField: + mpImpl->mbIgnoreBreakAfterMultilineField = bEnabled; + break; + } } -bool SdrModel::IsAnchoredTextOverflowLegacy() const +bool SdrModel::GetCompatibilityFlag(SdrCompatibilityFlag eFlag) const { - return mpImpl->mbAnchoredTextOverflowLegacy; + switch (eFlag) + { + case SdrCompatibilityFlag::AnchoredTextOverflowLegacy: + return mpImpl->mbAnchoredTextOverflowLegacy; + case SdrCompatibilityFlag::LegacyFontwork: + return mpImpl->mbLegacyFontwork; + case SdrCompatibilityFlag::ConnectorUseSnapRect: + return mpImpl->mbConnectorUseSnapRect; + case SdrCompatibilityFlag::IgnoreBreakAfterMultilineField: + return mpImpl->mbIgnoreBreakAfterMultilineField; + default: + return false; + } } void SdrModel::ReformatAllTextObjects() @@ -1865,7 +1785,7 @@ SvxNumType SdrModel::GetPageNumType() const return SVX_NUM_ARABIC; } -void SdrModel::ReadUserDataSequenceValue(const css::beans::PropertyValue* pValue) +void SdrModel::ReadUserDataSequenceValue(const beans::PropertyValue* pValue) { if (pValue->Name == "AnchoredTextOverflowLegacy") { @@ -1875,23 +1795,64 @@ void SdrModel::ReadUserDataSequenceValue(const css::beans::PropertyValue* pValue mpImpl->mbAnchoredTextOverflowLegacy = bBool; } } + else if (pValue->Name == "ConnectorUseSnapRect") + { + bool bBool = false; + if (pValue->Value >>= bBool) + { + mpImpl->mbConnectorUseSnapRect = bBool; + } + } + else if (pValue->Name == "LegacySingleLineFontwork") + { + bool bBool = false; + if ((pValue->Value >>= bBool) && mpImpl->mbLegacyFontwork != bBool) + { + mpImpl->mbLegacyFontwork = bBool; + // tdf#148000 hack: reset all CustomShape geometry as they may depend on this property + // Ideally this ReadUserDataSequenceValue should be called before geometry creation + // Once the calling order will be fixed, this hack will not be needed. + for (size_t i = 0; i < maPages.size(); ++i) + { + if (const SdrPage* pPage = maPages[i].get()) + { + SdrObjListIter aIter(pPage, SdrIterMode::DeepWithGroups); + while (aIter.IsMore()) + { + SdrObject* pTempObj = aIter.Next(); + if (SdrObjCustomShape* pShape = dynamic_cast<SdrObjCustomShape*>(pTempObj)) + { + pShape->InvalidateRenderGeometry(); + } + } + } + } + } + } + else if (pValue->Name == "IgnoreBreakAfterMultilineField") + { + bool bBool = false; + if (pValue->Value >>= bBool) + { + mpImpl->mbIgnoreBreakAfterMultilineField = bBool; + } + } } -template <typename T> -static void addPair(std::vector< std::pair< OUString, Any > >& aUserData, const OUString& name, const T val) -{ - aUserData.push_back(std::pair< OUString, Any >(name, css::uno::makeAny(val))); -} - -void SdrModel::WriteUserDataSequence(css::uno::Sequence < css::beans::PropertyValue >& rValues) +void SdrModel::WriteUserDataSequence(uno::Sequence <beans::PropertyValue>& rValues) { - std::vector< std::pair< OUString, Any > > aUserData; - addPair(aUserData, "AnchoredTextOverflowLegacy", IsAnchoredTextOverflowLegacy()); + std::vector< std::pair< OUString, uno::Any > > aUserData + { + { "AnchoredTextOverflowLegacy", uno::Any(GetCompatibilityFlag(SdrCompatibilityFlag::AnchoredTextOverflowLegacy)) }, + { "LegacySingleLineFontwork", uno::Any(GetCompatibilityFlag(SdrCompatibilityFlag::LegacyFontwork)) }, + { "ConnectorUseSnapRect", uno::Any(GetCompatibilityFlag(SdrCompatibilityFlag::ConnectorUseSnapRect)) }, + { "IgnoreBreakAfterMultilineField", uno::Any(GetCompatibilityFlag(SdrCompatibilityFlag::IgnoreBreakAfterMultilineField)) } + }; const sal_Int32 nOldLength = rValues.getLength(); rValues.realloc(nOldLength + aUserData.size()); - css::beans::PropertyValue* pValue = &(rValues.getArray()[nOldLength]); + beans::PropertyValue* pValue = &(rValues.getArray()[nOldLength]); for (const auto &aIter : aUserData) { @@ -1903,14 +1864,12 @@ void SdrModel::WriteUserDataSequence(css::uno::Sequence < css::beans::PropertyVa const SdrPage* SdrModel::GetPage(sal_uInt16 nPgNum) const { - DBG_ASSERT(nPgNum < maPages.size(), "SdrModel::GetPage: Access out of range (!)"); - return nPgNum < maPages.size() ? maPages[nPgNum] : nullptr; + return nPgNum < maPages.size() ? maPages[nPgNum].get() : nullptr; } SdrPage* SdrModel::GetPage(sal_uInt16 nPgNum) { - DBG_ASSERT(nPgNum < maPages.size(), "SdrModel::GetPage: Access out of range (!)"); - return nPgNum < maPages.size() ? maPages[nPgNum] : nullptr; + return nPgNum < maPages.size() ? maPages[nPgNum].get() : nullptr; } sal_uInt16 SdrModel::GetPageCount() const @@ -1929,19 +1888,19 @@ TextChain *SdrModel::GetTextChain() const const SdrPage* SdrModel::GetMasterPage(sal_uInt16 nPgNum) const { - DBG_ASSERT(nPgNum < maMaPag.size(), "SdrModel::GetMasterPage: Access out of range (!)"); - return maMaPag[nPgNum]; + DBG_ASSERT(nPgNum < maMasterPages.size(), "SdrModel::GetMasterPage: Access out of range (!)"); + return maMasterPages[nPgNum].get(); } SdrPage* SdrModel::GetMasterPage(sal_uInt16 nPgNum) { - DBG_ASSERT(nPgNum < maMaPag.size(), "SdrModel::GetMasterPage: Access out of range (!)"); - return maMaPag[nPgNum]; + DBG_ASSERT(nPgNum < maMasterPages.size(), "SdrModel::GetMasterPage: Access out of range (!)"); + return maMasterPages[nPgNum].get(); } sal_uInt16 SdrModel::GetMasterPageCount() const { - return sal_uInt16(maMaPag.size()); + return sal_uInt16(maMasterPages.size()); } void SdrModel::MasterPageListChanged() @@ -1976,27 +1935,41 @@ void SdrModel::SetSdrUndoFactory( SdrUndoFactory* pUndoFactory ) void SdrModel::dumpAsXml(xmlTextWriterPtr pWriter) const { - xmlTextWriterStartElement(pWriter, BAD_CAST("SdrModel")); - xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST("ptr"), "%p", this); + (void)xmlTextWriterStartElement(pWriter, BAD_CAST("SdrModel")); + (void)xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST("ptr"), "%p", this); - sal_uInt16 nPageCount = GetPageCount(); - for (sal_uInt16 i = 0; i < nPageCount; ++i) + (void)xmlTextWriterStartElement(pWriter, BAD_CAST("maMasterPages")); + for (size_t i = 0; i < maMasterPages.size(); ++i) { - if (const SdrPage* pPage = GetPage(i)) + if (const SdrPage* pPage = maMasterPages[i].get()) + { pPage->dumpAsXml(pWriter); + } } + (void)xmlTextWriterEndElement(pWriter); - xmlTextWriterEndElement(pWriter); -} + (void)xmlTextWriterStartElement(pWriter, BAD_CAST("maPages")); + for (size_t i = 0; i < maPages.size(); ++i) + { + if (const SdrPage* pPage = maPages[i].get()) + { + pPage->dumpAsXml(pWriter); + } + } + (void)xmlTextWriterEndElement(pWriter); -namespace -{ - class theSdrModelUnoTunnelImplementationId : public rtl::Static< UnoTunnelIdInit, theSdrModelUnoTunnelImplementationId > {}; + if (mpImpl->mpTheme) + { + mpImpl->mpTheme->dumpAsXml(pWriter); + } + + (void)xmlTextWriterEndElement(pWriter); } -const css::uno::Sequence< sal_Int8 >& SdrModel::getUnoTunnelId() +const uno::Sequence<sal_Int8>& SdrModel::getUnoTunnelId() { - return theSdrModelUnoTunnelImplementationId::get().getSeq(); + static const comphelper::UnoIdInit theSdrModelUnoTunnelImplementationId; + return theSdrModelUnoTunnelImplementationId.getSeq(); } |