diff options
Diffstat (limited to 'svx/source')
114 files changed, 3529 insertions, 3857 deletions
diff --git a/svx/source/accessibility/AccessibleEmptyEditSource.cxx b/svx/source/accessibility/AccessibleEmptyEditSource.cxx index 6cbd41f35ce0..19a09ec8f502 100644 --- a/svx/source/accessibility/AccessibleEmptyEditSource.cxx +++ b/svx/source/accessibility/AccessibleEmptyEditSource.cxx @@ -218,8 +218,7 @@ namespace accessibility mrViewWindow(rViewWindow), mbEditSourceEmpty( true ) { - if( mrObj.GetModel() ) - StartListening( *mrObj.GetModel() ); + StartListening( mrObj.getSdrModelFromSdrObject() ); } AccessibleEmptyEditSource::~AccessibleEmptyEditSource() @@ -232,8 +231,7 @@ namespace accessibility } else { - if( mrObj.GetModel() ) - EndListening( *mrObj.GetModel() ); + EndListening( mrObj.getSdrModelFromSdrObject() ); } } @@ -256,8 +254,7 @@ namespace accessibility void AccessibleEmptyEditSource::Switch2ProxyEditSource() { // deregister EmptyEditSource model listener - if( mrObj.GetModel() ) - EndListening( *mrObj.GetModel() ); + EndListening( mrObj.getSdrModelFromSdrObject() ); ::std::unique_ptr< SvxEditSource > pProxySource( new AccessibleProxyEditSource_Impl(mrObj, mrView, mrViewWindow) ); mpEditSource.swap(pProxySource); diff --git a/svx/source/accessibility/AccessibleGraphicShape.cxx b/svx/source/accessibility/AccessibleGraphicShape.cxx index 31c4690f5b97..fba25f4ad007 100644 --- a/svx/source/accessibility/AccessibleGraphicShape.cxx +++ b/svx/source/accessibility/AccessibleGraphicShape.cxx @@ -169,7 +169,7 @@ OUString AccessibleGraphicShape::CreateAccessibleDescription() // Return this object's role. sal_Int16 SAL_CALL AccessibleGraphicShape::getAccessibleRole() { - if( m_pShape->GetModel()->GetImageMapForObject(m_pShape) != nullptr ) + if( m_pShape->getSdrModelFromSdrObject().GetImageMapForObject(m_pShape) != nullptr ) return AccessibleRole::IMAGE_MAP; else return AccessibleShape::getAccessibleRole(); diff --git a/svx/source/core/extedit.cxx b/svx/source/core/extedit.cxx index a00216d40b16..dab305257299 100644 --- a/svx/source/core/extedit.cxx +++ b/svx/source/core/extedit.cxx @@ -154,12 +154,13 @@ void ExternalToolEdit::Edit(GraphicObject const*const pGraphicObject) } SdrExternalToolEdit::SdrExternalToolEdit( - FmFormView *const pView, SdrObject *const pObj) - : m_pView(pView) - , m_pObj(pObj) + FmFormView* pView, + SdrObject* pObj) +: m_pView(pView) + ,m_pObj(pObj) { assert(m_pObj && m_pView); - StartListening(*m_pObj->GetModel()); + StartListening(m_pObj->getSdrModelFromSdrObject()); } diff --git a/svx/source/customshapes/EnhancedCustomShape2d.cxx b/svx/source/customshapes/EnhancedCustomShape2d.cxx index 2386b5887d8f..f2a00feaad80 100644 --- a/svx/source/customshapes/EnhancedCustomShape2d.cxx +++ b/svx/source/customshapes/EnhancedCustomShape2d.cxx @@ -1980,7 +1980,10 @@ void EnhancedCustomShape2d::CreateSubPath( { basegfx::B2DPolyPolygon aClosedPolyPolygon(aNewB2DPolyPolygon); aClosedPolyPolygon.setClosed(true); - SdrPathObj* pFill = new SdrPathObj(OBJ_POLY, aClosedPolyPolygon); + SdrPathObj* pFill = new SdrPathObj( + mrSdrObjCustomShape.getSdrModelFromSdrObject(), + OBJ_POLY, + aClosedPolyPolygon); SfxItemSet aTempSet(*this); aTempSet.Put(makeSdrShadowItem(false)); aTempSet.Put(XLineStyleItem(drawing::LineStyle_NONE)); @@ -1995,6 +1998,7 @@ void EnhancedCustomShape2d::CreateSubPath( // to correct the polygon (here: open it) using the type, the last edge may get lost. // Thus, use a type that fits the polygon SdrPathObj* pStroke = new SdrPathObj( + mrSdrObjCustomShape.getSdrModelFromSdrObject(), aNewB2DPolyPolygon.isClosed() ? OBJ_POLY : OBJ_PLIN, aNewB2DPolyPolygon); SfxItemSet aTempSet(*this); @@ -2014,6 +2018,7 @@ void EnhancedCustomShape2d::CreateSubPath( { // see comment above about OBJ_PLIN pObj = new SdrPathObj( + mrSdrObjCustomShape.getSdrModelFromSdrObject(), aNewB2DPolyPolygon.isClosed() ? OBJ_POLY : OBJ_PLIN, aNewB2DPolyPolygon); aTempSet.Put(XFillStyleItem(drawing::FillStyle_NONE)); @@ -2021,7 +2026,10 @@ void EnhancedCustomShape2d::CreateSubPath( else { aNewB2DPolyPolygon.setClosed(true); - pObj = new SdrPathObj(OBJ_POLY, aNewB2DPolyPolygon); + pObj = new SdrPathObj( + mrSdrObjCustomShape.getSdrModelFromSdrObject(), + OBJ_POLY, + aNewB2DPolyPolygon); } if(bNoStroke) @@ -2372,7 +2380,7 @@ SdrObject* EnhancedCustomShape2d::CreatePathObj( bool bLineGeometryNeededOnly ) // copy remaining objects to pRet if(vObjectList.size() > 1) { - pRet = new SdrObjGroup; + pRet = new SdrObjGroup(mrSdrObjCustomShape.getSdrModelFromSdrObject()); for ( std::pair< SdrPathObj*, double >& rCandidate : vObjectList ) { @@ -2404,7 +2412,7 @@ SdrObject* EnhancedCustomShape2d::CreateObject( bool bLineGeometryNeededOnly ) if ( eSpType == mso_sptRectangle ) { - pRet = new SdrRectObj( aLogicRect ); + pRet = new SdrRectObj(mrSdrObjCustomShape.getSdrModelFromSdrObject(), aLogicRect); pRet->SetMergedItemSet( *this ); } if ( !pRet ) diff --git a/svx/source/customshapes/EnhancedCustomShape3d.cxx b/svx/source/customshapes/EnhancedCustomShape3d.cxx index 60177fc9fbe8..a0e2a6badba0 100644 --- a/svx/source/customshapes/EnhancedCustomShape3d.cxx +++ b/svx/source/customshapes/EnhancedCustomShape3d.cxx @@ -255,27 +255,24 @@ SdrObject* EnhancedCustomShape3d::Create3DObject( const SdrObject* pShape2d, const SdrObjCustomShape& rSdrObjCustomShape) { - SdrObject* pRet = nullptr; - SdrModel* pModel = rSdrObjCustomShape.GetModel(); - const SdrCustomShapeGeometryItem& rGeometryItem = rSdrObjCustomShape.GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ); + SdrObject* pRet(nullptr); + const SdrCustomShapeGeometryItem& rGeometryItem(rSdrObjCustomShape.GetMergedItem(SDRATTR_CUSTOMSHAPE_GEOMETRY)); + double fMap(1.0), *pMap = nullptr; + Fraction aFraction( rSdrObjCustomShape.getSdrModelFromSdrObject().GetScaleFraction() ); - double fMap, *pMap = nullptr; - if ( pModel ) + if ( aFraction.GetNumerator() != 1 || aFraction.GetDenominator() != 1 ) { - fMap = 1.0; - Fraction aFraction( pModel->GetScaleFraction() ); - if ( aFraction.GetNumerator() != 1 || aFraction.GetDenominator() != 1 ) - { - fMap *= double(aFraction); - pMap = &fMap; - } - if ( pModel->GetScaleUnit() != MapUnit::Map100thMM ) - { - DBG_ASSERT( pModel->GetScaleUnit() == MapUnit::MapTwip, "EnhancedCustomShape3d::Current MapMode is Unsupported" ); - fMap *= 1440.0 / 2540.0; - pMap = &fMap; - } + fMap *= double(aFraction); + pMap = &fMap; + } + + if ( rSdrObjCustomShape.getSdrModelFromSdrObject().GetScaleUnit() != MapUnit::Map100thMM ) + { + DBG_ASSERT( rSdrObjCustomShape.getSdrModelFromSdrObject().GetScaleUnit() == MapUnit::MapTwip, "EnhancedCustomShape3d::Current MapMode is Unsupported" ); + fMap *= 1440.0 / 2540.0; + pMap = &fMap; } + if ( GetBool( rGeometryItem, "Extrusion", false ) ) { bool bIsMirroredX(rSdrObjCustomShape.IsMirroredX()); @@ -326,7 +323,7 @@ SdrObject* EnhancedCustomShape3d::Create3DObject( a3DDefaultAttr.SetDefaultLatheCharacterMode( true ); a3DDefaultAttr.SetDefaultExtrudeCharacterMode( true ); - E3dScene* pScene = new E3dScene; + E3dScene* pScene = new E3dScene(rSdrObjCustomShape.getSdrModelFromSdrObject()); bool bSceneHasObjects ( false ); bool bUseTwoFillStyles( false ); @@ -480,10 +477,15 @@ SdrObject* EnhancedCustomShape3d::Create3DObject( aBoundRect2d.Union( aBoundRect ); // #i122777# depth 0 is okay for planes when using double-sided - E3dCompoundObject* p3DObj = new E3dExtrudeObj( a3DDefaultAttr, aPolyPoly, bUseTwoFillStyles ? 0 : fDepth ); + E3dCompoundObject* p3DObj = new E3dExtrudeObj( + rSdrObjCustomShape.getSdrModelFromSdrObject(), + a3DDefaultAttr, + aPolyPoly, + bUseTwoFillStyles ? 0 : fDepth ); p3DObj->NbcSetLayer( pShape2d->GetLayer() ); p3DObj->SetMergedItemSet( aLocalSet ); + if ( bIsPlaceholderObject ) aPlaceholderObjectList.push_back( p3DObj ); else if ( bUseTwoFillStyles ) @@ -530,7 +532,11 @@ SdrObject* EnhancedCustomShape3d::Create3DObject( } } pScene->Insert3DObj( p3DObj ); - p3DObj = new E3dExtrudeObj( a3DDefaultAttr, aPolyPoly, fDepth ); + p3DObj = new E3dExtrudeObj( + rSdrObjCustomShape.getSdrModelFromSdrObject(), + a3DDefaultAttr, + aPolyPoly, + fDepth); p3DObj->NbcSetLayer( pShape2d->GetLayer() ); p3DObj->SetMergedItemSet( aLocalSet ); if ( bUseExtrusionColor ) @@ -541,7 +547,11 @@ SdrObject* EnhancedCustomShape3d::Create3DObject( pScene->Insert3DObj( p3DObj ); // #i122777# depth 0 is okay for planes when using double-sided - p3DObj = new E3dExtrudeObj( a3DDefaultAttr, aPolyPoly, 0 ); + p3DObj = new E3dExtrudeObj( + rSdrObjCustomShape.getSdrModelFromSdrObject(), + a3DDefaultAttr, + aPolyPoly, + 0); p3DObj->NbcSetLayer( pShape2d->GetLayer() ); p3DObj->SetMergedItemSet( aLocalSet ); diff --git a/svx/source/customshapes/EnhancedCustomShapeEngine.cxx b/svx/source/customshapes/EnhancedCustomShapeEngine.cxx index 133c008ebc4e..753d43c3a0c7 100644 --- a/svx/source/customshapes/EnhancedCustomShapeEngine.cxx +++ b/svx/source/customshapes/EnhancedCustomShapeEngine.cxx @@ -167,7 +167,7 @@ SdrObject* EnhancedCustomShapeEngine::ImplForceGroupWithText( if ( dynamic_cast<const SdrObjGroup*>( pRenderedShape) == nullptr ) { SdrObject* pTmp = pRenderedShape; - pRenderedShape = new SdrObjGroup(); + pRenderedShape = new SdrObjGroup(rSdrObjCustomShape.getSdrModelFromSdrObject()); static_cast<SdrObjGroup*>(pRenderedShape)->GetSubList()->NbcInsertObject( pTmp ); } static_cast<SdrObjGroup*>(pRenderedShape)->GetSubList()->NbcInsertObject( pShadowGeometry->Clone(), 0 ); @@ -181,10 +181,9 @@ SdrObject* EnhancedCustomShapeEngine::ImplForceGroupWithText( { // #i37011# also create a text object and add at rPos + 1 SdrObject* pTextObj = SdrObjFactory::MakeNewObject( + rSdrObjCustomShape.getSdrModelFromSdrObject(), rSdrObjCustomShape.GetObjInventor(), - OBJ_TEXT, - nullptr, - rSdrObjCustomShape.GetModel()); + OBJ_TEXT); // Copy text content OutlinerParaObject* pParaObj(rSdrObjCustomShape.GetOutlinerParaObject()); @@ -233,7 +232,7 @@ SdrObject* EnhancedCustomShapeEngine::ImplForceGroupWithText( if ( dynamic_cast<const SdrObjGroup*>( pRenderedShape) == nullptr ) { SdrObject* pTmp = pRenderedShape; - pRenderedShape = new SdrObjGroup(); + pRenderedShape = new SdrObjGroup(rSdrObjCustomShape.getSdrModelFromSdrObject()); static_cast<SdrObjGroup*>(pRenderedShape)->GetSubList()->NbcInsertObject( pTmp ); } static_cast<SdrObjGroup*>(pRenderedShape)->GetSubList()->NbcInsertObject( pTextObj ); @@ -248,12 +247,11 @@ SdrObject* EnhancedCustomShapeEngine::ImplForceGroupWithText( if ( dynamic_cast<const SdrObjGroup*>( pRenderedShape) == nullptr ) { SdrObject* pTmp = pRenderedShape; - pRenderedShape = new SdrObjGroup(); + pRenderedShape = new SdrObjGroup(rSdrObjCustomShape.getSdrModelFromSdrObject()); static_cast<SdrObjGroup*>(pRenderedShape)->GetSubList()->NbcInsertObject( pTmp ); } pRenderedShape->SetPage(rSdrObjCustomShape.GetPage()); - pRenderedShape->SetModel(rSdrObjCustomShape.GetModel()); } } @@ -391,9 +389,7 @@ awt::Rectangle SAL_CALL EnhancedCustomShapeEngine::getTextBounds() SdrObjCustomShape& rSdrObjCustomShape(static_cast< SdrObjCustomShape& >(*GetSdrObjectFromXShape(mxShape))); uno::Reference< document::XActionLockable > xLockable( mxShape, uno::UNO_QUERY ); - if(rSdrObjCustomShape.GetModel() - && xLockable.is() - && !xLockable->isActionLocked()) + if(xLockable.is() && !xLockable->isActionLocked()) { EnhancedCustomShape2d aCustomShape2d(rSdrObjCustomShape); tools::Rectangle aRect( aCustomShape2d.GetTextRect() ); diff --git a/svx/source/customshapes/EnhancedCustomShapeFontWork.cxx b/svx/source/customshapes/EnhancedCustomShapeFontWork.cxx index 71dc441f1727..9bfed5d53ab4 100644 --- a/svx/source/customshapes/EnhancedCustomShapeFontWork.cxx +++ b/svx/source/customshapes/EnhancedCustomShapeFontWork.cxx @@ -853,13 +853,17 @@ SdrObject* CreateSdrObjectFromParagraphOutlines( ++aTextAreaIter; } - pRet = new SdrPathObj( OBJ_POLY, aPolyPoly ); + pRet = new SdrPathObj( + rSdrObjCustomShape.getSdrModelFromSdrObject(), + OBJ_POLY, + aPolyPoly); SfxItemSet aSet(rSdrObjCustomShape.GetMergedItemSet()); aSet.ClearItem( SDRATTR_TEXTDIRECTION ); //SJ: vertical writing is not required, by removing this item no outliner is created aSet.Put(makeSdrShadowItem(false)); // #i37011# NO shadow for FontWork geometry pRet->SetMergedItemSet( aSet ); // * otherwise we would crash, because the outliner tries to create a Paraobject, but there is no model } + return pRet; } diff --git a/svx/source/dialog/connctrl.cxx b/svx/source/dialog/connctrl.cxx index b9a8ea76b1bd..9440ce6796a6 100644 --- a/svx/source/dialog/connctrl.cxx +++ b/svx/source/dialog/connctrl.cxx @@ -39,7 +39,7 @@ SvxXConnectionPreview::SvxXConnectionPreview( vcl::Window* pParent, WinBits nStyle) : Control(pParent, nStyle) , pEdgeObj(nullptr) - , pObjList(nullptr) + , pSdrPage(nullptr) , pView(nullptr) { SetMapMode(MapMode(MapUnit::Map100thMM)); @@ -55,7 +55,7 @@ SvxXConnectionPreview::~SvxXConnectionPreview() void SvxXConnectionPreview::dispose() { - delete pObjList; + delete pSdrPage; Control::dispose(); } @@ -76,13 +76,13 @@ Size SvxXConnectionPreview::GetOptimalSize() const void SvxXConnectionPreview::AdaptSize() { // Adapt size - if( !pObjList ) + if( !pSdrPage ) return; SetMapMode(MapMode(MapUnit::Map100thMM)); OutputDevice* pOD = pView->GetFirstOutputDevice(); // GetWin( 0 ); - tools::Rectangle aRect = pObjList->GetAllObjBoundRect(); + tools::Rectangle aRect = pSdrPage->GetAllObjBoundRect(); MapMode aMapMode = GetMapMode(); aMapMode.SetMapUnit( pOD->GetMapMode().GetMapUnit() ); @@ -171,37 +171,43 @@ void SvxXConnectionPreview::Construct() // potential memory leak here (!). Create SdrObjList only when there is // not yet one. - if(!pObjList) + if(!pSdrPage) { - pObjList = new SdrObjList( pView->GetModel(), nullptr ); + pSdrPage = new SdrPage( + pView->getSdrModelFromSdrView(), + false); } if( pTmpObj1 ) { SdrObject* pObj1 = pTmpObj1->Clone(); - pObjList->InsertObject( pObj1 ); + pSdrPage->InsertObject( pObj1 ); pEdgeObj->ConnectToNode( true, pObj1 ); } + if( pTmpObj2 ) { SdrObject* pObj2 = pTmpObj2->Clone(); - pObjList->InsertObject( pObj2 ); + pSdrPage->InsertObject( pObj2 ); pEdgeObj->ConnectToNode( false, pObj2 ); } - pObjList->InsertObject( pEdgeObj ); + + pSdrPage->InsertObject( pEdgeObj ); } } } if( !pEdgeObj ) - pEdgeObj = new SdrEdgeObj(); + { + pEdgeObj = new SdrEdgeObj(pView->getSdrModelFromSdrView()); + } AdaptSize(); } void SvxXConnectionPreview::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle&) { - if (pObjList) + if (pSdrPage) { // This will not work anymore. To not start at Adam and Eve, i will // ATM not try to change all this stuff to really using an own model @@ -212,9 +218,9 @@ void SvxXConnectionPreview::Paint(vcl::RenderContext& rRenderContext, const tool // New stuff: Use a ObjectContactOfObjListPainter. sdr::contact::SdrObjectVector aObjectVector; - for (size_t a = 0; a < pObjList->GetObjCount(); ++a) + for (size_t a = 0; a < pSdrPage->GetObjCount(); ++a) { - SdrObject* pObject = pObjList->GetObj(a); + SdrObject* pObject = pSdrPage->GetObj(a); DBG_ASSERT(pObject, "SvxXConnectionPreview::Paint: Corrupt ObjectList (!)"); aObjectVector.push_back(pObject); diff --git a/svx/source/dialog/contwnd.cxx b/svx/source/dialog/contwnd.cxx index e404154ed46d..c041a7240032 100644 --- a/svx/source/dialog/contwnd.cxx +++ b/svx/source/dialog/contwnd.cxx @@ -61,7 +61,10 @@ void ContourWindow::SetPolyPolygon(const tools::PolyPolygon& rPolyPoly) { basegfx::B2DPolyPolygon aPolyPolygon; aPolyPolygon.append(aPolyPoly[ i ].getB2DPolygon()); - SdrPathObj* pPathObj = new SdrPathObj( OBJ_PATHFILL, aPolyPolygon ); + SdrPathObj* pPathObj = new SdrPathObj( + *pModel, + OBJ_PATHFILL, + aPolyPolygon); SfxItemSet aSet(pModel->GetItemPool()); diff --git a/svx/source/dialog/dlgctl3d.cxx b/svx/source/dialog/dlgctl3d.cxx index 0eee4586f225..22bb53ba2d18 100644 --- a/svx/source/dialog/dlgctl3d.cxx +++ b/svx/source/dialog/dlgctl3d.cxx @@ -92,12 +92,12 @@ void Svx3DPreviewControl::Construct() mpModel->InsertPage( mpFmPage, 0 ); // 3D View - mp3DView = new E3dView( mpModel, this ); + mp3DView = new E3dView(*mpModel, this ); mp3DView->SetBufferedOutputAllowed(true); mp3DView->SetBufferedOverlayAllowed(true); // 3D Scene - mpScene = new E3dScene; + mpScene = new E3dScene(*mpModel); // initially create object SetObjectType(SvxPreviewObjectType::SPHERE); @@ -204,6 +204,7 @@ void Svx3DPreviewControl::SetObjectType(SvxPreviewObjectType nType) case SvxPreviewObjectType::SPHERE: { mp3DObj = new E3dSphereObj( + *mpModel, mp3DView->Get3DDefaultAttributes(), basegfx::B3DPoint( 0, 0, 0 ), basegfx::B3DVector( 5000, 5000, 5000 )); @@ -213,6 +214,7 @@ void Svx3DPreviewControl::SetObjectType(SvxPreviewObjectType nType) case SvxPreviewObjectType::CUBE: { mp3DObj = new E3dCubeObj( + *mpModel, mp3DView->Get3DDefaultAttributes(), basegfx::B3DPoint( -2500, -2500, -2500 ), basegfx::B3DVector( 5000, 5000, 5000 )); @@ -286,6 +288,7 @@ void Svx3DLightControl::Construct2() // create invisible expansion object const double fMaxExpansion(RADIUS_LAMP_BIG + RADIUS_LAMP_PREVIEW_SIZE); mpExpansionObject = new E3dCubeObj( + *mpModel, mp3DView->Get3DDefaultAttributes(), basegfx::B3DPoint(-fMaxExpansion, -fMaxExpansion, -fMaxExpansion), basegfx::B3DVector(2.0 * fMaxExpansion, 2.0 * fMaxExpansion, 2.0 * fMaxExpansion)); @@ -309,6 +312,7 @@ void Svx3DLightControl::Construct2() // create object for it mpLampBottomObject = new E3dPolygonObj( + *mpModel, basegfx::B3DPolyPolygon(a3DCircle)); mpScene->Insert3DObj( mpLampBottomObject ); @@ -322,6 +326,7 @@ void Svx3DLightControl::Construct2() // create object for it mpLampShaftObject = new E3dPolygonObj( + *mpModel, basegfx::B3DPolyPolygon(a3DHalfCircle)); mpScene->Insert3DObj( mpLampShaftObject ); @@ -383,6 +388,7 @@ void Svx3DLightControl::ConstructLightObjects() const double fLampSize(bIsSelectedLight ? RADIUS_LAMP_BIG : RADIUS_LAMP_SMALL); E3dObject* pNewLight = new E3dSphereObj( + *mpModel, mp3DView->Get3DDefaultAttributes(), basegfx::B3DPoint( 0, 0, 0 ), basegfx::B3DVector( fLampSize, fLampSize, fLampSize)); diff --git a/svx/source/dialog/dlgctrl.cxx b/svx/source/dialog/dlgctrl.cxx index d89b71b3e2a1..7e2ffb67c0e3 100644 --- a/svx/source/dialog/dlgctrl.cxx +++ b/svx/source/dialog/dlgctrl.cxx @@ -1468,14 +1468,9 @@ SvxXLinePreview::SvxXLinePreview(vcl::Window* pParent) { InitSettings( true, true ); - mpLineObjA = new SdrPathObj(OBJ_LINE); - mpLineObjA->SetModel(&getModel()); - - mpLineObjB = new SdrPathObj(OBJ_PLIN); - mpLineObjB->SetModel(&getModel()); - - mpLineObjC = new SdrPathObj(OBJ_PLIN); - mpLineObjC->SetModel(&getModel()); + mpLineObjA = new SdrPathObj(getModel(), OBJ_LINE); + mpLineObjB = new SdrPathObj(getModel(), OBJ_PLIN); + mpLineObjC = new SdrPathObj(getModel(), OBJ_PLIN); } VCL_BUILDER_FACTORY(SvxXLinePreview) @@ -1563,15 +1558,16 @@ void SvxXLinePreview::Paint(vcl::RenderContext& rRenderContext, const tools::Rec } SvxXRectPreview::SvxXRectPreview(vcl::Window* pParent) - : SvxPreviewBase(pParent) - , mpRectangleObject(nullptr) +: SvxPreviewBase(pParent) + ,mpRectangleObject(nullptr) { InitSettings(true, true); // create RectangleObject const tools::Rectangle aObjectSize(Point(), GetOutputSize()); - mpRectangleObject = new SdrRectObj(aObjectSize); - mpRectangleObject->SetModel(&getModel()); + mpRectangleObject = new SdrRectObj( + getModel(), + aObjectSize); } void SvxXRectPreview::Resize() @@ -1580,8 +1576,9 @@ void SvxXRectPreview::Resize() SdrObject *pOrigObject = mpRectangleObject; if (pOrigObject) { - mpRectangleObject = new SdrRectObj(aObjectSize); - mpRectangleObject->SetModel(&getModel()); + mpRectangleObject = new SdrRectObj( + getModel(), + aObjectSize); SetAttributes(pOrigObject->GetMergedItemSet()); SdrObject::Free(pOrigObject); } @@ -1637,13 +1634,15 @@ SvxXShadowPreview::SvxXShadowPreview( vcl::Window* pParent ) // create RectangleObject const tools::Rectangle aObjectSize( Point( aSize.Width(), aSize.Height() ), aSize ); - mpRectangleObject = new SdrRectObj(aObjectSize); - mpRectangleObject->SetModel(&getModel()); + mpRectangleObject = new SdrRectObj( + getModel(), + aObjectSize); // create ShadowObject const tools::Rectangle aShadowSize( Point( aSize.Width(), aSize.Height() ), aSize ); - mpRectangleShadow = new SdrRectObj(aShadowSize); - mpRectangleShadow->SetModel(&getModel()); + mpRectangleShadow = new SdrRectObj( + getModel(), + aShadowSize); } VCL_BUILDER_FACTORY(SvxXShadowPreview) diff --git a/svx/source/dialog/graphctl.cxx b/svx/source/dialog/graphctl.cxx index 481c55ccd418..07ff51e01fd9 100644 --- a/svx/source/dialog/graphctl.cxx +++ b/svx/source/dialog/graphctl.cxx @@ -142,7 +142,7 @@ void GraphCtrl::InitSdrModel() pModel->SetChanged( false ); // Creating a View - pView = new GraphCtrlView( pModel, this ); + pView = new GraphCtrlView(*pModel, this); pView->SetWorkArea( tools::Rectangle( Point(), aGraphSize ) ); pView->EnableExtendedMouseEventDispatcher( true ); pView->ShowSdrPage(pView->GetModel()->GetPage(0)); diff --git a/svx/source/dialog/imapwnd.cxx b/svx/source/dialog/imapwnd.cxx index da1a22a37ed9..557bbb005a95 100644 --- a/svx/source/dialog/imapwnd.cxx +++ b/svx/source/dialog/imapwnd.cxx @@ -195,7 +195,10 @@ SdrObject* IMapWindow::CreateObj( const IMapObject* pIMapObj ) // clipped on CanvasPane aDrawRect.Intersection( aClipRect ); - pSdrObj = static_cast<SdrObject*>(new SdrRectObj( aDrawRect )); + pSdrObj = static_cast<SdrObject*>( + new SdrRectObj( + *pModel, + aDrawRect)); pCloneIMapObj.reset(static_cast<IMapObject*>(new IMapRectangleObject( *pIMapRectObj ))); } break; @@ -211,7 +214,13 @@ SdrObject* IMapWindow::CreateObj( const IMapObject* pIMapObj ) // limited to CanvasPane aCircle.Intersection( aClipRect ); - pSdrObj = static_cast<SdrObject*>(new SdrCircObj( OBJ_CIRC, aCircle, 0, 36000 )); + pSdrObj = static_cast<SdrObject*>( + new SdrCircObj( + *pModel, + OBJ_CIRC, + aCircle, + 0, + 36000)); pCloneIMapObj.reset(static_cast<IMapObject*>(new IMapCircleObject( *pIMapCircleObj ))); } break; @@ -228,7 +237,13 @@ SdrObject* IMapWindow::CreateObj( const IMapObject* pIMapObj ) // clipped on CanvasPane aDrawRect.Intersection( aClipRect ); - pSdrObj = static_cast<SdrObject*>(new SdrCircObj( OBJ_CIRC, aDrawRect, 0, 36000 )); + pSdrObj = static_cast<SdrObject*>( + new SdrCircObj( + *pModel, + OBJ_CIRC, + aDrawRect, + 0, + 36000)); } else { @@ -240,7 +255,11 @@ SdrObject* IMapWindow::CreateObj( const IMapObject* pIMapObj ) basegfx::B2DPolygon aPolygon; aPolygon.append(aDrawPoly.getB2DPolygon()); - pSdrObj = static_cast<SdrObject*>(new SdrPathObj(OBJ_POLY, basegfx::B2DPolyPolygon(aPolygon))); + pSdrObj = static_cast<SdrObject*>( + new SdrPathObj( + *pModel, + OBJ_POLY, + basegfx::B2DPolyPolygon(aPolygon))); } pCloneIMapObj.reset(static_cast<IMapObject*>(new IMapPolygonObject( *pIMapPolyObj ))); @@ -745,7 +764,10 @@ void IMapWindow::CreateDefaultObject() aPagePos.AdjustY((aPageSize.Height() / 2) - (nDefaultObjectSizeHeight / 2) ); tools::Rectangle aNewObjectRectangle(aPagePos, Size(nDefaultObjectSizeWidth, nDefaultObjectSizeHeight)); - SdrObject* pObj = SdrObjFactory::MakeNewObject( pView->GetCurrentObjInventor(), pView->GetCurrentObjIdentifier(), nullptr, pModel); + SdrObject* pObj = SdrObjFactory::MakeNewObject( + *pModel, + pView->GetCurrentObjInventor(), + pView->GetCurrentObjIdentifier()); pObj->SetLogicRect(aNewObjectRectangle); switch( pObj->GetObjIdentifier() ) diff --git a/svx/source/dialog/measctrl.cxx b/svx/source/dialog/measctrl.cxx index ddca770b766d..03e630041189 100644 --- a/svx/source/dialog/measctrl.cxx +++ b/svx/source/dialog/measctrl.cxx @@ -42,9 +42,11 @@ SvxXMeasurePreview::SvxXMeasurePreview(vcl::Window* pParent, WinBits nStyle) Point aPt1 = Point(aSize.Width() / 5, static_cast<long>(aSize.Height() / 2)); Point aPt2 = Point(aSize.Width() * 4 / 5, static_cast<long>(aSize.Height() / 2)); - pMeasureObj = new SdrMeasureObj(aPt1, aPt2); pModel = new SdrModel(); - pMeasureObj->SetModel(pModel); + pMeasureObj = new SdrMeasureObj( + *pModel, + aPt1, + aPt2); bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode(); SetDrawMode(bHighContrast ? OUTPUT_DRAWMODE_CONTRAST : OUTPUT_DRAWMODE_COLOR); diff --git a/svx/source/engine3d/cube3d.cxx b/svx/source/engine3d/cube3d.cxx index 6583969bb771..509688fe2f77 100644 --- a/svx/source/engine3d/cube3d.cxx +++ b/svx/source/engine3d/cube3d.cxx @@ -35,25 +35,31 @@ sdr::contact::ViewContact* E3dCubeObj::CreateObjectSpecificViewContact() } -E3dCubeObj::E3dCubeObj(E3dDefaultAttributes& rDefault, const basegfx::B3DPoint& aPos, const basegfx::B3DVector& r3DSize) -: E3dCompoundObject() +E3dCubeObj::E3dCubeObj( + SdrModel& rSdrModel, + const E3dDefaultAttributes& rDefault, + const basegfx::B3DPoint& aPos, + const basegfx::B3DVector& r3DSize) +: E3dCompoundObject(rSdrModel) { // Set Defaults SetDefaultAttributes(rDefault); - aCubePos = aPos; // position centre or left, bottom, back (dependent on bPosIsCenter) + // position centre or left, bottom, back (dependent on bPosIsCenter) + aCubePos = aPos; aCubeSize = r3DSize; } -E3dCubeObj::E3dCubeObj() -: E3dCompoundObject() +E3dCubeObj::E3dCubeObj(SdrModel& rSdrModel) +: E3dCompoundObject(rSdrModel) { // Set Defaults - E3dDefaultAttributes aDefault; + const E3dDefaultAttributes aDefault; + SetDefaultAttributes(aDefault); } -void E3dCubeObj::SetDefaultAttributes(E3dDefaultAttributes& rDefault) +void E3dCubeObj::SetDefaultAttributes(const E3dDefaultAttributes& rDefault) { aCubePos = rDefault.GetDefaultCubePos(); aCubeSize = rDefault.GetDefaultCubeSize(); @@ -72,9 +78,22 @@ SdrObject *E3dCubeObj::DoConvertToPolyObj(bool /*bBezier*/, bool /*bAddText*/) c return nullptr; } -E3dCubeObj* E3dCubeObj::Clone() const +E3dCubeObj* E3dCubeObj::Clone(SdrModel* pTargetModel) const +{ + return CloneHelper< E3dCubeObj >(pTargetModel); +} + +E3dCubeObj& E3dCubeObj::operator=(const E3dCubeObj& rObj) { - return CloneHelper< E3dCubeObj >(); + if( this == &rObj ) + return *this; + E3dCompoundObject::operator=(rObj); + + aCubePos = rObj.aCubePos; + aCubeSize = rObj.aCubeSize; + bPosIsCenter = rObj.bPosIsCenter; + + return *this; } // Set local parameters with geometry re-creating diff --git a/svx/source/engine3d/dragmt3d.cxx b/svx/source/engine3d/dragmt3d.cxx index e55931b568f5..5e070abb6c43 100644 --- a/svx/source/engine3d/dragmt3d.cxx +++ b/svx/source/engine3d/dragmt3d.cxx @@ -73,8 +73,7 @@ E3dDragMethod::E3dDragMethod ( if(pE3dObj) { // fill new interaction unit - E3dDragMethodUnit aNewUnit; - aNewUnit.mp3DObj = pE3dObj; + E3dDragMethodUnit aNewUnit(*pE3dObj); // get transformations aNewUnit.maInitTransform = aNewUnit.maTransform = pE3dObj->GetTransform(); @@ -157,13 +156,15 @@ bool E3dDragMethod::EndSdrDrag(bool /*bCopy*/) for(nOb=0;nOb<nCnt;nOb++) { E3dDragMethodUnit& rCandidate = maGrp[nOb]; - E3DModifySceneSnapRectUpdater aUpdater(rCandidate.mp3DObj); - rCandidate.mp3DObj->SetTransform(rCandidate.maTransform); + E3DModifySceneSnapRectUpdater aUpdater(&rCandidate.mr3DObj); + rCandidate.mr3DObj.SetTransform(rCandidate.maTransform); if( bUndo ) { - getSdrDragView().AddUndo(new E3dRotateUndoAction(rCandidate.mp3DObj->GetModel(), - rCandidate.mp3DObj, rCandidate.maInitTransform, - rCandidate.maTransform)); + getSdrDragView().AddUndo( + new E3dRotateUndoAction( + rCandidate.mr3DObj, + rCandidate.maInitTransform, + rCandidate.maTransform)); } } if( bUndo ) @@ -185,8 +186,8 @@ void E3dDragMethod::CancelSdrDrag() { // Restore transformation E3dDragMethodUnit& rCandidate = maGrp[nOb]; - E3DModifySceneSnapRectUpdater aUpdater(rCandidate.mp3DObj); - rCandidate.mp3DObj->SetTransform(rCandidate.maInitTransform); + E3DModifySceneSnapRectUpdater aUpdater(&rCandidate.mr3DObj); + rCandidate.mr3DObj.SetTransform(rCandidate.maInitTransform); } } } @@ -224,7 +225,7 @@ void E3dDragMethod::CreateOverlayGeometry(sdr::overlay::OverlayManager& rOverlay if(nPlyCnt) { - const sdr::contact::ViewContactOfE3dScene& rVCScene = static_cast< sdr::contact::ViewContactOfE3dScene& >(rCandidate.mp3DObj->GetScene()->GetViewContact()); + const sdr::contact::ViewContactOfE3dScene& rVCScene = static_cast< sdr::contact::ViewContactOfE3dScene& >(rCandidate.mr3DObj.GetScene()->GetViewContact()); const drawinglayer::geometry::ViewInformation3D& aViewInfo3D(rVCScene.getViewInformation3D()); const basegfx::B3DHomMatrix aWorldToView(aViewInfo3D.getDeviceToView() * aViewInfo3D.getProjection() * aViewInfo3D.getOrientation()); const basegfx::B3DHomMatrix aTransform(aWorldToView * rCandidate.maDisplayTransform); @@ -261,7 +262,7 @@ E3dDragRotate::E3dDragRotate(SdrDragView &_rView, if(nCnt) { - const E3dScene *pScene = maGrp[0].mp3DObj->GetScene(); + const E3dScene *pScene = maGrp[0].mr3DObj.GetScene(); if(pScene) { @@ -271,7 +272,7 @@ E3dDragRotate::E3dDragRotate(SdrDragView &_rView, for(sal_uInt32 nOb(0); nOb < nCnt; nOb++) { E3dDragMethodUnit& rCandidate = maGrp[nOb]; - basegfx::B3DPoint aObjCenter = rCandidate.mp3DObj->GetBoundVolume().getCenter(); + basegfx::B3DPoint aObjCenter = rCandidate.mr3DObj.GetBoundVolume().getCenter(); const basegfx::B3DHomMatrix aTransform(aViewInfo3D.getOrientation() * rCandidate.maDisplayTransform * rCandidate.maInitTransform); aObjCenter = aTransform * aObjCenter; @@ -387,7 +388,7 @@ void E3dDragRotate::MoveSdrDrag(const Point& rPnt) } // Transformation in eye coordinates, there rotate then and back - const sdr::contact::ViewContactOfE3dScene& rVCScene = static_cast< sdr::contact::ViewContactOfE3dScene& >(rCandidate.mp3DObj->GetScene()->GetViewContact()); + const sdr::contact::ViewContactOfE3dScene& rVCScene = static_cast< sdr::contact::ViewContactOfE3dScene& >(rCandidate.mr3DObj.GetScene()->GetViewContact()); const drawinglayer::geometry::ViewInformation3D& aViewInfo3D(rVCScene.getViewInformation3D()); basegfx::B3DHomMatrix aInverseOrientation(aViewInfo3D.getOrientation()); aInverseOrientation.invert(); @@ -405,8 +406,8 @@ void E3dDragRotate::MoveSdrDrag(const Point& rPnt) if(mbMoveFull) { - E3DModifySceneSnapRectUpdater aUpdater(rCandidate.mp3DObj); - rCandidate.mp3DObj->SetTransform(rCandidate.maTransform); + E3DModifySceneSnapRectUpdater aUpdater(&rCandidate.mr3DObj); + rCandidate.mr3DObj.SetTransform(rCandidate.maTransform); } else { @@ -504,7 +505,7 @@ void E3dDragMove::MoveSdrDrag(const Point& rPnt) for(sal_uInt32 nOb(0); nOb < nCnt; nOb++) { E3dDragMethodUnit& rCandidate = maGrp[nOb]; - const sdr::contact::ViewContactOfE3dScene& rVCScene = static_cast< sdr::contact::ViewContactOfE3dScene& >(rCandidate.mp3DObj->GetScene()->GetViewContact()); + const sdr::contact::ViewContactOfE3dScene& rVCScene = static_cast< sdr::contact::ViewContactOfE3dScene& >(rCandidate.mr3DObj.GetScene()->GetViewContact()); const drawinglayer::geometry::ViewInformation3D& aViewInfo3D(rVCScene.getViewInformation3D()); // move coor from 2d world to 3d Eye @@ -554,8 +555,8 @@ void E3dDragMove::MoveSdrDrag(const Point& rPnt) if(mbMoveFull) { - E3DModifySceneSnapRectUpdater aUpdater(rCandidate.mp3DObj); - rCandidate.mp3DObj->SetTransform(rCandidate.maTransform); + E3DModifySceneSnapRectUpdater aUpdater(&rCandidate.mr3DObj); + rCandidate.mr3DObj.SetTransform(rCandidate.maTransform); } else { @@ -575,10 +576,10 @@ void E3dDragMove::MoveSdrDrag(const Point& rPnt) for(sal_uInt32 nOb(0); nOb < nCnt; nOb++) { E3dDragMethodUnit& rCandidate = maGrp[nOb]; - const basegfx::B3DPoint aObjectCenter(rCandidate.mp3DObj->GetBoundVolume().getCenter()); + const basegfx::B3DPoint aObjectCenter(rCandidate.mr3DObj.GetBoundVolume().getCenter()); // transform from 2D world view to 3D eye - const sdr::contact::ViewContactOfE3dScene& rVCScene = static_cast< sdr::contact::ViewContactOfE3dScene& >(rCandidate.mp3DObj->GetScene()->GetViewContact()); + const sdr::contact::ViewContactOfE3dScene& rVCScene = static_cast< sdr::contact::ViewContactOfE3dScene& >(rCandidate.mr3DObj.GetScene()->GetViewContact()); const drawinglayer::geometry::ViewInformation3D& aViewInfo3D(rVCScene.getViewInformation3D()); basegfx::B2DPoint aGlobalScaleStart2D(static_cast<double>(aStartPos.X()), static_cast<double>(aStartPos.Y())); @@ -673,14 +674,14 @@ void E3dDragMove::MoveSdrDrag(const Point& rPnt) if(mbMoveFull) { - E3DModifySceneSnapRectUpdater aUpdater(rCandidate.mp3DObj); - rCandidate.mp3DObj->SetTransform(rCandidate.maTransform); + E3DModifySceneSnapRectUpdater aUpdater(&rCandidate.mr3DObj); + rCandidate.mr3DObj.SetTransform(rCandidate.maTransform); } else { Hide(); rCandidate.maWireframePoly.clear(); - rCandidate.maWireframePoly = rCandidate.mp3DObj->CreateWireframe(); + rCandidate.maWireframePoly = rCandidate.mr3DObj.CreateWireframe(); rCandidate.maWireframePoly.transform(rCandidate.maTransform); Show(); } diff --git a/svx/source/engine3d/e3dsceneupdater.cxx b/svx/source/engine3d/e3dsceneupdater.cxx index bc696daebafb..28c472727e17 100644 --- a/svx/source/engine3d/e3dsceneupdater.cxx +++ b/svx/source/engine3d/e3dsceneupdater.cxx @@ -29,30 +29,27 @@ E3DModifySceneSnapRectUpdater::E3DModifySceneSnapRectUpdater(const SdrObject* pO mpViewInformation3D(nullptr) { // Secure old 3D transformation stack before modification - if(pObject) + if(const E3dObject* pE3dObject = dynamic_cast< const E3dObject* >(pObject)) { - const E3dObject* pE3dObject = dynamic_cast< const E3dObject* >(pObject); + mpScene = pE3dObject->GetScene(); - if(pE3dObject) + if(mpScene && mpScene->GetScene() == mpScene) { - mpScene = pE3dObject->GetScene(); + // if there is a scene and it's the outmost scene, get current 3D range + const sdr::contact::ViewContactOfE3dScene& rVCScene = static_cast< sdr::contact::ViewContactOfE3dScene& >(mpScene->GetViewContact()); + const basegfx::B3DRange aAllContentRange(rVCScene.getAllContentRange3D()); - if(mpScene && mpScene->GetScene() == mpScene) + if(aAllContentRange.isEmpty()) { - // if there is a scene and it's the outmost scene, get current 3D range - const sdr::contact::ViewContactOfE3dScene& rVCScene = static_cast< sdr::contact::ViewContactOfE3dScene& >(mpScene->GetViewContact()); - const basegfx::B3DRange aAllContentRange(rVCScene.getAllContentRange3D()); - - if(aAllContentRange.isEmpty()) - { - // no content, nothing to do - mpScene = nullptr; - } - else - { - // secure current 3D transformation stack - mpViewInformation3D.reset( new drawinglayer::geometry::ViewInformation3D(rVCScene.getViewInformation3D(aAllContentRange)) ); - } + // no content, nothing to do + mpScene = nullptr; + } + else + { + // secure current 3D transformation stack + mpViewInformation3D.reset( + new drawinglayer::geometry::ViewInformation3D( + rVCScene.getViewInformation3D(aAllContentRange))); } } } diff --git a/svx/source/engine3d/e3dundo.cxx b/svx/source/engine3d/e3dundo.cxx index e194dd661ef1..47268fcda660 100644 --- a/svx/source/engine3d/e3dundo.cxx +++ b/svx/source/engine3d/e3dundo.cxx @@ -38,36 +38,32 @@ bool E3dUndoAction::CanRepeat(SfxRepeatTarget&) const // Undo destructor for 3D-Rotation - -E3dRotateUndoAction::~E3dRotateUndoAction () +E3dRotateUndoAction::~E3dRotateUndoAction() { } // Undo for 3D-Rotation on the Rotation matrix - -void E3dRotateUndoAction::Undo () +void E3dRotateUndoAction::Undo() { - E3DModifySceneSnapRectUpdater aUpdater(pMy3DObj); - pMy3DObj->SetTransform(aMyOldRotation); + E3DModifySceneSnapRectUpdater aUpdater(&mrMy3DObj); + mrMy3DObj.SetTransform(maMyOldRotation); } // Redo for 3D-Rotation on the Rotation matrix - -void E3dRotateUndoAction::Redo () +void E3dRotateUndoAction::Redo() { - E3DModifySceneSnapRectUpdater aUpdater(pMy3DObj); - pMy3DObj->SetTransform(aMyNewRotation); + E3DModifySceneSnapRectUpdater aUpdater(&mrMy3DObj); + mrMy3DObj.SetTransform(maMyNewRotation); } - -E3dAttributesUndoAction::E3dAttributesUndoAction( SdrModel &rModel, - E3dObject* pInObject, - const SfxItemSet& rNewSet, - const SfxItemSet& rOldSet) - : SdrUndoAction( rModel ) - , pObject ( pInObject ) - , aNewSet ( rNewSet ) - , aOldSet ( rOldSet ) +E3dAttributesUndoAction::E3dAttributesUndoAction( + E3dObject& rInObject, + const SfxItemSet& rNewSet, + const SfxItemSet& rOldSet) +: SdrUndoAction(rInObject.getSdrModelFromSdrObject()) + ,mrObject(rInObject) + ,maNewSet(rNewSet) + ,maOldSet(rOldSet) { } @@ -80,18 +76,17 @@ E3dAttributesUndoAction::~E3dAttributesUndoAction() void E3dAttributesUndoAction::Undo() { - E3DModifySceneSnapRectUpdater aUpdater(pObject); - pObject->SetMergedItemSetAndBroadcast(aOldSet); + E3DModifySceneSnapRectUpdater aUpdater(&mrObject); + mrObject.SetMergedItemSetAndBroadcast(maOldSet); } void E3dAttributesUndoAction::Redo() { - E3DModifySceneSnapRectUpdater aUpdater(pObject); - pObject->SetMergedItemSetAndBroadcast(aNewSet); + E3DModifySceneSnapRectUpdater aUpdater(&mrObject); + mrObject.SetMergedItemSetAndBroadcast(maNewSet); } // Multiple Undo is not possible - bool E3dAttributesUndoAction::CanRepeat(SfxRepeatTarget& /*rView*/) const { return false; diff --git a/svx/source/engine3d/extrud3d.cxx b/svx/source/engine3d/extrud3d.cxx index 3b3bb93956c3..0a929970e50e 100644 --- a/svx/source/engine3d/extrud3d.cxx +++ b/svx/source/engine3d/extrud3d.cxx @@ -39,24 +39,24 @@ // DrawContact section - sdr::contact::ViewContact* E3dExtrudeObj::CreateObjectSpecificViewContact() { return new sdr::contact::ViewContactOfE3dExtrude(*this); } - sdr::properties::BaseProperties* E3dExtrudeObj::CreateObjectSpecificProperties() { return new sdr::properties::E3dExtrudeProperties(*this); } - // Constructor creates a two cover surface tools::PolyPolygon and (point-count 1) side // surfaces rectangles from the passed PolyPolygon - -E3dExtrudeObj::E3dExtrudeObj(E3dDefaultAttributes const & rDefault, const basegfx::B2DPolyPolygon& rPP, double fDepth) -: E3dCompoundObject(), +E3dExtrudeObj::E3dExtrudeObj( + SdrModel& rSdrModel, + const E3dDefaultAttributes& rDefault, + const basegfx::B2DPolyPolygon& rPP, + double fDepth) +: E3dCompoundObject(rSdrModel), maExtrudePolygon(rPP) { // since the old class PolyPolygon3D did mirror the given PolyPolygons in Y, do the same here @@ -71,15 +71,16 @@ E3dExtrudeObj::E3dExtrudeObj(E3dDefaultAttributes const & rDefault, const basegf GetProperties().SetObjectItemDirect(makeSvx3DDepthItem(static_cast<sal_uInt32>(fDepth + 0.5))); } -E3dExtrudeObj::E3dExtrudeObj() -: E3dCompoundObject() +E3dExtrudeObj::E3dExtrudeObj(SdrModel& rSdrModel) +: E3dCompoundObject(rSdrModel) { // Set Defaults - E3dDefaultAttributes aDefault; + const E3dDefaultAttributes aDefault; + SetDefaultAttributes(aDefault); } -void E3dExtrudeObj::SetDefaultAttributes(E3dDefaultAttributes const & rDefault) +void E3dExtrudeObj::SetDefaultAttributes(const E3dDefaultAttributes& rDefault) { GetProperties().SetObjectItemDirect(Svx3DSmoothNormalsItem(rDefault.GetDefaultExtrudeSmoothed())); GetProperties().SetObjectItemDirect(Svx3DSmoothLidsItem(rDefault.GetDefaultExtrudeSmoothFrontBack())); @@ -97,11 +98,21 @@ sal_uInt16 E3dExtrudeObj::GetObjIdentifier() const return E3D_EXTRUDEOBJ_ID; } -E3dExtrudeObj* E3dExtrudeObj::Clone() const +E3dExtrudeObj* E3dExtrudeObj::Clone(SdrModel* pTargetModel) const { - return CloneHelper< E3dExtrudeObj >(); + return CloneHelper< E3dExtrudeObj >(pTargetModel); } +E3dExtrudeObj& E3dExtrudeObj::operator=(const E3dExtrudeObj& rObj) +{ + if( this == &rObj ) + return *this; + E3dCompoundObject::operator=(rObj); + + maExtrudePolygon = rObj.maExtrudePolygon; + + return *this; +} // Set local parameters with geometry re-creating @@ -194,7 +205,7 @@ SdrAttrObj* E3dExtrudeObj::GetBreakObj() { // create PathObj basegfx::B2DPolyPolygon aPoly = TransformToScreenCoor(aBackSide); - SdrPathObj* pPathObj = new SdrPathObj(OBJ_PLIN, aPoly); + SdrPathObj* pPathObj = new SdrPathObj(getSdrModelFromSdrObject(), OBJ_PLIN, aPoly); SfxItemSet aSet(GetObjectItemSet()); aSet.Put(XLineStyleItem(css::drawing::LineStyle_SOLID)); diff --git a/svx/source/engine3d/lathe3d.cxx b/svx/source/engine3d/lathe3d.cxx index 99268c6d5ff8..74097eb29f63 100644 --- a/svx/source/engine3d/lathe3d.cxx +++ b/svx/source/engine3d/lathe3d.cxx @@ -37,23 +37,22 @@ // DrawContact section - sdr::contact::ViewContact* E3dLatheObj::CreateObjectSpecificViewContact() { return new sdr::contact::ViewContactOfE3dLathe(*this); } - sdr::properties::BaseProperties* E3dLatheObj::CreateObjectSpecificProperties() { return new sdr::properties::E3dLatheProperties(*this); } - // Constructor from 3D polygon, scale is the conversion factor for the coordinates - -E3dLatheObj::E3dLatheObj(E3dDefaultAttributes const & rDefault, const basegfx::B2DPolyPolygon& rPoly2D) -: E3dCompoundObject(), +E3dLatheObj::E3dLatheObj( + SdrModel& rSdrModel, + const E3dDefaultAttributes& rDefault, + const basegfx::B2DPolyPolygon& rPoly2D) +: E3dCompoundObject(rSdrModel), maPolyPoly2D(rPoly2D) { // since the old class PolyPolygon3D did mirror the given PolyPolygons in Y, do the same here @@ -82,15 +81,16 @@ E3dLatheObj::E3dLatheObj(E3dDefaultAttributes const & rDefault, const basegfx::B } } -E3dLatheObj::E3dLatheObj() -: E3dCompoundObject() +E3dLatheObj::E3dLatheObj(SdrModel& rSdrModel) +: E3dCompoundObject(rSdrModel) { // Set Defaults - E3dDefaultAttributes aDefault; + const E3dDefaultAttributes aDefault; + SetDefaultAttributes(aDefault); } -void E3dLatheObj::SetDefaultAttributes(E3dDefaultAttributes const & rDefault) +void E3dLatheObj::SetDefaultAttributes(const E3dDefaultAttributes& rDefault) { GetProperties().SetObjectItemDirect(Svx3DSmoothNormalsItem(rDefault.GetDefaultLatheSmoothed())); GetProperties().SetObjectItemDirect(Svx3DSmoothLidsItem(rDefault.GetDefaultLatheSmoothFrontBack())); @@ -104,9 +104,20 @@ sal_uInt16 E3dLatheObj::GetObjIdentifier() const return E3D_LATHEOBJ_ID; } -E3dLatheObj* E3dLatheObj::Clone() const +E3dLatheObj* E3dLatheObj::Clone(SdrModel* pTargetModel) const { - return CloneHelper< E3dLatheObj >(); + return CloneHelper< E3dLatheObj >(pTargetModel); +} + +E3dLatheObj& E3dLatheObj::operator=(const E3dLatheObj& rObj) +{ + if( this == &rObj ) + return *this; + E3dCompoundObject::operator=(rObj); + + maPolyPoly2D = rObj.maPolyPoly2D; + + return *this; } // Convert the object to group object consisting of n polygons @@ -176,7 +187,7 @@ SdrAttrObj* E3dLatheObj::GetBreakObj() // create PathObj basegfx::B3DPolyPolygon aLathePoly3D(basegfx::utils::createB3DPolyPolygonFromB2DPolyPolygon(maPolyPoly2D)); basegfx::B2DPolyPolygon aTransPoly(TransformToScreenCoor(aLathePoly3D)); - SdrPathObj* pPathObj = new SdrPathObj(OBJ_PLIN, aTransPoly); + SdrPathObj* pPathObj = new SdrPathObj(getSdrModelFromSdrObject(), OBJ_PLIN, aTransPoly); // Set Attribute SfxItemSet aSet(GetObjectItemSet()); diff --git a/svx/source/engine3d/obj3d.cxx b/svx/source/engine3d/obj3d.cxx index 73a0675efdb4..959ecf1f0c49 100644 --- a/svx/source/engine3d/obj3d.cxx +++ b/svx/source/engine3d/obj3d.cxx @@ -81,16 +81,16 @@ using namespace com::sun::star; // List for 3D-Objects - - E3dObjList::E3dObjList() -: SdrObjList(nullptr, nullptr) +: SdrObjList(nullptr) { } -E3dObjList::E3dObjList(const E3dObjList&) -: SdrObjList() +E3dObjList* E3dObjList::CloneSdrObjList(SdrModel* pNewModel) const { + E3dObjList* pObjList = new E3dObjList(); + pObjList->lateInitSdrObjList(*this, pNewModel); + return pObjList; } E3dObjList::~E3dObjList() @@ -169,8 +169,9 @@ sdr::properties::BaseProperties* E3dObject::CreateObjectSpecificProperties() } -E3dObject::E3dObject() -: maSubList(), +E3dObject::E3dObject(SdrModel& rSdrModel) +: SdrAttrObj(rSdrModel), + maSubList(), maLocalBoundVol(), maTransformation(), maFullTransform(), @@ -303,14 +304,7 @@ void E3dObject::SetPage(SdrPage* pNewPage) maSubList.SetPage(pNewPage); } -void E3dObject::SetModel(SdrModel* pNewModel) -{ - SdrAttrObj::SetModel(pNewModel); - maSubList.SetModel(pNewModel); -} - // resize object, used from old 2d interfaces, e.g. in Move/Scale dialog (F4) - void E3dObject::NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact) { // Movement in X, Y in the eye coordinate system @@ -656,9 +650,9 @@ OUString E3dObject::TakeObjNamePlural() const return ImpGetResStr(STR_ObjNamePluralObj3d); } -E3dObject* E3dObject::Clone() const +E3dObject* E3dObject::Clone(SdrModel* pTargetModel) const { - return CloneHelper< E3dObject >(); + return CloneHelper< E3dObject >(pTargetModel); } E3dObject& E3dObject::operator=(const E3dObject& rObj) @@ -736,9 +730,8 @@ sdr::properties::BaseProperties* E3dCompoundObject::CreateObjectSpecificProperti return new sdr::properties::E3dCompoundProperties(*this); } - -E3dCompoundObject::E3dCompoundObject() -: E3dObject(), +E3dCompoundObject::E3dCompoundObject(SdrModel& rSdrModel) +: E3dObject(rSdrModel), aMaterialAmbientColor() { // Set defaults @@ -881,9 +874,20 @@ void E3dCompoundObject::RecalcSnapRect() } } -E3dCompoundObject* E3dCompoundObject::Clone() const +E3dCompoundObject* E3dCompoundObject::Clone(SdrModel* pTargetModel) const { - return CloneHelper< E3dCompoundObject >(); + return CloneHelper< E3dCompoundObject >(pTargetModel); +} + +E3dCompoundObject& E3dCompoundObject::operator=(const E3dCompoundObject& rObj) +{ + if( this == &rObj ) + return *this; + E3dObject::operator=(rObj); + + aMaterialAmbientColor = rObj.aMaterialAmbientColor; + + return *this; } // convert given basegfx::B3DPolyPolygon to screen coor diff --git a/svx/source/engine3d/objfac3d.cxx b/svx/source/engine3d/objfac3d.cxx index b704cf2b848d..58e1479e413b 100644 --- a/svx/source/engine3d/objfac3d.cxx +++ b/svx/source/engine3d/objfac3d.cxx @@ -52,24 +52,19 @@ IMPL_STATIC_LINK( E3dObjFactory, MakeObject, SdrObjCreatorParams, aParams, SdrOb switch ( aParams.nObjIdentifier ) { case E3D_SCENE_ID: - return new E3dScene(); + return new E3dScene(aParams.rSdrModel); case E3D_POLYGONOBJ_ID : - return new E3dPolygonObj(); + return new E3dPolygonObj(aParams.rSdrModel); case E3D_CUBEOBJ_ID : - return new E3dCubeObj(); + return new E3dCubeObj(aParams.rSdrModel); case E3D_SPHEREOBJ_ID: - // Gets the dummy constructor, as this is only called when - // loading documents. The actual number of segments is however - // determined only after loading the members. This will result - // in that the first sphere will be immediately destroyed, - // although it was never used. - return new E3dSphereObj(E3dSphereObj::DUMMY); + return new E3dSphereObj(aParams.rSdrModel); case E3D_EXTRUDEOBJ_ID: - return new E3dExtrudeObj(); + return new E3dExtrudeObj(aParams.rSdrModel); case E3D_LATHEOBJ_ID: - return new E3dLatheObj(); + return new E3dLatheObj(aParams.rSdrModel); case E3D_COMPOUNDOBJ_ID: - return new E3dCompoundObject(); + return new E3dCompoundObject(aParams.rSdrModel); } } return nullptr; diff --git a/svx/source/engine3d/polygn3d.cxx b/svx/source/engine3d/polygn3d.cxx index 190c0ca89ee5..bcb9ba81b9eb 100644 --- a/svx/source/engine3d/polygn3d.cxx +++ b/svx/source/engine3d/polygn3d.cxx @@ -25,17 +25,16 @@ #include <basegfx/polygon/b3dpolygon.hxx> #include <basegfx/polygon/b3dpolygontools.hxx> - // DrawContact section - sdr::contact::ViewContact* E3dPolygonObj::CreateObjectSpecificViewContact() { return new sdr::contact::ViewContactOfE3dPolygon(*this); } E3dPolygonObj::E3dPolygonObj( + SdrModel& rSdrModel, const basegfx::B3DPolyPolygon& rPolyPoly3D) -: E3dCompoundObject(), +: E3dCompoundObject(rSdrModel), bLineOnly(true) { // Set geometry @@ -48,9 +47,9 @@ E3dPolygonObj::E3dPolygonObj( CreateDefaultTexture(); } -E3dPolygonObj::E3dPolygonObj() -: E3dCompoundObject(), - bLineOnly(false) // added missing initialisation +E3dPolygonObj::E3dPolygonObj(SdrModel& rSdrModel) +: E3dCompoundObject(rSdrModel), + bLineOnly(false) { // Create no geometry } @@ -219,9 +218,23 @@ SdrObject *E3dPolygonObj::DoConvertToPolyObj(bool /*bBezier*/, bool /*bAddText*/ return nullptr; } -E3dPolygonObj* E3dPolygonObj::Clone() const +E3dPolygonObj* E3dPolygonObj::Clone(SdrModel* pTargetModel) const { - return CloneHelper< E3dPolygonObj >(); + return CloneHelper< E3dPolygonObj >(pTargetModel); +} + +E3dPolygonObj& E3dPolygonObj::operator=(const E3dPolygonObj& rObj) +{ + if( this == &rObj ) + return *this; + E3dCompoundObject::operator=(rObj); + + aPolyPoly3D = rObj.aPolyPoly3D; + aPolyNormals3D = rObj.aPolyNormals3D; + aPolyTexture2D = rObj.aPolyTexture2D; + bLineOnly = rObj.bLineOnly; + + return *this; } void E3dPolygonObj::SetLineOnly(bool bNew) diff --git a/svx/source/engine3d/scene3d.cxx b/svx/source/engine3d/scene3d.cxx index 444331de3472..38961d3ccfa8 100644 --- a/svx/source/engine3d/scene3d.cxx +++ b/svx/source/engine3d/scene3d.cxx @@ -170,8 +170,8 @@ sdr::contact::ViewContact* E3dScene::CreateObjectSpecificViewContact() } -E3dScene::E3dScene() -: E3dObject(), +E3dScene::E3dScene(SdrModel& rSdrModel) +: E3dObject(rSdrModel), aCamera(basegfx::B3DPoint(0.0, 0.0, 4.0), basegfx::B3DPoint()), mp3DDepthRemapper(nullptr), bDrawOnlySelected(false), @@ -411,24 +411,9 @@ void E3dScene::removeAllNonSelectedObjects() } } -E3dScene* E3dScene::Clone() const +E3dScene* E3dScene::Clone(SdrModel* pTargetModel) const { - return CloneHelper< E3dScene >(); -} - -void E3dScene::SuspendReportingDirtyRects() -{ - GetScene()->mbSkipSettingDirty = true; -} - -void E3dScene::ResumeReportingDirtyRects() -{ - GetScene()->mbSkipSettingDirty = false; -} - -void E3dScene::SetAllSceneRectsDirty() -{ - GetScene()->SetRectsDirty(); + return CloneHelper< E3dScene >(pTargetModel); } E3dScene& E3dScene::operator=(const E3dScene& rObj) @@ -463,6 +448,21 @@ E3dScene& E3dScene::operator=(const E3dScene& rObj) return *this; } +void E3dScene::SuspendReportingDirtyRects() +{ + GetScene()->mbSkipSettingDirty = true; +} + +void E3dScene::ResumeReportingDirtyRects() +{ + GetScene()->mbSkipSettingDirty = false; +} + +void E3dScene::SetAllSceneRectsDirty() +{ + GetScene()->SetRectsDirty(); +} + // Rebuild Light- and label- object lists rebuild (after loading, allocation) void E3dScene::RebuildLists() diff --git a/svx/source/engine3d/sphere3d.cxx b/svx/source/engine3d/sphere3d.cxx index ecac05170094..75670c2e28d7 100644 --- a/svx/source/engine3d/sphere3d.cxx +++ b/svx/source/engine3d/sphere3d.cxx @@ -33,25 +33,24 @@ #include <sdr/contact/viewcontactofe3dsphere.hxx> #include <basegfx/polygon/b3dpolygon.hxx> - // DrawContact section - sdr::contact::ViewContact* E3dSphereObj::CreateObjectSpecificViewContact() { return new sdr::contact::ViewContactOfE3dSphere(*this); } - sdr::properties::BaseProperties* E3dSphereObj::CreateObjectSpecificProperties() { return new sdr::properties::E3dSphereProperties(*this); } - // Build Sphere from polygon facets in latitude and longitude - -E3dSphereObj::E3dSphereObj(E3dDefaultAttributes& rDefault, const basegfx::B3DPoint& rCenter, const basegfx::B3DVector& r3DSize) -: E3dCompoundObject() +E3dSphereObj::E3dSphereObj( + SdrModel& rSdrModel, + const E3dDefaultAttributes& rDefault, + const basegfx::B3DPoint& rCenter, + const basegfx::B3DVector& r3DSize) +: E3dCompoundObject(rSdrModel) { // Set defaults SetDefaultAttributes(rDefault); @@ -60,23 +59,16 @@ E3dSphereObj::E3dSphereObj(E3dDefaultAttributes& rDefault, const basegfx::B3DPoi aSize = r3DSize; } -// Create Sphere without creating the Polygons within - -// This call is from the 3D Object Factory (objfac3d.cxx) and only when loading -// of documents. Here you do not need CreateSphere call, since the real number -// of segments is not even known yet. This was until 10.02.1997 a (small) -// memory leak. - -E3dSphereObj::E3dSphereObj(Dummy /*dummy*/) -// the parameters it needs to be able to distinguish which -// constructors of the two is meant. The above is the default. +E3dSphereObj::E3dSphereObj(SdrModel& rSdrModel) +: E3dCompoundObject(rSdrModel) { // Set defaults - E3dDefaultAttributes aDefault; + const E3dDefaultAttributes aDefault; + SetDefaultAttributes(aDefault); } -void E3dSphereObj::SetDefaultAttributes(E3dDefaultAttributes& rDefault) +void E3dSphereObj::SetDefaultAttributes(const E3dDefaultAttributes& rDefault) { // Set defaults aCenter = rDefault.GetDefaultSphereCenter(); @@ -95,9 +87,21 @@ SdrObject *E3dSphereObj::DoConvertToPolyObj(bool /*bBezier*/, bool /*bAddText*/) return nullptr; } -E3dSphereObj* E3dSphereObj::Clone() const +E3dSphereObj* E3dSphereObj::Clone(SdrModel* pTargetModel) const +{ + return CloneHelper< E3dSphereObj >(pTargetModel); +} + +E3dSphereObj& E3dSphereObj::operator=(const E3dSphereObj& rObj) { - return CloneHelper< E3dSphereObj >(); + if( this == &rObj ) + return *this; + E3dCompoundObject::operator=(rObj); + + aCenter = rObj.aCenter; + aSize = rObj.aSize; + + return *this; } // Set local parameters with geometry re-creating diff --git a/svx/source/engine3d/view3d.cxx b/svx/source/engine3d/view3d.cxx index 33d051f23309..31d6c36bb44c 100644 --- a/svx/source/engine3d/view3d.cxx +++ b/svx/source/engine3d/view3d.cxx @@ -224,10 +224,12 @@ void Impl3DMirrorConstructOverlay::SetMirrorAxis(Point aMirrorAxisA, Point aMirr } } -E3dView::E3dView(SdrModel* pModel, OutputDevice* pOut) : - SdrView(pModel, pOut) +E3dView::E3dView( + SdrModel& rSdrModel, + OutputDevice* pOut) +: SdrView(rSdrModel, pOut) { - InitView (); + InitView(); } // DrawMarkedObj override, since possibly only a single 3D object is to be @@ -579,7 +581,6 @@ bool E3dView::ImpCloneAll3DObjectsToDestScene(E3dScene const * pSrcScene, E3dSce pNewCompoundObj->SetTransform(aModifyingTransform * aNewObjectTrans); // fill and insert new object - pNewCompoundObj->SetModel(pDstScene->GetModel()); pNewCompoundObj->SetPage(pDstScene->GetPage()); pNewCompoundObj->NbcSetLayer(pCompoundObj->GetLayer()); pNewCompoundObj->NbcSetStyleSheet(pCompoundObj->GetStyleSheet(), true); @@ -700,10 +701,15 @@ void E3dView::ImpCreateSingle3DObjectFlat(E3dScene* pScene, SdrObject* pObj, boo if(pPath) { E3dDefaultAttributes aDefault = Get3DDefaultAttributes(); + if(bExtrude) + { aDefault.SetDefaultExtrudeCharacterMode(true); + } else + { aDefault.SetDefaultLatheCharacterMode(true); + } // Get Itemset of the original object SfxItemSet aSet(pObj->GetMergedItemSet()); @@ -736,13 +742,13 @@ void E3dView::ImpCreateSingle3DObjectFlat(E3dScene* pScene, SdrObject* pObj, boo E3dObject* p3DObj = nullptr; if(bExtrude) { - p3DObj = new E3dExtrudeObj(aDefault, pPath->GetPathPoly(), fDepth); + p3DObj = new E3dExtrudeObj(pObj->getSdrModelFromSdrObject(), aDefault, pPath->GetPathPoly(), fDepth); } else { basegfx::B2DPolyPolygon aPolyPoly2D(pPath->GetPathPoly()); aPolyPoly2D.transform(rLatheMat); - p3DObj = new E3dLatheObj(aDefault, aPolyPoly2D); + p3DObj = new E3dLatheObj(pObj->getSdrModelFromSdrObject(), aDefault, aPolyPoly2D); } // Set attribute @@ -836,8 +842,10 @@ void E3dView::ConvertMarkedObjTo3D(bool bExtrude, const basegfx::B2DPoint& rPnt1 else BegUndo(SvxResId(RID_SVX_3D_UNDO_LATHE)); + SdrModel& rSdrModel(GetSdrMarkByIndex(0)->GetMarkedSdrObj()->getSdrModelFromSdrObject()); + // Create a new scene for the created 3D object - E3dScene* pScene = new E3dScene; + E3dScene* pScene = new E3dScene(rSdrModel); // Determine rectangle and possibly correct it tools::Rectangle aRect = GetAllMarkedRect(); @@ -1262,7 +1270,6 @@ bool E3dView::BegDragObj(const Point& rPnt, OutputDevice* pOut, } // Set current 3D drawing object, create the scene for this - E3dScene* E3dView::SetCurrent3DObj(E3dObject* p3DObj) { DBG_ASSERT(p3DObj != nullptr, "Who puts in a NULL-pointer here"); @@ -1275,7 +1282,7 @@ E3dScene* E3dView::SetCurrent3DObj(E3dObject* p3DObj) tools::Rectangle aRect(0,0, static_cast<long>(fW), static_cast<long>(fH)); - E3dScene* pScene = new E3dScene; + E3dScene* pScene = new E3dScene(p3DObj->getSdrModelFromSdrObject()); InitScene(pScene, fW, fH, aVolume.getMaxZ() + ((fW + fH) / 4.0)); diff --git a/svx/source/form/fmdmod.cxx b/svx/source/form/fmdmod.cxx index d487399fedf9..ac197b2ff419 100644 --- a/svx/source/form/fmdmod.cxx +++ b/svx/source/form/fmdmod.cxx @@ -31,6 +31,7 @@ using namespace ::svxform; ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL SvxFmMSFactory::createInstance(const OUString& rServiceSpecifier) { ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > xRet; + if ( rServiceSpecifier.startsWith( "com.sun.star.form.component." ) ) { css::uno::Reference<css::uno::XComponentContext> xContext = comphelper::getProcessComponentContext(); @@ -38,11 +39,17 @@ using namespace ::svxform; } else if ( rServiceSpecifier == "com.sun.star.drawing.ControlShape" ) { - SdrObject* pObj = new FmFormObj(); + SdrModel* pTargetModel = getSdrModelFromUnoModel(); + OSL_ENSURE(pTargetModel, "Got no SdrModel for SdrShape construction (!)"); + SdrObject* pObj = new FmFormObj(*pTargetModel); xRet = static_cast<cppu::OWeakObject*>(static_cast<SvxShape_UnoImplHelper*>(new SvxShapeControl(pObj))); } + if (!xRet.is()) + { xRet = SvxUnoDrawMSFactory::createInstance(rServiceSpecifier); + } + return xRet; } diff --git a/svx/source/form/fmdpage.cxx b/svx/source/form/fmdpage.cxx index 1e81e8fe08e8..45ac667c50eb 100644 --- a/svx/source/form/fmdpage.cxx +++ b/svx/source/form/fmdpage.cxx @@ -73,10 +73,13 @@ SdrObject *SvxFmDrawPage::CreateSdrObject_( const css::uno::Reference< css::draw if ( aShapeType == "com.sun.star.drawing.ShapeControl" // compatibility || aShapeType == "com.sun.star.drawing.ControlShape" ) - return new FmFormObj(); + { + return new FmFormObj(GetSdrPage()->getSdrModelFromSdrPage()); + } else + { return SvxDrawPage::CreateSdrObject_( xDescr ); - + } } css::uno::Reference< css::drawing::XShape > SvxFmDrawPage::CreateShape( SdrObject *pObj ) const diff --git a/svx/source/form/fmobj.cxx b/svx/source/form/fmobj.cxx index 5863ec9f38f6..44431b8018da 100644 --- a/svx/source/form/fmobj.cxx +++ b/svx/source/form/fmobj.cxx @@ -55,26 +55,27 @@ using namespace ::com::sun::star::container; using namespace ::svxform; -FmFormObj::FmFormObj(const OUString& rModelName) - :SdrUnoObj ( rModelName ) - ,m_nPos ( -1 ) - ,m_pLastKnownRefDevice ( nullptr ) +FmFormObj::FmFormObj( + SdrModel& rSdrModel, + const OUString& rModelName) +: SdrUnoObj(rSdrModel, rModelName) + ,m_nPos(-1) + ,m_pLastKnownRefDevice(nullptr) { - // normally, this is done in SetUnoControlModel, but if the call happened in the base class ctor, // then our incarnation of it was not called (since we were not constructed at this time). impl_checkRefDevice_nothrow( true ); } - -FmFormObj::FmFormObj() - :SdrUnoObj ( "" ) - ,m_nPos ( -1 ) - ,m_pLastKnownRefDevice ( nullptr ) +FmFormObj::FmFormObj(SdrModel& rSdrModel) +: SdrUnoObj(rSdrModel, "") + ,m_nPos(-1) + ,m_pLastKnownRefDevice(nullptr) { + // Stuff that old SetModel also did: + impl_checkRefDevice_nothrow(); } - FmFormObj::~FmFormObj() { @@ -105,7 +106,7 @@ void FmFormObj::ClearObjEnv() void FmFormObj::impl_checkRefDevice_nothrow( bool _force ) { - const FmFormModel* pFormModel = dynamic_cast<FmFormModel*>( GetModel() ); + const FmFormModel* pFormModel = dynamic_cast<FmFormModel*>(&getSdrModelFromSdrObject()); if ( !pFormModel || !pFormModel->ControlsUseRefDevice() ) return; @@ -357,9 +358,9 @@ void FmFormObj::clonedFrom(const FmFormObj* _pSource) } -FmFormObj* FmFormObj::Clone() const +FmFormObj* FmFormObj::Clone(SdrModel* pTargetModel) const { - FmFormObj* pFormObject = CloneHelper< FmFormObj >(); + FmFormObj* pFormObject = CloneHelper< FmFormObj >(pTargetModel); DBG_ASSERT(pFormObject != nullptr, "FmFormObj::Clone : invalid clone !"); if (pFormObject) pFormObject->clonedFrom(this); @@ -368,13 +369,6 @@ FmFormObj* FmFormObj::Clone() const } -void FmFormObj::NbcReformatText() -{ - impl_checkRefDevice_nothrow(); - SdrUnoObj::NbcReformatText(); -} - - FmFormObj& FmFormObj::operator= (const FmFormObj& rObj) { if( this == &rObj ) @@ -401,6 +395,13 @@ FmFormObj& FmFormObj::operator= (const FmFormObj& rObj) } +void FmFormObj::NbcReformatText() +{ + impl_checkRefDevice_nothrow(); + SdrUnoObj::NbcReformatText(); +} + + namespace { OUString lcl_getFormComponentAccessPath(const Reference< XInterface >& _xElement, Reference< XInterface >& _rTopLevelElement) @@ -584,14 +585,6 @@ Reference< XInterface > FmFormObj::ensureModelEnv(const Reference< XInterface > return Reference<XInterface>( xDestContainer, UNO_QUERY ); } - -void FmFormObj::SetModel( SdrModel* _pNewModel ) -{ - SdrUnoObj::SetModel( _pNewModel ); - impl_checkRefDevice_nothrow(); -} - - FmFormObj* FmFormObj::GetFormObject( SdrObject* _pSdrObject ) { FmFormObj* pFormObject = dynamic_cast< FmFormObj* >( _pSdrObject ); diff --git a/svx/source/form/fmobjfac.cxx b/svx/source/form/fmobjfac.cxx index bfc834e9cd1a..a640caac7c0c 100644 --- a/svx/source/form/fmobjfac.cxx +++ b/svx/source/form/fmobjfac.cxx @@ -106,10 +106,10 @@ namespace } } -IMPL_STATIC_LINK( - FmFormObjFactory, MakeObject, SdrObjCreatorParams, aParams, SdrObject*) +IMPL_STATIC_LINK(FmFormObjFactory, MakeObject, SdrObjCreatorParams, aParams, SdrObject*) { SdrObject* pNewObj = nullptr; + if (aParams.nInventor == SdrInventor::FmForm) { OUString sServiceSpecifier; @@ -213,9 +213,9 @@ IMPL_STATIC_LINK( // create the actual object if ( !sServiceSpecifier.isEmpty() ) - pNewObj = new FmFormObj(sServiceSpecifier); + pNewObj = new FmFormObj(aParams.rSdrModel, sServiceSpecifier); else - pNewObj = new FmFormObj(); + pNewObj = new FmFormObj(aParams.rSdrModel); // initialize some properties which we want to differ from the defaults for ( PropertyValueArray::const_iterator aInitProp = aInitialProperties.begin(); diff --git a/svx/source/form/fmpage.cxx b/svx/source/form/fmpage.cxx index 7f267cbbcf03..ca79aba3845f 100644 --- a/svx/source/form/fmpage.cxx +++ b/svx/source/form/fmpage.cxx @@ -49,22 +49,17 @@ using com::sun::star::uno::UNO_QUERY; FmFormPage::FmFormPage(FmFormModel& rModel, bool bMasterPage) - :SdrPage(rModel, bMasterPage) - ,m_pImpl( new FmFormPageImpl( *this ) ) +: SdrPage(rModel, bMasterPage) + ,m_pImpl( new FmFormPageImpl( *this ) ) { } - -FmFormPage::FmFormPage(const FmFormPage& rPage) - :SdrPage(rPage) - ,m_pImpl(new FmFormPageImpl( *this ) ) -{ -} - -void FmFormPage::lateInit(const FmFormPage& rPage, FmFormModel* const pNewModel) +void FmFormPage::lateInit(const FmFormPage& rPage) { - SdrPage::lateInit( rPage, pNewModel ); + // call parent + SdrPage::lateInit( rPage ); + // copy local variables (former stuff from copy constructor) m_pImpl->initFrom( rPage.GetImpl() ); m_sPageName = rPage.m_sPageName; } @@ -74,65 +69,22 @@ FmFormPage::~FmFormPage() { } - -void FmFormPage::SetModel(SdrModel* pNewModel) -{ - /* #35055# */ - // we want to call the super's "SetModel" method even if the model is the - // same, in case code somewhere in the system depends on it. But our code - // doesn't, so get the old model to do a check. - SdrModel *pOldModel = GetModel(); - - SdrPage::SetModel( pNewModel ); - - /* #35055# */ - if ( ( pOldModel != pNewModel ) && m_pImpl ) - { - try - { - Reference< css::form::XForms > xForms( m_pImpl->getForms( false ) ); - if ( xForms.is() ) - { - // we want to keep the current collection, just reset the model - // with which it's associated. - FmFormModel* pDrawModel = static_cast<FmFormModel*>( GetModel() ); - SfxObjectShell* pObjShell = pDrawModel->GetObjectShell(); - if ( pObjShell ) - xForms->setParent( pObjShell->GetModel() ); - } - } - catch( css::uno::Exception const& ) - { - OSL_FAIL( "UNO Exception caught resetting model for m_pImpl (FmFormPageImpl) in FmFormPage::SetModel" ); - } - } -} - - -SdrPage* FmFormPage::Clone() const -{ - return Clone(nullptr); -} - -SdrPage* FmFormPage::Clone(SdrModel* const pNewModel) const +SdrPage* FmFormPage::Clone(SdrModel* pNewModel) const { - FmFormPage* const pNewPage = new FmFormPage(*this); - FmFormModel* pFormModel = nullptr; - if (pNewModel) - { - pFormModel = dynamic_cast<FmFormModel*>(pNewModel); - assert(pFormModel); - } - pNewPage->lateInit(*this, pFormModel); - return pNewPage; + FmFormModel& rFmFormModel(static_cast< FmFormModel& >(nullptr == pNewModel ? getSdrModelFromSdrPage() : *pNewModel)); + FmFormPage* pClonedFmFormPage( + new FmFormPage( + rFmFormModel, + IsMasterPage())); + pClonedFmFormPage->lateInit(*this); + return pClonedFmFormPage; } void FmFormPage::InsertObject(SdrObject* pObj, size_t nPos) { SdrPage::InsertObject( pObj, nPos ); - if (GetModel()) - static_cast<FmFormModel*>(GetModel())->GetUndoEnv().Inserted(pObj); + static_cast< FmFormModel& >(getSdrModelFromSdrPage()).GetUndoEnv().Inserted(pObj); } @@ -217,8 +169,8 @@ bool FmFormPage::RequestHelp( vcl::Window* pWindow, SdrView const * pView, SdrObject* FmFormPage::RemoveObject(size_t nObjNum) { SdrObject* pObj = SdrPage::RemoveObject(nObjNum); - if (pObj && GetModel()) - static_cast<FmFormModel*>(GetModel())->GetUndoEnv().Removed(pObj); + if (pObj) + static_cast< FmFormModel& >(getSdrModelFromSdrPage()).GetUndoEnv().Removed(pObj); return pObj; } diff --git a/svx/source/form/fmpgeimp.cxx b/svx/source/form/fmpgeimp.cxx index 3d974c0eb02e..417f84a1212c 100644 --- a/svx/source/form/fmpgeimp.cxx +++ b/svx/source/form/fmpgeimp.cxx @@ -315,16 +315,15 @@ const Reference< css::form::XForms >& FmFormPageImpl::getForms( bool _bForceCrea m_aFormsCreationHdl.Call( *this ); } - FmFormModel* pFormsModel = dynamic_cast<FmFormModel*>( m_rPage.GetModel() ); + FmFormModel& rFmFormModel(dynamic_cast< FmFormModel& >(m_rPage.getSdrModelFromSdrPage())); // give the newly created collection a place in the universe - SfxObjectShell* pObjShell = pFormsModel ? pFormsModel->GetObjectShell() : nullptr; + SfxObjectShell* pObjShell(rFmFormModel.GetObjectShell()); if ( pObjShell ) m_xForms->setParent( pObjShell->GetModel() ); // tell the UNDO environment that we have a new forms collection - if ( pFormsModel ) - pFormsModel->GetUndoEnv().AddForms( Reference<XNameContainer>(m_xForms,UNO_QUERY_THROW) ); + rFmFormModel.GetUndoEnv().AddForms( Reference<XNameContainer>(m_xForms,UNO_QUERY_THROW) ); } return m_xForms; } @@ -396,13 +395,13 @@ Reference< XForm > FmFormPageImpl::getDefaultForm() // did not find an existing suitable form -> create a new one if ( !xForm.is() ) { - SdrModel* pModel = m_rPage.GetModel(); + SdrModel& rModel(m_rPage.getSdrModelFromSdrPage()); - if( pModel->IsUndoEnabled() ) + if( rModel.IsUndoEnabled() ) { OUString aStr(SvxResId(RID_STR_FORM)); OUString aUndoStr(SvxResId(RID_STR_UNDO_CONTAINER_INSERT)); - pModel->BegUndo(aUndoStr.replaceFirst("'#'", aStr)); + rModel.BegUndo(aUndoStr.replaceFirst("'#'", aStr)); } try @@ -417,13 +416,15 @@ Reference< XForm > FmFormPageImpl::getDefaultForm() OUString sName = SvxResId(RID_STR_STDFORMNAME); xFormProps->setPropertyValue( FM_PROP_NAME, makeAny( sName ) ); - if( pModel->IsUndoEnabled() ) + if( rModel.IsUndoEnabled() ) { - pModel->AddUndo(new FmUndoContainerAction(*static_cast<FmFormModel*>(pModel), - FmUndoContainerAction::Inserted, - xForms, - xForm, - xForms->getCount())); + rModel.AddUndo( + new FmUndoContainerAction( + static_cast< FmFormModel& >(rModel), + FmUndoContainerAction::Inserted, + xForms, + xForm, + xForms->getCount())); } xForms->insertByName( sName, makeAny( xForm ) ); xCurrentForm = xForm; @@ -434,8 +435,8 @@ Reference< XForm > FmFormPageImpl::getDefaultForm() xForm.clear(); } - if( pModel->IsUndoEnabled() ) - pModel->EndUndo(); + if( rModel.IsUndoEnabled() ) + rModel.EndUndo(); } return xForm; @@ -474,16 +475,15 @@ Reference< css::form::XForm > FmFormPageImpl::findPlaceInFormComponentHierarchy // If no css::form found, then create a new one if (!xForm.is()) { - SdrModel* pModel = m_rPage.GetModel(); - - const bool bUndo = pModel->IsUndoEnabled(); + SdrModel& rModel(m_rPage.getSdrModelFromSdrPage()); + const bool bUndo(rModel.IsUndoEnabled()); if( bUndo ) { OUString aStr(SvxResId(RID_STR_FORM)); OUString aUndoStr(SvxResId(RID_STR_UNDO_CONTAINER_INSERT)); aUndoStr = aUndoStr.replaceFirst("#", aStr); - pModel->BegUndo(aUndoStr); + rModel.BegUndo(aUndoStr); } xForm.set(::comphelper::getProcessServiceFactory()->createInstance(FM_SUN_COMPONENT_FORM), UNO_QUERY); @@ -515,17 +515,19 @@ Reference< css::form::XForm > FmFormPageImpl::findPlaceInFormComponentHierarchy if( bUndo ) { Reference< css::container::XIndexContainer > xContainer( getForms(), UNO_QUERY ); - pModel->AddUndo(new FmUndoContainerAction(*static_cast<FmFormModel*>(pModel), - FmUndoContainerAction::Inserted, - xContainer, - xForm, - xContainer->getCount())); + rModel.AddUndo( + new FmUndoContainerAction( + static_cast< FmFormModel& >(rModel), + FmUndoContainerAction::Inserted, + xContainer, + xForm, + xContainer->getCount())); } getForms()->insertByName( sName, makeAny( xForm ) ); if( bUndo ) - pModel->EndUndo(); + rModel.EndUndo(); } xCurrentForm = xForm; } diff --git a/svx/source/form/fmshimp.cxx b/svx/source/form/fmshimp.cxx index a21e90431d7b..560b2fa5c70b 100644 --- a/svx/source/form/fmshimp.cxx +++ b/svx/source/form/fmshimp.cxx @@ -3845,10 +3845,8 @@ void FmXFormShell::loadForms_Lock(FmFormPage* _pPage, const LoadFormsFlags _nBeh { // lock the undo env so the forms can change non-transient properties while loading // (without this my doc's modified flag would be set) - FmFormModel* pModel = dynamic_cast<FmFormModel*>( _pPage->GetModel() ); - DBG_ASSERT( pModel, "FmXFormShell::loadForms: invalid model!" ); - if ( pModel ) - pModel->GetUndoEnv().Lock(); + FmFormModel& rFmFormModel(dynamic_cast< FmFormModel& >(_pPage->getSdrModelFromSdrPage())); + rFmFormModel.GetUndoEnv().Lock(); // load all forms Reference< XIndexAccess > xForms; @@ -3894,9 +3892,8 @@ void FmXFormShell::loadForms_Lock(FmFormPage* _pPage, const LoadFormsFlags _nBeh } } - if ( pModel ) - // unlock the environment - pModel->GetUndoEnv().UnLock(); + // unlock the environment + rFmFormModel.GetUndoEnv().UnLock(); } } diff --git a/svx/source/form/fmview.cxx b/svx/source/form/fmview.cxx index 2adad0dc524f..6acd8b890e2d 100644 --- a/svx/source/form/fmview.cxx +++ b/svx/source/form/fmview.cxx @@ -77,14 +77,14 @@ using namespace ::com::sun::star::util; using namespace ::svxform; using namespace ::svx; - -FmFormView::FmFormView( FmFormModel* pModel, OutputDevice* pOut ) - :E3dView(pModel,pOut) +FmFormView::FmFormView( + SdrModel& rSdrModel, + OutputDevice* pOut) +: E3dView(rSdrModel, pOut) { Init(); } - void FmFormView::Init() { pFormShell = nullptr; diff --git a/svx/source/form/fmvwimp.cxx b/svx/source/form/fmvwimp.cxx index cbf975fe0a2d..30dd8add1b1d 100644 --- a/svx/source/form/fmvwimp.cxx +++ b/svx/source/form/fmvwimp.cxx @@ -1350,7 +1350,7 @@ SdrObject* FmXFormView::implCreateFieldControl( const svx::ODataAccessDescriptor if ( bCheckbox ) return pControl; - SdrObjGroup* pGroup = new SdrObjGroup(); + SdrObjGroup* pGroup = new SdrObjGroup(getView()->getSdrModelFromSdrView()); SdrObjList* pObjList = pGroup->GetSubList(); pObjList->InsertObject( pLabel ); pObjList->InsertObject( pControl ); @@ -1462,7 +1462,7 @@ SdrObject* FmXFormView::implCreateXFormsControl( const svx::OXFormsDescriptor &_ // group objects - SdrObjGroup* pGroup = new SdrObjGroup(); + SdrObjGroup* pGroup = new SdrObjGroup(getView()->getSdrModelFromSdrView()); SdrObjList* pObjList = pGroup->GetSubList(); pObjList->InsertObject(pLabel); pObjList->InsertObject(pControl); @@ -1476,7 +1476,11 @@ SdrObject* FmXFormView::implCreateXFormsControl( const svx::OXFormsDescriptor &_ const MapMode eSourceMode(MapUnit::Map100thMM); const sal_uInt16 nObjID = OBJ_FM_BUTTON; ::Size controlSize(4000, 500); - FmFormObj *pControl = static_cast<FmFormObj*>(SdrObjFactory::MakeNewObject( SdrInventor::FmForm, nObjID, nullptr )); + FmFormObj *pControl = static_cast<FmFormObj*>( + SdrObjFactory::MakeNewObject( + getView()->getSdrModelFromSdrView(), + SdrInventor::FmForm, + nObjID)); controlSize.setWidth( long(controlSize.Width() * eTargetMode.GetScaleX()) ); controlSize.setHeight( long(controlSize.Height() * eTargetMode.GetScaleY()) ); ::Point controlPos( OutputDevice::LogicToLogic( ::Point( controlSize.Width(), 0 ), eSourceMode, eTargetMode ) ); @@ -1576,11 +1580,18 @@ bool FmXFormView::createControlLabelPair( OutputDevice const & _rOutDev, sal_Int // the label ::std::unique_ptr< SdrUnoObj > pLabel; Reference< XPropertySet > xLabelModel; + if ( bNeedLabel ) { pLabel.reset( dynamic_cast< SdrUnoObj* >( - SdrObjFactory::MakeNewObject( _nInventor, _nLabelObjectID, _pLabelPage, _pModel ) ) ); + SdrObjFactory::MakeNewObject( + *_pModel, + _nInventor, + _nLabelObjectID, + _pLabelPage))); + OSL_ENSURE( pLabel.get(), "FmXFormView::createControlLabelPair: could not create the label!" ); + if ( !pLabel.get() ) return false; @@ -1606,8 +1617,14 @@ bool FmXFormView::createControlLabelPair( OutputDevice const & _rOutDev, sal_Int // the control ::std::unique_ptr< SdrUnoObj > pControl( dynamic_cast< SdrUnoObj* >( - SdrObjFactory::MakeNewObject( _nInventor, _nControlObjectID, _pControlPage, _pModel ) ) ); + SdrObjFactory::MakeNewObject( + *_pModel, + _nInventor, + _nControlObjectID, + _pControlPage))); + OSL_ENSURE( pControl.get(), "FmXFormView::createControlLabelPair: could not create the control!" ); + if ( !pControl.get() ) return false; diff --git a/svx/source/gallery2/galobj.cxx b/svx/source/gallery2/galobj.cxx index d9e6a205cbfe..a91fabd1c527 100644 --- a/svx/source/gallery2/galobj.cxx +++ b/svx/source/gallery2/galobj.cxx @@ -458,7 +458,7 @@ bool SgaObjectSvDraw::CreateThumb( const FmFormModel& rModel ) if(aObjRect.GetWidth() && aObjRect.GetHeight()) { ScopedVclPtrInstance< VirtualDevice > pVDev; - FmFormView aView(const_cast< FmFormModel* >(&rModel), pVDev); + FmFormView aView(const_cast< FmFormModel& >(rModel), pVDev); aView.ShowSdrPage(const_cast< FmFormPage* >(pPage)); aView.MarkAllObj(); diff --git a/svx/source/gallery2/galtheme.cxx b/svx/source/gallery2/galtheme.cxx index de21ba0307bb..9c8b27bef7d5 100644 --- a/svx/source/gallery2/galtheme.cxx +++ b/svx/source/gallery2/galtheme.cxx @@ -801,7 +801,7 @@ bool GalleryTheme::GetGraphic(sal_uInt32 nPos, Graphic& rGraphic) { ScopedVclPtrInstance< VirtualDevice > pVDev; pVDev->SetMapMode( MapMode( MapUnit::Map100thMM ) ); - FmFormView aView( aModel.GetModel(), pVDev ); + FmFormView aView(*aModel.GetModel(), pVDev); aView.hideMarkHandles(); aView.ShowSdrPage(aView.GetModel()->GetPage(0)); @@ -1244,7 +1244,7 @@ bool GalleryTheme::InsertTransferable(const uno::Reference< datatransfer::XTrans if( aModel.GetModel() ) { SdrPage* pPage = aModel.GetModel()->GetPage(0); - SdrGrafObj* pGrafObj = new SdrGrafObj( *pGraphic ); + SdrGrafObj* pGrafObj = new SdrGrafObj(*aModel.GetModel(), *pGraphic ); pGrafObj->AppendUserData( new SgaIMapInfo( aImageMap ) ); pPage->InsertObject( pGrafObj ); diff --git a/svx/source/inc/cell.hxx b/svx/source/inc/cell.hxx index 5b7f71b04c89..86c7579e1726 100644 --- a/svx/source/inc/cell.hxx +++ b/svx/source/inc/cell.hxx @@ -91,8 +91,6 @@ public: SVX_DLLPRIVATE SdrTextVertAdjust GetTextVerticalAdjust() const; SdrTextHorzAdjust GetTextHorizontalAdjust() const; - SVX_DLLPRIVATE virtual void SetModel(SdrModel* pNewModel) override; - SVX_DLLPRIVATE void merge( sal_Int32 nColumnSpan, sal_Int32 nRowSpan ); SVX_DLLPRIVATE void mergeContent( const CellRef& xSourceCell ); SVX_DLLPRIVATE void replaceContentAndFormating( const CellRef& xSourceCell ); diff --git a/svx/source/inc/fmobj.hxx b/svx/source/inc/fmobj.hxx index 6b9adf61c548..da9f7c6fbfd7 100644 --- a/svx/source/inc/fmobj.hxx +++ b/svx/source/inc/fmobj.hxx @@ -27,7 +27,7 @@ // FmFormObj -class SVX_DLLPUBLIC FmFormObj: public SdrUnoObj +class SVX_DLLPUBLIC FmFormObj : public SdrUnoObj { FmFormObj( const FmFormObj& ) = delete; @@ -47,9 +47,10 @@ class SVX_DLLPUBLIC FmFormObj: public SdrUnoObj // only to be used for comparison with the current ref device! public: - FmFormObj(const OUString& rModelName); - FmFormObj(); - + FmFormObj( + SdrModel& rSdrModel, + const OUString& rModelName); + FmFormObj(SdrModel& rSdrModel); SAL_DLLPRIVATE const css::uno::Reference< css::container::XIndexContainer>& GetOriginalParent() const { return m_xParent; } @@ -72,12 +73,10 @@ public: SAL_DLLPRIVATE virtual sal_uInt16 GetObjIdentifier() const override; SAL_DLLPRIVATE virtual void NbcReformatText() override; - SAL_DLLPRIVATE virtual FmFormObj* Clone() const override; + SAL_DLLPRIVATE virtual FmFormObj* Clone(SdrModel* pTargetModel = nullptr) const override; // #116235# virtual SdrObject* Clone(SdrPage* pPage, SdrModel* pModel) const; SAL_DLLPRIVATE FmFormObj& operator= (const FmFormObj& rObj); - SAL_DLLPRIVATE virtual void SetModel(SdrModel* pNewModel) override; - SAL_DLLPRIVATE void clonedFrom(const FmFormObj* _pSource); SAL_DLLPRIVATE static css::uno::Reference< css::uno::XInterface> ensureModelEnv( diff --git a/svx/source/inc/tablemodel.hxx b/svx/source/inc/tablemodel.hxx index e59626da0200..791a4310f190 100644 --- a/svx/source/inc/tablemodel.hxx +++ b/svx/source/inc/tablemodel.hxx @@ -176,7 +176,7 @@ private: rtl::Reference< TableColumns > mxTableColumns; rtl::Reference< TableRows > mxTableRows; - SdrTableObj* mpTableObj; + SdrTableObj* mpTableObj; // TTTT should be reference bool mbModified; bool mbNotifyPending; diff --git a/svx/source/sdr/contact/viewcontactofgraphic.cxx b/svx/source/sdr/contact/viewcontactofgraphic.cxx index b7c3086fe735..3c0622bad264 100644 --- a/svx/source/sdr/contact/viewcontactofgraphic.cxx +++ b/svx/source/sdr/contact/viewcontactofgraphic.cxx @@ -241,7 +241,7 @@ namespace sdr aDraftText += " ..."; } - if (!aDraftText.isEmpty() && GetGrafObject().GetModel()) + if (!aDraftText.isEmpty()) { // #i103255# Goal is to produce TextPrimitives which hold the given text as // BlockText in the available space. It would be very tricky to do @@ -253,8 +253,7 @@ namespace sdr // needed and can be deleted. // create temp RectObj as TextObj and set needed attributes - SdrRectObj aRectObj(OBJ_TEXT); - aRectObj.SetModel(GetGrafObject().GetModel()); + SdrRectObj aRectObj(GetGrafObject().getSdrModelFromSdrObject(), OBJ_TEXT); aRectObj.NbcSetText(aDraftText); aRectObj.SetMergedItem(SvxColorItem(COL_LIGHTRED, EE_CHAR_COLOR)); diff --git a/svx/source/sdr/contact/viewcontactofsdrrectobj.cxx b/svx/source/sdr/contact/viewcontactofsdrrectobj.cxx index c0ab639395de..f02ba917280c 100644 --- a/svx/source/sdr/contact/viewcontactofsdrrectobj.cxx +++ b/svx/source/sdr/contact/viewcontactofsdrrectobj.cxx @@ -72,8 +72,7 @@ drawinglayer::primitive2d::Primitive2DContainer ViewContactOfSdrRectObj::createV drawinglayer::primitive2d::calculateRelativeCornerRadius(nCornerRadius, aObjectRange, fCornerRadiusX, fCornerRadiusY); // #i105856# use knowledge about pickthrough from the model - const bool bPickThroughTransparentTextFrames( - GetRectObj().GetModel() && GetRectObj().GetModel()->IsPickThroughTransparentTextFrames()); + const bool bPickThroughTransparentTextFrames(GetRectObj().getSdrModelFromSdrObject().IsPickThroughTransparentTextFrames()); // create primitive. Always create primitives to allow the decomposition of // SdrRectanglePrimitive2D to create needed invisible elements for HitTest and/or BoundRect diff --git a/svx/source/sdr/contact/viewobjectcontactofgraphic.cxx b/svx/source/sdr/contact/viewobjectcontactofgraphic.cxx index 95ed93a42b4c..f6e425fb1cfa 100644 --- a/svx/source/sdr/contact/viewobjectcontactofgraphic.cxx +++ b/svx/source/sdr/contact/viewobjectcontactofgraphic.cxx @@ -242,7 +242,7 @@ namespace sdr { // prepare primitive generation with evtl. loading the graphic when it's swapped out SdrGrafObj& rGrafObj = const_cast< ViewObjectContactOfGraphic* >(this)->getSdrGrafObj(); - bool bDoAsynchronGraphicLoading(rGrafObj.GetModel() && rGrafObj.GetModel()->IsSwapGraphics()); + bool bDoAsynchronGraphicLoading(rGrafObj.getSdrModelFromSdrObject().IsSwapGraphics()); if( bDoAsynchronGraphicLoading && rGrafObj.IsSwappedOut() ) { diff --git a/svx/source/sdr/primitive2d/sdrattributecreator.cxx b/svx/source/sdr/primitive2d/sdrattributecreator.cxx index 60e130c8b949..452971758bbc 100644 --- a/svx/source/sdr/primitive2d/sdrattributecreator.cxx +++ b/svx/source/sdr/primitive2d/sdrattributecreator.cxx @@ -527,7 +527,7 @@ namespace drawinglayer bool bChainable = rTextObj.IsChainable(); - if(rText.GetOutlinerParaObject() && rText.GetModel()) + if(rText.GetOutlinerParaObject()) { // added TextEdit text suppression bool bInEditMode(false); @@ -564,7 +564,7 @@ namespace drawinglayer const SdrTextAniKind eAniKind(rTextObj.GetTextAniKind()); // #i107346# - const SdrOutliner& rDrawTextOutliner = rText.GetModel()->GetDrawOutliner(&rTextObj); + const SdrOutliner& rDrawTextOutliner(rText.GetObject().getSdrModelFromSdrObject().GetDrawOutliner(&rTextObj)); const bool bWrongSpell(rDrawTextOutliner.GetControlWord() & EEControlBits::ONLINESPELLING); return attribute::SdrTextAttribute( diff --git a/svx/source/sdr/primitive2d/sdrtextprimitive2d.cxx b/svx/source/sdr/primitive2d/sdrtextprimitive2d.cxx index 0cdd5d0216d2..e3d7aba47366 100644 --- a/svx/source/sdr/primitive2d/sdrtextprimitive2d.cxx +++ b/svx/source/sdr/primitive2d/sdrtextprimitive2d.cxx @@ -64,16 +64,16 @@ namespace sal_Int16 nRetval(0); SdrPage* pPage = GetSdrPageFromXDrawPage(rxDrawPage); - if(pPage && pPage->GetModel()) + if(pPage) { if( (pPage->GetPageNum() == 0) && !pPage->IsMasterPage() ) { // handout page! - return pPage->GetModel()->getHandoutPageCount(); + return pPage->getSdrModelFromSdrPage().getHandoutPageCount(); } else { - const sal_uInt16 nPageCount(pPage->GetModel()->GetPageCount()); + const sal_uInt16 nPageCount(pPage->getSdrModelFromSdrPage().GetPageCount()); nRetval = (static_cast<sal_Int16>(nPageCount) - 1) / 2; } } @@ -188,9 +188,9 @@ namespace drawinglayer } // #i101443# check change of TextBackgroundolor - if(!bDoDelete && getSdrText() && getSdrText()->GetModel()) + if(!bDoDelete && getSdrText()) { - SdrOutliner& rDrawOutliner = getSdrText()->GetModel()->GetDrawOutliner(); + SdrOutliner& rDrawOutliner = getSdrText()->GetObject().getSdrModelFromSdrObject().GetDrawOutliner(); aNewTextBackgroundColor = rDrawOutliner.GetBackgroundColor(); bNewTextBackgroundColorIsSet = true; @@ -223,9 +223,9 @@ namespace drawinglayer nCurrentlyValidPageCount = getPageCount(xCurrentlyVisualizingPage); } - if(!bNewTextBackgroundColorIsSet && getSdrText() && getSdrText()->GetModel()) + if(!bNewTextBackgroundColorIsSet && getSdrText()) { - SdrOutliner& rDrawOutliner = getSdrText()->GetModel()->GetDrawOutliner(); + SdrOutliner& rDrawOutliner = getSdrText()->GetObject().getSdrModelFromSdrObject().GetDrawOutliner(); aNewTextBackgroundColor = rDrawOutliner.GetBackgroundColor(); } diff --git a/svx/source/sdr/properties/attributeproperties.cxx b/svx/source/sdr/properties/attributeproperties.cxx index b4038eab847a..d14b7ffd6b2f 100644 --- a/svx/source/sdr/properties/attributeproperties.cxx +++ b/svx/source/sdr/properties/attributeproperties.cxx @@ -44,33 +44,40 @@ #include <svx/svdmodel.hxx> #include <svx/svdtrans.hxx> #include <svx/svdpage.hxx> - +#include <svx/svdograf.hxx> +#include <svx/svdoole2.hxx> namespace sdr { namespace properties { - void AttributeProperties::ImpAddStyleSheet(SfxStyleSheet* pNewStyleSheet, bool bDontRemoveHardAttr) + SfxStyleSheet* AttributeProperties::ImpGetDefaultStyleSheet() const { - // test if old StyleSheet is cleared, else it would be lost - // after this method -> memory leak (!) - DBG_ASSERT(!mpStyleSheet, "Old style sheet not deleted before setting new one (!)"); + // use correct default stylesheet #119287# + const SdrGrafObj* pIsSdrGrafObj(dynamic_cast< const SdrGrafObj* >(&GetSdrObject())); + const SdrOle2Obj* pIsSdrOle2Obj(dynamic_cast< const SdrOle2Obj* >(&GetSdrObject())); + SfxStyleSheet* pRetval(nullptr); - if(pNewStyleSheet) + if(pIsSdrGrafObj || pIsSdrOle2Obj) { - mpStyleSheet = pNewStyleSheet; - - // local ItemSet is needed here, force it - GetObjectItemSet(); + pRetval = GetSdrObject().getSdrModelFromSdrObject().GetDefaultStyleSheetForSdrGrafObjAndSdrOle2Obj(); + } + else + { + pRetval = GetSdrObject().getSdrModelFromSdrObject().GetDefaultStyleSheet(); + } - // register as listener - StartListening(pNewStyleSheet->GetPool()); - StartListening(*pNewStyleSheet); + return pRetval; + } + void AttributeProperties::ImpSetParentAtSfxItemSet(bool bDontRemoveHardAttr) + { + if(HasSfxItemSet() && mpStyleSheet) + { // Delete hard attributes where items are set in the style sheet if(!bDontRemoveHardAttr) { - const SfxItemSet& rStyle = pNewStyleSheet->GetItemSet(); + const SfxItemSet& rStyle = mpStyleSheet->GetItemSet(); SfxWhichIter aIter(rStyle); sal_uInt16 nWhich = aIter.FirstWhich(); @@ -86,7 +93,37 @@ namespace sdr } // set new stylesheet as parent - mpItemSet->SetParent(&pNewStyleSheet->GetItemSet()); + mpItemSet->SetParent(&mpStyleSheet->GetItemSet()); + } + else + { + OSL_ENSURE(false, "ImpSetParentAtSfxItemSet called without SfxItemSet/SfxStyleSheet (!)"); + } + } + + void AttributeProperties::ImpAddStyleSheet(SfxStyleSheet* pNewStyleSheet, bool bDontRemoveHardAttr) + { + // test if old StyleSheet is cleared, else it would be lost + // after this method -> memory leak (!) + DBG_ASSERT(!mpStyleSheet, "Old style sheet not deleted before setting new one (!)"); + + if(pNewStyleSheet) + { + // local remember + mpStyleSheet = pNewStyleSheet; + + if(HasSfxItemSet()) + { + // register as listener + StartListening(pNewStyleSheet->GetPool()); + StartListening(*pNewStyleSheet); + + // only apply the following when we have an SfxItemSet already, else + if(GetStyleSheet()) + { + ImpSetParentAtSfxItemSet(bDontRemoveHardAttr); + } + } } } @@ -99,7 +136,7 @@ namespace sdr EndListening(mpStyleSheet->GetPool()); // reset parent of ItemSet - if(mpItemSet) + if(HasSfxItemSet()) { mpItemSet->SetParent(nullptr); } @@ -127,15 +164,59 @@ namespace sdr : DefaultProperties(rObj), mpStyleSheet(nullptr) { + // Do nothing else, esp. do *not* try to get and set + // a default SfxStyle sheet. Nothing is allowed to be done + // that may lead to calls to virtual functions like + // CreateObjectSpecificItemSet - these would go *wrong*. + // Thus the rest is lazy-init from here. } AttributeProperties::AttributeProperties(const AttributeProperties& rProps, SdrObject& rObj) : DefaultProperties(rProps, rObj), mpStyleSheet(nullptr) { - if(rProps.GetStyleSheet()) + SfxStyleSheet* pTargetStyleSheet(rProps.GetStyleSheet()); + + if(pTargetStyleSheet && &rObj.getSdrModelFromSdrObject() != &GetSdrObject().getSdrModelFromSdrObject()) { - ImpAddStyleSheet(rProps.GetStyleSheet(), true); + // TTTT It is a clone to another model, thus the TargetStyleSheet + // is probably also from another SdrModel, so do *not* simply use it. + // + // The DefaultProperties::Clone already has cloned the ::SET items + // to a new SfxItemSet in the new SfxItemPool. There are quite some + // possibilities to continue: + // - Do not use StyleSheet (will do this for now) + // - Search for same StyleSheet in Target-SdrModel and use if found + // (use e.g. Name) + // - Clone used StyleSheet(s) to Target-SdrModel and use + // - Set all Attributes from the StyleSheet as hard attributes at the + // SfxItemSet + // The original AW080 uses 'ImpModelChange' (see there) which Clones + // and uses the used StyleSheets if there is a Target-SfxItemPool + // and sets to hard attributes if not. This may be used later if needed, + // but for now only a single UnitTest uses this Clone-scenario and works + // well with not using the TargetStyleSheet. The logic Cloning + // StyleSheets *should* - if needed - be on a higher level where it is + // potentially better known what would be the correct thing to do. + pTargetStyleSheet = nullptr; + } + + if(pTargetStyleSheet) + { + if(HasSfxItemSet()) + { + // The SfxItemSet has been cloned and exists, + // we can directly set the SfxStyleSheet at it + ImpAddStyleSheet(pTargetStyleSheet, true); + } + else + { + // No SfxItemSet exists yet (there is none in + // the source, so none was cloned). Remember the + // SfxStyleSheet to set it when the SfxItemSet + // got constructed on-demand + mpStyleSheet = pTargetStyleSheet; + } } } @@ -149,6 +230,42 @@ namespace sdr return *(new AttributeProperties(*this, rObj)); } + const SfxItemSet& AttributeProperties::GetObjectItemSet() const + { + // remember if we had a SfxItemSet already + const bool bHadSfxItemSet(HasSfxItemSet()); + + // call parent - this will then guarantee + // SfxItemSet existance + DefaultProperties::GetObjectItemSet(); + + if(!bHadSfxItemSet) + { + if(GetStyleSheet()) + { + // Late-Init of setting parent to SfxStyleSheet after + // it's creation. See copy-constructor and how it remembers + // the SfxStyleSheet there. + // It is necessary to reset mpStyleSheet to nullptr to + // not trigger alarm insde ImpAddStyleSheet (!) + SfxStyleSheet* pNew(mpStyleSheet); + const_cast< AttributeProperties* >(this)->mpStyleSheet = nullptr; + const_cast< AttributeProperties* >(this)->ImpAddStyleSheet( + pNew, + true); + } + else + { + // Set missing defaults and do not RemoveHardAttributes + const_cast< AttributeProperties* >(this)->ImpAddStyleSheet( + ImpGetDefaultStyleSheet(), + true); + } + } + + return *mpItemSet; + } + void AttributeProperties::ItemSetChanged(const SfxItemSet& /*rSet*/) { // own modifications @@ -164,64 +281,72 @@ namespace sdr if(pNewItem) { const SfxPoolItem* pResultItem = nullptr; - SdrModel* pModel = GetSdrObject().GetModel(); + SdrModel& rModel(GetSdrObject().getSdrModelFromSdrObject()); switch( nWhich ) { case XATTR_FILLBITMAP: { - pResultItem = static_cast<const XFillBitmapItem*>(pNewItem)->checkForUniqueItem( pModel ); + // TTTT checkForUniqueItem should use SdrModel& + pResultItem = static_cast<const XFillBitmapItem*>(pNewItem)->checkForUniqueItem( &rModel ); break; } case XATTR_LINEDASH: { - pResultItem = static_cast<const XLineDashItem*>(pNewItem)->checkForUniqueItem( pModel ); + pResultItem = static_cast<const XLineDashItem*>(pNewItem)->checkForUniqueItem( &rModel ); break; } case XATTR_LINESTART: { - pResultItem = static_cast<const XLineStartItem*>(pNewItem)->checkForUniqueItem( pModel ); + pResultItem = static_cast<const XLineStartItem*>(pNewItem)->checkForUniqueItem( &rModel ); break; } case XATTR_LINEEND: { - pResultItem = static_cast<const XLineEndItem*>(pNewItem)->checkForUniqueItem( pModel ); + pResultItem = static_cast<const XLineEndItem*>(pNewItem)->checkForUniqueItem( &rModel ); break; } case XATTR_FILLGRADIENT: { - pResultItem = static_cast<const XFillGradientItem*>(pNewItem)->checkForUniqueItem( pModel ); + pResultItem = static_cast<const XFillGradientItem*>(pNewItem)->checkForUniqueItem( &rModel ); break; } case XATTR_FILLFLOATTRANSPARENCE: { // #85953# allow all kinds of XFillFloatTransparenceItem to be set - pResultItem = static_cast<const XFillFloatTransparenceItem*>(pNewItem)->checkForUniqueItem( pModel ); + pResultItem = static_cast<const XFillFloatTransparenceItem*>(pNewItem)->checkForUniqueItem( &rModel ); break; } case XATTR_FILLHATCH: { - pResultItem = static_cast<const XFillHatchItem*>(pNewItem)->checkForUniqueItem( pModel ); + pResultItem = static_cast<const XFillHatchItem*>(pNewItem)->checkForUniqueItem( &rModel ); break; } } // set item - GetObjectItemSet(); + if(!HasSfxItemSet()) + { + GetObjectItemSet(); + } + if(pResultItem) { // force ItemSet mpItemSet->Put(*pResultItem); + // delete item if it was a generated one delete pResultItem; } else + { mpItemSet->Put(*pNewItem); + } } else { // clear item if ItemSet exists - if(mpItemSet) + if(HasSfxItemSet()) { mpItemSet->ClearItem(nWhich); } @@ -230,6 +355,12 @@ namespace sdr void AttributeProperties::SetStyleSheet(SfxStyleSheet* pNewStyleSheet, bool bDontRemoveHardAttr) { + // guarantee SfxItemSet existance here + if(!HasSfxItemSet()) + { + GetObjectItemSet(); + } + ImpRemoveStyleSheet(); ImpAddStyleSheet(pNewStyleSheet, bDontRemoveHardAttr); @@ -243,237 +374,18 @@ namespace sdr return mpStyleSheet; } - void AttributeProperties::MoveToItemPool(SfxItemPool* pSrcPool, SfxItemPool* pDestPool, SdrModel* pNewModel) - { - OSL_ASSERT(pNewModel!=nullptr); - - if(pSrcPool && pDestPool && (pSrcPool != pDestPool)) - { - if(mpItemSet) - { - // migrate ItemSet to new pool. Scaling is NOT necessary - // because this functionality is used by UNDO only. Thus - // objects and ItemSets would be moved back to their original - // pool before usage. - SfxStyleSheet* pStySheet = GetStyleSheet(); - - if(pStySheet) - { - ImpRemoveStyleSheet(); - } - - auto pOldSet = std::move(mpItemSet); - mpItemSet.reset(pOldSet->Clone(false, pDestPool)); - SdrModel::MigrateItemSet(pOldSet.get(), mpItemSet.get(), pNewModel); - - // set stylesheet (if used) - if(pStySheet) - { - // #i109515# - SfxItemPool* pStyleSheetPool = &pStySheet->GetPool().GetPool(); - - if(pStyleSheetPool == pDestPool) - { - // just re-set stylesheet - ImpAddStyleSheet(pStySheet, true); - } - else - { - // StyleSheet is NOT from the correct pool. - // Look one up in the right pool with the same - // name or use the default. - - // Look up the style in the new document. - OSL_ASSERT(pNewModel->GetStyleSheetPool() != nullptr); - SfxStyleSheet* pNewStyleSheet = dynamic_cast<SfxStyleSheet*>( - pNewModel->GetStyleSheetPool()->Find( - pStySheet->GetName(), - SfxStyleFamily::All)); - if (pNewStyleSheet == nullptr - || &pNewStyleSheet->GetPool().GetPool() != pDestPool) - { - // There is no copy of the style in the new - // document. Use the default as a fallback. - pNewStyleSheet = pNewModel->GetDefaultStyleSheet(); - } - ImpAddStyleSheet(pNewStyleSheet, true); - } - } - } - } - } - - void AttributeProperties::SetModel(SdrModel* pOldModel, SdrModel* pNewModel) - { - if(pOldModel != pNewModel && pNewModel) - { - // For a living model move the items from one pool to the other - if(pOldModel) - { - // If metric has changed, scale items. - MapUnit aOldUnit(pOldModel->GetScaleUnit()); - MapUnit aNewUnit(pNewModel->GetScaleUnit()); - bool bScaleUnitChanged(aNewUnit != aOldUnit); - Fraction aMetricFactor; - - if(bScaleUnitChanged) - { - aMetricFactor = GetMapFactor(aOldUnit, aNewUnit).X(); - Scale(aMetricFactor); - } - - // Move all styles which are used by the object to the new - // StyleSheet pool - SfxStyleSheet* pOldStyleSheet = GetStyleSheet(); - - if(pOldStyleSheet) - { - SfxStyleSheetBase* pSheet = pOldStyleSheet; - SfxStyleSheetBasePool* pOldPool = pOldModel->GetStyleSheetPool(); - SfxStyleSheetBasePool* pNewPool = pNewModel->GetStyleSheetPool(); - DBG_ASSERT(pOldPool, "Properties::SetModel(): Object has StyleSheet but no StyleSheetPool (!)"); - - if(pOldPool && pNewPool) - { - // build a list of to-be-copied Styles - std::vector<SfxStyleSheetBase*> aStyleList; - SfxStyleSheetBase* pAnchor = nullptr; - - while(pSheet) - { - pAnchor = pNewPool->Find(pSheet->GetName(), pSheet->GetFamily()); - - if(!pAnchor) - { - aStyleList.push_back(pSheet); - pSheet = pOldPool->Find(pSheet->GetParent(), pSheet->GetFamily()); - } - else - { - // the style does exist - pSheet = nullptr; - } - } - - // copy and set the parents - SfxStyleSheetBase* pNewSheet = nullptr; - SfxStyleSheetBase* pLastSheet = nullptr; - SfxStyleSheetBase* pForThisObject = nullptr; - - for (std::vector<SfxStyleSheetBase*>::const_iterator iter = aStyleList.begin(), aEnd = aStyleList.end() - ; iter != aEnd; ++iter) - { - pNewSheet = &pNewPool->Make((*iter)->GetName(), (*iter)->GetFamily(), (*iter)->GetMask()); - pNewSheet->GetItemSet().Put((*iter)->GetItemSet(), false); - - if(bScaleUnitChanged) - { - sdr::properties::ScaleItemSet(pNewSheet->GetItemSet(), aMetricFactor); - } - - if(pLastSheet) - { - pLastSheet->SetParent(pNewSheet->GetName()); - } - - if(!pForThisObject) - { - pForThisObject = pNewSheet; - } - - pLastSheet = pNewSheet; - } - - // Set link to the Style found in the Pool - if(pAnchor && pLastSheet) - { - pLastSheet->SetParent(pAnchor->GetName()); - } - - // if list was empty (all Styles exist in destination pool) - // pForThisObject is not yet set - if(!pForThisObject && pAnchor) - { - pForThisObject = pAnchor; - } - - // De-register at old and register at new Style - if(GetStyleSheet() != pForThisObject) - { - ImpRemoveStyleSheet(); - ImpAddStyleSheet(static_cast<SfxStyleSheet*>(pForThisObject), true); - } - } - else - { - // there is no StyleSheetPool in the new model, thus set - // all items as hard items in the object - std::vector<const SfxItemSet*> aSetList; - const SfxItemSet* pItemSet = &pOldStyleSheet->GetItemSet(); - - while(pItemSet) - { - aSetList.push_back(pItemSet); - pItemSet = pItemSet->GetParent(); - } - - auto pNewSet = CreateObjectSpecificItemSet(pNewModel->GetItemPool()); - - std::vector<const SfxItemSet*>::reverse_iterator riter; - for (riter = aSetList.rbegin(); riter != aSetList.rend(); ++riter) - pNewSet->Put(*(*riter)); - - // Items which were hard attributes before need to stay - if(mpItemSet) - { - SfxWhichIter aIter(*mpItemSet); - sal_uInt16 nWhich = aIter.FirstWhich(); - - while(nWhich) - { - if(mpItemSet->GetItemState(nWhich, false) == SfxItemState::SET) - { - pNewSet->Put(mpItemSet->Get(nWhich)); - } - - nWhich = aIter.NextWhich(); - } - } - - if(bScaleUnitChanged) - { - ScaleItemSet(*pNewSet, aMetricFactor); - } - - if(mpItemSet) - { - if(GetStyleSheet()) - { - ImpRemoveStyleSheet(); - } - } - - mpItemSet = std::move(pNewSet); - } - } - } - - // each object gets the default Style if there is none set yet. - if(!GetStyleSheet() && pNewModel) - { - GetObjectItemSet(); // #118414 force ItemSet to allow style to be set - SetStyleSheet(pNewModel->GetDefaultStyleSheet(), true); - } - } - } - void AttributeProperties::ForceStyleToHardAttributes() { if(!GetStyleSheet() || dynamic_cast<const SfxStyleSheet *>(mpStyleSheet) == nullptr) return; + // force SfxItemSet existence + if(!HasSfxItemSet()) + { + GetObjectItemSet(); + } + // prepare copied, new itemset, but WITHOUT parent - GetObjectItemSet(); SfxItemSet* pDestItemSet = new SfxItemSet(*mpItemSet); pDestItemSet->SetParent(nullptr); @@ -539,22 +451,22 @@ namespace sdr { // Style needs to be exchanged SfxStyleSheet* pNewStSh = nullptr; - SdrModel* pModel = rObj.GetModel(); + SdrModel& rModel(rObj.getSdrModelFromSdrObject()); // Do nothing if object is in destruction, else a StyleSheet may be found from // a StyleSheetPool which is just being deleted itself. and thus it would be fatal // to register as listener to that new StyleSheet. - if(pModel && !rObj.IsInDestruction()) + if(!rObj.IsInDestruction()) { if(dynamic_cast<const SfxStyleSheet *>(GetStyleSheet()) != nullptr) { - pNewStSh = static_cast<SfxStyleSheet*>(pModel->GetStyleSheetPool()->Find( + pNewStSh = static_cast<SfxStyleSheet*>(rModel.GetStyleSheetPool()->Find( GetStyleSheet()->GetParent(), GetStyleSheet()->GetFamily())); } if(!pNewStSh) { - pNewStSh = pModel->GetDefaultStyleSheet(); + pNewStSh = rModel.GetDefaultStyleSheet(); } } diff --git a/svx/source/sdr/properties/defaultproperties.cxx b/svx/source/sdr/properties/defaultproperties.cxx index 167e368382c4..56d23b6851bd 100644 --- a/svx/source/sdr/properties/defaultproperties.cxx +++ b/svx/source/sdr/properties/defaultproperties.cxx @@ -25,14 +25,14 @@ #include <svl/itemset.hxx> #include <svl/whiter.hxx> #include <vcl/outdev.hxx> - #include <vector> #include <svx/svdobj.hxx> #include <svx/svddef.hxx> #include <svx/svdpool.hxx> #include <editeng/eeitem.hxx> #include <libxml/xmlwriter.h> - +#include <svx/svdmodel.hxx> +#include <svx/svdtrans.hxx> namespace sdr { @@ -56,7 +56,29 @@ namespace sdr { if(rProps.mpItemSet) { - mpItemSet.reset(rProps.mpItemSet->Clone()); + // Clone may be to another model and thus another ItemPool. + // SfxItemSet supports that thus we are able to Clone all + // SfxItemState::SET items to the target pool. + mpItemSet.reset( + rProps.mpItemSet->Clone( + true, + &rObj.getSdrModelFromSdrObject().GetItemPool())); + + // React on ModelChange: If metric has changed, scale items. + // As seen above, clone is supported, but scale is not included, + // thus: TTTT maybe add scale to SfxItemSet::Clone() (?) + if(&rObj.getSdrModelFromSdrObject() != &GetSdrObject().getSdrModelFromSdrObject()) + { + const MapUnit aOldUnit(GetSdrObject().getSdrModelFromSdrObject().GetScaleUnit()); + const MapUnit aNewUnit(rObj.getSdrModelFromSdrObject().GetScaleUnit()); + const bool bScaleUnitChanged(aNewUnit != aOldUnit); + + if(bScaleUnitChanged) + { + const Fraction aMetricFactor(GetMapFactor(aOldUnit, aNewUnit).X()); + Scale(aMetricFactor); + } + } // do not keep parent info, this may be changed by later constructors. // This class just copies the ItemSet, ignore parent. diff --git a/svx/source/sdr/properties/e3dsceneproperties.cxx b/svx/source/sdr/properties/e3dsceneproperties.cxx index 1b3bdbf486b6..a5f59940d51e 100644 --- a/svx/source/sdr/properties/e3dsceneproperties.cxx +++ b/svx/source/sdr/properties/e3dsceneproperties.cxx @@ -267,31 +267,6 @@ namespace sdr return pRetval; } - void E3dSceneProperties::MoveToItemPool(SfxItemPool* pSrcPool, SfxItemPool* pDestPool, SdrModel* pNewModel) - { - if(pSrcPool && pDestPool && (pSrcPool != pDestPool)) - { - // call parent - E3dProperties::MoveToItemPool(pSrcPool, pDestPool, pNewModel); - - // own reaction, but only with outmost scene - E3dScene& rObj = static_cast<E3dScene&>(GetSdrObject()); - const SdrObjList* pSubList = rObj.GetSubList(); - - if(pSubList && rObj.GetScene() == &rObj) - { - SdrObjListIter a3DIterator(*pSubList, SdrIterMode::DeepWithGroups); - - while(a3DIterator.IsMore()) - { - E3dObject* pObj = static_cast<E3dObject*>(a3DIterator.Next()); - DBG_ASSERT(dynamic_cast<const E3dObject* >(pObj) != nullptr, "In scenes there are only 3D objects allowed (!)"); - pObj->GetProperties().MoveToItemPool(pSrcPool, pDestPool, pNewModel); - } - } - } - } - void E3dSceneProperties::SetSceneItemsFromCamera() { // force ItemSet diff --git a/svx/source/sdr/properties/groupproperties.cxx b/svx/source/sdr/properties/groupproperties.cxx index 7b46704e0923..a79f7cc9059a 100644 --- a/svx/source/sdr/properties/groupproperties.cxx +++ b/svx/source/sdr/properties/groupproperties.cxx @@ -246,31 +246,6 @@ namespace sdr // nothing to do here, groups have no items and thus no default items, too. } - void GroupProperties::MoveToItemPool(SfxItemPool* pSrcPool, SfxItemPool* pDestPool, SdrModel* pNewModel) - { - if(pSrcPool && pDestPool && (pSrcPool != pDestPool)) - { - const SdrObjList* pSub = static_cast<const SdrObjGroup&>(GetSdrObject()).GetSubList(); - const size_t nCount(pSub->GetObjCount()); - - for(size_t a = 0; a < nCount; ++a) - { - pSub->GetObj(a)->GetProperties().MoveToItemPool(pSrcPool, pDestPool, pNewModel); - } - - // also clear local ItemSet, it's only temporary for group objects anyways. - if(mpItemSet) - { - // copy/paste is still using clone operators and MoveToItemPool functionality. - // Since SfxItemSet contains a pool pointer, ClearItem is not enough here. - // The ItemSet for merge is constructed on demand, so it's enough here to - // just delete it and set to 0L. - // mpItemSet->ClearItem(); - mpItemSet.reset(); - } - } - } - void GroupProperties::ForceStyleToHardAttributes() { const SdrObjList* pSub = static_cast<const SdrObjGroup&>(GetSdrObject()).GetSubList(); diff --git a/svx/source/sdr/properties/properties.cxx b/svx/source/sdr/properties/properties.cxx index c8082ab53f8f..256e6ea275bb 100644 --- a/svx/source/sdr/properties/properties.cxx +++ b/svx/source/sdr/properties/properties.cxx @@ -80,18 +80,6 @@ namespace sdr ClearObjectItem(nWhich); } - void BaseProperties::MoveToItemPool(SfxItemPool* /*pSrcPool*/, SfxItemPool* /*pDestPool*/, SdrModel* /*pNewModel*/) - { - // Move properties to a new ItemPool. Default implementation does nothing. - // Override where an ItemSet is implemented. - } - - void BaseProperties::SetModel(SdrModel* /*pOldModel*/, SdrModel* /*pNewModel*/) - { - // Set new model. Default implementation does nothing. - // Override where an ItemSet is implemented. - } - void BaseProperties::ForceStyleToHardAttributes() { // force all attributes which come from styles to hard attributes diff --git a/svx/source/sdr/properties/textproperties.cxx b/svx/source/sdr/properties/textproperties.cxx index 0d57e931cd23..f6e1aba0b791 100644 --- a/svx/source/sdr/properties/textproperties.cxx +++ b/svx/source/sdr/properties/textproperties.cxx @@ -240,7 +240,7 @@ namespace sdr // #i101556# StyleSheet has changed -> new version maVersion++; - if( rObj.GetModel() /*&& !rObj.IsTextEditActive()*/ && !rObj.IsLinkedText() ) + if(!rObj.IsLinkedText() ) { SdrOutliner& rOutliner = rObj.ImpGetDrawOutliner(); @@ -279,9 +279,7 @@ namespace sdr aNewStyleSheetName = aNewStyleSheetName.copy(0, aNewStyleSheetName.getLength() - 1); sal_Int16 nDepth = rOutliner.GetDepth(nPara); aNewStyleSheetName += OUString::number( nDepth <= 0 ? 1 : nDepth + 1); - - SdrModel* pModel = rObj.GetModel(); - SfxStyleSheetBasePool* pStylePool = (pModel != nullptr) ? pModel->GetStyleSheetPool() : nullptr; + SfxStyleSheetBasePool* pStylePool(rObj.getSdrModelFromSdrObject().GetStyleSheetPool()); SfxStyleSheet* pNewStyle = nullptr; if(pStylePool) pNewStyle = static_cast<SfxStyleSheet*>(pStylePool->Find(aNewStyleSheetName, GetStyleSheet()->GetFamily())); @@ -397,11 +395,9 @@ namespace sdr // now the standard TextProperties stuff SdrTextObj& rObj = static_cast<SdrTextObj&>(GetSdrObject()); - if(rObj.GetModel() - && !rObj.IsTextEditActive() - && !rObj.IsLinkedText()) + if(!rObj.IsTextEditActive() && !rObj.IsLinkedText()) { - Outliner* pOutliner = SdrMakeOutliner(OutlinerMode::OutlineObject, *rObj.GetModel()); + Outliner* pOutliner = SdrMakeOutliner(OutlinerMode::OutlineObject, rObj.getSdrModelFromSdrObject()); const svx::ITextProvider& rTextProvider(getTextProvider()); sal_Int32 nText = rTextProvider.getTextCount(); while (nText--) diff --git a/svx/source/svdraw/svdcrtv.cxx b/svx/source/svdraw/svdcrtv.cxx index 33cf4eb9b3c2..f2d739e76612 100644 --- a/svx/source/svdraw/svdcrtv.cxx +++ b/svx/source/svdraw/svdcrtv.cxx @@ -197,8 +197,10 @@ void SdrCreateView::ImpClearVars() ImpClearConnectMarker(); } -SdrCreateView::SdrCreateView(SdrModel* pModel1, OutputDevice* pOut) -: SdrDragView(pModel1,pOut), +SdrCreateView::SdrCreateView( + SdrModel& rSdrModel, + OutputDevice* pOut) +: SdrDragView(rSdrModel, pOut), mpCoMaOverlay(nullptr), mpCreateViewExtraData(new ImpSdrCreateViewExtraData()) { @@ -348,7 +350,10 @@ void SdrCreateView::SetCurrentObj(sal_uInt16 nIdent, SdrInventor nInvent) nCurrentInvent=nInvent; nCurrentIdent=nIdent; SdrObject * pObj = (nIdent == OBJ_NONE) ? nullptr : - SdrObjFactory::MakeNewObject(nInvent, nIdent, nullptr); + SdrObjFactory::MakeNewObject( + *GetModel(), + nInvent, + nIdent); if(pObj) { @@ -407,14 +412,14 @@ bool SdrCreateView::ImpBegCreateObj(SdrInventor nInvent, sal_uInt16 nIdent, cons { pCurrentCreate->SetPage(pCreatePV->GetPage()); } - else if (mpModel) - { - pCurrentCreate->SetModel(mpModel); - } } else { - pCurrentCreate = SdrObjFactory::MakeNewObject(nInvent, nIdent, pCreatePV->GetPage(), mpModel); + pCurrentCreate = SdrObjFactory::MakeNewObject( + *mpModel, + nInvent, + nIdent, + pCreatePV->GetPage()); } Point aPnt(rPnt); diff --git a/svx/source/svdraw/svddrgv.cxx b/svx/source/svdraw/svddrgv.cxx index b13383b27a32..5d18d6840d27 100644 --- a/svx/source/svdraw/svddrgv.cxx +++ b/svx/source/svdraw/svddrgv.cxx @@ -71,8 +71,10 @@ void SdrDragView::ImpClearVars() mbSolidDragging = getOptionsDrawinglayer().IsSolidDragCreate(); } -SdrDragView::SdrDragView(SdrModel* pModel1, OutputDevice* pOut) -: SdrExchangeView(pModel1,pOut) +SdrDragView::SdrDragView( + SdrModel& rSdrModel, + OutputDevice* pOut) +: SdrExchangeView(rSdrModel, pOut) { ImpClearVars(); } diff --git a/svx/source/svdraw/svdedtv.cxx b/svx/source/svdraw/svdedtv.cxx index c373caac480f..ce620ae67e41 100644 --- a/svx/source/svdraw/svdedtv.cxx +++ b/svx/source/svdraw/svdedtv.cxx @@ -88,8 +88,10 @@ void SdrEditView::ImpClearVars() bPossibilitiesDirty=true; // << Purify didn't like this } -SdrEditView::SdrEditView(SdrModel* pModel1, OutputDevice* pOut): - SdrMarkView(pModel1,pOut) +SdrEditView::SdrEditView( + SdrModel& rSdrModel, + OutputDevice* pOut) +: SdrMarkView(rSdrModel, pOut) { ImpClearVars(); } @@ -98,7 +100,6 @@ SdrEditView::~SdrEditView() { } - void SdrEditView::InsertNewLayer(const OUString& rName, sal_uInt16 nPos) { SdrLayerAdmin& rLA=mpModel->GetLayerAdmin(); diff --git a/svx/source/svdraw/svdedtv2.cxx b/svx/source/svdraw/svdedtv2.cxx index 01820c63bc34..ef63499a1eb8 100644 --- a/svx/source/svdraw/svdedtv2.cxx +++ b/svx/source/svdraw/svdedtv2.cxx @@ -1126,7 +1126,7 @@ void SdrEditView::MergeMarkedObjects(SdrMergeMode eMode) // #i73441# check insert list before taking actions if(pInsOL) { - SdrPathObj* pPath = new SdrPathObj(OBJ_PATHFILL, aMergePolyPolygonA); + SdrPathObj* pPath = new SdrPathObj(pAttrObj->getSdrModelFromSdrObject(), OBJ_PATHFILL, aMergePolyPolygonA); ImpCopyAttributes(pAttrObj, pPath); pInsOL->InsertObject(pPath, nInsPos); if( bUndo ) @@ -1134,7 +1134,7 @@ void SdrEditView::MergeMarkedObjects(SdrMergeMode eMode) // #i124760# To have a correct selection with only the new object it is necessary to // unmark all objects first. If not doing so, there may remain invalid pointers to objects - //TTTT:Not needed for aw080 (!) + // TTTT:Not needed for aw080 (!) UnmarkAllObj(pInsPV); MarkObj(pPath, pInsPV, false, true); @@ -1355,7 +1355,7 @@ void SdrEditView::CombineMarkedObjects(bool bNoPolyPoly) } } - SdrPathObj* pPath = new SdrPathObj(eKind,aPolyPolygon); + SdrPathObj* pPath = new SdrPathObj(pAttrObj->getSdrModelFromSdrObject(), eKind, aPolyPolygon); // attributes of the lowest object ImpCopyAttributes(pAttrObj, pPath); @@ -1522,7 +1522,10 @@ void SdrEditView::ImpDismantleOneObject(const SdrObject* pObj, SdrObjList& rOL, if(!bMakeLines || nPointCount < 2) { - SdrPathObj* pPath = new SdrPathObj(static_cast<SdrObjKind>(pSrcPath->GetObjIdentifier()), basegfx::B2DPolyPolygon(rCandidate)); + SdrPathObj* pPath = new SdrPathObj( + pSrcPath->getSdrModelFromSdrObject(), + static_cast<SdrObjKind>(pSrcPath->GetObjIdentifier()), + basegfx::B2DPolyPolygon(rCandidate)); ImpCopyAttributes(pSrcPath, pPath); pLast = pPath; rOL.InsertObject(pPath, rPos); @@ -1556,7 +1559,10 @@ void SdrEditView::ImpDismantleOneObject(const SdrObject* pObj, SdrObjList& rOL, aNewPolygon.append(rCandidate.getB2DPoint(nNextIndex)); } - SdrPathObj* pPath = new SdrPathObj(eKind, basegfx::B2DPolyPolygon(aNewPolygon)); + SdrPathObj* pPath = new SdrPathObj( + pSrcPath->getSdrModelFromSdrObject(), + eKind, + basegfx::B2DPolyPolygon(aNewPolygon)); ImpCopyAttributes(pSrcPath, pPath); pLast = pPath; rOL.InsertObject(pPath, rPos); @@ -1584,7 +1590,6 @@ void SdrEditView::ImpDismantleOneObject(const SdrObject* pObj, SdrObjList& rOL, { SdrObject* pCandidate = pReplacement->Clone(); DBG_ASSERT(pCandidate, "SdrEditView::ImpDismantleOneObject: Could not clone SdrObject (!)"); - pCandidate->SetModel(pCustomShape->GetModel()); if(pCustomShape->GetMergedItem(SDRATTR_SHADOW).GetValue()) { @@ -1603,7 +1608,9 @@ void SdrEditView::ImpDismantleOneObject(const SdrObject* pObj, SdrObjList& rOL, { // #i37011# also create a text object and add at rPos + 1 SdrObject* pTextObj = SdrObjFactory::MakeNewObject( - pCustomShape->GetObjInventor(), OBJ_TEXT, nullptr, pCustomShape->GetModel()); + pCustomShape->getSdrModelFromSdrObject(), + pCustomShape->GetObjInventor(), + OBJ_TEXT); // Copy text content OutlinerParaObject* pParaObj = pCustomShape->GetOutlinerParaObject(); @@ -1754,14 +1761,13 @@ void SdrEditView::GroupMarked() SdrMark* pM=GetSdrMarkByIndex(nm); if (pM->GetPageView()==pPV) { - if (pGrp==nullptr) + SdrObject* pObj=pM->GetMarkedSdrObj(); + if (nullptr==pGrp) { - if (pGrp==nullptr) - pGrp=new SdrObjGroup; + pGrp = new SdrObjGroup(pObj->getSdrModelFromSdrObject()); pDstLst=pGrp->GetSubList(); DBG_ASSERT(pDstLst!=nullptr,"Alleged group object doesn't return object list."); } - SdrObject* pObj=pM->GetMarkedSdrObj(); pSrcLst=pObj->GetObjList(); if (pSrcLst!=pSrcLst0) { diff --git a/svx/source/svdraw/svdedxv.cxx b/svx/source/svdraw/svdedxv.cxx index 51ef80fb46b6..d03a55fe4b11 100644 --- a/svx/source/svdraw/svdedxv.cxx +++ b/svx/source/svdraw/svdedxv.cxx @@ -88,8 +88,10 @@ void SdrObjEditView::ImpClearVars() bTextEditOnlyOneView=false; } -SdrObjEditView::SdrObjEditView(SdrModel* pModel1, OutputDevice* pOut): - SdrGlueEditView(pModel1,pOut), +SdrObjEditView::SdrObjEditView( + SdrModel& rSdrModel, + OutputDevice* pOut) +: SdrGlueEditView(rSdrModel, pOut), mpOldTextEditUndoManager(nullptr) { ImpClearVars(); @@ -1089,7 +1091,7 @@ bool SdrObjEditView::SdrBeginTextEdit( mxTextEditObj.reset( pObj ); pTextEditOutliner=pGivenOutliner; if (pTextEditOutliner==nullptr) - pTextEditOutliner = SdrMakeOutliner( OutlinerMode::TextObject, *mxTextEditObj->GetModel() ); + pTextEditOutliner = SdrMakeOutliner( OutlinerMode::TextObject, mxTextEditObj->getSdrModelFromSdrObject() ); { SvtAccessibilityOptions aOptions; @@ -1588,8 +1590,7 @@ SdrEndTextEditKind SdrObjEditView::SdrEndTextEdit(bool bDontDeleteReally) } if( pTEObj && - pTEObj->GetModel() && - !pTEObj->GetModel()->isLocked() && + !pTEObj->getSdrModelFromSdrObject().isLocked() && pTEObj->GetBroadcaster()) { SdrHint aHint(SdrHintKind::EndEdit, *pTEObj); @@ -2408,11 +2409,17 @@ void SdrObjEditView::MarkListHasChanged() const SdrMarkList& rMarkList=GetMarkedObjectList(); if( rMarkList.GetMarkCount() == 1 ) { - const SdrObject* pObj= rMarkList.GetMark(0)->GetMarkedSdrObj(); + const SdrObject* pObj(rMarkList.GetMark(0)->GetMarkedSdrObj()); + SdrView* pView(dynamic_cast< SdrView* >(this)); + // check for table - if( pObj && (pObj->GetObjInventor() == SdrInventor::Default ) && (pObj->GetObjIdentifier() == OBJ_TABLE) ) + if(pObj && pView && (pObj->GetObjInventor() == SdrInventor::Default ) && (pObj->GetObjIdentifier() == OBJ_TABLE)) { - mxSelectionController = sdr::table::CreateTableController( this, static_cast<sdr::table::SdrTableObj const *>(pObj), mxLastSelectionController ); + mxSelectionController = sdr::table::CreateTableController( + *pView, + static_cast<const sdr::table::SdrTableObj&>(*pObj), + mxLastSelectionController); + if( mxSelectionController.is() ) { mxLastSelectionController.clear(); diff --git a/svx/source/svdraw/svdetc.cxx b/svx/source/svdraw/svdetc.cxx index 4b29e2c53efe..24479d6e8a06 100644 --- a/svx/source/svdraw/svdetc.cxx +++ b/svx/source/svdraw/svdetc.cxx @@ -531,9 +531,6 @@ namespace const SdrLayerIDSet& rVisLayers, Color& rCol) { - if(!rList.GetModel()) - return false; - bool bRet(false); bool bMaster(rList.GetPage() && rList.GetPage()->IsMasterPage()); @@ -576,9 +573,6 @@ namespace Color& rCol, bool bSkipBackgroundShape) { - if(!rPage.GetModel()) - return false; - bool bRet(impGetSdrObjListFillColor(rPage, rPnt, rTextEditPV, rVisLayers, rCol)); if(!bRet && !rPage.IsMasterPage()) diff --git a/svx/source/svdraw/svdfmtf.cxx b/svx/source/svdraw/svdfmtf.cxx index f3806362aba6..3f3a93565979 100644 --- a/svx/source/svdraw/svdfmtf.cxx +++ b/svx/source/svdraw/svdfmtf.cxx @@ -557,6 +557,7 @@ void ImpSdrGDIMetaFileImport::InsertObj(SdrObject* pObj, bool bScale) if(!aNewRange.isEmpty()) { pObj = new SdrPathObj( + *mpModel, aNewPoly.isClosed() ? OBJ_POLY : OBJ_PLIN, aNewPoly); @@ -686,7 +687,10 @@ void ImpSdrGDIMetaFileImport::DoAction(MetaLineAction const & rAct) if(bCreateLineObject) { - SdrPathObj* pPath = new SdrPathObj(OBJ_LINE, basegfx::B2DPolyPolygon(aLine)); + SdrPathObj* pPath = new SdrPathObj( + *mpModel, + OBJ_LINE, + basegfx::B2DPolyPolygon(aLine)); mnLineWidth = nNewLineWidth; maLineJoin = rLineInfo.GetLineJoin(); maLineCap = rLineInfo.GetLineCap(); @@ -705,14 +709,18 @@ void ImpSdrGDIMetaFileImport::DoAction(MetaLineAction const & rAct) void ImpSdrGDIMetaFileImport::DoAction(MetaRectAction const & rAct) { - SdrRectObj* pRect=new SdrRectObj(rAct.GetRect()); + SdrRectObj* pRect = new SdrRectObj( + *mpModel, + rAct.GetRect()); SetAttributes(pRect); InsertObj(pRect); } void ImpSdrGDIMetaFileImport::DoAction(MetaRoundRectAction const & rAct) { - SdrRectObj* pRect=new SdrRectObj(rAct.GetRect()); + SdrRectObj* pRect = new SdrRectObj( + *mpModel, + rAct.GetRect()); SetAttributes(pRect); long nRad=(rAct.GetHorzRound()+rAct.GetVertRound())/2; if (nRad!=0) { @@ -725,7 +733,10 @@ void ImpSdrGDIMetaFileImport::DoAction(MetaRoundRectAction const & rAct) void ImpSdrGDIMetaFileImport::DoAction(MetaEllipseAction const & rAct) { - SdrCircObj* pCirc=new SdrCircObj(OBJ_CIRC,rAct.GetRect()); + SdrCircObj* pCirc=new SdrCircObj( + *mpModel, + OBJ_CIRC, + rAct.GetRect()); SetAttributes(pCirc); InsertObj(pCirc); } @@ -735,7 +746,10 @@ void ImpSdrGDIMetaFileImport::DoAction(MetaArcAction const & rAct) Point aCenter(rAct.GetRect().Center()); long nStart=GetAngle(rAct.GetStartPoint()-aCenter); long nEnd=GetAngle(rAct.GetEndPoint()-aCenter); - SdrCircObj* pCirc=new SdrCircObj(OBJ_CARC,rAct.GetRect(),nStart,nEnd); + SdrCircObj* pCirc = new SdrCircObj( + *mpModel, + OBJ_CARC, + rAct.GetRect(),nStart,nEnd); SetAttributes(pCirc); InsertObj(pCirc); } @@ -745,7 +759,12 @@ void ImpSdrGDIMetaFileImport::DoAction(MetaPieAction const & rAct) Point aCenter(rAct.GetRect().Center()); long nStart=GetAngle(rAct.GetStartPoint()-aCenter); long nEnd=GetAngle(rAct.GetEndPoint()-aCenter); - SdrCircObj* pCirc=new SdrCircObj(OBJ_SECT,rAct.GetRect(),nStart,nEnd); + SdrCircObj* pCirc = new SdrCircObj( + *mpModel, + OBJ_SECT, + rAct.GetRect(), + nStart, + nEnd); SetAttributes(pCirc); InsertObj(pCirc); } @@ -755,7 +774,12 @@ void ImpSdrGDIMetaFileImport::DoAction(MetaChordAction const & rAct) Point aCenter(rAct.GetRect().Center()); long nStart=GetAngle(rAct.GetStartPoint()-aCenter); long nEnd=GetAngle(rAct.GetEndPoint()-aCenter); - SdrCircObj* pCirc=new SdrCircObj(OBJ_CCUT,rAct.GetRect(),nStart,nEnd); + SdrCircObj* pCirc = new SdrCircObj( + *mpModel, + OBJ_CCUT, + rAct.GetRect(), + nStart, + nEnd); SetAttributes(pCirc); InsertObj(pCirc); } @@ -911,6 +935,7 @@ void ImpSdrGDIMetaFileImport::DoAction( MetaPolyLineAction const & rAct ) if(bCreateLineObject) { SdrPathObj* pPath = new SdrPathObj( + *mpModel, aSource.isClosed() ? OBJ_POLY : OBJ_PLIN, basegfx::B2DPolyPolygon(aSource)); mnLineWidth = nNewLineWidth; @@ -942,7 +967,10 @@ void ImpSdrGDIMetaFileImport::DoAction( MetaPolygonAction const & rAct ) { // #i73407# make sure polygon is closed, it's a filled primitive aSource.setClosed(true); - SdrPathObj* pPath = new SdrPathObj(OBJ_POLY, basegfx::B2DPolyPolygon(aSource)); + SdrPathObj* pPath = new SdrPathObj( + *mpModel, + OBJ_POLY, + basegfx::B2DPolyPolygon(aSource)); SetAttributes(pPath); InsertObj(pPath, false); } @@ -963,7 +991,10 @@ void ImpSdrGDIMetaFileImport::DoAction(MetaPolyPolygonAction const & rAct) { // #i73407# make sure polygon is closed, it's a filled primitive aSource.setClosed(true); - SdrPathObj* pPath = new SdrPathObj(OBJ_POLY, aSource); + SdrPathObj* pPath = new SdrPathObj( + *mpModel, + OBJ_POLY, + aSource); SetAttributes(pPath); InsertObj(pPath, false); } @@ -990,7 +1021,10 @@ void ImpSdrGDIMetaFileImport::ImportText( const Point& rPos, const OUString& rSt aPos.AdjustY( -nTextHeight ); tools::Rectangle aTextRect( aPos, aSize ); - SdrRectObj* pText =new SdrRectObj( OBJ_TEXT, aTextRect ); + SdrRectObj* pText = new SdrRectObj( + *mpModel, + OBJ_TEXT, + aTextRect); pText->SetMergedItem ( makeSdrTextUpperDistItem (0)); pText->SetMergedItem ( makeSdrTextLowerDistItem (0)); @@ -1009,7 +1043,6 @@ void ImpSdrGDIMetaFileImport::ImportText( const Point& rPos, const OUString& rSt pText->SetMergedItem( makeSdrTextAutoGrowWidthItem( true ) ); } - pText->SetModel(mpModel); pText->SetLayer(mnLayer); pText->NbcSetText( rStr ); SetAttributes( pText, true ); @@ -1059,7 +1092,10 @@ void ImpSdrGDIMetaFileImport::DoAction(MetaBmpAction const & rAct) { tools::Rectangle aRect(rAct.GetPoint(),rAct.GetBitmap().GetSizePixel()); aRect.AdjustRight( 1 ); aRect.AdjustBottom( 1 ); - SdrGrafObj* pGraf=new SdrGrafObj(Graphic(rAct.GetBitmap()),aRect); + SdrGrafObj* pGraf = new SdrGrafObj( + *mpModel, + Graphic(rAct.GetBitmap()), + aRect); // This action is not creating line and fill, set directly, do not use SetAttributes(..) pGraf->SetMergedItem(XLineStyleItem(drawing::LineStyle_NONE)); @@ -1071,7 +1107,10 @@ void ImpSdrGDIMetaFileImport::DoAction(MetaBmpScaleAction const & rAct) { tools::Rectangle aRect(rAct.GetPoint(),rAct.GetSize()); aRect.AdjustRight( 1 ); aRect.AdjustBottom( 1 ); - SdrGrafObj* pGraf=new SdrGrafObj(Graphic(rAct.GetBitmap()),aRect); + SdrGrafObj* pGraf = new SdrGrafObj( + *mpModel, + Graphic(rAct.GetBitmap()), + aRect); // This action is not creating line and fill, set directly, do not use SetAttributes(..) pGraf->SetMergedItem(XLineStyleItem(drawing::LineStyle_NONE)); @@ -1083,7 +1122,10 @@ void ImpSdrGDIMetaFileImport::DoAction(MetaBmpExAction const & rAct) { tools::Rectangle aRect(rAct.GetPoint(),rAct.GetBitmapEx().GetSizePixel()); aRect.AdjustRight( 1 ); aRect.AdjustBottom( 1 ); - SdrGrafObj* pGraf=new SdrGrafObj( rAct.GetBitmapEx(), aRect ); + SdrGrafObj* pGraf = new SdrGrafObj( + *mpModel, + rAct.GetBitmapEx(), + aRect); // This action is not creating line and fill, set directly, do not use SetAttributes(..) pGraf->SetMergedItem(XLineStyleItem(drawing::LineStyle_NONE)); @@ -1095,7 +1137,10 @@ void ImpSdrGDIMetaFileImport::DoAction(MetaBmpExScaleAction const & rAct) { tools::Rectangle aRect(rAct.GetPoint(),rAct.GetSize()); aRect.AdjustRight( 1 ); aRect.AdjustBottom( 1 ); - SdrGrafObj* pGraf=new SdrGrafObj( rAct.GetBitmapEx(), aRect ); + SdrGrafObj* pGraf = new SdrGrafObj( + *mpModel, + rAct.GetBitmapEx(), + aRect); // This action is not creating line and fill, set directly, do not use SetAttributes(..) pGraf->SetMergedItem(XLineStyleItem(drawing::LineStyle_NONE)); @@ -1117,7 +1162,10 @@ void ImpSdrGDIMetaFileImport::DoAction( MetaHatchAction const & rAct ) if(!mbLastObjWasPolyWithoutLine || !CheckLastPolyLineAndFillMerge(aSource)) { const Hatch& rHatch = rAct.GetHatch(); - SdrPathObj* pPath = new SdrPathObj(OBJ_POLY, aSource); + SdrPathObj* pPath = new SdrPathObj( + *mpModel, + OBJ_POLY, + aSource); // #i125211# Use the ranges from the SdrObject to create a new empty SfxItemSet SfxItemSet aHatchAttr(mpModel->GetItemPool(), pPath->GetMergedItemSet().GetRanges()); css::drawing::HatchStyle eStyle; @@ -1207,7 +1255,10 @@ void ImpSdrGDIMetaFileImport::DoAction( MetaCommentAction const & rAct, GDIMetaF if(!mbLastObjWasPolyWithoutLine || !CheckLastPolyLineAndFillMerge(aSource)) { const Gradient& rGrad = pAct->GetGradient(); - SdrPathObj* pPath = new SdrPathObj(OBJ_POLY, aSource); + SdrPathObj* pPath = new SdrPathObj( + *mpModel, + OBJ_POLY, + aSource); // #i125211# Use the ranges from the SdrObject to create a new empty SfxItemSet SfxItemSet aGradAttr(mpModel->GetItemPool(), pPath->GetMergedItemSet().GetRanges()); XGradient aXGradient; @@ -1275,7 +1326,10 @@ void ImpSdrGDIMetaFileImport::DoAction(MetaBmpScalePartAction const & rAct) aRect.AdjustRight( 1 ); aRect.AdjustBottom( 1 ); aBitmap.Crop(tools::Rectangle(rAct.GetSrcPoint(), rAct.GetSrcSize())); - SdrGrafObj* pGraf = new SdrGrafObj(aBitmap, aRect); + SdrGrafObj* pGraf = new SdrGrafObj( + *mpModel, + aBitmap, + aRect); // This action is not creating line and fill, set directly, do not use SetAttributes(..) pGraf->SetMergedItem(XLineStyleItem(drawing::LineStyle_NONE)); @@ -1291,7 +1345,10 @@ void ImpSdrGDIMetaFileImport::DoAction(MetaBmpExScalePartAction const & rAct) aRect.AdjustRight( 1 ); aRect.AdjustBottom( 1 ); aBitmapEx.Crop(tools::Rectangle(rAct.GetSrcPoint(), rAct.GetSrcSize())); - SdrGrafObj* pGraf = new SdrGrafObj(aBitmapEx, aRect); + SdrGrafObj* pGraf = new SdrGrafObj( + *mpModel, + aBitmapEx, + aRect); // This action is not creating line and fill, set directly, do not use SetAttributes(..) pGraf->SetMergedItem(XLineStyleItem(drawing::LineStyle_NONE)); @@ -1305,7 +1362,10 @@ void ImpSdrGDIMetaFileImport::DoAction(MetaMaskAction const & rAct) BitmapEx aBitmapEx(rAct.GetBitmap(), rAct.GetColor()); aRect.AdjustRight( 1 ); aRect.AdjustBottom( 1 ); - SdrGrafObj* pGraf = new SdrGrafObj(aBitmapEx, aRect); + SdrGrafObj* pGraf = new SdrGrafObj( + *mpModel, + aBitmapEx, + aRect); // This action is not creating line and fill, set directly, do not use SetAttributes(..) pGraf->SetMergedItem(XLineStyleItem(drawing::LineStyle_NONE)); @@ -1319,7 +1379,10 @@ void ImpSdrGDIMetaFileImport::DoAction(MetaMaskScaleAction const & rAct) BitmapEx aBitmapEx(rAct.GetBitmap(), rAct.GetColor()); aRect.AdjustRight( 1 ); aRect.AdjustBottom( 1 ); - SdrGrafObj* pGraf = new SdrGrafObj(aBitmapEx, aRect); + SdrGrafObj* pGraf = new SdrGrafObj( + *mpModel, + aBitmapEx, + aRect); // This action is not creating line and fill, set directly, do not use SetAttributes(..) pGraf->SetMergedItem(XLineStyleItem(drawing::LineStyle_NONE)); @@ -1334,7 +1397,10 @@ void ImpSdrGDIMetaFileImport::DoAction(MetaMaskScalePartAction const & rAct) aRect.AdjustRight( 1 ); aRect.AdjustBottom( 1 ); aBitmapEx.Crop(tools::Rectangle(rAct.GetSrcPoint(), rAct.GetSrcSize())); - SdrGrafObj* pGraf = new SdrGrafObj(aBitmapEx, aRect); + SdrGrafObj* pGraf = new SdrGrafObj( + *mpModel, + aBitmapEx, + aRect); // This action is not creating line and fill, set directly, do not use SetAttributes(..) pGraf->SetMergedItem(XLineStyleItem(drawing::LineStyle_NONE)); @@ -1381,6 +1447,7 @@ void ImpSdrGDIMetaFileImport::DoAction(MetaGradientAction const & rAct) aRange.transform(aTransform); const Gradient& rGradient = rAct.GetGradient(); SdrRectObj* pRect = new SdrRectObj( + *mpModel, tools::Rectangle( floor(aRange.getMinX()), floor(aRange.getMinY()), @@ -1420,7 +1487,10 @@ void ImpSdrGDIMetaFileImport::DoAction(MetaTransparentAction const & rAct) aSource.transform(aTransform); aSource.setClosed(true); - SdrPathObj* pPath = new SdrPathObj(OBJ_POLY, aSource); + SdrPathObj* pPath = new SdrPathObj( + *mpModel, + OBJ_POLY, + aSource); SetAttributes(pPath); pPath->SetMergedItem(XFillTransparenceItem(rAct.GetTransparence())); InsertObj(pPath, false); @@ -1439,7 +1509,10 @@ void ImpSdrGDIMetaFileImport::DoAction(MetaGradientExAction const & rAct) if(!mbLastObjWasPolyWithoutLine || !CheckLastPolyLineAndFillMerge(aSource)) { const Gradient& rGradient = rAct.GetGradient(); - SdrPathObj* pPath = new SdrPathObj(OBJ_POLY, aSource); + SdrPathObj* pPath = new SdrPathObj( + *mpModel, + OBJ_POLY, + aSource); // #i125211# Use the ranges from the SdrObject to create a new empty SfxItemSet SfxItemSet aGradientAttr(mpModel->GetItemPool(), pPath->GetMergedItemSet().GetRanges()); const css::awt::GradientStyle aXGradientStyle(getXGradientStyleFromGradientStyle(rGradient.GetStyle())); @@ -1563,7 +1636,10 @@ void ImpSdrGDIMetaFileImport::DoAction(MetaFloatTransparentAction const & rAct) } // create and add object - SdrGrafObj* pGraf = new SdrGrafObj(aBitmapEx, aRect); + SdrGrafObj* pGraf = new SdrGrafObj( + *mpModel, + aBitmapEx, + aRect); // for MetaFloatTransparentAction, do not use SetAttributes(...) // since these metafile content is not used to draw line/fill diff --git a/svx/source/svdraw/svdglev.cxx b/svx/source/svdraw/svdglev.cxx index 64da87b646ab..3bbd461923fd 100644 --- a/svx/source/svdraw/svdglev.cxx +++ b/svx/source/svdraw/svdglev.cxx @@ -29,9 +29,10 @@ #include <svx/svdtrans.hxx> #include <svx/svdobj.hxx> - -SdrGlueEditView::SdrGlueEditView(SdrModel* pModel1, OutputDevice* pOut): - SdrPolyEditView(pModel1,pOut) +SdrGlueEditView::SdrGlueEditView( + SdrModel& rSdrModel, + OutputDevice* pOut) +: SdrPolyEditView(rSdrModel, pOut) { } @@ -39,7 +40,6 @@ SdrGlueEditView::~SdrGlueEditView() { } - void SdrGlueEditView::ImpDoMarkedGluePoints(PGlueDoFunc pDoFunc, bool bConst, const void* p1, const void* p2, const void* p3, const void* p4) { const size_t nMarkCount=GetMarkedObjectCount(); diff --git a/svx/source/svdraw/svdhdl.cxx b/svx/source/svdraw/svdhdl.cxx index 711a96e1dfff..b00b9671ece4 100644 --- a/svx/source/svdraw/svdhdl.cxx +++ b/svx/source/svdraw/svdhdl.cxx @@ -1351,8 +1351,8 @@ void SdrHdlGradient::FromIAOToItem(SdrObject* _pObj, bool bSetItemOnObject, bool if(bSetItemOnObject) { - SdrModel* pModel = _pObj->GetModel(); - SfxItemSet aNewSet(pModel->GetItemPool()); + SdrModel& rModel(_pObj->getSdrModelFromSdrObject()); + SfxItemSet aNewSet(rModel.GetItemPool()); if(IsGradient()) { @@ -1367,11 +1367,11 @@ void SdrHdlGradient::FromIAOToItem(SdrObject* _pObj, bool bSetItemOnObject, bool aNewSet.Put(aNewTransItem); } - if(bUndo && pModel->IsUndoEnabled()) + if(bUndo && rModel.IsUndoEnabled()) { - pModel->BegUndo(SvxResId(IsGradient() ? SIP_XA_FILLGRADIENT : SIP_XA_FILLTRANSPARENCE)); - pModel->AddUndo(pModel->GetSdrUndoFactory().CreateUndoAttrObject(*_pObj)); - pModel->EndUndo(); + rModel.BegUndo(SvxResId(IsGradient() ? SIP_XA_FILLGRADIENT : SIP_XA_FILLTRANSPARENCE)); + rModel.AddUndo(rModel.GetSdrUndoFactory().CreateUndoAttrObject(*_pObj)); + rModel.EndUndo(); } pObj->SetMergedItemSetAndBroadcast(aNewSet); diff --git a/svx/source/svdraw/svdmodel.cxx b/svx/source/svdraw/svdmodel.cxx index 04d0f701247e..bb237ba756cf 100644 --- a/svx/source/svdraw/svdmodel.cxx +++ b/svx/source/svdraw/svdmodel.cxx @@ -1323,7 +1323,7 @@ void SdrModel::InsertPage(SdrPage* pPage, sal_uInt16 nPos) PageListChanged(); pPage->SetInserted(); pPage->SetPageNum(nPos); - pPage->SetModel(this); + if (nPos<nCount) bPagNumsDirty=true; SetChanged(); SdrHint aHint(SdrHintKind::PageOrderChange, pPage); @@ -1372,10 +1372,11 @@ void SdrModel::InsertMasterPage(SdrPage* pPage, sal_uInt16 nPos) MasterPageListChanged(); pPage->SetInserted(); pPage->SetPageNum(nPos); - pPage->SetModel(this); + if (nPos<nCount) { bMPgNumsDirty=true; } + SetChanged(); SdrHint aHint(SdrHintKind::PageOrderChange, pPage); Broadcast(aHint); @@ -1476,7 +1477,10 @@ void SdrModel::CopyPages(sal_uInt16 nFirstPageNum, sal_uInt16 nLastPageNum, if (!bMoveNoCopy) { const SdrPage* pPg1=GetPage(nPageNum2); + + // Clone to local model pPg=pPg1->Clone(); + InsertPage(pPg,nDestNum); if (bUndo) AddUndo(GetSdrUndoFactory().CreateUndoCopyPage(*pPg)); @@ -1577,14 +1581,18 @@ void SdrModel::Merge(SdrModel& rSourceModel, if (pMasterMap && pMasterNeed && nMasterNeed!=0) { for (sal_uInt16 i=nSrcMasterPageCnt; i>0;) { i--; - if (pMasterNeed[i]) { - SdrPage* pPg=nullptr; - if (bTreadSourceAsConst) { - const SdrPage* pPg1=rSourceModel.GetMasterPage(i); - pPg=pPg1->Clone(); - } else { - pPg=rSourceModel.RemoveMasterPage(i); + if (pMasterNeed[i]) + { + // Always Clone to new model + const SdrPage* pPg1(rSourceModel.GetMasterPage(i)); + SdrPage* pPg(pPg1->Clone(this)); + + if(!bTreadSourceAsConst) + { + // if requested, delete original/modify original model + delete rSourceModel.RemoveMasterPage(i); } + if (pPg!=nullptr) { // Now append all of them to the end of the DstModel. // Don't use InsertMasterPage(), because everything is @@ -1592,7 +1600,6 @@ void SdrModel::Merge(SdrModel& rSourceModel, maMaPag.insert(maMaPag.begin()+nDstMasterPageCnt, pPg); MasterPageListChanged(); pPg->SetInserted(); - pPg->SetModel(this); bMPgNumsDirty=true; if (bUndo) AddUndo(GetSdrUndoFactory().CreateUndoNewPage(*pPg)); } else { @@ -1607,14 +1614,18 @@ void SdrModel::Merge(SdrModel& rSourceModel, sal_uInt16 nSourcePos=nFirstPageNum; sal_uInt16 nMergeCount=sal_uInt16(std::abs(static_cast<long>(static_cast<long>(nFirstPageNum)-nLastPageNum))+1); if (nDestPos>GetPageCount()) nDestPos=GetPageCount(); - while (nMergeCount>0) { - SdrPage* pPg=nullptr; - if (bTreadSourceAsConst) { - const SdrPage* pPg1=rSourceModel.GetPage(nSourcePos); - pPg=pPg1->Clone(); - } else { - pPg=rSourceModel.RemovePage(nSourcePos); + while (nMergeCount>0) + { + // Always Clone to new model + const SdrPage* pPg1(rSourceModel.GetPage(nSourcePos)); + SdrPage* pPg(pPg1->Clone(this)); + + if(!bTreadSourceAsConst) + { + // if requested, delete original/modify original model + delete rSourceModel.RemovePage(nSourcePos); } + if (pPg!=nullptr) { InsertPage(pPg,nDestPos); if (bUndo) AddUndo(GetSdrUndoFactory().CreateUndoNewPage(*pPg)); diff --git a/svx/source/svdraw/svdmrkv.cxx b/svx/source/svdraw/svdmrkv.cxx index 985b415ca3b6..07a5b2876361 100644 --- a/svx/source/svdraw/svdmrkv.cxx +++ b/svx/source/svdraw/svdmrkv.cxx @@ -144,15 +144,17 @@ void SdrMarkView::ImpClearVars() BrkMarkGluePoints(); } -SdrMarkView::SdrMarkView(SdrModel* pModel1, OutputDevice* pOut) -: SdrSnapView(pModel1,pOut), +SdrMarkView::SdrMarkView( + SdrModel& rSdrModel, + OutputDevice* pOut) +: SdrSnapView(rSdrModel, pOut), mpMarkObjOverlay(nullptr), mpMarkPointsOverlay(nullptr), mpMarkGluePointsOverlay(nullptr), maHdlList(this) { ImpClearVars(); - StartListening(*pModel1); + StartListening(rSdrModel); } SdrMarkView::~SdrMarkView() diff --git a/svx/source/svdraw/svdoashp.cxx b/svx/source/svdraw/svdoashp.cxx index 70c9faf7978b..783c5e9b5b58 100644 --- a/svx/source/svdraw/svdoashp.cxx +++ b/svx/source/svdraw/svdoashp.cxx @@ -810,8 +810,8 @@ sdr::properties::BaseProperties* SdrObjCustomShape::CreateObjectSpecificProperti return new sdr::properties::CustomShapeProperties(*this); } -SdrObjCustomShape::SdrObjCustomShape() - : SdrTextObj() +SdrObjCustomShape::SdrObjCustomShape(SdrModel& rSdrModel) +: SdrTextObj(rSdrModel) , fObjectRotation(0.0) , mbAdjustingTextFrameWidthAndHeight(false) , mpLastShadowGeometry(nullptr) @@ -1346,23 +1346,16 @@ void SdrObjCustomShape::TakeObjInfo(SdrObjTransformInfoRec& rInfo) const } } -void SdrObjCustomShape::SetModel(SdrModel* pNewModel) -{ - SdrTextObj::SetModel(pNewModel); - mXRenderedCustomShape.clear(); -} - sal_uInt16 SdrObjCustomShape::GetObjIdentifier() const { return sal_uInt16(OBJ_CUSTOMSHAPE); } - // #115391# This implementation is based on the TextFrame size of the CustomShape and the // state of the ResizeShapeToFitText flag to correctly set TextMinFrameWidth/Height void SdrObjCustomShape::AdaptTextMinSize() { - if (!pModel || (!pModel->IsCreatingDataObj() && !pModel->IsPasteResize())) + if (!getSdrModelFromSdrObject().IsCreatingDataObj() && !getSdrModelFromSdrObject().IsPasteResize()) { const bool bResizeShapeToFitText(GetObjectItem(SDRATTR_TEXT_AUTOGROWHEIGHT).GetValue()); SfxItemSet aSet( @@ -2232,7 +2225,7 @@ bool SdrObjCustomShape::AdjustTextFrameWidthAndHeight(tools::Rectangle& rR, bool { // Either we have text or the application has native text and suggested its size to us. bool bHasText = HasText() || (m_aSuggestedTextFrameSize.Width() != 0 && m_aSuggestedTextFrameSize.Height() != 0); - if ( pModel && bHasText && !rR.IsEmpty() ) + if ( bHasText && !rR.IsEmpty() ) { bool bWdtGrow=bWdt && IsAutoGrowWidth(); bool bHgtGrow=bHgt && IsAutoGrowHeight(); @@ -2243,7 +2236,7 @@ bool SdrObjCustomShape::AdjustTextFrameWidthAndHeight(tools::Rectangle& rR, bool long nWdt=0,nMinWdt=0,nMaxWdt=0; Size aSiz(rR.GetSize()); aSiz.AdjustWidth( -1 ); aSiz.AdjustHeight( -1 ); Size aMaxSiz(100000,100000); - Size aTmpSiz(pModel->GetMaxObjSize()); + Size aTmpSiz(getSdrModelFromSdrObject().GetMaxObjSize()); if (aTmpSiz.Width()!=0) aMaxSiz.setWidth(aTmpSiz.Width() ); if (aTmpSiz.Height()!=0) aMaxSiz.setHeight(aTmpSiz.Height() ); if (bWdtGrow) @@ -2499,8 +2492,8 @@ void SdrObjCustomShape::TakeTextEditArea(Size* pPaperMin, Size* pPaperMax, tools Size aAnkSiz(aViewInit.GetSize()); aAnkSiz.AdjustWidth( -1 ); aAnkSiz.AdjustHeight( -1 ); // because GetSize() adds 1 Size aMaxSiz(1000000,1000000); - if (pModel!=nullptr) { - Size aTmpSiz(pModel->GetMaxObjSize()); + { + Size aTmpSiz(getSdrModelFromSdrObject().GetMaxObjSize()); if (aTmpSiz.Width()!=0) aMaxSiz.setWidth(aTmpSiz.Width() ); if (aTmpSiz.Height()!=0) aMaxSiz.setHeight(aTmpSiz.Height() ); } @@ -2646,11 +2639,9 @@ void SdrObjCustomShape::TakeTextRect( SdrOutliner& rOutliner, tools::Rectangle& if (pPara) { - bool bHitTest = false; - if( pModel ) - bHitTest = &pModel->GetHitTestOutliner() == &rOutliner; - + bool bHitTest(&getSdrModelFromSdrObject().GetHitTestOutliner() == &rOutliner); const SdrTextObj* pTestObj = rOutliner.GetTextObj(); + if( !pTestObj || !bHitTest || pTestObj != this || pTestObj->GetOutlinerParaObject() != GetOutlinerParaObject() ) { @@ -2746,9 +2737,9 @@ void SdrObjCustomShape::NbcSetOutlinerParaObject(OutlinerParaObject* pTextObject InvalidateRenderGeometry(); } -SdrObjCustomShape* SdrObjCustomShape::Clone() const +SdrObjCustomShape* SdrObjCustomShape::Clone(SdrModel* pTargetModel) const { - return CloneHelper< SdrObjCustomShape >(); + return CloneHelper< SdrObjCustomShape >(pTargetModel); } SdrObjCustomShape& SdrObjCustomShape::operator=(const SdrObjCustomShape& rObj) @@ -2815,9 +2806,9 @@ SdrObject* SdrObjCustomShape::DoConvertToPolyObj(bool bBezier, bool bAddText) co if ( pRenderedCustomShape ) { + // Clone to same SdrModel SdrObject* pCandidate = pRenderedCustomShape->Clone(); DBG_ASSERT(pCandidate, "SdrObjCustomShape::DoConvertToPolyObj: Could not clone SdrObject (!)"); - pCandidate->SetModel(GetModel()); pRetval = pCandidate->DoConvertToPolyObj(bBezier, bAddText); SdrObject::Free( pCandidate ); @@ -2948,7 +2939,7 @@ void SdrObjCustomShape::TRSetBaseGeometry(const basegfx::B2DHomMatrix& rMatrix, } // if anchor is used, make position relative to it - if( pModel && pModel->IsWriter() ) + if(getSdrModelFromSdrObject().IsWriter()) { if(GetAnchorPos().X() || GetAnchorPos().Y()) { @@ -3065,7 +3056,7 @@ bool SdrObjCustomShape::TRGetBaseGeometry(basegfx::B2DHomMatrix& rMatrix, basegf basegfx::B2DTuple aTranslate(aRectangle.Left(), aRectangle.Top()); // position may be relative to anchorpos, convert - if( pModel && pModel->IsWriter() ) + if(getSdrModelFromSdrObject().IsWriter()) { if(GetAnchorPos().X() || GetAnchorPos().Y()) { diff --git a/svx/source/svdraw/svdoattr.cxx b/svx/source/svdraw/svdoattr.cxx index 1f118f838f84..f33a47e63ee5 100644 --- a/svx/source/svdraw/svdoattr.cxx +++ b/svx/source/svdraw/svdoattr.cxx @@ -80,7 +80,8 @@ sdr::properties::BaseProperties* SdrAttrObj::CreateObjectSpecificProperties() } -SdrAttrObj::SdrAttrObj() +SdrAttrObj::SdrAttrObj(SdrModel& rSdrModel) +: SdrObject(rSdrModel) { } @@ -99,26 +100,7 @@ const tools::Rectangle& SdrAttrObj::GetSnapRect() const return maSnapRect; } -void SdrAttrObj::SetModel(SdrModel* pNewModel) -{ - SdrModel* pOldModel = pModel; - - // test for correct pool in ItemSet; move to new pool if necessary - if(pNewModel && &GetObjectItemPool() != &pNewModel->GetItemPool()) - { - MigrateItemPool(&GetObjectItemPool(), &pNewModel->GetItemPool(), pNewModel); - } - - // call parent - SdrObject::SetModel(pNewModel); - - // modify properties - GetProperties().SetModel(pOldModel, pNewModel); -} - - // syntactical sugar for ItemSet accesses - void SdrAttrObj::Notify(SfxBroadcaster& /*rBC*/, const SfxHint& rHint) { bool bDataChg(SfxHintId::DataChanged == rHint.GetId()); diff --git a/svx/source/svdraw/svdobj.cxx b/svx/source/svdraw/svdobj.cxx index 6726c2eafda3..29b66b5cdf92 100644 --- a/svx/source/svdraw/svdobj.cxx +++ b/svx/source/svdraw/svdobj.cxx @@ -226,6 +226,10 @@ sdr::properties::BaseProperties& SdrObject::GetProperties() const { if(!mpProperties) { + // CAUTION(!) Do *not* call this during SdrObject construction, + // that will lead to wrong type-casts (dependent on costructor-level) + // and thus eventually create the wrong sdr::properties (!). Is there + // a way to check if on the stack is a SdrObject-constructor (?) const_cast< SdrObject* >(this)->mpProperties.reset( const_cast< SdrObject* >(this)->CreateObjectSpecificProperties() ); } @@ -284,10 +288,10 @@ void SdrObject::SetBoundRectDirty() } -SdrObject::SdrObject() : - mpFillGeometryDefiningShape(nullptr) +SdrObject::SdrObject(SdrModel& rSdrModel) +: mpFillGeometryDefiningShape(nullptr) + ,mrSdrModelFromSdrObject(rSdrModel) ,pPage(nullptr) - ,pModel(nullptr) ,pUserCall(nullptr) ,pPlusData(nullptr) ,mpImpl(new Impl) @@ -343,22 +347,7 @@ SdrObject::~SdrObject() // when they get called from ObjectInDestruction(). mpImpl->maObjectUsers.clear(); - try - { - SvxShape* pSvxShape = getSvxShape(); - if ( pSvxShape ) - { - OSL_ENSURE(!pSvxShape->HasSdrObjectOwnership(),"Please check where this call come from and replace it with SdrObject::Free"); - pSvxShape->InvalidateSdrObject(); - uno::Reference< lang::XComponent > xShapeComp( getWeakUnoShape(), uno::UNO_QUERY_THROW ); - xShapeComp->dispose(); - } - } - catch( const uno::Exception& ) - { - DBG_UNHANDLED_EXCEPTION("svx"); - } - + // UserCall SendUserCall(SdrUserCallType::Delete, GetLastBoundRect()); o3tl::reset_preserve_ptr_during(pPlusData); @@ -370,14 +359,38 @@ SdrObject::~SdrObject() void SdrObject::Free( SdrObject*& _rpObject ) { SdrObject* pObject = _rpObject; _rpObject = nullptr; - if ( pObject == nullptr ) + + if(nullptr == pObject) + { // nothing to do return; + } - SvxShape* pShape = pObject->getSvxShape(); - if ( pShape && pShape->HasSdrObjectOwnership() ) - // only the shape is allowed to delete me, and will reset the ownership before doing so - return; + SvxShape* pShape(pObject->getSvxShape()); + + if(pShape) + { + if(pShape->HasSdrObjectOwnership()) + { + // only the SvxShape is allowed to delete me, and will reset + // the ownership before doing so + return; + } + else + { + // not only delete pObject, but also need to dispose uno shape + try + { + pShape->InvalidateSdrObject(); + uno::Reference< lang::XComponent > xShapeComp( pObject->getWeakUnoShape(), uno::UNO_QUERY_THROW ); + xShapeComp->dispose(); + } + catch( const uno::Exception& ) + { + DBG_UNHANDLED_EXCEPTION("svx"); + } + } + } delete pObject; } @@ -393,28 +406,6 @@ void SdrObject::SetRectsDirty(bool bNotMyself) } } -void SdrObject::SetModel(SdrModel* pNewModel) -{ - if(pNewModel && pPage) - { - if(pPage->GetModel() != pNewModel) - { - pPage = nullptr; - } - } - - // update listeners at possible API wrapper object - if( pModel != pNewModel ) - { - SvxShape* pShape = getSvxShape(); - if( pShape ) - pShape->ChangeModel( pNewModel ); - } - - pModel = pNewModel; -} - - void SdrObject::SetObjList(SdrObjList* pNewObjList) { pObjList=pNewObjList; @@ -423,16 +414,23 @@ void SdrObject::SetObjList(SdrObjList* pNewObjList) void SdrObject::SetPage(SdrPage* pNewPage) { - SdrModel* pOldModel = pModel; - SdrPage* pOldPage = pPage; + SdrModel* pOldModel(&getSdrModelFromSdrObject()); + SdrPage* pOldPage(pPage); - pPage=pNewPage; - if (pPage!=nullptr) - { - SdrModel* pMod=pPage->GetModel(); - if (pMod!=pModel && pMod!=nullptr) - SetModel(pMod); - } + pPage = pNewPage; + + // TTTT Possibility here to add a warning for the future -> SdrModel + // of SdrObject (this) and SdrPage it it added to *have* to have the + // same SdrModel + // if(nullptr != pPage) + // { + // SdrModel* pMod(&pPage->getSdrModelFromSdrPage()); + // + // if(pMod != &getSdrModelFromSdrObject()) + // { + // SetModel(pMod); + // } + // } // The creation of the UNO shape in SdrObject::getUnoShape is influenced // by pPage, so when the page changes we need to discard the cached UNO @@ -440,7 +438,14 @@ void SdrObject::SetPage(SdrPage* pNewPage) // If the page is changing to another page with the same model, we // assume they create compatible UNO shape objects so we shouldn't have // to invalidate. - if (pOldPage != pPage && !(pOldPage && pPage && pOldModel == pModel)) + // TTTT: This causes quite some problems in SvxDrawPage::add when used + // e.g. from Writer - the SdrObject may be cloned to target model, and + // the xShape was added to it by purpose (see there). Thus it will be + // good to think about if this is really needed - it *seems* to be intended + // for a xShape being a on-demand-creatable resource - wit hthe argument that + // the SdrPage/UnoPage used influences the SvxShape creation. This uses + // ressources and would be nice to get rid of anyways. + if (pOldPage != pPage && !(pOldPage && pPage && pOldModel == &getSdrModelFromSdrObject())) { SvxShape* const pShape(getSvxShape()); if (pShape && !pShape->HasSdrObjectOwnership()) @@ -512,13 +517,9 @@ sal_Int16 SdrObject::GetRelativeHeightRelation() const return mpImpl->meRelativeHeightRelation; } -SfxItemPool & SdrObject::GetObjectItemPool() const +SfxItemPool& SdrObject::GetObjectItemPool() const { - if(pModel) - return pModel->GetItemPool(); - - // use a static global default pool - return SdrObject::GetGlobalDrawObjectItemPool(); + return getSdrModelFromSdrObject().GetItemPool(); } SdrInventor SdrObject::GetObjInventor() const @@ -636,7 +637,7 @@ void SdrObject::SetName(const OUString& rStr) { // Undo/Redo for setting object's name (#i73249#) bool bUndo( false ); - if ( GetModel() && GetModel()->IsUndoEnabled() ) + if ( getSdrModelFromSdrObject().IsUndoEnabled() ) { bUndo = true; SdrUndoAction* pUndoAction = @@ -645,14 +646,14 @@ void SdrObject::SetName(const OUString& rStr) SdrUndoObjStrAttr::ObjStrAttrType::Name, GetName(), rStr ); - GetModel()->BegUndo( pUndoAction->GetComment() ); - GetModel()->AddUndo( pUndoAction ); + getSdrModelFromSdrObject().BegUndo( pUndoAction->GetComment() ); + getSdrModelFromSdrObject().AddUndo( pUndoAction ); } pPlusData->aObjName = rStr; // Undo/Redo for setting object's name (#i73249#) if ( bUndo ) { - GetModel()->EndUndo(); + getSdrModelFromSdrObject().EndUndo(); } SetChanged(); BroadcastObjectChange(); @@ -680,7 +681,7 @@ void SdrObject::SetTitle(const OUString& rStr) { // Undo/Redo for setting object's title (#i73249#) bool bUndo( false ); - if ( GetModel() && GetModel()->IsUndoEnabled() ) + if ( getSdrModelFromSdrObject().IsUndoEnabled() ) { bUndo = true; SdrUndoAction* pUndoAction = @@ -689,14 +690,14 @@ void SdrObject::SetTitle(const OUString& rStr) SdrUndoObjStrAttr::ObjStrAttrType::Title, GetTitle(), rStr ); - GetModel()->BegUndo( pUndoAction->GetComment() ); - GetModel()->AddUndo( pUndoAction ); + getSdrModelFromSdrObject().BegUndo( pUndoAction->GetComment() ); + getSdrModelFromSdrObject().AddUndo( pUndoAction ); } pPlusData->aObjTitle = rStr; // Undo/Redo for setting object's title (#i73249#) if ( bUndo ) { - GetModel()->EndUndo(); + getSdrModelFromSdrObject().EndUndo(); } SetChanged(); BroadcastObjectChange(); @@ -724,7 +725,7 @@ void SdrObject::SetDescription(const OUString& rStr) { // Undo/Redo for setting object's description (#i73249#) bool bUndo( false ); - if ( GetModel() && GetModel()->IsUndoEnabled() ) + if ( getSdrModelFromSdrObject().IsUndoEnabled() ) { bUndo = true; SdrUndoAction* pUndoAction = @@ -733,14 +734,14 @@ void SdrObject::SetDescription(const OUString& rStr) SdrUndoObjStrAttr::ObjStrAttrType::Description, GetDescription(), rStr ); - GetModel()->BegUndo( pUndoAction->GetComment() ); - GetModel()->AddUndo( pUndoAction ); + getSdrModelFromSdrObject().BegUndo( pUndoAction->GetComment() ); + getSdrModelFromSdrObject().AddUndo( pUndoAction ); } pPlusData->aObjDescription = rStr; // Undo/Redo for setting object's description (#i73249#) if ( bUndo ) { - GetModel()->EndUndo(); + getSdrModelFromSdrObject().EndUndo(); } SetChanged(); BroadcastObjectChange(); @@ -835,7 +836,7 @@ const tools::Rectangle& SdrObject::GetLastBoundRect() const void SdrObject::RecalcBoundRect() { // #i101680# suppress BoundRect calculations on import(s) - if ((pModel && pModel->isLocked()) || utl::ConfigManager::IsFuzzing()) + if ((getSdrModelFromSdrObject().isLocked()) || utl::ConfigManager::IsFuzzing()) return; // central new method which will calculate the BoundRect using primitive geometry @@ -865,7 +866,7 @@ void SdrObject::RecalcBoundRect() void SdrObject::BroadcastObjectChange() const { - if ((pModel && pModel->isLocked()) || utl::ConfigManager::IsFuzzing()) + if ((getSdrModelFromSdrObject().isLocked()) || utl::ConfigManager::IsFuzzing()) return; if (mbDelayBroadcastObjectChange) @@ -875,7 +876,7 @@ void SdrObject::BroadcastObjectChange() const } bool bPlusDataBroadcast(pPlusData && pPlusData->pBroadcast); - bool bObjectChange(IsInserted() && pModel); + bool bObjectChange(IsInserted()); if(bPlusDataBroadcast || bObjectChange) { @@ -888,7 +889,7 @@ void SdrObject::BroadcastObjectChange() const if(bObjectChange) { - pModel->Broadcast(aHint); + getSdrModelFromSdrObject().Broadcast(aHint); } } } @@ -899,9 +900,13 @@ void SdrObject::SetChanged() // notification now. ActionChanged(); - if(IsInserted() && pModel) + // TTTT Need to check meaning/usage of IsInserted in one + // of the next changes. It should not mean to have a SdrModel + // set (this is guaranteed now), but should be connected to + // being added to a SdrPage (?) + if(IsInserted()) { - pModel->SetChanged(); + getSdrModelFromSdrObject().SetChanged(); } } @@ -929,9 +934,9 @@ bool SdrObject::HasLimitedRotation() const return false; } -SdrObject* SdrObject::Clone() const +SdrObject* SdrObject::Clone(SdrModel* pTargetModel) const { - return CloneHelper< SdrObject >(); + return CloneHelper< SdrObject >(pTargetModel); } SdrObject& SdrObject::operator=(const SdrObject& rObj) @@ -947,7 +952,6 @@ SdrObject& SdrObject::operator=(const SdrObject& rObj) // draw object, an SdrObject needs to be provided, as in the normal constructor. mpProperties.reset( &rObj.GetProperties().Clone(*this) ); - pModel =rObj.pModel; pPage = rObj.pPage; aOutRect=rObj.aOutRect; mnLayerID = rObj.mnLayerID; @@ -1021,19 +1025,9 @@ void SdrObject::ImpForcePlusData() pPlusData.reset( new SdrObjPlusData ); } -OUString SdrObject::GetAngleStr(long nAngle) const -{ - if (pModel!=nullptr) - return SdrModel::GetAngleString(nAngle); - - return OUString(); -} - OUString SdrObject::GetMetrStr(long nVal) const { - if (pModel!=nullptr) - return pModel->GetMetricString(nVal); - return OUString(); + return getSdrModelFromSdrObject().GetMetricString(nVal); } basegfx::B2DPolyPolygon SdrObject::TakeXorPoly() const @@ -2054,16 +2048,16 @@ void SdrObject::NbcApplyNotPersistAttr(const SfxItemSet& rAttr) if (rAttr.GetItemState(SDRATTR_LAYERID,true,&pPoolItem)==SfxItemState::SET) { nLayer=static_cast<const SdrLayerIdItem*>(pPoolItem)->GetValue(); } - if (rAttr.GetItemState(SDRATTR_LAYERNAME,true,&pPoolItem)==SfxItemState::SET && pModel!=nullptr) { - OUString aLayerName=static_cast<const SdrLayerNameItem*>(pPoolItem)->GetValue(); - const SdrLayerAdmin* pLayAd=pPage!=nullptr ? &pPage->GetLayerAdmin() : pModel!=nullptr ? &pModel->GetLayerAdmin() : nullptr; - if (pLayAd!=nullptr) { - const SdrLayer* pLayer=pLayAd->GetLayer(aLayerName); - if (pLayer!=nullptr) { - nLayer=pLayer->GetID(); - } - } + if (rAttr.GetItemState(SDRATTR_LAYERNAME,true,&pPoolItem)==SfxItemState::SET) + { + OUString aLayerName = static_cast<const SdrLayerNameItem*>(pPoolItem)->GetValue(); + const SdrLayerAdmin& rLayAd(nullptr != pPage ? pPage->GetLayerAdmin() : getSdrModelFromSdrObject().GetLayerAdmin()); + const SdrLayer* pLayer = rLayAd.GetLayer(aLayerName); + if(nullptr != pLayer) + { + nLayer=pLayer->GetID(); + } } if (nLayer!=SDRLAYER_NOTFOUND) { NbcSetLayer(nLayer); @@ -2126,12 +2120,11 @@ void SdrObject::TakeNotPersistAttr(SfxItemSet& rAttr) const } rAttr.Put(SdrLayerIdItem(GetLayer())); - const SdrLayerAdmin* pLayAd=pPage!=nullptr ? &pPage->GetLayerAdmin() : pModel!=nullptr ? &pModel->GetLayerAdmin() : nullptr; - if (pLayAd!=nullptr) { - const SdrLayer* pLayer=pLayAd->GetLayerPerID(GetLayer()); - if (pLayer!=nullptr) { - rAttr.Put(SdrLayerNameItem(pLayer->GetName())); - } + const SdrLayerAdmin& rLayAd(nullptr != pPage ? pPage->GetLayerAdmin() : getSdrModelFromSdrObject().GetLayerAdmin()); + const SdrLayer* pLayer = rLayAd.GetLayerPerID(GetLayer()); + if(nullptr != pLayer) + { + rAttr.Put(SdrLayerNameItem(pLayer->GetName())); } Point aRef1(rSnap.Center()); Point aRef2(aRef1); aRef2.AdjustY( 1 ); @@ -2309,15 +2302,15 @@ void extractLineContourFromPrimitive2DSequence( } -SdrObject* SdrObject::ImpConvertToContourObj(SdrObject* pRet, bool bForceLineDash) +SdrObject* SdrObject::ImpConvertToContourObj(bool bForceLineDash) { - bool bNoChange(true); + SdrObject* pRetval(nullptr); - if(pRet->LineGeometryUsageIsNecessary()) + if(LineGeometryUsageIsNecessary()) { basegfx::B2DPolyPolygon aMergedLineFillPolyPolygon; basegfx::B2DPolyPolygon aMergedHairlinePolyPolygon; - const drawinglayer::primitive2d::Primitive2DContainer xSequence(pRet->GetViewContact().getViewIndependentPrimitive2DContainer()); + const drawinglayer::primitive2d::Primitive2DContainer xSequence(GetViewContact().getViewIndependentPrimitive2DContainer()); if(!xSequence.empty()) { @@ -2345,7 +2338,7 @@ SdrObject* SdrObject::ImpConvertToContourObj(SdrObject* pRet, bool bForceLineDas if(aMergedLineFillPolyPolygon.count() || (bForceLineDash && aMergedHairlinePolyPolygon.count())) { - SfxItemSet aSet(pRet->GetMergedItemSet()); + SfxItemSet aSet(GetMergedItemSet()); drawing::FillStyle eOldFillStyle = aSet.Get(XATTR_FILLSTYLE).GetValue(); SdrPathObj* aLinePolygonPart = nullptr; SdrPathObj* aLineHairlinePart = nullptr; @@ -2354,8 +2347,10 @@ SdrObject* SdrObject::ImpConvertToContourObj(SdrObject* pRet, bool bForceLineDas if(aMergedLineFillPolyPolygon.count()) { // create SdrObject for filled line geometry - aLinePolygonPart = new SdrPathObj(OBJ_PATHFILL, aMergedLineFillPolyPolygon); - aLinePolygonPart->SetModel(pRet->GetModel()); + aLinePolygonPart = new SdrPathObj( + getSdrModelFromSdrObject(), + OBJ_PATHFILL, + aMergedLineFillPolyPolygon); // correct item properties aSet.Put(XLineWidthItem(0)); @@ -2375,8 +2370,10 @@ SdrObject* SdrObject::ImpConvertToContourObj(SdrObject* pRet, bool bForceLineDas // OBJ_PATHLINE is necessary here, not OBJ_PATHFILL. This is intended // to get a non-filled object. If the poly is closed, the PathObj takes care for // the correct closed state. - aLineHairlinePart = new SdrPathObj(OBJ_PATHLINE, aMergedHairlinePolyPolygon); - aLineHairlinePart->SetModel(pRet->GetModel()); + aLineHairlinePart = new SdrPathObj( + getSdrModelFromSdrObject(), + OBJ_PATHLINE, + aMergedHairlinePolyPolygon); aSet.Put(XLineWidthItem(0)); aSet.Put(XFillStyleItem(drawing::FillStyle_NONE)); @@ -2396,7 +2393,7 @@ SdrObject* SdrObject::ImpConvertToContourObj(SdrObject* pRet, bool bForceLineDas // check if original geometry should be added (e.g. filled and closed) bool bAddOriginalGeometry(false); - SdrPathObj* pPath = dynamic_cast<SdrPathObj*>( pRet ); + SdrPathObj* pPath = dynamic_cast<SdrPathObj*>(this); if(pPath && pPath->IsClosed()) { @@ -2409,20 +2406,17 @@ SdrObject* SdrObject::ImpConvertToContourObj(SdrObject* pRet, bool bForceLineDas // do we need a group? if(bBuildGroup || bAddOriginalGeometry) { - SdrObject* pGroup = new SdrObjGroup; - pGroup->SetModel(pRet->GetModel()); + SdrObject* pGroup = new SdrObjGroup(getSdrModelFromSdrObject()); if(bAddOriginalGeometry) { // Add a clone of the original geometry. aSet.ClearItem(); - aSet.Put(pRet->GetMergedItemSet()); + aSet.Put(GetMergedItemSet()); aSet.Put(XLineStyleItem(drawing::LineStyle_NONE)); aSet.Put(XLineWidthItem(0)); - SdrObject* pClone = pRet->Clone(); - - pClone->SetModel(pRet->GetModel()); + SdrObject* pClone = Clone(); pClone->SetMergedItemSet(aSet); pGroup->GetSubList()->NbcInsertObject(pClone); @@ -2438,38 +2432,30 @@ SdrObject* SdrObject::ImpConvertToContourObj(SdrObject* pRet, bool bForceLineDas pGroup->GetSubList()->NbcInsertObject(aLineHairlinePart); } - pRet = pGroup; - - // be more careful with the state describing bool - bNoChange = false; + pRetval = pGroup; } else { if(aLinePolygonPart) { - pRet = aLinePolygonPart; - // be more careful with the state describing bool - bNoChange = false; + pRetval = aLinePolygonPart; } else if(aLineHairlinePart) { - pRet = aLineHairlinePart; - // be more careful with the state describing bool - bNoChange = false; + pRetval = aLineHairlinePart; } } } } - if(bNoChange) + if(nullptr == pRetval) { // due to current method usage, create and return a clone when nothing has changed - SdrObject* pClone = pRet->Clone(); - pClone->SetModel(pRet->GetModel()); - pRet = pClone; + SdrObject* pClone = Clone(); + pRetval = pClone; } - return pRet; + return pRetval; } @@ -2497,8 +2483,7 @@ SdrObject* SdrObject::ConvertToContourObj(SdrObject* pRet, bool bForceLineDash) if(dynamic_cast<const SdrObjGroup*>( pRet) != nullptr) { SdrObjList* pObjList2 = pRet->GetSubList(); - SdrObject* pGroup = new SdrObjGroup; - pGroup->SetModel(pRet->GetModel()); + SdrObject* pGroup = new SdrObjGroup(getSdrModelFromSdrObject()); for(size_t a=0; a<pObjList2->GetObjCount(); ++a) { @@ -2518,7 +2503,7 @@ SdrObject* SdrObject::ConvertToContourObj(SdrObject* pRet, bool bForceLineDash) pPathObj->SetPathPoly(basegfx::utils::simplifyCurveSegments(pPathObj->GetPathPoly())); } - pRet = ImpConvertToContourObj(pRet, bForceLineDash); + pRet = pRet->ImpConvertToContourObj(bForceLineDash); } // #i73441# preserve LayerID @@ -2601,10 +2586,10 @@ void SdrObject::SetPrintable(bool bPrn) { bNoPrint=!bPrn; SetChanged(); - if (IsInserted() && pModel!=nullptr) + if (IsInserted()) { SdrHint aHint(SdrHintKind::ObjectChange, *this); - pModel->Broadcast(aHint); + getSdrModelFromSdrObject().Broadcast(aHint); } } } @@ -2615,10 +2600,10 @@ void SdrObject::SetVisible(bool bVisible) { mbVisible = bVisible; SetChanged(); - if (IsInserted() && pModel!=nullptr) + if (IsInserted()) { SdrHint aHint(SdrHintKind::ObjectChange, *this); - pModel->Broadcast(aHint); + getSdrModelFromSdrObject().Broadcast(aHint); } } } @@ -2744,15 +2729,6 @@ void SdrObject::SendUserCall(SdrUserCallType eUserCall, const tools::Rectangle& } } -// change ItemPool for this object -void SdrObject::MigrateItemPool(SfxItemPool* pSrcPool, SfxItemPool* pDestPool, SdrModel* pNewModel) -{ - if(pSrcPool && pDestPool && (pSrcPool != pDestPool)) - { - GetProperties().MoveToItemPool(pSrcPool, pDestPool, pNewModel); - } -} - void SdrObject::impl_setUnoShape( const uno::Reference< uno::XInterface >& _rxUnoShape ) { const uno::Reference< uno::XInterface>& xOldUnoShape( maWeakUnoShape ); @@ -2882,7 +2858,7 @@ bool SdrObject::TRGetBaseGeometry(basegfx::B2DHomMatrix& rMatrix, basegfx::B2DPo basegfx::B2DTuple aTranslate(aRectangle.Left(), aRectangle.Top()); // position maybe relative to anchorpos, convert - if( pModel && pModel->IsWriter() ) + if(getSdrModelFromSdrObject().IsWriter()) { if(GetAnchorPos().X() || GetAnchorPos().Y()) { @@ -2966,7 +2942,7 @@ void SdrObject::TRSetBaseGeometry(const basegfx::B2DHomMatrix& rMatrix, const ba } // if anchor is used, make position relative to it - if( pModel && pModel->IsWriter() ) + if(getSdrModelFromSdrObject().IsWriter()) { if(GetAnchorPos().X() || GetAnchorPos().Y()) { @@ -2985,9 +2961,7 @@ void SdrObject::TRSetBaseGeometry(const basegfx::B2DHomMatrix& rMatrix, const ba // Give info if object is in destruction bool SdrObject::IsInDestruction() const { - if(pModel) - return pModel->IsInDestruction(); - return false; + return getSdrModelFromSdrObject().IsInDestruction(); } // return if fill is != drawing::FillStyle_NONE @@ -3056,9 +3030,9 @@ SdrDelayBroadcastObjectChange::~SdrDelayBroadcastObjectChange() } -SdrObject* SdrObjFactory::CreateObjectFromFactory( SdrInventor nInventor, sal_uInt16 nObjIdentifier ) +SdrObject* SdrObjFactory::CreateObjectFromFactory(SdrModel& rSdrModel, SdrInventor nInventor, sal_uInt16 nObjIdentifier) { - SdrObjCreatorParams aParams { nInventor, nObjIdentifier }; + SdrObjCreatorParams aParams { nInventor, nObjIdentifier, rSdrModel }; for (const auto & i : ImpGetUserMakeObjHdl()) { SdrObject* pObj = i.Call(aParams); if (pObj) { @@ -3068,78 +3042,15 @@ SdrObject* SdrObjFactory::CreateObjectFromFactory( SdrInventor nInventor, sal_uI return nullptr; } -SdrObject* SdrObjFactory::MakeNewObject(SdrInventor nInvent, sal_uInt16 nIdent, SdrPage* pPage, SdrModel* pModel) -{ - if (!pModel && pPage) - pModel = pPage->GetModel(); - - SdrObject* pObj = nullptr; - - if (nInvent == SdrInventor::Default) - { - switch (nIdent) - { - case sal_uInt16(OBJ_NONE ): pObj=new SdrObject; break; - case sal_uInt16(OBJ_GRUP ): pObj=new SdrObjGroup; break; - case sal_uInt16(OBJ_LINE ): pObj=new SdrPathObj(OBJ_LINE ); break; - case sal_uInt16(OBJ_POLY ): pObj=new SdrPathObj(OBJ_POLY ); break; - case sal_uInt16(OBJ_PLIN ): pObj=new SdrPathObj(OBJ_PLIN ); break; - case sal_uInt16(OBJ_PATHLINE ): pObj=new SdrPathObj(OBJ_PATHLINE ); break; - case sal_uInt16(OBJ_PATHFILL ): pObj=new SdrPathObj(OBJ_PATHFILL ); break; - case sal_uInt16(OBJ_FREELINE ): pObj=new SdrPathObj(OBJ_FREELINE ); break; - case sal_uInt16(OBJ_FREEFILL ): pObj=new SdrPathObj(OBJ_FREEFILL ); break; - case sal_uInt16(OBJ_PATHPOLY ): pObj=new SdrPathObj(OBJ_POLY ); break; - case sal_uInt16(OBJ_PATHPLIN ): pObj=new SdrPathObj(OBJ_PLIN ); break; - case sal_uInt16(OBJ_EDGE ): pObj=new SdrEdgeObj; break; - case sal_uInt16(OBJ_RECT ): pObj=new SdrRectObj; break; - case sal_uInt16(OBJ_CIRC ): pObj=new SdrCircObj(OBJ_CIRC ); break; - case sal_uInt16(OBJ_SECT ): pObj=new SdrCircObj(OBJ_SECT ); break; - case sal_uInt16(OBJ_CARC ): pObj=new SdrCircObj(OBJ_CARC ); break; - case sal_uInt16(OBJ_CCUT ): pObj=new SdrCircObj(OBJ_CCUT ); break; - case sal_uInt16(OBJ_TEXT ): pObj=new SdrRectObj(OBJ_TEXT ); break; - case sal_uInt16(OBJ_TEXTEXT ): pObj=new SdrRectObj(OBJ_TEXTEXT ); break; - case sal_uInt16(OBJ_TITLETEXT ): pObj=new SdrRectObj(OBJ_TITLETEXT ); break; - case sal_uInt16(OBJ_OUTLINETEXT): pObj=new SdrRectObj(OBJ_OUTLINETEXT); break; - case sal_uInt16(OBJ_MEASURE ): pObj=new SdrMeasureObj; break; - case sal_uInt16(OBJ_GRAF ): pObj=new SdrGrafObj; break; - case sal_uInt16(OBJ_OLE2 ): pObj=new SdrOle2Obj; break; - case sal_uInt16(OBJ_FRAME ): pObj=new SdrOle2Obj(true); break; - case sal_uInt16(OBJ_CAPTION ): pObj=new SdrCaptionObj; break; - case sal_uInt16(OBJ_PAGE ): pObj=new SdrPageObj; break; - case sal_uInt16(OBJ_UNO ): pObj=new SdrUnoObj(OUString()); break; - case sal_uInt16(OBJ_CUSTOMSHAPE ): pObj=new SdrObjCustomShape(); break; -#if HAVE_FEATURE_AVMEDIA - case sal_uInt16(OBJ_MEDIA ): pObj=new SdrMediaObj(); break; -#endif - case sal_uInt16(OBJ_TABLE ): pObj=new sdr::table::SdrTableObj(pModel); break; - } - } - - if (!pObj) - pObj = CreateObjectFromFactory(nInvent, nIdent); - - if (!pObj) - { - // Well, if no one wants it... - return nullptr; - } - - if (pPage) - pObj->SetPage(pPage); - else if (pModel) - pObj->SetModel(pModel); - - return pObj; -} - SdrObject* SdrObjFactory::MakeNewObject( - SdrInventor nInventor, sal_uInt16 nIdentifier, const tools::Rectangle& rSnapRect, SdrPage* pPage ) + SdrModel& rSdrModel, + SdrInventor nInventor, + sal_uInt16 nIdentifier, + SdrPage* pPage, + const tools::Rectangle* pSnapRect) { - SdrModel* pModel = pPage ? pPage->GetModel() : nullptr; - - SdrObject* pObj = nullptr; - - bool bSetSnapRect = true; + SdrObject* pObj(nullptr); + bool bSetSnapRect(nullptr != pSnapRect); if (nInventor == SdrInventor::Default) { @@ -3147,15 +3058,44 @@ SdrObject* SdrObjFactory::MakeNewObject( { case OBJ_MEASURE: { - pObj = new SdrMeasureObj(rSnapRect.TopLeft(), rSnapRect.BottomRight()); + if(nullptr != pSnapRect) + { + pObj = new SdrMeasureObj( + rSdrModel, + pSnapRect->TopLeft(), + pSnapRect->BottomRight()); + } + else + { + pObj = new SdrMeasureObj(rSdrModel); + } } break; case OBJ_LINE: { - basegfx::B2DPolygon aPoly; - aPoly.append(basegfx::B2DPoint(rSnapRect.Left(), rSnapRect.Top())); - aPoly.append(basegfx::B2DPoint(rSnapRect.Right(), rSnapRect.Bottom())); - pObj = new SdrPathObj(OBJ_LINE, basegfx::B2DPolyPolygon(aPoly)); + if(nullptr != pSnapRect) + { + basegfx::B2DPolygon aPoly; + + aPoly.append( + basegfx::B2DPoint( + pSnapRect->Left(), + pSnapRect->Top())); + aPoly.append( + basegfx::B2DPoint( + pSnapRect->Right(), + pSnapRect->Bottom())); + pObj = new SdrPathObj( + rSdrModel, + OBJ_LINE, + basegfx::B2DPolyPolygon(aPoly)); + } + else + { + pObj = new SdrPathObj( + rSdrModel, + OBJ_LINE); + } } break; case OBJ_TEXT: @@ -3163,8 +3103,20 @@ SdrObject* SdrObjFactory::MakeNewObject( case OBJ_TITLETEXT: case OBJ_OUTLINETEXT: { - pObj = new SdrRectObj(static_cast<SdrObjKind>(nIdentifier), rSnapRect); - bSetSnapRect = false; + if(nullptr != pSnapRect) + { + pObj = new SdrRectObj( + rSdrModel, + static_cast<SdrObjKind>(nIdentifier), + *pSnapRect); + bSetSnapRect = false; + } + else + { + pObj = new SdrRectObj( + rSdrModel, + static_cast<SdrObjKind>(nIdentifier)); + } } break; case OBJ_CIRC: @@ -3172,38 +3124,52 @@ SdrObject* SdrObjFactory::MakeNewObject( case OBJ_CARC: case OBJ_CCUT: { - pObj = new SdrCircObj(static_cast<SdrObjKind>(nIdentifier), rSnapRect); - bSetSnapRect = false; + if(nullptr != pSnapRect) + { + pObj = new SdrCircObj( + rSdrModel, + static_cast<SdrObjKind>(nIdentifier), + *pSnapRect); + bSetSnapRect = false; + } + else + { + pObj = new SdrCircObj( + rSdrModel, + static_cast<SdrObjKind>(nIdentifier)); + } } break; - case sal_uInt16(OBJ_NONE ): pObj=new SdrObject; break; - case sal_uInt16(OBJ_GRUP ): pObj=new SdrObjGroup; break; - case sal_uInt16(OBJ_POLY ): pObj=new SdrPathObj(OBJ_POLY ); break; - case sal_uInt16(OBJ_PLIN ): pObj=new SdrPathObj(OBJ_PLIN ); break; - case sal_uInt16(OBJ_PATHLINE ): pObj=new SdrPathObj(OBJ_PATHLINE ); break; - case sal_uInt16(OBJ_PATHFILL ): pObj=new SdrPathObj(OBJ_PATHFILL ); break; - case sal_uInt16(OBJ_FREELINE ): pObj=new SdrPathObj(OBJ_FREELINE ); break; - case sal_uInt16(OBJ_FREEFILL ): pObj=new SdrPathObj(OBJ_FREEFILL ); break; - case sal_uInt16(OBJ_PATHPOLY ): pObj=new SdrPathObj(OBJ_POLY ); break; - case sal_uInt16(OBJ_PATHPLIN ): pObj=new SdrPathObj(OBJ_PLIN ); break; - case sal_uInt16(OBJ_EDGE ): pObj=new SdrEdgeObj; break; - case sal_uInt16(OBJ_RECT ): pObj=new SdrRectObj; break; - case sal_uInt16(OBJ_GRAF ): pObj=new SdrGrafObj; break; - case sal_uInt16(OBJ_OLE2 ): pObj=new SdrOle2Obj; break; - case sal_uInt16(OBJ_FRAME ): pObj=new SdrOle2Obj(true); break; - case sal_uInt16(OBJ_CAPTION ): pObj=new SdrCaptionObj; break; - case sal_uInt16(OBJ_PAGE ): pObj=new SdrPageObj; break; - case sal_uInt16(OBJ_UNO ): pObj=new SdrUnoObj(OUString()); break; - case sal_uInt16(OBJ_CUSTOMSHAPE ): pObj=new SdrObjCustomShape(); break; + case sal_uInt16(OBJ_NONE ): pObj=new SdrObject(rSdrModel); break; + case sal_uInt16(OBJ_GRUP ): pObj=new SdrObjGroup(rSdrModel); break; + case sal_uInt16(OBJ_POLY ): pObj=new SdrPathObj(rSdrModel, OBJ_POLY ); break; + case sal_uInt16(OBJ_PLIN ): pObj=new SdrPathObj(rSdrModel, OBJ_PLIN ); break; + case sal_uInt16(OBJ_PATHLINE ): pObj=new SdrPathObj(rSdrModel, OBJ_PATHLINE ); break; + case sal_uInt16(OBJ_PATHFILL ): pObj=new SdrPathObj(rSdrModel, OBJ_PATHFILL ); break; + case sal_uInt16(OBJ_FREELINE ): pObj=new SdrPathObj(rSdrModel, OBJ_FREELINE ); break; + case sal_uInt16(OBJ_FREEFILL ): pObj=new SdrPathObj(rSdrModel, OBJ_FREEFILL ); break; + case sal_uInt16(OBJ_PATHPOLY ): pObj=new SdrPathObj(rSdrModel, OBJ_POLY ); break; + case sal_uInt16(OBJ_PATHPLIN ): pObj=new SdrPathObj(rSdrModel, OBJ_PLIN ); break; + case sal_uInt16(OBJ_EDGE ): pObj=new SdrEdgeObj(rSdrModel); break; + case sal_uInt16(OBJ_RECT ): pObj=new SdrRectObj(rSdrModel); break; + case sal_uInt16(OBJ_GRAF ): pObj=new SdrGrafObj(rSdrModel); break; + case sal_uInt16(OBJ_OLE2 ): pObj=new SdrOle2Obj(rSdrModel); break; + case sal_uInt16(OBJ_FRAME ): pObj=new SdrOle2Obj(rSdrModel, true); break; + case sal_uInt16(OBJ_CAPTION ): pObj=new SdrCaptionObj(rSdrModel); break; + case sal_uInt16(OBJ_PAGE ): pObj=new SdrPageObj(rSdrModel); break; + case sal_uInt16(OBJ_UNO ): pObj=new SdrUnoObj(rSdrModel, OUString()); break; + case sal_uInt16(OBJ_CUSTOMSHAPE ): pObj=new SdrObjCustomShape(rSdrModel); break; #if HAVE_FEATURE_AVMEDIA - case sal_uInt16(OBJ_MEDIA ): pObj=new SdrMediaObj(); break; + case sal_uInt16(OBJ_MEDIA ): pObj=new SdrMediaObj(rSdrModel); break; #endif - case sal_uInt16(OBJ_TABLE ): pObj=new sdr::table::SdrTableObj(pModel); break; + case sal_uInt16(OBJ_TABLE ): pObj=new sdr::table::SdrTableObj(rSdrModel); break; } } if (!pObj) - pObj = CreateObjectFromFactory(nInventor, nIdentifier); + { + pObj = CreateObjectFromFactory(rSdrModel, nInventor, nIdentifier); + } if (!pObj) { @@ -3211,11 +3177,15 @@ SdrObject* SdrObjFactory::MakeNewObject( return nullptr; } - if (pPage) + if(nullptr != pPage) + { pObj->SetPage(pPage); + } - if (bSetSnapRect) - pObj->SetSnapRect(rSnapRect); + if(bSetSnapRect && nullptr != pSnapRect) + { + pObj->SetSnapRect(*pSnapRect); + } return pObj; } diff --git a/svx/source/svdraw/svdocapt.cxx b/svx/source/svdraw/svdocapt.cxx index 00cb7ded37ab..cd688f348842 100644 --- a/svx/source/svdraw/svdocapt.cxx +++ b/svx/source/svdraw/svdocapt.cxx @@ -189,16 +189,19 @@ sdr::contact::ViewContact* SdrCaptionObj::CreateObjectSpecificViewContact() } -SdrCaptionObj::SdrCaptionObj(): - SdrRectObj(OBJ_TEXT), +SdrCaptionObj::SdrCaptionObj(SdrModel& rSdrModel) +: SdrRectObj(rSdrModel, OBJ_TEXT), aTailPoly(3), // default size: 3 points = 2 lines mbSpecialTextBoxShadow(false), mbFixedTail(false) { } -SdrCaptionObj::SdrCaptionObj(const tools::Rectangle& rRect, const Point& rTail): - SdrRectObj(OBJ_TEXT,rRect), +SdrCaptionObj::SdrCaptionObj( + SdrModel& rSdrModel, + const tools::Rectangle& rRect, + const Point& rTail) +: SdrRectObj(rSdrModel, OBJ_TEXT,rRect), aTailPoly(3), // default size: 3 points = 2 lines mbSpecialTextBoxShadow(false), mbFixedTail(false) @@ -232,9 +235,23 @@ sal_uInt16 SdrCaptionObj::GetObjIdentifier() const return sal_uInt16(OBJ_CAPTION); } -SdrCaptionObj* SdrCaptionObj::Clone() const +SdrCaptionObj* SdrCaptionObj::Clone(SdrModel* pTargetModel) const { - return CloneHelper< SdrCaptionObj >(); + return CloneHelper< SdrCaptionObj >(pTargetModel); +} + +SdrCaptionObj& SdrCaptionObj::operator=(const SdrCaptionObj& rObj) +{ + if( this == &rObj ) + return *this; + SdrRectObj::operator=(rObj); + + aTailPoly = rObj.aTailPoly; + mbSpecialTextBoxShadow = rObj.mbSpecialTextBoxShadow; + mbFixedTail = rObj.mbFixedTail; + maFixedTailPos = rObj.maFixedTailPos; + + return *this; } OUString SdrCaptionObj::TakeObjNameSingul() const @@ -663,12 +680,6 @@ Point SdrCaptionObj::GetSnapPoint(sal_uInt32 /*i*/) const return Point(0,0); } -void SdrCaptionObj::SetModel(SdrModel* pNewModel) -{ - SdrRectObj::SetModel(pNewModel); - ImpRecalcTail(); -} - void SdrCaptionObj::Notify(SfxBroadcaster& rBC, const SfxHint& rHint) { SdrRectObj::Notify(rBC,rHint); @@ -706,8 +717,9 @@ SdrObject* SdrCaptionObj::DoConvertToPolyObj(bool bBezier, bool bAddText) const if (pOL!=nullptr) { pRet=pRect; bInsTail = false; } if (pOL==nullptr) pOL=pRect->GetSubList(); if (pOL!=nullptr) { pRet=pRect; bInsRect = false; } - if (pOL==nullptr) { - SdrObjGroup* pGrp=new SdrObjGroup; + if (pOL==nullptr) + { + SdrObjGroup* pGrp = new SdrObjGroup(getSdrModelFromSdrObject()); pOL=pGrp->GetSubList(); pRet=pGrp; } @@ -747,7 +759,8 @@ void SdrCaptionObj::TRSetBaseGeometry(const basegfx::B2DHomMatrix& rMatrix, cons handleNegativeScale(aScale, &fRotate); // force metric to pool metric - MapUnit eMapUnit = pModel->GetItemPool().GetMetric(0); + MapUnit eMapUnit(getSdrModelFromSdrObject().GetItemPool().GetMetric(0)); + if(eMapUnit != MapUnit::Map100thMM) { switch(eMapUnit) @@ -772,7 +785,7 @@ void SdrCaptionObj::TRSetBaseGeometry(const basegfx::B2DHomMatrix& rMatrix, cons } // if anchor is used, make position relative to it - if( pModel->IsWriter() ) + if(getSdrModelFromSdrObject().IsWriter()) { if(GetAnchorPos().X() || GetAnchorPos().Y()) { diff --git a/svx/source/svdraw/svdocirc.cxx b/svx/source/svdraw/svdocirc.cxx index dc87f9a5de9a..1dc049f07d17 100644 --- a/svx/source/svdraw/svdocirc.cxx +++ b/svx/source/svdraw/svdocirc.cxx @@ -104,8 +104,10 @@ sdr::contact::ViewContact* SdrCircObj::CreateObjectSpecificViewContact() return new sdr::contact::ViewContactOfSdrCircObj(*this); } - -SdrCircObj::SdrCircObj(SdrObjKind eNewKind) +SdrCircObj::SdrCircObj( + SdrModel& rSdrModel, + SdrObjKind eNewKind) +: SdrRectObj(rSdrModel) { nStartAngle=0; nEndAngle=36000; @@ -113,8 +115,11 @@ SdrCircObj::SdrCircObj(SdrObjKind eNewKind) bClosedObj=eNewKind!=OBJ_CARC; } -SdrCircObj::SdrCircObj(SdrObjKind eNewKind, const tools::Rectangle& rRect): - SdrRectObj(rRect) +SdrCircObj::SdrCircObj( + SdrModel& rSdrModel, + SdrObjKind eNewKind, + const tools::Rectangle& rRect) +: SdrRectObj(rSdrModel, rRect) { nStartAngle=0; nEndAngle=36000; @@ -122,8 +127,13 @@ SdrCircObj::SdrCircObj(SdrObjKind eNewKind, const tools::Rectangle& rRect): bClosedObj=eNewKind!=OBJ_CARC; } -SdrCircObj::SdrCircObj(SdrObjKind eNewKind, const tools::Rectangle& rRect, long nNewStartWink, long nNewEndWink): - SdrRectObj(rRect) +SdrCircObj::SdrCircObj( + SdrModel& rSdrModel, + SdrObjKind eNewKind, + const tools::Rectangle& rRect, + long nNewStartWink, + long nNewEndWink) +: SdrRectObj(rSdrModel, rRect) { long nAngleDif=nNewEndWink-nNewStartWink; nStartAngle=NormAngle360(nNewStartWink); @@ -338,9 +348,22 @@ OUString SdrCircObj::TakeObjNamePlural() const return ImpGetResStr(pID); } -SdrCircObj* SdrCircObj::Clone() const +SdrCircObj* SdrCircObj::Clone(SdrModel* pTargetModel) const +{ + return CloneHelper< SdrCircObj >(pTargetModel); +} + +SdrCircObj& SdrCircObj::operator=(const SdrCircObj& rObj) { - return CloneHelper< SdrCircObj >(); + if( this == &rObj ) + return *this; + SdrRectObj::operator=(rObj); + + meCircleKind = rObj.meCircleKind; + nStartAngle = rObj.nStartAngle; + nEndAngle = rObj.nEndAngle; + + return *this; } basegfx::B2DPolyPolygon SdrCircObj::TakeXorPoly() const @@ -576,7 +599,7 @@ OUString SdrCircObj::getSpecialDragComment(const SdrDragStat& rDrag) const nAngle = pU->nEnd; } - aBuf.append(GetAngleStr(nAngle)); + aBuf.append(SdrModel::GetAngleString(nAngle)); aBuf.append(')'); } @@ -594,7 +617,7 @@ OUString SdrCircObj::getSpecialDragComment(const SdrDragStat& rDrag) const ImpTakeDescriptionStr(STR_DragCircAngle, aStr); OUStringBuffer aBuf(aStr); aBuf.append(" ("); - aBuf.append(GetAngleStr(nAngle)); + aBuf.append(SdrModel::GetAngleString(nAngle)); aBuf.append(')'); return aBuf.makeStringAndClear(); diff --git a/svx/source/svdraw/svdoedge.cxx b/svx/source/svdraw/svdoedge.cxx index 45203c3d63cf..ce5a636a5e03 100644 --- a/svx/source/svdraw/svdoedge.cxx +++ b/svx/source/svdraw/svdoedge.cxx @@ -161,8 +161,8 @@ sdr::contact::ViewContact* SdrEdgeObj::CreateObjectSpecificViewContact() } -SdrEdgeObj::SdrEdgeObj() -: SdrTextObj(), +SdrEdgeObj::SdrEdgeObj(SdrModel& rSdrModel) +: SdrTextObj(rSdrModel), nNotifyingCount(0), bEdgeTrackDirty(false), bEdgeTrackUserDefined(false), @@ -520,13 +520,14 @@ void SdrEdgeObj::ImpSetTailPoint(bool bTail1, const Point& rPt) void SdrEdgeObj::ImpDirtyEdgeTrack() { - if ( !bEdgeTrackUserDefined || !(GetModel() && GetModel()->isLocked()) ) + if ( !bEdgeTrackUserDefined || !getSdrModelFromSdrObject().isLocked() ) bEdgeTrackDirty = true; } void SdrEdgeObj::ImpUndirtyEdgeTrack() { - if (bEdgeTrackDirty && (GetModel() && GetModel()->isLocked()) ) { + if (bEdgeTrackDirty && getSdrModelFromSdrObject().isLocked()) + { ImpRecalcEdgeTrack(); } } @@ -540,7 +541,7 @@ void SdrEdgeObj::ImpRecalcEdgeTrack() } // #i120437# also not when model locked during import, but remember - if(!GetModel() || GetModel()->isLocked()) + if(getSdrModelFromSdrObject().isLocked()) { mbSuppressed = true; return; @@ -1615,9 +1616,9 @@ void SdrEdgeObj::Reformat() } } -SdrEdgeObj* SdrEdgeObj::Clone() const +SdrEdgeObj* SdrEdgeObj::Clone(SdrModel* pTargetModel) const { - return CloneHelper< SdrEdgeObj >(); + return CloneHelper< SdrEdgeObj >(pTargetModel); } SdrEdgeObj& SdrEdgeObj::operator=(const SdrEdgeObj& rObj) @@ -2247,7 +2248,7 @@ void SdrEdgeObj::NbcResize(const Point& rRefPnt, const Fraction& aXFact, const F ResizeXPoly(*pEdgeTrack,rRefPnt,aXFact,aYFact); // if resize is not from paste, forget user distances - if (!GetModel() || !GetModel()->IsPasteResize()) + if (!getSdrModelFromSdrObject().IsPasteResize()) { aEdgeInfo.aObj1Line2 = Point(); aEdgeInfo.aObj1Line3 = Point(); diff --git a/svx/source/svdraw/svdograf.cxx b/svx/source/svdraw/svdograf.cxx index 1a00716fa088..e61a09da8e2b 100644 --- a/svx/source/svdraw/svdograf.cxx +++ b/svx/source/svdraw/svdograf.cxx @@ -216,8 +216,8 @@ void SdrGraphicLink::RemoveGraphicUpdater() ::sfx2::SvBaseLink::UpdateResult SdrGraphicLink::DataChanged( const OUString& rMimeType, const css::uno::Any & rValue ) { - SdrModel* pModel = rGrafObj.GetModel(); - sfx2::LinkManager* pLinkManager= pModel ? pModel->GetLinkManager() : nullptr; + SdrModel& rModel(rGrafObj.getSdrModelFromSdrObject()); + sfx2::LinkManager* pLinkManager(rModel.GetLinkManager()); if( pLinkManager && rValue.hasValue() ) { @@ -325,15 +325,14 @@ void SdrGrafObj::onGraphicChanged() } } - -SdrGrafObj::SdrGrafObj() - : SdrRectObj() - , mpGraphicObject(new GraphicObject) - , pGraphicLink(nullptr) - , bMirrored(false) - , mbIsSignatureLine(false) - , mbIsSignatureLineShowSignDate(true) - , mbIsSignatureLineCanAddComment(false) +SdrGrafObj::SdrGrafObj(SdrModel& rSdrModel) +: SdrRectObj(rSdrModel) + ,mpGraphicObject(new GraphicObject) + ,pGraphicLink(nullptr) + ,bMirrored(false) + ,mbIsSignatureLine(false) + ,mbIsSignatureLineShowSignDate(true) + ,mbIsSignatureLineCanAddComment(false) { mpGraphicObject->SetSwapStreamHdl( LINK(this, SdrGrafObj, ImpSwapHdl) ); onGraphicChanged(); @@ -352,14 +351,17 @@ SdrGrafObj::SdrGrafObj() mbSupportTextIndentingOnLineWidthChange = false; } -SdrGrafObj::SdrGrafObj(const Graphic& rGraphic, const tools::Rectangle& rRect) - : SdrRectObj(rRect) - , mpGraphicObject(new GraphicObject(rGraphic)) - , pGraphicLink(nullptr) - , bMirrored(false) - , mbIsSignatureLine(false) - , mbIsSignatureLineShowSignDate(true) - , mbIsSignatureLineCanAddComment(false) +SdrGrafObj::SdrGrafObj( + SdrModel& rSdrModel, + const Graphic& rGraphic, + const tools::Rectangle& rRect) +: SdrRectObj(rSdrModel, rRect) + ,mpGraphicObject(new GraphicObject(rGraphic)) + ,pGraphicLink(nullptr) + ,bMirrored(false) + ,mbIsSignatureLine(false) + ,mbIsSignatureLineShowSignDate(true) + ,mbIsSignatureLineCanAddComment(false) { mpGraphicObject->SetSwapStreamHdl( LINK(this, SdrGrafObj, ImpSwapHdl) ); onGraphicChanged(); @@ -378,14 +380,16 @@ SdrGrafObj::SdrGrafObj(const Graphic& rGraphic, const tools::Rectangle& rRect) mbSupportTextIndentingOnLineWidthChange = false; } -SdrGrafObj::SdrGrafObj(const Graphic& rGraphic) - : SdrRectObj() - , mpGraphicObject(new GraphicObject(rGraphic)) - , pGraphicLink(nullptr) - , bMirrored(false) - , mbIsSignatureLine(false) - , mbIsSignatureLineShowSignDate(true) - , mbIsSignatureLineCanAddComment(false) +SdrGrafObj::SdrGrafObj( + SdrModel& rSdrModel, + const Graphic& rGraphic) +: SdrRectObj(rSdrModel) + ,mpGraphicObject(new GraphicObject(rGraphic)) + ,pGraphicLink(nullptr) + ,bMirrored(false) + ,mbIsSignatureLine(false) + ,mbIsSignatureLineShowSignDate(true) + ,mbIsSignatureLineCanAddComment(false) { mpGraphicObject->SetSwapStreamHdl( LINK(this, SdrGrafObj, ImpSwapHdl) ); onGraphicChanged(); @@ -481,10 +485,12 @@ Graphic SdrGrafObj::GetTransformedGraphic( SdrGrafObjTransformsAttrs nTransformF { // Refactored most of the code to GraphicObject, where // everybody can use e.g. the cropping functionality - - MapMode aDestMap( pModel->GetScaleUnit(), Point(), pModel->GetScaleFraction(), pModel->GetScaleFraction() ); - const Size aDestSize( GetLogicRect().GetSize() ); - + MapMode aDestMap( + getSdrModelFromSdrObject().GetScaleUnit(), + Point(), + getSdrModelFromSdrObject().GetScaleFraction(), + getSdrModelFromSdrObject().GetScaleFraction()); + const Size aDestSize( GetLogicRect().GetSize() ); GraphicAttr aActAttr = GetGraphicAttr(nTransformFlags); // Delegate to moved code in GraphicObject @@ -559,11 +565,12 @@ const Size& SdrGrafObj::GetGrafPrefSize() const void SdrGrafObj::SetGrafStreamURL( const OUString& rGraphicStreamURL ) { mbIsPreview = false; + if( rGraphicStreamURL.isEmpty() ) { mpGraphicObject->SetUserData(); } - else if( pModel->IsSwapGraphics() ) + else if(getSdrModelFromSdrObject().IsSwapGraphics() ) { mpGraphicObject->SetUserData( rGraphicStreamURL ); } @@ -580,21 +587,20 @@ Size SdrGrafObj::getOriginalSize() const if (aGrafInfo.IsCropped()) { - long aCroppedTop = OutputDevice::LogicToLogic( aGrafInfo.GetTopCrop(), GetModel()->GetScaleUnit(), GetGrafPrefMapMode().GetMapUnit()); - long aCroppedBottom = OutputDevice::LogicToLogic( aGrafInfo.GetBottomCrop(), GetModel()->GetScaleUnit(), GetGrafPrefMapMode().GetMapUnit()); - long aCroppedLeft = OutputDevice::LogicToLogic( aGrafInfo.GetLeftCrop(), GetModel()->GetScaleUnit(), GetGrafPrefMapMode().GetMapUnit()); - long aCroppedRight = OutputDevice::LogicToLogic( aGrafInfo.GetRightCrop(), GetModel()->GetScaleUnit(), GetGrafPrefMapMode().GetMapUnit()); - - long aCroppedWidth = aSize.getWidth() - aCroppedLeft + aCroppedRight; - long aCroppedHeight = aSize.getHeight() - aCroppedTop + aCroppedBottom; + const long aCroppedTop(OutputDevice::LogicToLogic(aGrafInfo.GetTopCrop(), getSdrModelFromSdrObject().GetScaleUnit(), GetGrafPrefMapMode().GetMapUnit())); + const long aCroppedBottom(OutputDevice::LogicToLogic(aGrafInfo.GetBottomCrop(), getSdrModelFromSdrObject().GetScaleUnit(), GetGrafPrefMapMode().GetMapUnit())); + const long aCroppedLeft(OutputDevice::LogicToLogic(aGrafInfo.GetLeftCrop(), getSdrModelFromSdrObject().GetScaleUnit(), GetGrafPrefMapMode().GetMapUnit())); + const long aCroppedRight(OutputDevice::LogicToLogic(aGrafInfo.GetRightCrop(), getSdrModelFromSdrObject().GetScaleUnit(), GetGrafPrefMapMode().GetMapUnit())); + const long aCroppedWidth(aSize.getWidth() - aCroppedLeft + aCroppedRight); + const long aCroppedHeight(aSize.getHeight() - aCroppedTop + aCroppedBottom); aSize = Size ( aCroppedWidth, aCroppedHeight); } if ( GetGrafPrefMapMode().GetMapUnit() == MapUnit::MapPixel ) - aSize = Application::GetDefaultDevice()->PixelToLogic(aSize, MapMode(GetModel()->GetScaleUnit())); + aSize = Application::GetDefaultDevice()->PixelToLogic(aSize, MapMode(getSdrModelFromSdrObject().GetScaleUnit())); else - aSize = OutputDevice::LogicToLogic(aSize, GetGrafPrefMapMode(), MapMode(GetModel()->GetScaleUnit())); + aSize = OutputDevice::LogicToLogic(aSize, GetGrafPrefMapMode(), MapMode(getSdrModelFromSdrObject().GetScaleUnit())); return aSize; } @@ -629,7 +635,7 @@ void SdrGrafObj::ForceSwapIn() const void SdrGrafObj::ImpRegisterLink() { - sfx2::LinkManager* pLinkManager = pModel != nullptr ? pModel->GetLinkManager() : nullptr; + sfx2::LinkManager* pLinkManager(getSdrModelFromSdrObject().GetLinkManager()); if( pLinkManager != nullptr && pGraphicLink == nullptr ) { @@ -645,7 +651,7 @@ void SdrGrafObj::ImpRegisterLink() void SdrGrafObj::ImpDeregisterLink() { - sfx2::LinkManager* pLinkManager = pModel != nullptr ? pModel->GetLinkManager() : nullptr; + sfx2::LinkManager* pLinkManager(getSdrModelFromSdrObject().GetLinkManager()); if( pLinkManager != nullptr && pGraphicLink!=nullptr) { @@ -730,11 +736,11 @@ bool SdrGrafObj::ImpUpdateGraphicLink( bool bAsynchron ) const void SdrGrafObj::ImpSetLinkedGraphic( const Graphic& rGraphic ) { - const bool bIsChanged = GetModel()->IsChanged(); + const bool bIsChanged(getSdrModelFromSdrObject().IsChanged()); NbcSetGraphic( rGraphic ); ActionChanged(); BroadcastObjectChange(); - GetModel()->SetChanged( bIsChanged ); + getSdrModelFromSdrObject().SetChanged(bIsChanged); } OUString SdrGrafObj::TakeObjNameSingul() const @@ -894,9 +900,9 @@ SdrObject* SdrGrafObj::getFullDragClone() const return pRetval; } -SdrGrafObj* SdrGrafObj::Clone() const +SdrGrafObj* SdrGrafObj::Clone(SdrModel* pTargetModel) const { - return CloneHelper< SdrGrafObj >(); + return CloneHelper< SdrGrafObj >(pTargetModel); } SdrGrafObj& SdrGrafObj::operator=( const SdrGrafObj& rObj ) @@ -1016,14 +1022,14 @@ void SdrGrafObj::SetPage( SdrPage* pNewPage ) ImpDeregisterLink(); } - if(!pModel && !GetStyleSheet() && pNewPage && pNewPage->GetModel()) + if(!GetStyleSheet() && pNewPage) { // #i119287# Set default StyleSheet for SdrGrafObj here, it is different from 'Default'. This // needs to be done before the style 'Default' is set from the :SetModel() call which is triggered // from the following :SetPage(). // TTTT: Needs to be moved in branch aw080 due to having a SdrModel from the beginning, is at this // place for convenience currently (works in both versions, is not in the way) - SfxStyleSheet* pSheet = pNewPage->GetModel()->GetDefaultStyleSheetForSdrGrafObjAndSdrOle2Obj(); + SfxStyleSheet* pSheet(pNewPage->getSdrModelFromSdrPage().GetDefaultStyleSheetForSdrGrafObjAndSdrOle2Obj()); if(pSheet) { @@ -1042,28 +1048,6 @@ void SdrGrafObj::SetPage( SdrPage* pNewPage ) ImpRegisterLink(); } -void SdrGrafObj::SetModel( SdrModel* pNewModel ) -{ - bool bChg = pNewModel != pModel; - - if( bChg ) - { - if( mpGraphicObject->HasUserData() ) - { - ForceSwapIn(); - } - - if( pGraphicLink != nullptr ) - ImpDeregisterLink(); - } - - // realize model - SdrRectObj::SetModel(pNewModel); - - if (bChg && !aFileName.isEmpty()) - ImpRegisterLink(); -} - void SdrGrafObj::StartAnimation() { SetGrafAnimationAllowed(true); @@ -1083,11 +1067,15 @@ GDIMetaFile SdrGrafObj::getMetafileFromEmbeddedVectorGraphicData() const { GDIMetaFile aRetval; - if(isEmbeddedVectorGraphicData() && GetModel()) + if(isEmbeddedVectorGraphicData()) { ScopedVclPtrInstance< VirtualDevice > pOut; const tools::Rectangle aBoundRect(GetCurrentBoundRect()); - const MapMode aMap(GetModel()->GetScaleUnit(), Point(), GetModel()->GetScaleFraction(), GetModel()->GetScaleFraction()); + const MapMode aMap( + getSdrModelFromSdrObject().GetScaleUnit(), + Point(), + getSdrModelFromSdrObject().GetScaleFraction(), + getSdrModelFromSdrObject().GetScaleFraction()); pOut->EnableOutput(false); pOut->SetMapMode(aMap); @@ -1132,8 +1120,11 @@ SdrObject* SdrGrafObj::DoConvertToPolyObj(bool bBezier, bool bAddText ) const case GraphicType::GdiMetafile: { // Sort into group and return ONLY those objects that can be created from the MetaFile. - ImpSdrGDIMetaFileImport aFilter(*GetModel(), GetLayer(), maRect); - SdrObjGroup* pGrp = new SdrObjGroup(); + ImpSdrGDIMetaFileImport aFilter( + getSdrModelFromSdrObject(), + GetLayer(), + maRect); + SdrObjGroup* pGrp = new SdrObjGroup(getSdrModelFromSdrObject()); if(aFilter.DoImport(aMtf, *pGrp->GetSubList(), 0)) { @@ -1156,7 +1147,6 @@ SdrObject* SdrGrafObj::DoConvertToPolyObj(bool bBezier, bool bAddText ) const pRetval = pGrp; pGrp->NbcSetLayer(GetLayer()); - pGrp->SetModel(GetModel()); if(bAddText) { @@ -1198,10 +1188,8 @@ SdrObject* SdrGrafObj::DoConvertToPolyObj(bool bBezier, bool bAddText ) const if(!pGrp) { - pGrp = new SdrObjGroup(); - + pGrp = new SdrObjGroup(getSdrModelFromSdrObject()); pGrp->NbcSetLayer(GetLayer()); - pGrp->SetModel(GetModel()); pGrp->GetSubList()->NbcInsertObject(pRetval); } @@ -1335,7 +1323,7 @@ IMPL_LINK(SdrGrafObj, ReplacementSwapHdl, const GraphicObject*, pO, SvStream*) // replacement image is always swapped if (pO->IsInSwapOut()) { - SdrSwapGraphicsMode const nSwapMode(pModel->GetSwapGraphicsMode()); + SdrSwapGraphicsMode const nSwapMode(getSdrModelFromSdrObject().GetSwapGraphicsMode()); if (nSwapMode & SdrSwapGraphicsMode::TEMP) { return GRFMGR_AUTOSWAPSTREAM_TEMP; @@ -1359,13 +1347,13 @@ IMPL_LINK( SdrGrafObj, ImpSwapHdl, const GraphicObject*, pO, SvStream* ) if( pO->IsInSwapOut() ) { - if( pModel && !mbIsPreview && pModel->IsSwapGraphics() && mpGraphicObject->GetSizeBytes() > 20480 ) + if( !mbIsPreview && getSdrModelFromSdrObject().IsSwapGraphics() && mpGraphicObject->GetSizeBytes() > 20480 ) { // test if this object is visualized from someone // ## test only if there are VOCs other than the preview renderer if(!GetViewContact().HasViewObjectContacts()) { - const SdrSwapGraphicsMode nSwapMode = pModel->GetSwapGraphicsMode(); + const SdrSwapGraphicsMode nSwapMode = getSdrModelFromSdrObject().GetSwapGraphicsMode(); if( ( pGraphicLink ) && ( nSwapMode & SdrSwapGraphicsMode::PURGE ) ) @@ -1391,78 +1379,73 @@ IMPL_LINK( SdrGrafObj, ImpSwapHdl, const GraphicObject*, pO, SvStream* ) else if( pO->IsInSwapIn() ) { // can be loaded from the original document stream later - if( pModel != nullptr ) + if(mpGraphicObject->HasUserData()) { - if(mpGraphicObject->HasUserData()) + ::comphelper::LifecycleProxy proxy; + OUString aUserData = mpGraphicObject->GetUserData(); + uno::Reference<io::XInputStream> const xStream( + getSdrModelFromSdrObject().GetDocumentStream(aUserData, proxy)); + + std::unique_ptr<SvStream> const pStream( (xStream.is()) + ? ::utl::UcbStreamHelper::CreateStream(xStream) + : nullptr ); + + if( pStream != nullptr ) { - ::comphelper::LifecycleProxy proxy; - OUString aUserData = mpGraphicObject->GetUserData(); - uno::Reference<io::XInputStream> const xStream( - pModel->GetDocumentStream(aUserData, proxy)); + Graphic aGraphic; - std::unique_ptr<SvStream> const pStream( (xStream.is()) - ? ::utl::UcbStreamHelper::CreateStream(xStream) - : nullptr ); + std::unique_ptr<css::uno::Sequence< css::beans::PropertyValue > > pFilterData; - if( pStream != nullptr ) + if(mbInsidePaint && !GetViewContact().HasViewObjectContacts()) { - Graphic aGraphic; - - std::unique_ptr<css::uno::Sequence< css::beans::PropertyValue > > pFilterData; + pFilterData.reset(new css::uno::Sequence< css::beans::PropertyValue >( 3 )); + + const css::awt::Size aPreviewSizeHint( 64, 64 ); + const bool bAllowPartialStreamRead = true; + // create <GfxLink> instance also for previews in order to avoid that its corresponding + // data is cleared in the graphic cache entry in case that the preview data equals the complete graphic data + const bool bCreateNativeLink = true; + (*pFilterData)[ 0 ].Name = "PreviewSizeHint"; + (*pFilterData)[ 0 ].Value <<= aPreviewSizeHint; + (*pFilterData)[ 1 ].Name = "AllowPartialStreamRead"; + (*pFilterData)[ 1 ].Value <<= bAllowPartialStreamRead; + (*pFilterData)[ 2 ].Name = "CreateNativeLink"; + (*pFilterData)[ 2 ].Value <<= bCreateNativeLink; + + mbIsPreview = true; + } - if(mbInsidePaint && !GetViewContact().HasViewObjectContacts()) + if(!GraphicFilter::GetGraphicFilter().ImportGraphic( + aGraphic, aUserData, *pStream, + GRFILTER_FORMAT_DONTKNOW, nullptr, GraphicFilterImportFlags::NONE, pFilterData.get())) + { + const OUString aNewUserData( mpGraphicObject->GetUserData() ); + mpGraphicObject->SetGraphic( aGraphic ); + if( mbIsPreview ) { - pFilterData.reset(new css::uno::Sequence< css::beans::PropertyValue >( 3 )); - - const css::awt::Size aPreviewSizeHint( 64, 64 ); - const bool bAllowPartialStreamRead = true; - // create <GfxLink> instance also for previews in order to avoid that its corresponding - // data is cleared in the graphic cache entry in case that the preview data equals the complete graphic data - const bool bCreateNativeLink = true; - (*pFilterData)[ 0 ].Name = "PreviewSizeHint"; - (*pFilterData)[ 0 ].Value <<= aPreviewSizeHint; - (*pFilterData)[ 1 ].Name = "AllowPartialStreamRead"; - (*pFilterData)[ 1 ].Value <<= bAllowPartialStreamRead; - (*pFilterData)[ 2 ].Name = "CreateNativeLink"; - (*pFilterData)[ 2 ].Value <<= bCreateNativeLink; - - mbIsPreview = true; + mpGraphicObject->SetUserData(aNewUserData); } - - if(!GraphicFilter::GetGraphicFilter().ImportGraphic( - aGraphic, aUserData, *pStream, - GRFILTER_FORMAT_DONTKNOW, nullptr, GraphicFilterImportFlags::NONE, pFilterData.get())) + else { - const OUString aNewUserData( mpGraphicObject->GetUserData() ); - mpGraphicObject->SetGraphic( aGraphic ); - if( mbIsPreview ) - { - mpGraphicObject->SetUserData(aNewUserData); - } - else - { - mpGraphicObject->SetUserData(); - } - - // Graphic successfully swapped in. - pRet = GRFMGR_AUTOSWAPSTREAM_LOADED; + mpGraphicObject->SetUserData(); } - pFilterData.reset(); - pStream->ResetError(); + // Graphic successfully swapped in. + pRet = GRFMGR_AUTOSWAPSTREAM_LOADED; } - } - else if( !ImpUpdateGraphicLink( false ) ) - { - pRet = GRFMGR_AUTOSWAPSTREAM_TEMP; - } - else - { - pRet = GRFMGR_AUTOSWAPSTREAM_LOADED; + pFilterData.reset(); + + pStream->ResetError(); } } - else + else if( !ImpUpdateGraphicLink( false ) ) + { pRet = GRFMGR_AUTOSWAPSTREAM_TEMP; + } + else + { + pRet = GRFMGR_AUTOSWAPSTREAM_LOADED; + } } return pRet; @@ -1481,30 +1464,27 @@ Reference< XInputStream > SdrGrafObj::getInputStream() { Reference< XInputStream > xStream; - if( pModel ) + if (mpGraphicObject && GetGraphic().IsLink()) { - if (mpGraphicObject && GetGraphic().IsLink()) + Graphic aGraphic( GetGraphic() ); + GfxLink aLink( aGraphic.GetLink() ); + sal_uInt32 nSize = aLink.GetDataSize(); + const void* pSourceData = static_cast<const void*>(aLink.GetData()); + if( nSize && pSourceData ) { - Graphic aGraphic( GetGraphic() ); - GfxLink aLink( aGraphic.GetLink() ); - sal_uInt32 nSize = aLink.GetDataSize(); - const void* pSourceData = static_cast<const void*>(aLink.GetData()); - if( nSize && pSourceData ) - { - sal_uInt8 * pBuffer = new sal_uInt8[ nSize ]; - memcpy( pBuffer, pSourceData, nSize ); + sal_uInt8 * pBuffer = new sal_uInt8[ nSize ]; + memcpy( pBuffer, pSourceData, nSize ); - SvMemoryStream* pStream = new SvMemoryStream( static_cast<void*>(pBuffer), static_cast<std::size_t>(nSize), StreamMode::READ ); - pStream->ObjectOwnsMemory( true ); - xStream.set( new utl::OInputStreamWrapper( pStream, true ) ); - } + SvMemoryStream* pStream = new SvMemoryStream( static_cast<void*>(pBuffer), static_cast<std::size_t>(nSize), StreamMode::READ ); + pStream->ObjectOwnsMemory( true ); + xStream.set( new utl::OInputStreamWrapper( pStream, true ) ); } + } - if (!xStream.is() && !aFileName.isEmpty()) - { - SvFileStream* pStream = new SvFileStream( aFileName, StreamMode::READ ); - xStream.set( new utl::OInputStreamWrapper( pStream ) ); - } + if (!xStream.is() && !aFileName.isEmpty()) + { + SvFileStream* pStream = new SvFileStream( aFileName, StreamMode::READ ); + xStream.set( new utl::OInputStreamWrapper( pStream ) ); } return xStream; diff --git a/svx/source/svdraw/svdogrp.cxx b/svx/source/svdraw/svdogrp.cxx index d2151f14f4e4..6311106c4e2f 100644 --- a/svx/source/svdraw/svdogrp.cxx +++ b/svx/source/svdraw/svdogrp.cxx @@ -50,32 +50,28 @@ #include <basegfx/polygon/b2dpolygon.hxx> #include <libxml/xmlwriter.h> - // BaseProperties section - sdr::properties::BaseProperties* SdrObjGroup::CreateObjectSpecificProperties() { return new sdr::properties::GroupProperties(*this); } - // DrawContact section - sdr::contact::ViewContact* SdrObjGroup::CreateObjectSpecificViewContact() { return new sdr::contact::ViewContactOfGroup(*this); } - -SdrObjGroup::SdrObjGroup() +SdrObjGroup::SdrObjGroup(SdrModel& rSdrModel) +: SdrObject(rSdrModel), + maSdrObjList(), + aRefPoint(0, 0) { - pSub.reset( new SdrObjList(nullptr,nullptr) ); - pSub->SetOwnerObj(this); - pSub->SetListKind(SdrObjListKind::GroupObj); + maSdrObjList.SetOwnerObj(this); + maSdrObjList.SetListKind(SdrObjListKind::GroupObj); bClosedObj=false; } - SdrObjGroup::~SdrObjGroup() { } @@ -83,10 +79,9 @@ SdrObjGroup::~SdrObjGroup() void SdrObjGroup::TakeObjInfo(SdrObjTransformInfoRec& rInfo) const { rInfo.bNoContortion=false; - SdrObjList* pOL=pSub.get(); - const size_t nObjCount = pOL->GetObjCount(); + const size_t nObjCount = maSdrObjList.GetObjCount(); for (size_t i=0; i<nObjCount; ++i) { - SdrObject* pObj=pOL->GetObj(i); + SdrObject* pObj=maSdrObjList.GetObj(i); SdrObjTransformInfoRec aInfo; pObj->TakeObjInfo(aInfo); if (!aInfo.bMoveAllowed ) rInfo.bMoveAllowed =false; @@ -145,10 +140,9 @@ SdrLayerID SdrObjGroup::GetLayer() const { bool b1st = true; SdrLayerID nLay = SdrObject::GetLayer(); - SdrObjList* pOL=pSub.get(); - const size_t nObjCount = pOL->GetObjCount(); + const size_t nObjCount = maSdrObjList.GetObjCount(); for (size_t i=0; i<nObjCount; ++i) { - SdrLayerID nLay1=pOL->GetObj(i)->GetLayer(); + SdrLayerID nLay1=maSdrObjList.GetObj(i)->GetLayer(); if (b1st) { nLay=nLay1; b1st = false; } else if (nLay1!=nLay) return SdrLayerID(0); } @@ -159,10 +153,9 @@ SdrLayerID SdrObjGroup::GetLayer() const void SdrObjGroup::NbcSetLayer(SdrLayerID nLayer) { SdrObject::NbcSetLayer(nLayer); - SdrObjList* pOL=pSub.get(); - const size_t nObjCount = pOL->GetObjCount(); + const size_t nObjCount = maSdrObjList.GetObjCount(); for (size_t i=0; i<nObjCount; ++i) { - pOL->GetObj(i)->NbcSetLayer(nLayer); + maSdrObjList.GetObj(i)->NbcSetLayer(nLayer); } } @@ -170,58 +163,27 @@ void SdrObjGroup::NbcSetLayer(SdrLayerID nLayer) void SdrObjGroup::SetObjList(SdrObjList* pNewObjList) { SdrObject::SetObjList(pNewObjList); - pSub->SetUpList(pNewObjList); + maSdrObjList.SetUpList(pNewObjList); } void SdrObjGroup::SetPage(SdrPage* pNewPage) { SdrObject::SetPage(pNewPage); - pSub->SetPage(pNewPage); -} - - -void SdrObjGroup::SetModel(SdrModel* pNewModel) -{ - if(pNewModel!=pModel) - { - // #i30648# - // This method also needs to migrate the used ItemSet - // when the destination model uses a different pool - // than the current one. Else it is possible to create - // SdrObjGroups which reference the old pool which might - // be destroyed (as the bug shows). - SdrModel* pOldModel = pModel; - - // test for correct pool in ItemSet; move to new pool if necessary - if(pNewModel && &GetObjectItemPool() != &pNewModel->GetItemPool()) - { - MigrateItemPool(&GetObjectItemPool(), &pNewModel->GetItemPool(), pNewModel); - } - - // call parent - SdrObject::SetModel(pNewModel); - - // set new model at content - pSub->SetModel(pNewModel); - - // modify properties - GetProperties().SetModel(pOldModel, pNewModel); - } + maSdrObjList.SetPage(pNewPage); } - SdrObjList* SdrObjGroup::GetSubList() const { - return pSub.get(); + return const_cast< SdrObjList* >(&maSdrObjList); } const tools::Rectangle& SdrObjGroup::GetCurrentBoundRect() const { // <aOutRect> has to contain the bounding rectangle - if ( pSub->GetObjCount()!=0 ) + if ( maSdrObjList.GetObjCount()!=0 ) { - const_cast<SdrObjGroup*>(this)->aOutRect = pSub->GetAllObjBoundRect(); + const_cast<SdrObjGroup*>(this)->aOutRect = maSdrObjList.GetAllObjBoundRect(); } return aOutRect; @@ -230,9 +192,9 @@ const tools::Rectangle& SdrObjGroup::GetCurrentBoundRect() const const tools::Rectangle& SdrObjGroup::GetSnapRect() const { // <aOutRect> has to contain the bounding rectangle - if ( pSub->GetObjCount()!=0 ) + if ( maSdrObjList.GetObjCount()!=0 ) { - return pSub->GetAllObjSnapRect(); + return maSdrObjList.GetAllObjSnapRect(); } else { @@ -240,24 +202,24 @@ const tools::Rectangle& SdrObjGroup::GetSnapRect() const } } -SdrObjGroup* SdrObjGroup::Clone() const +SdrObjGroup* SdrObjGroup::Clone(SdrModel* pTargetModel) const { - return CloneHelper< SdrObjGroup >(); + return CloneHelper< SdrObjGroup >(pTargetModel); } SdrObjGroup& SdrObjGroup::operator=(const SdrObjGroup& rObj) { if( this == &rObj ) return *this; + // copy SdrObject stuff SdrObject::operator=(rObj); // #i36404# // copy SubList, init model and page first SdrObjList& rSourceSubList = *rObj.GetSubList(); - pSub->SetPage(rSourceSubList.GetPage()); - pSub->SetModel(rSourceSubList.GetModel()); - pSub->CopyObjects(*rObj.GetSubList()); + maSdrObjList.SetPage(rSourceSubList.GetPage()); + maSdrObjList.CopyObjects(*rObj.GetSubList()); // copy local parameters aRefPoint = rObj.aRefPoint; @@ -269,7 +231,7 @@ OUString SdrObjGroup::TakeObjNameSingul() const { OUStringBuffer sName; - if(!pSub->GetObjCount()) + if(!maSdrObjList.GetObjCount()) { sName.append(ImpGetResStr(STR_ObjNameSingulGRUPEMPTY)); } @@ -294,7 +256,7 @@ OUString SdrObjGroup::TakeObjNameSingul() const OUString SdrObjGroup::TakeObjNamePlural() const { - if (pSub->GetObjCount()==0) + if (maSdrObjList.GetObjCount()==0) return ImpGetResStr(STR_ObjNamePluralGRUPEMPTY); return ImpGetResStr(STR_ObjNamePluralGRUP); } @@ -308,11 +270,11 @@ void SdrObjGroup::RecalcSnapRect() basegfx::B2DPolyPolygon SdrObjGroup::TakeXorPoly() const { basegfx::B2DPolyPolygon aRetval; - const size_t nObjCount(pSub->GetObjCount()); + const size_t nObjCount(maSdrObjList.GetObjCount()); for(size_t a = 0; a < nObjCount; ++a) { - SdrObject* pObj = pSub->GetObj(a); + SdrObject* pObj = maSdrObjList.GetObj(a); aRetval.append(pObj->TakeXorPoly()); } @@ -341,9 +303,9 @@ long SdrObjGroup::GetRotateAngle() const { long nRetval(0); - if(pSub->GetObjCount()) + if(maSdrObjList.GetObjCount()) { - SdrObject* pObj = pSub->GetObj(0); + SdrObject* pObj = maSdrObjList.GetObj(0); nRetval = pObj->GetRotateAngle(); } @@ -356,9 +318,9 @@ long SdrObjGroup::GetShearAngle(bool /*bVertical*/) const { long nRetval(0); - if(pSub->GetObjCount()) + if(maSdrObjList.GetObjCount()) { - SdrObject* pObj = pSub->GetObj(0); + SdrObject* pObj = maSdrObjList.GetObj(0); nRetval = pObj->GetShearAngle(); } @@ -396,11 +358,10 @@ void SdrObjGroup::NbcSetLogicRect(const tools::Rectangle& rRect) void SdrObjGroup::NbcMove(const Size& rSiz) { aRefPoint.Move(rSiz); - if (pSub->GetObjCount()!=0) { - SdrObjList* pOL=pSub.get(); - const size_t nObjCount = pOL->GetObjCount(); + if (maSdrObjList.GetObjCount()!=0) { + const size_t nObjCount = maSdrObjList.GetObjCount(); for (size_t i=0; i<nObjCount; ++i) { - SdrObject* pObj=pOL->GetObj(i); + SdrObject* pObj=maSdrObjList.GetObj(i); pObj->NbcMove(rSiz); } } else { @@ -428,11 +389,10 @@ void SdrObjGroup::NbcResize(const Point& rRef, const Fraction& xFact, const Frac } } ResizePoint(aRefPoint,rRef,xFact,yFact); - if (pSub->GetObjCount()!=0) { - SdrObjList* pOL=pSub.get(); - const size_t nObjCount = pOL->GetObjCount(); + if (maSdrObjList.GetObjCount()!=0) { + const size_t nObjCount = maSdrObjList.GetObjCount(); for (size_t i=0; i<nObjCount; ++i) { - SdrObject* pObj=pOL->GetObj(i); + SdrObject* pObj=maSdrObjList.GetObj(i); pObj->NbcResize(rRef,xFact,yFact); } } else { @@ -446,10 +406,9 @@ void SdrObjGroup::NbcRotate(const Point& rRef, long nAngle, double sn, double cs { SetGlueReallyAbsolute(true); RotatePoint(aRefPoint,rRef,sn,cs); - SdrObjList* pOL=pSub.get(); - const size_t nObjCount = pOL->GetObjCount(); + const size_t nObjCount = maSdrObjList.GetObjCount(); for (size_t i=0; i<nObjCount; ++i) { - SdrObject* pObj=pOL->GetObj(i); + SdrObject* pObj=maSdrObjList.GetObj(i); pObj->NbcRotate(rRef,nAngle,sn,cs); } NbcRotateGluePoints(rRef,nAngle,sn,cs); @@ -461,10 +420,9 @@ void SdrObjGroup::NbcMirror(const Point& rRef1, const Point& rRef2) { SetGlueReallyAbsolute(true); MirrorPoint(aRefPoint,rRef1,rRef2); // implementation missing in SvdEtc! - SdrObjList* pOL=pSub.get(); - const size_t nObjCount = pOL->GetObjCount(); + const size_t nObjCount = maSdrObjList.GetObjCount(); for (size_t i=0; i<nObjCount; ++i) { - SdrObject* pObj=pOL->GetObj(i); + SdrObject* pObj=maSdrObjList.GetObj(i); pObj->NbcMirror(rRef1,rRef2); } NbcMirrorGluePoints(rRef1,rRef2); @@ -476,10 +434,9 @@ void SdrObjGroup::NbcShear(const Point& rRef, long nAngle, double tn, bool bVShe { SetGlueReallyAbsolute(true); ShearPoint(aRefPoint,rRef,tn); - SdrObjList* pOL=pSub.get(); - const size_t nObjCount = pOL->GetObjCount(); + const size_t nObjCount = maSdrObjList.GetObjCount(); for (size_t i=0; i<nObjCount; ++i) { - SdrObject* pObj=pOL->GetObj(i); + SdrObject* pObj=maSdrObjList.GetObj(i); pObj->NbcShear(rRef,nAngle,tn,bVShear); } NbcShearGluePoints(rRef,tn,bVShear); @@ -492,10 +449,9 @@ void SdrObjGroup::NbcSetAnchorPos(const Point& rPnt) aAnchor=rPnt; Size aSiz(rPnt.X()-aAnchor.X(),rPnt.Y()-aAnchor.Y()); aRefPoint.Move(aSiz); - SdrObjList* pOL=pSub.get(); - const size_t nObjCount=pOL->GetObjCount(); + const size_t nObjCount=maSdrObjList.GetObjCount(); for (size_t i=0; i<nObjCount; ++i) { - SdrObject* pObj=pOL->GetObj(i); + SdrObject* pObj=maSdrObjList.GetObj(i); pObj->NbcSetAnchorPos(rPnt); } } @@ -537,16 +493,15 @@ void SdrObjGroup::Move(const Size& rSiz) if (rSiz.Width()!=0 || rSiz.Height()!=0) { tools::Rectangle aBoundRect0; if (pUserCall!=nullptr) aBoundRect0=GetLastBoundRect(); aRefPoint.Move(rSiz); - if (pSub->GetObjCount()!=0) { + if (maSdrObjList.GetObjCount()!=0) { // first move the connectors, then everything else - SdrObjList* pOL=pSub.get(); - const size_t nObjCount = pOL->GetObjCount(); + const size_t nObjCount = maSdrObjList.GetObjCount(); for (size_t i=0; i<nObjCount; ++i) { - SdrObject* pObj=pOL->GetObj(i); + SdrObject* pObj=maSdrObjList.GetObj(i); if (pObj->IsEdgeObj()) pObj->Move(rSiz); } for (size_t i=0; i<nObjCount; ++i) { - SdrObject* pObj=pOL->GetObj(i); + SdrObject* pObj=maSdrObjList.GetObj(i); if (!pObj->IsEdgeObj()) pObj->Move(rSiz); } } else { @@ -581,16 +536,15 @@ void SdrObjGroup::Resize(const Point& rRef, const Fraction& xFact, const Fractio } tools::Rectangle aBoundRect0; if (pUserCall!=nullptr) aBoundRect0=GetLastBoundRect(); ResizePoint(aRefPoint,rRef,xFact,yFact); - if (pSub->GetObjCount()!=0) { + if (maSdrObjList.GetObjCount()!=0) { // move the connectors first, everything else afterwards - SdrObjList* pOL=pSub.get(); - const size_t nObjCount = pOL->GetObjCount(); + const size_t nObjCount = maSdrObjList.GetObjCount(); for (size_t i=0; i<nObjCount; ++i) { - SdrObject* pObj=pOL->GetObj(i); + SdrObject* pObj=maSdrObjList.GetObj(i); if (pObj->IsEdgeObj()) pObj->Resize(rRef,xFact,yFact,bUnsetRelative); } for (size_t i=0; i<nObjCount; ++i) { - SdrObject* pObj=pOL->GetObj(i); + SdrObject* pObj=maSdrObjList.GetObj(i); if (!pObj->IsEdgeObj()) pObj->Resize(rRef,xFact,yFact,bUnsetRelative); } } else { @@ -614,14 +568,13 @@ void SdrObjGroup::Rotate(const Point& rRef, long nAngle, double sn, double cs) tools::Rectangle aBoundRect0; if (pUserCall!=nullptr) aBoundRect0=GetLastBoundRect(); RotatePoint(aRefPoint,rRef,sn,cs); // move the connectors first, everything else afterwards - SdrObjList* pOL=pSub.get(); - const size_t nObjCount = pOL->GetObjCount(); + const size_t nObjCount = maSdrObjList.GetObjCount(); for (size_t i=0; i<nObjCount; ++i) { - SdrObject* pObj=pOL->GetObj(i); + SdrObject* pObj=maSdrObjList.GetObj(i); if (pObj->IsEdgeObj()) pObj->Rotate(rRef,nAngle,sn,cs); } for (size_t i=0; i<nObjCount; ++i) { - SdrObject* pObj=pOL->GetObj(i); + SdrObject* pObj=maSdrObjList.GetObj(i); if (!pObj->IsEdgeObj()) pObj->Rotate(rRef,nAngle,sn,cs); } NbcRotateGluePoints(rRef,nAngle,sn,cs); @@ -638,14 +591,13 @@ void SdrObjGroup::Mirror(const Point& rRef1, const Point& rRef2) tools::Rectangle aBoundRect0; if (pUserCall!=nullptr) aBoundRect0=GetLastBoundRect(); MirrorPoint(aRefPoint,rRef1,rRef2); // implementation missing in SvdEtc! // move the connectors first, everything else afterwards - SdrObjList* pOL=pSub.get(); - const size_t nObjCount = pOL->GetObjCount(); + const size_t nObjCount = maSdrObjList.GetObjCount(); for (size_t i=0; i<nObjCount; ++i) { - SdrObject* pObj=pOL->GetObj(i); + SdrObject* pObj=maSdrObjList.GetObj(i); if (pObj->IsEdgeObj()) pObj->Mirror(rRef1,rRef2); } for (size_t i=0; i<nObjCount; ++i) { - SdrObject* pObj=pOL->GetObj(i); + SdrObject* pObj=maSdrObjList.GetObj(i); if (!pObj->IsEdgeObj()) pObj->Mirror(rRef1,rRef2); } NbcMirrorGluePoints(rRef1,rRef2); @@ -665,14 +617,13 @@ void SdrObjGroup::Shear(const Point& rRef, long nAngle, double tn, bool bVShear) tools::Rectangle aBoundRect0; if (pUserCall!=nullptr) aBoundRect0=GetLastBoundRect(); ShearPoint(aRefPoint,rRef,tn); // move the connectors first, everything else afterwards - SdrObjList* pOL=pSub.get(); - const size_t nObjCount = pOL->GetObjCount(); + const size_t nObjCount = maSdrObjList.GetObjCount(); for (size_t i=0; i<nObjCount; ++i) { - SdrObject* pObj=pOL->GetObj(i); + SdrObject* pObj=maSdrObjList.GetObj(i); if (pObj->IsEdgeObj()) pObj->Shear(rRef,nAngle,tn,bVShear); } for (size_t i=0; i<nObjCount; ++i) { - SdrObject* pObj=pOL->GetObj(i); + SdrObject* pObj=maSdrObjList.GetObj(i); if (!pObj->IsEdgeObj()) pObj->Shear(rRef,nAngle,tn,bVShear); } NbcShearGluePoints(rRef,tn,bVShear); @@ -692,14 +643,13 @@ void SdrObjGroup::SetAnchorPos(const Point& rPnt) Size aSiz(rPnt.X()-aAnchor.X(),rPnt.Y()-aAnchor.Y()); aRefPoint.Move(aSiz); // move the connectors first, everything else afterwards - SdrObjList* pOL=pSub.get(); - const size_t nObjCount = pOL->GetObjCount(); + const size_t nObjCount = maSdrObjList.GetObjCount(); for (size_t i=0; i<nObjCount; ++i) { - SdrObject* pObj=pOL->GetObj(i); + SdrObject* pObj=maSdrObjList.GetObj(i); if (pObj->IsEdgeObj()) pObj->SetAnchorPos(rPnt); } for (size_t i=0; i<nObjCount; ++i) { - SdrObject* pObj = pOL->GetObj(i); + SdrObject* pObj = maSdrObjList.GetObj(i); if (!pObj->IsEdgeObj()) pObj->SetAnchorPos(rPnt); } if (bChg) { @@ -726,22 +676,21 @@ void SdrObjGroup::SetRelativePos(const Point& rPnt) void SdrObjGroup::NbcReformatText() { - pSub->NbcReformatAllTextObjects(); + maSdrObjList.NbcReformatAllTextObjects(); } void SdrObjGroup::ReformatText() { - pSub->ReformatAllTextObjects(); + maSdrObjList.ReformatAllTextObjects(); } SdrObject* SdrObjGroup::DoConvertToPolyObj(bool bBezier, bool bAddText) const { - SdrObject* pGroup = new SdrObjGroup; - pGroup->SetModel(GetModel()); + SdrObject* pGroup = new SdrObjGroup(getSdrModelFromSdrObject()); - for(size_t a=0; a<pSub->GetObjCount(); ++a) + for(size_t a=0; a<maSdrObjList.GetObjCount(); ++a) { - SdrObject* pIterObj = pSub->GetObj(a); + SdrObject* pIterObj = maSdrObjList.GetObj(a); SdrObject* pResult = pIterObj->DoConvertToPolyObj(bBezier, bAddText); // pResult can be NULL e.g. for empty objects @@ -759,7 +708,7 @@ void SdrObjGroup::dumpAsXml(xmlTextWriterPtr pWriter) const SdrObject::dumpAsXml(pWriter); - pSub->dumpAsXml(pWriter); + maSdrObjList.dumpAsXml(pWriter); xmlTextWriterEndElement(pWriter); } diff --git a/svx/source/svdraw/svdomeas.cxx b/svx/source/svdraw/svdomeas.cxx index 63f33c6cbbce..9c1f6550f66d 100644 --- a/svx/source/svdraw/svdomeas.cxx +++ b/svx/source/svdraw/svdomeas.cxx @@ -94,71 +94,63 @@ OUString SdrMeasureObj::TakeRepresentation(SdrMeasureFieldKind eMeasureFieldKind { case SdrMeasureFieldKind::Value: { - if(pModel) + eModUIUnit = getSdrModelFromSdrObject().GetUIUnit(); + + if(eMeasureUnit == FUNIT_NONE) + eMeasureUnit = eModUIUnit; + + sal_Int32 nLen(GetLen(aPt2 - aPt1)); + Fraction aFact(1,1); + + if(eMeasureUnit != eModUIUnit) { - eModUIUnit = pModel->GetUIUnit(); + // for the unit conversion + aFact *= GetMapFactor(eModUIUnit, eMeasureUnit).X(); + } - if(eMeasureUnit == FUNIT_NONE) - eMeasureUnit = eModUIUnit; + if(aMeasureScale.GetNumerator() != aMeasureScale.GetDenominator()) + { + aFact *= aMeasureScale; + } - sal_Int32 nLen(GetLen(aPt2 - aPt1)); - Fraction aFact(1,1); + if(aFact.GetNumerator() != aFact.GetDenominator()) + { + // scale via BigInt, to avoid overruns + nLen = BigMulDiv(nLen, aFact.GetNumerator(), aFact.GetDenominator()); + } - if(eMeasureUnit != eModUIUnit) - { - // for the unit conversion - aFact *= GetMapFactor(eModUIUnit, eMeasureUnit).X(); - } + if(!aFact.IsValid()) + { + aStr = "?"; + } + else + { + aStr = getSdrModelFromSdrObject().GetMetricString(nLen, true, nNumDigits); + } - if(aMeasureScale.GetNumerator() != aMeasureScale.GetDenominator()) - { - aFact *= aMeasureScale; - } + SvtSysLocale aSysLocale; + const LocaleDataWrapper& rLocaleDataWrapper = aSysLocale.GetLocaleData(); + sal_Unicode cDec(rLocaleDataWrapper.getNumDecimalSep()[0]); + sal_Unicode cDecAlt(rLocaleDataWrapper.getNumDecimalSepAlt().toChar()); - if(aFact.GetNumerator() != aFact.GetDenominator()) - { - // scale via BigInt, to avoid overruns - nLen = BigMulDiv(nLen, aFact.GetNumerator(), aFact.GetDenominator()); - } + if(aStr.indexOf(cDec) != -1 || (cDecAlt && aStr.indexOf(cDecAlt) != -1)) + { + sal_Int32 nLen2(aStr.getLength() - 1); - if(!aFact.IsValid()) - { - aStr = "?"; - } - else + while(aStr[nLen2] == '0') { - aStr = pModel->GetMetricString(nLen, true, nNumDigits); + aStr = aStr.copy(0, nLen2); + nLen2--; } - SvtSysLocale aSysLocale; - const LocaleDataWrapper& rLocaleDataWrapper = aSysLocale.GetLocaleData(); - sal_Unicode cDec(rLocaleDataWrapper.getNumDecimalSep()[0]); - sal_Unicode cDecAlt(rLocaleDataWrapper.getNumDecimalSepAlt().toChar()); - - if(aStr.indexOf(cDec) != -1 || (cDecAlt && aStr.indexOf(cDecAlt) != -1)) + if(aStr[nLen2] == cDec || (cDecAlt && aStr[nLen2] == cDecAlt)) { - sal_Int32 nLen2(aStr.getLength() - 1); - - while(aStr[nLen2] == '0') - { - aStr = aStr.copy(0, nLen2); - nLen2--; - } - - if(aStr[nLen2] == cDec || (cDecAlt && aStr[nLen2] == cDecAlt)) - { - aStr = aStr.copy(0, nLen2); - nLen2--; - } - - if(aStr.isEmpty()) - aStr += "0"; + aStr = aStr.copy(0, nLen2); + nLen2--; } - } - else - { - // if there's no Model ... (e. g. preview in dialog) - aStr = "4711"; + + if(aStr.isEmpty()) + aStr += "0"; } break; @@ -167,16 +159,13 @@ OUString SdrMeasureObj::TakeRepresentation(SdrMeasureFieldKind eMeasureFieldKind { if(bShowUnit) { - if(pModel) - { - eModUIUnit = pModel->GetUIUnit(); + eModUIUnit = getSdrModelFromSdrObject().GetUIUnit(); - if(eMeasureUnit == FUNIT_NONE) - eMeasureUnit = eModUIUnit; + if(eMeasureUnit == FUNIT_NONE) + eMeasureUnit = eModUIUnit; - if(bShowUnit) - aStr = SdrModel::GetUnitString(eMeasureUnit); - } + if(bShowUnit) + aStr = SdrModel::GetUnitString(eMeasureUnit); } break; @@ -211,14 +200,19 @@ sdr::contact::ViewContact* SdrMeasureObj::CreateObjectSpecificViewContact() } -SdrMeasureObj::SdrMeasureObj(): +SdrMeasureObj::SdrMeasureObj(SdrModel& rSdrModel) +: SdrTextObj(rSdrModel), bTextDirty(false) { // #i25616# mbSupportTextIndentingOnLineWidthChange = false; } -SdrMeasureObj::SdrMeasureObj(const Point& rPt1, const Point& rPt2): +SdrMeasureObj::SdrMeasureObj( + SdrModel& rSdrModel, + const Point& rPt1, + const Point& rPt2) +: SdrTextObj(rSdrModel), aPt1(rPt1), aPt2(rPt2), bTextDirty(false) @@ -708,9 +702,22 @@ void SdrMeasureObj::TakeUnrotatedSnapRect(tools::Rectangle& rRect) const } } -SdrMeasureObj* SdrMeasureObj::Clone() const +SdrMeasureObj* SdrMeasureObj::Clone(SdrModel* pTargetModel) const +{ + return CloneHelper< SdrMeasureObj >(pTargetModel); +} + +SdrMeasureObj& SdrMeasureObj::operator=(const SdrMeasureObj& rObj) { - return CloneHelper< SdrMeasureObj >(); + if( this == &rObj ) + return *this; + SdrTextObj::operator=(rObj); + + aPt1 = rObj.aPt1; + aPt2 = rObj.aPt2; + bTextDirty = rObj.bTextDirty; + + return *this; } OUString SdrMeasureObj::TakeObjNameSingul() const @@ -1138,8 +1145,7 @@ SdrObject* SdrMeasureObj::DoConvertToPolyObj(bool bBezier, bool bAddText) const SfxStyleSheet* pStyleSheet = GetStyleSheet(); // prepare group - SdrObjGroup* pGroup = new SdrObjGroup; - pGroup->SetModel(GetModel()); + SdrObjGroup* pGroup = new SdrObjGroup(getSdrModelFromSdrObject()); // prepare parameters basegfx::B2DPolyPolygon aPolyPoly; @@ -1153,8 +1159,11 @@ SdrObject* SdrMeasureObj::DoConvertToPolyObj(bool bBezier, bool bAddText) const aPolyPoly.clear(); aPolyPoly.append(aTmpPolyPolygon[0].getB2DPolygon()); - pPath = new SdrPathObj(OBJ_PATHLINE, aPolyPoly); - pPath->SetModel(GetModel()); + pPath = new SdrPathObj( + getSdrModelFromSdrObject(), + OBJ_PATHLINE, + aPolyPoly); + pPath->SetMergedItemSet(aSet); pPath->SetStyleSheet(pStyleSheet, true); pGroup->GetSubList()->NbcInsertObject(pPath); @@ -1171,8 +1180,11 @@ SdrObject* SdrMeasureObj::DoConvertToPolyObj(bool bBezier, bool bAddText) const aPolyPoly.clear(); aPolyPoly.append(aTmpPolyPolygon[0].getB2DPolygon()); - pPath = new SdrPathObj(OBJ_PATHLINE, aPolyPoly); - pPath->SetModel(GetModel()); + pPath = new SdrPathObj( + getSdrModelFromSdrObject(), + OBJ_PATHLINE, + aPolyPoly); + pPath->SetMergedItemSet(aSet); pPath->SetStyleSheet(pStyleSheet, true); @@ -1183,8 +1195,11 @@ SdrObject* SdrMeasureObj::DoConvertToPolyObj(bool bBezier, bool bAddText) const aPolyPoly.clear(); aPolyPoly.append(aTmpPolyPolygon[1].getB2DPolygon()); - pPath = new SdrPathObj(OBJ_PATHLINE, aPolyPoly); - pPath->SetModel(GetModel()); + pPath = new SdrPathObj( + getSdrModelFromSdrObject(), + OBJ_PATHLINE, + aPolyPoly); + pPath->SetMergedItemSet(aSet); pPath->SetStyleSheet(pStyleSheet, true); @@ -1202,8 +1217,11 @@ SdrObject* SdrMeasureObj::DoConvertToPolyObj(bool bBezier, bool bAddText) const aPolyPoly.clear(); aPolyPoly.append(aTmpPolyPolygon[0].getB2DPolygon()); - pPath = new SdrPathObj(OBJ_PATHLINE, aPolyPoly); - pPath->SetModel(GetModel()); + pPath = new SdrPathObj( + getSdrModelFromSdrObject(), + OBJ_PATHLINE, + aPolyPoly); + pPath->SetMergedItemSet(aSet); pPath->SetStyleSheet(pStyleSheet, true); @@ -1214,8 +1232,11 @@ SdrObject* SdrMeasureObj::DoConvertToPolyObj(bool bBezier, bool bAddText) const aPolyPoly.clear(); aPolyPoly.append(aTmpPolyPolygon[1].getB2DPolygon()); - pPath = new SdrPathObj(OBJ_PATHLINE, aPolyPoly); - pPath->SetModel(GetModel()); + pPath = new SdrPathObj( + getSdrModelFromSdrObject(), + OBJ_PATHLINE, + aPolyPoly); + pPath->SetMergedItemSet(aSet); pPath->SetStyleSheet(pStyleSheet, true); @@ -1229,8 +1250,11 @@ SdrObject* SdrMeasureObj::DoConvertToPolyObj(bool bBezier, bool bAddText) const { aPolyPoly.clear(); aPolyPoly.append(aTmpPolyPolygon[nLoopStart].getB2DPolygon()); - pPath = new SdrPathObj(OBJ_PATHLINE, aPolyPoly); - pPath->SetModel(GetModel()); + pPath = new SdrPathObj( + getSdrModelFromSdrObject(), + OBJ_PATHLINE, + aPolyPoly); + pPath->SetMergedItemSet(aSet); pPath->SetStyleSheet(pStyleSheet, true); @@ -1361,7 +1385,7 @@ bool SdrMeasureObj::TRGetBaseGeometry(basegfx::B2DHomMatrix& rMatrix, basegfx::B basegfx::B2DTuple aTranslate(aRange.getMinimum()); // position maybe relative to anchor position, convert - if( pModel->IsWriter() ) + if( getSdrModelFromSdrObject().IsWriter() ) { if(GetAnchorPos().X() || GetAnchorPos().Y()) { @@ -1370,7 +1394,7 @@ bool SdrMeasureObj::TRGetBaseGeometry(basegfx::B2DHomMatrix& rMatrix, basegfx::B } // force MapUnit to 100th mm - MapUnit eMapUnit = pModel->GetItemPool().GetMetric(0); + MapUnit eMapUnit = getSdrModelFromSdrObject().GetItemPool().GetMetric(0); if(eMapUnit != MapUnit::Map100thMM) { switch(eMapUnit) @@ -1407,7 +1431,7 @@ void SdrMeasureObj::TRSetBaseGeometry(const basegfx::B2DHomMatrix& rMatrix, cons basegfx::B2DPoint aPosB(rMatrix * basegfx::B2DPoint(1.0, 0.0)); // force metric to pool metric - MapUnit eMapUnit = pModel->GetItemPool().GetMetric(0); + MapUnit eMapUnit = getSdrModelFromSdrObject().GetItemPool().GetMetric(0); if(eMapUnit != MapUnit::Map100thMM) { switch(eMapUnit) @@ -1429,7 +1453,7 @@ void SdrMeasureObj::TRSetBaseGeometry(const basegfx::B2DHomMatrix& rMatrix, cons } } - if( pModel->IsWriter() ) + if( getSdrModelFromSdrObject().IsWriter() ) { // if anchor is used, make position relative to it if(GetAnchorPos().X() || GetAnchorPos().Y()) diff --git a/svx/source/svdraw/svdomedia.cxx b/svx/source/svdraw/svdomedia.cxx index 4c41e76e6dc3..012dc1d35879 100644 --- a/svx/source/svdraw/svdomedia.cxx +++ b/svx/source/svdraw/svdomedia.cxx @@ -65,16 +65,17 @@ struct SdrMediaObj::Impl OUString m_LastFailedPkgURL; }; - -SdrMediaObj::SdrMediaObj() - : SdrRectObj() - , m_xImpl( new Impl ) +SdrMediaObj::SdrMediaObj(SdrModel& rSdrModel) +: SdrRectObj(rSdrModel) + ,m_xImpl( new Impl ) { } -SdrMediaObj::SdrMediaObj( const tools::Rectangle& rRect ) - : SdrRectObj( rRect ) - , m_xImpl( new Impl ) +SdrMediaObj::SdrMediaObj( + SdrModel& rSdrModel, + const tools::Rectangle& rRect) +: SdrRectObj(rSdrModel, rRect) + ,m_xImpl( new Impl ) { } @@ -141,9 +142,9 @@ OUString SdrMediaObj::TakeObjNamePlural() const return ImpGetResStr(STR_ObjNamePluralMEDIA); } -SdrMediaObj* SdrMediaObj::Clone() const +SdrMediaObj* SdrMediaObj::Clone(SdrModel* pTargetModel) const { - return CloneHelper< SdrMediaObj >(); + return CloneHelper< SdrMediaObj >(pTargetModel); } SdrMediaObj& SdrMediaObj::operator=(const SdrMediaObj& rObj) @@ -315,8 +316,14 @@ void SdrMediaObj::SetInputStream(uno::Reference<io::XInputStream> const& xStream SAL_WARN("svx", "this is only intended for embedded media"); return; } + OUString tempFileURL; - bool const bSuccess = lcl_CopyToTempFile(xStream, tempFileURL, ""); + const bool bSuccess( + lcl_CopyToTempFile( + xStream, + tempFileURL, + "")); + if (bSuccess) { m_xImpl->m_pTempFile.reset(new MediaTempFile(tempFileURL)); @@ -331,19 +338,14 @@ void SdrMediaObj::SetInputStream(uno::Reference<io::XInputStream> const& xStream /// copy a stream from XStorage to temp file #if HAVE_FEATURE_AVMEDIA static bool lcl_HandlePackageURL( - OUString const & rURL, - SdrModel const *const pModel, - OUString & o_rTempFileURL) + OUString const & rURL, + const SdrModel& rModel, + OUString & o_rTempFileURL) { - if (!pModel) - { - SAL_WARN("svx", "no model"); - return false; - } ::comphelper::LifecycleProxy sourceProxy; uno::Reference<io::XInputStream> xInStream; try { - xInStream = pModel->GetDocumentStream(rURL, sourceProxy); + xInStream = rModel.GetDocumentStream(rURL, sourceProxy); } catch (container::NoSuchElementException const&) { @@ -394,8 +396,12 @@ void SdrMediaObj::mediaPropertiesChanged( const ::avmedia::MediaItem& rNewProper rNewProperties.getTempURL())) { OUString tempFileURL; - bool bSuccess; - bSuccess = lcl_HandlePackageURL(url, GetModel(), tempFileURL); + const bool bSuccess( + lcl_HandlePackageURL( + url, + getSdrModelFromSdrObject(), + tempFileURL)); + if (bSuccess) { m_xImpl->m_pTempFile.reset( diff --git a/svx/source/svdraw/svdoole2.cxx b/svx/source/svdraw/svdoole2.cxx index 8a264270bddf..50595c5766df 100644 --- a/svx/source/svdraw/svdoole2.cxx +++ b/svx/source/svdraw/svdoole2.cxx @@ -663,13 +663,42 @@ sdr::contact::ViewContact* SdrOle2Obj::CreateObjectSpecificViewContact() return new sdr::contact::ViewContactOfSdrOle2Obj(*this); } -SdrOle2Obj::SdrOle2Obj( bool bFrame_ ) : +void SdrOle2Obj::Init() +{ + // Stuff that was done from old SetModel: + // #i43086# #i85304 redo the change for charts for the above bugfix, as #i43086# does not occur anymore + // so maybe the ImpSetVisAreaSize call can be removed here completely + // Nevertheless I leave it in for other objects as I am not sure about the side effects when removing now + if(!getSdrModelFromSdrObject().isLocked() && !IsChart()) + { + ImpSetVisAreaSize(); + } + + ::comphelper::IEmbeddedHelper* pDestPers(getSdrModelFromSdrObject().GetPersist()); + if(pDestPers && !IsEmptyPresObj()) + { + // object wasn't connected, now it should be + Connect_Impl(); + } + + AddListeners_Impl(); +} + +SdrOle2Obj::SdrOle2Obj( + SdrModel& rSdrModel, + bool bFrame_) +: SdrRectObj(rSdrModel), mpImpl(new SdrOle2ObjImpl(bFrame_)) { + Init(); } -SdrOle2Obj::SdrOle2Obj( const svt::EmbeddedObjectRef& rNewObjRef, const OUString& rNewObjName, const tools::Rectangle& rNewRect) : - SdrRectObj(rNewRect), +SdrOle2Obj::SdrOle2Obj( + SdrModel& rSdrModel, + const svt::EmbeddedObjectRef& rNewObjRef, + const OUString& rNewObjName, + const tools::Rectangle& rNewRect) +: SdrRectObj(rSdrModel, rNewRect), mpImpl(new SdrOle2ObjImpl(false/*bFrame_*/, rNewObjRef)) { mpImpl->aPersistName = rNewObjName; @@ -679,6 +708,8 @@ SdrOle2Obj::SdrOle2Obj( const svt::EmbeddedObjectRef& rNewObjRef, const OUStrin // For math objects, set closed state to transparent SetClosedObj(!ImplIsMathObj( mpImpl->mxObjRef.GetObject() )); + + Init(); } OUString SdrOle2Obj::GetStyleString() @@ -781,7 +812,8 @@ bool SdrOle2Obj::UpdateLinkURL_Impl() if ( mpImpl->mpObjectLink ) { - sfx2::LinkManager* pLinkManager = pModel ? pModel->GetLinkManager() : nullptr; + sfx2::LinkManager* pLinkManager(getSdrModelFromSdrObject().GetLinkManager()); + if ( pLinkManager ) { OUString aNewLinkURL; @@ -831,9 +863,7 @@ bool SdrOle2Obj::UpdateLinkURL_Impl() void SdrOle2Obj::BreakFileLink_Impl() { - uno::Reference<document::XStorageBasedDocument> xDoc; - if ( pModel ) - xDoc.set( pModel->getUnoModel(),uno::UNO_QUERY); + uno::Reference<document::XStorageBasedDocument> xDoc(getSdrModelFromSdrObject().getUnoModel(), uno::UNO_QUERY); if ( xDoc.is() ) { @@ -858,7 +888,8 @@ void SdrOle2Obj::BreakFileLink_Impl() void SdrOle2Obj::DisconnectFileLink_Impl() { - sfx2::LinkManager* pLinkManager = pModel ? pModel->GetLinkManager() : nullptr; + sfx2::LinkManager* pLinkManager(getSdrModelFromSdrObject().GetLinkManager()); + if ( pLinkManager && mpImpl->mpObjectLink ) { pLinkManager->Remove( mpImpl->mpObjectLink ); @@ -868,18 +899,21 @@ void SdrOle2Obj::DisconnectFileLink_Impl() void SdrOle2Obj::CheckFileLink_Impl() { - if (pModel && mpImpl->mxObjRef.GetObject().is() && !mpImpl->mpObjectLink) + if (mpImpl->mxObjRef.GetObject().is() && !mpImpl->mpObjectLink) { try { uno::Reference< embed::XLinkageSupport > xLinkSupport( mpImpl->mxObjRef.GetObject(), uno::UNO_QUERY ); + if ( xLinkSupport.is() && xLinkSupport->isLink() ) { OUString aLinkURL = xLinkSupport->getLinkURL(); + if ( !aLinkURL.isEmpty() ) { // this is a file link so the model link manager should handle it - sfx2::LinkManager* pLinkManager = pModel->GetLinkManager(); + sfx2::LinkManager* pLinkManager(getSdrModelFromSdrObject().GetLinkManager()); + if ( pLinkManager ) { mpImpl->mpObjectLink = new SdrEmbedObjectLink( this ); @@ -905,14 +939,16 @@ void SdrOle2Obj::Reconnect_Impl() void SdrOle2Obj::Connect_Impl() { - if( pModel && !mpImpl->aPersistName.isEmpty() ) + if(!mpImpl->aPersistName.isEmpty() ) { try { - ::comphelper::IEmbeddedHelper* pPers = pModel->GetPersist(); + ::comphelper::IEmbeddedHelper* pPers(getSdrModelFromSdrObject().GetPersist()); + if ( pPers ) { comphelper::EmbeddedObjectContainer& rContainer = pPers->getEmbeddedObjectContainer(); + if ( !rContainer.HasEmbeddedObject( mpImpl->aPersistName ) || ( mpImpl->mxObjRef.is() && !rContainer.HasEmbeddedObject( mpImpl->mxObjRef.GetObject() ) ) ) { @@ -957,9 +993,9 @@ void SdrOle2Obj::Connect_Impl() uno::Reference< container::XChild > xChild( mpImpl->mxObjRef.GetObject(), uno::UNO_QUERY ); if( xChild.is() ) { - uno::Reference< uno::XInterface > xParent( pModel->getUnoModel()); + uno::Reference< uno::XInterface > xParent( getSdrModelFromSdrObject().getUnoModel()); if( xParent.is()) - xChild->setParent( pModel->getUnoModel() ); + xChild->setParent( getSdrModelFromSdrObject().getUnoModel() ); } } @@ -1040,9 +1076,9 @@ void SdrOle2Obj::Disconnect_Impl() { try { - if ( pModel && !mpImpl->aPersistName.isEmpty() ) + if ( !mpImpl->aPersistName.isEmpty() ) { - if( pModel->IsInDestruction() ) + if( getSdrModelFromSdrObject().IsInDestruction() ) { // TODO/LATER: here we must assume that the destruction of the model is enough to make clear that we will not // remove the object from the container, even if the DrawingObject itself is not destroyed (unfortunately this @@ -1078,7 +1114,7 @@ void SdrOle2Obj::Disconnect_Impl() } else if ( mpImpl->mxObjRef.is() ) { - if ( pModel->getUnoModel().is() ) + if ( getSdrModelFromSdrObject().getUnoModel().is() ) { // remove object, but don't close it (that's up to someone else) comphelper::EmbeddedObjectContainer* pContainer = mpImpl->mxObjRef.GetContainer(); @@ -1122,8 +1158,9 @@ SdrObject* SdrOle2Obj::createSdrGrafObjReplacement(bool bAddText) const if(pOLEGraphic) { // #i118485# allow creating a SdrGrafObj representation - SdrGrafObj* pClone = new SdrGrafObj(*pOLEGraphic); - pClone->SetModel(GetModel()); + SdrGrafObj* pClone = new SdrGrafObj( + getSdrModelFromSdrObject(), + *pOLEGraphic); // copy transformation basegfx::B2DHomMatrix aMatrix; @@ -1141,7 +1178,7 @@ SdrObject* SdrOle2Obj::createSdrGrafObjReplacement(bool bAddText) const // #i118485# copy text (Caution! Model needed, as guaranteed in aw080) OutlinerParaObject* pOPO = GetOutlinerParaObject(); - if(pOPO && GetModel()) + if(pOPO) { pClone->NbcSetOutlinerParaObject(new OutlinerParaObject(*pOPO)); } @@ -1153,8 +1190,9 @@ SdrObject* SdrOle2Obj::createSdrGrafObjReplacement(bool bAddText) const { // #i100710# pOLEGraphic may be zero (no visualisation available), // so we need to use the OLE replacement graphic - SdrRectObj* pClone = new SdrRectObj(GetSnapRect()); - pClone->SetModel(GetModel()); + SdrRectObj* pClone = new SdrRectObj( + getSdrModelFromSdrObject(), + GetSnapRect()); // gray outline pClone->SetMergedItem(XLineStyleItem(css::drawing::LineStyle_SOLID)); @@ -1175,90 +1213,17 @@ SdrObject* SdrOle2Obj::createSdrGrafObjReplacement(bool bAddText) const SdrObject* SdrOle2Obj::DoConvertToPolyObj(bool bBezier, bool bAddText) const { // #i118485# missing converter added - if(GetModel()) - { - SdrObject* pRetval = createSdrGrafObjReplacement(true); - - if(pRetval) - { - SdrObject* pRetval2 = pRetval->DoConvertToPolyObj(bBezier, bAddText); - SdrObject::Free(pRetval); - - return pRetval2; - } - } + SdrObject* pRetval = createSdrGrafObjReplacement(true); - return nullptr; -} - -void SdrOle2Obj::SetModel(SdrModel* pNewModel) -{ - ::comphelper::IEmbeddedHelper* pDestPers = pNewModel ? pNewModel->GetPersist() : nullptr; - ::comphelper::IEmbeddedHelper* pSrcPers = pModel ? pModel->GetPersist() : nullptr; - - if ( pNewModel == pModel ) - { - // don't know if this is necessary or if it will ever happen, but who knows?! - SdrRectObj::SetModel( pNewModel ); - return; - } - - // assignment to model has changed - DBG_ASSERT( pSrcPers || !mpImpl->mbConnected, "Connected object without a model?!" ); - - DBG_ASSERT( pDestPers, "The destination model must have a persistence! Please submit an issue!" ); - DBG_ASSERT( pDestPers != pSrcPers, "The source and the destination models should have different persistences! Problems are possible!" ); - - // this is a bug if the target model has no persistence - // no error handling is possible so just do nothing in this method - if ( !pDestPers ) - return; - - RemoveListeners_Impl(); - - if( pDestPers && pSrcPers && !IsEmptyPresObj() ) + if(pRetval) { - try - { - // move the object's storage; ObjectRef remains the same, but PersistName may change - OUString aTmp; - comphelper::EmbeddedObjectContainer& rContainer = pSrcPers->getEmbeddedObjectContainer(); - uno::Reference < embed::XEmbeddedObject > xObj = rContainer.GetEmbeddedObject( mpImpl->aPersistName ); - DBG_ASSERT( !mpImpl->mxObjRef.is() || mpImpl->mxObjRef.GetObject() == xObj, "Wrong object identity!" ); - if ( xObj.is() ) - { - pDestPers->getEmbeddedObjectContainer().MoveEmbeddedObject( rContainer, xObj, aTmp ); - mpImpl->aPersistName = aTmp; - mpImpl->mxObjRef.AssignToContainer( &pDestPers->getEmbeddedObjectContainer(), aTmp ); - } - DBG_ASSERT( !aTmp.isEmpty(), "Copying embedded object failed!" ); - } - catch( css::uno::Exception& ) - { - SAL_WARN( "svx", "SdrOle2Obj::SetModel(), exception caught: " - << comphelper::anyToString( cppu::getCaughtException() ) ); - } - } - - SdrRectObj::SetModel( pNewModel ); + SdrObject* pRetval2 = pRetval->DoConvertToPolyObj(bBezier, bAddText); + SdrObject::Free(pRetval); - // #i43086# - // #i85304 redo the change for charts for the above bugfix, as #i43086# does not occur anymore - //so maybe the ImpSetVisAreaSize call can be removed here completely - //Nevertheless I leave it in for other objects as I am not sure about the side effects when removing now - if( pModel && !pModel->isLocked() && !IsChart() ) - ImpSetVisAreaSize(); - - if( pDestPers && !IsEmptyPresObj() ) - { - if ( !pSrcPers || IsEmptyPresObj() ) - // object wasn't connected, now it should be - Connect_Impl(); - else - Reconnect_Impl(); + return pRetval2; } - AddListeners_Impl(); + return nullptr; } void SdrOle2Obj::SetPage(SdrPage* pNewPage) @@ -1269,14 +1234,14 @@ void SdrOle2Obj::SetPage(SdrPage* pNewPage) if (bRemove && mpImpl->mbConnected ) Disconnect(); - if(!pModel && !GetStyleSheet() && pNewPage && pNewPage->GetModel()) + if(!GetStyleSheet() && pNewPage) { // #i119287# Set default StyleSheet for SdrGrafObj here, it is different from 'Default'. This // needs to be done before the style 'Default' is set from the :SetModel() call which is triggered // from the following :SetPage(). // TTTT: Needs to be moved in branch aw080 due to having a SdrModel from the beginning, is at this // place for convenience currently (works in both versions, is not in the way) - SfxStyleSheet* pSheet = pNewPage->GetModel()->GetDefaultStyleSheetForSdrGrafObjAndSdrOle2Obj(); + SfxStyleSheet* pSheet = pNewPage->getSdrModelFromSdrPage().GetDefaultStyleSheetForSdrGrafObjAndSdrOle2Obj(); if(pSheet) { @@ -1414,65 +1379,68 @@ OUString SdrOle2Obj::TakeObjNamePlural() const return ImpGetResStr(mpImpl->mbFrame ? STR_ObjNamePluralFrame : STR_ObjNamePluralOLE2); } -SdrOle2Obj* SdrOle2Obj::Clone() const +SdrOle2Obj* SdrOle2Obj::Clone(SdrModel* pTargetModel) const { - return CloneHelper< SdrOle2Obj >(); + return CloneHelper< SdrOle2Obj >(pTargetModel); +} + +SdrOle2Obj& SdrOle2Obj::operator=(const SdrOle2Obj& rObj) +{ + return assignFrom(rObj); } SdrOle2Obj& SdrOle2Obj::assignFrom(const SdrOle2Obj& rObj) { //TODO/LATER: who takes over control of my old object?! - if( &rObj != this ) + if( &rObj == this ) { - // ImpAssign( rObj ); - const SdrOle2Obj& rOle2Obj = rObj; + return *this; + } + + // ImpAssign( rObj ); + const SdrOle2Obj& rOle2Obj = rObj; - if( pModel && mpImpl->mbConnected ) - Disconnect(); + if( mpImpl->mbConnected ) + Disconnect(); - SdrRectObj::operator=( rObj ); + SdrRectObj::operator=( rObj ); - // Manually copying bClosedObj attribute - SetClosedObj( rObj.IsClosedObj() ); + // Manually copying bClosedObj attribute + SetClosedObj( rObj.IsClosedObj() ); - mpImpl->aPersistName = rOle2Obj.mpImpl->aPersistName; - mpImpl->maProgName = rOle2Obj.mpImpl->maProgName; - mpImpl->mbFrame = rOle2Obj.mpImpl->mbFrame; + mpImpl->aPersistName = rOle2Obj.mpImpl->aPersistName; + mpImpl->maProgName = rOle2Obj.mpImpl->maProgName; + mpImpl->mbFrame = rOle2Obj.mpImpl->mbFrame; - if (rOle2Obj.mpImpl->mxGraphic) - { - mpImpl->mxGraphic.reset(new Graphic(*rOle2Obj.mpImpl->mxGraphic)); - } + if (rOle2Obj.mpImpl->mxGraphic) + { + mpImpl->mxGraphic.reset(new Graphic(*rOle2Obj.mpImpl->mxGraphic)); + } - if( pModel && rObj.GetModel() && !IsEmptyPresObj() ) + if( !IsEmptyPresObj() ) + { + ::comphelper::IEmbeddedHelper* pDestPers(getSdrModelFromSdrObject().GetPersist()); + ::comphelper::IEmbeddedHelper* pSrcPers(rObj.getSdrModelFromSdrObject().GetPersist()); + if( pDestPers && pSrcPers ) { - ::comphelper::IEmbeddedHelper* pDestPers = pModel->GetPersist(); - ::comphelper::IEmbeddedHelper* pSrcPers = rObj.GetModel()->GetPersist(); - if( pDestPers && pSrcPers ) + DBG_ASSERT( !mpImpl->mxObjRef.is(), "Object already existing!" ); + comphelper::EmbeddedObjectContainer& rContainer = pSrcPers->getEmbeddedObjectContainer(); + uno::Reference < embed::XEmbeddedObject > xObj = rContainer.GetEmbeddedObject( mpImpl->aPersistName ); + if ( xObj.is() ) { - DBG_ASSERT( !mpImpl->mxObjRef.is(), "Object already existing!" ); - comphelper::EmbeddedObjectContainer& rContainer = pSrcPers->getEmbeddedObjectContainer(); - uno::Reference < embed::XEmbeddedObject > xObj = rContainer.GetEmbeddedObject( mpImpl->aPersistName ); - if ( xObj.is() ) - { - OUString aTmp; - mpImpl->mxObjRef.Assign( pDestPers->getEmbeddedObjectContainer().CopyAndGetEmbeddedObject( - rContainer, xObj, aTmp, pSrcPers->getDocumentBaseURL(), pDestPers->getDocumentBaseURL()), rOle2Obj.GetAspect()); - mpImpl->mbTypeAsked = false; - mpImpl->aPersistName = aTmp; - CheckFileLink_Impl(); - } - - Connect(); + OUString aTmp; + mpImpl->mxObjRef.Assign( pDestPers->getEmbeddedObjectContainer().CopyAndGetEmbeddedObject( + rContainer, xObj, aTmp, pSrcPers->getDocumentBaseURL(), pDestPers->getDocumentBaseURL()), rOle2Obj.GetAspect()); + mpImpl->mbTypeAsked = false; + mpImpl->aPersistName = aTmp; + CheckFileLink_Impl(); } + + Connect(); } } - return *this; -} -SdrOle2Obj& SdrOle2Obj::operator=(const SdrOle2Obj& rObj) -{ - return assignFrom(rObj); + return *this; } void SdrOle2Obj::ImpSetVisAreaSize() @@ -1490,14 +1458,17 @@ void SdrOle2Obj::ImpSetVisAreaSize() GetObjRef(); if (mpImpl->mxObjRef.is()) { - OSL_ASSERT( pModel ); sal_Int64 nMiscStatus = mpImpl->mxObjRef->getStatus( GetAspect() ); // the client is required to get access to scaling - SfxInPlaceClient* pClient = SfxInPlaceClient::GetClient( dynamic_cast<SfxObjectShell*>(pModel->GetPersist()), mpImpl->mxObjRef.GetObject() ); - bool bHasOwnClient = - ( mpImpl->mxLightClient.is() - && mpImpl->mxObjRef->getClientSite() == uno::Reference< embed::XEmbeddedClient >( mpImpl->mxLightClient.get() ) ); + SfxInPlaceClient* pClient( + SfxInPlaceClient::GetClient( + dynamic_cast<SfxObjectShell*>( + getSdrModelFromSdrObject().GetPersist()), + mpImpl->mxObjRef.GetObject())); + const bool bHasOwnClient( + mpImpl->mxLightClient.is() && + mpImpl->mxObjRef->getClientSite() == uno::Reference< embed::XEmbeddedClient >( mpImpl->mxLightClient.get() ) ); if ( pClient || bHasOwnClient ) { @@ -1529,7 +1500,10 @@ void SdrOle2Obj::ImpSetVisAreaSize() Size aVisSize( static_cast<long>( Fraction( maRect.GetWidth() ) / aScaleWidth ), static_cast<long>( Fraction( maRect.GetHeight() ) / aScaleHeight ) ); - aVisSize = OutputDevice::LogicToLogic(aVisSize, MapMode(pModel->GetScaleUnit()), MapMode(aMapUnit)); + aVisSize = OutputDevice::LogicToLogic( + aVisSize, + MapMode(getSdrModelFromSdrObject().GetScaleUnit()), + MapMode(aMapUnit)); awt::Size aSz; aSz.Width = aVisSize.Width(); aSz.Height = aVisSize.Height(); @@ -1550,7 +1524,11 @@ void SdrOle2Obj::ImpSetVisAreaSize() // server changed VisArea to its liking and the VisArea is different than the suggested one // store the new value as given by the object MapUnit aNewMapUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( mpImpl->mxObjRef->getMapUnit( GetAspect() ) ); - maRect.SetSize(OutputDevice::LogicToLogic(aAcceptedVisArea.GetSize(), MapMode(aNewMapUnit), MapMode(pModel->GetScaleUnit()))); + maRect.SetSize( + OutputDevice::LogicToLogic( + aAcceptedVisArea.GetSize(), + MapMode(aNewMapUnit), + MapMode(getSdrModelFromSdrObject().GetScaleUnit()))); } // make the new object area known to the client @@ -1596,13 +1574,30 @@ void SdrOle2Obj::ImpSetVisAreaSize() uno::Reference< embed::XVisualObject > xVisualObject( getXModel(), uno::UNO_QUERY ); if( xVisualObject.is() ) { - MapUnit aMapUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( mpImpl->mxObjRef->getMapUnit( GetAspect() ) ); - Point aTL( maRect.TopLeft() ); - Point aBR( maRect.BottomRight() ); - Point aTL2(OutputDevice::LogicToLogic(aTL, MapMode(pModel->GetScaleUnit()), MapMode(aMapUnit))); - Point aBR2(OutputDevice::LogicToLogic(aBR, MapMode(pModel->GetScaleUnit()), MapMode(aMapUnit))); - tools::Rectangle aNewRect( aTL2, aBR2 ); - xVisualObject->setVisualAreaSize( GetAspect(), awt::Size( aNewRect.GetWidth(), aNewRect.GetHeight() ) ); + const MapUnit aMapUnit( + VCLUnoHelper::UnoEmbed2VCLMapUnit( + mpImpl->mxObjRef->getMapUnit(GetAspect()))); + const Point aTL( maRect.TopLeft() ); + const Point aBR( maRect.BottomRight() ); + const Point aTL2( + OutputDevice::LogicToLogic( + aTL, + MapMode(getSdrModelFromSdrObject().GetScaleUnit()), + MapMode(aMapUnit))); + const Point aBR2( + OutputDevice::LogicToLogic( + aBR, + MapMode(getSdrModelFromSdrObject().GetScaleUnit()), + MapMode(aMapUnit))); + const tools::Rectangle aNewRect( + aTL2, + aBR2); + + xVisualObject->setVisualAreaSize( + GetAspect(), + awt::Size( + aNewRect.GetWidth(), + aNewRect.GetHeight())); } } } @@ -1610,9 +1605,10 @@ void SdrOle2Obj::ImpSetVisAreaSize() void SdrOle2Obj::NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact) { - if( pModel && !pModel->isLocked() ) + if(!getSdrModelFromSdrObject().isLocked()) { GetObjRef(); + if ( mpImpl->mxObjRef.is() && ( mpImpl->mxObjRef->getStatus( GetAspect() ) & embed::EmbedMisc::MS_EMBED_RECOMPOSEONRESIZE ) ) { // if the object needs recompose on resize @@ -1623,7 +1619,8 @@ void SdrOle2Obj::NbcResize(const Point& rRef, const Fraction& xFact, const Fract } SdrRectObj::NbcResize(rRef,xFact,yFact); - if( pModel && !pModel->isLocked() ) + + if( !getSdrModelFromSdrObject().isLocked() ) ImpSetVisAreaSize(); } @@ -1631,7 +1628,7 @@ void SdrOle2Obj::SetGeoData(const SdrObjGeoData& rGeo) { SdrRectObj::SetGeoData(rGeo); - if( pModel && !pModel->isLocked() ) + if( !getSdrModelFromSdrObject().isLocked() ) ImpSetVisAreaSize(); } @@ -1639,7 +1636,7 @@ void SdrOle2Obj::NbcSetSnapRect(const tools::Rectangle& rRect) { SdrRectObj::NbcSetSnapRect(rRect); - if( pModel && !pModel->isLocked() ) + if( !getSdrModelFromSdrObject().isLocked() ) ImpSetVisAreaSize(); if ( mpImpl->mxObjRef.is() && IsChart() ) @@ -1655,7 +1652,7 @@ void SdrOle2Obj::NbcSetLogicRect(const tools::Rectangle& rRect) { SdrRectObj::NbcSetLogicRect(rRect); - if( pModel && !pModel->isLocked() ) + if( !getSdrModelFromSdrObject().isLocked() ) ImpSetVisAreaSize(); } @@ -1686,7 +1683,7 @@ void SdrOle2Obj::NbcMove(const Size& rSize) { SdrRectObj::NbcMove(rSize); - if( pModel && !pModel->isLocked() ) + if( !getSdrModelFromSdrObject().isLocked() ) ImpSetVisAreaSize(); } @@ -1758,7 +1755,8 @@ bool SdrOle2Obj::Unload() return true; bool bUnloaded = false; - if ( pModel && mpImpl->mxObjRef.is() ) + + if ( mpImpl->mxObjRef.is() ) { bUnloaded = Unload( mpImpl->mxObjRef.GetObject(), GetAspect() ); } @@ -1768,12 +1766,14 @@ bool SdrOle2Obj::Unload() void SdrOle2Obj::GetObjRef_Impl() { - if ( !mpImpl->mxObjRef.is() && !mpImpl->aPersistName.isEmpty() && pModel && pModel->GetPersist() ) + if ( !mpImpl->mxObjRef.is() && !mpImpl->aPersistName.isEmpty() && getSdrModelFromSdrObject().GetPersist() ) { // Only try loading if it did not went wrong up to now if(!mpImpl->mbLoadingOLEObjectFailed) { - mpImpl->mxObjRef.Assign( pModel->GetPersist()->getEmbeddedObjectContainer().GetEmbeddedObject( mpImpl->aPersistName ), GetAspect() ); + mpImpl->mxObjRef.Assign( + getSdrModelFromSdrObject().GetPersist()->getEmbeddedObjectContainer().GetEmbeddedObject(mpImpl->aPersistName), + GetAspect()); mpImpl->mbTypeAsked = false; CheckFileLink_Impl(); @@ -1793,7 +1793,7 @@ void SdrOle2Obj::GetObjRef_Impl() if( !IsEmptyPresObj() ) { // remember modified status of model - const bool bWasChanged = pModel && pModel->IsChanged(); + const bool bWasChanged(getSdrModelFromSdrObject().IsChanged()); // perhaps preview not valid anymore // This line changes the modified state of the model @@ -1802,9 +1802,9 @@ void SdrOle2Obj::GetObjRef_Impl() // if status was not set before, force it back // to not set, so that SetGraphic(0) above does not // set the modified state of the model. - if(!bWasChanged && pModel && pModel->IsChanged()) + if(!bWasChanged && getSdrModelFromSdrObject().IsChanged()) { - pModel->SetChanged( false ); + getSdrModelFromSdrObject().SetChanged( false ); } } } @@ -1889,9 +1889,7 @@ bool SdrOle2Obj::IsCalc() const uno::Reference< frame::XModel > SdrOle2Obj::GetParentXModel() const { - uno::Reference< frame::XModel > xDoc; - if ( pModel ) - xDoc.set( pModel->getUnoModel(),uno::UNO_QUERY); + uno::Reference< frame::XModel > xDoc(getSdrModelFromSdrObject().getUnoModel(), uno::UNO_QUERY); return xDoc; } @@ -1899,10 +1897,10 @@ bool SdrOle2Obj::CalculateNewScaling( Fraction& aScaleWidth, Fraction& aScaleHei { // TODO/LEAN: to avoid rounding errors scaling always uses the VisArea. // If we don't cache it for own objects also we must load the object here - if ( !mpImpl->mxObjRef.is() || !pModel ) + if (!mpImpl->mxObjRef.is()) return false; - MapMode aMapMode( pModel->GetScaleUnit() ); + MapMode aMapMode(getSdrModelFromSdrObject().GetScaleUnit()); aObjAreaSize = mpImpl->mxObjRef.GetSize( &aMapMode ); Size aSize = maRect.GetSize(); @@ -1919,7 +1917,7 @@ bool SdrOle2Obj::CalculateNewScaling( Fraction& aScaleWidth, Fraction& aScaleHei bool SdrOle2Obj::AddOwnLightClient() { // The Own Light Client must be registered in object only using this method! - if ( !SfxInPlaceClient::GetClient( dynamic_cast<SfxObjectShell*>(pModel->GetPersist()), mpImpl->mxObjRef.GetObject() ) + if ( !SfxInPlaceClient::GetClient( dynamic_cast<SfxObjectShell*>(getSdrModelFromSdrObject().GetPersist()), mpImpl->mxObjRef.GetObject() ) && !( mpImpl->mxLightClient.is() && mpImpl->mxObjRef->getClientSite() == uno::Reference< embed::XEmbeddedClient >( mpImpl->mxLightClient.get() ) ) ) { Connect(); diff --git a/svx/source/svdraw/svdopage.cxx b/svx/source/svdraw/svdopage.cxx index a2a6592037ee..af38237fa632 100644 --- a/svx/source/svdraw/svdopage.cxx +++ b/svx/source/svdraw/svdopage.cxx @@ -64,9 +64,11 @@ void SdrPageObj::PageInDestruction(const SdrPage& rPage) } } - -SdrPageObj::SdrPageObj(SdrPage* pNewPage) -: mpShownPage(pNewPage) +SdrPageObj::SdrPageObj( + SdrModel& rSdrModel, + SdrPage* pNewPage) +: SdrObject(rSdrModel), + mpShownPage(pNewPage) { if(mpShownPage) { @@ -74,8 +76,12 @@ SdrPageObj::SdrPageObj(SdrPage* pNewPage) } } -SdrPageObj::SdrPageObj(const tools::Rectangle& rRect, SdrPage* pNewPage) -: mpShownPage(pNewPage) +SdrPageObj::SdrPageObj( + SdrModel& rSdrModel, + const tools::Rectangle& rRect, + SdrPage* pNewPage) +: SdrObject(rSdrModel), + mpShownPage(pNewPage) { if(mpShownPage) { @@ -144,9 +150,9 @@ void SdrPageObj::TakeObjInfo(SdrObjTransformInfoRec& rInfo) const rInfo.bCanConvToPolyLineToArea=false; } -SdrPageObj* SdrPageObj::Clone() const +SdrPageObj* SdrPageObj::Clone(SdrModel* pTargetModel) const { - return CloneHelper< SdrPageObj >(); + return CloneHelper< SdrPageObj >(pTargetModel); } SdrPageObj& SdrPageObj::operator=(const SdrPageObj& rObj) diff --git a/svx/source/svdraw/svdopath.cxx b/svx/source/svdraw/svdopath.cxx index 5cf8dd58c115..fc991ab478c3 100644 --- a/svx/source/svdraw/svdopath.cxx +++ b/svx/source/svdraw/svdopath.cxx @@ -941,27 +941,27 @@ OUString ImpPathForDragAndCreate::getSpecialDragComment(const SdrDragStat& rDrag { aStr += SdrModel::GetAngleString(std::abs(pU->nCircRelAngle)) + " r=" - + mrSdrPathObject.GetModel()->GetMetricString(pU->nCircRadius, true); + + mrSdrPathObject.getSdrModelFromSdrObject().GetMetricString(pU->nCircRadius, true); } aStr += "dx=" - + mrSdrPathObject.GetModel()->GetMetricString(aNow.X(), true) + + mrSdrPathObject.getSdrModelFromSdrObject().GetMetricString(aNow.X(), true) + " dy=" - + mrSdrPathObject.GetModel()->GetMetricString(aNow.Y(), true); + + mrSdrPathObject.getSdrModelFromSdrObject().GetMetricString(aNow.Y(), true); if(!IsFreeHand(meObjectKind)) { sal_Int32 nLen(GetLen(aNow)); sal_Int32 nAngle(GetAngle(aNow)); aStr += " l=" - + mrSdrPathObject.GetModel()->GetMetricString(nLen, true) + + mrSdrPathObject.getSdrModelFromSdrObject().GetMetricString(nLen, true) + " " + SdrModel::GetAngleString(nAngle); } aStr += ")"; } - else if(!mrSdrPathObject.GetModel() || !pHdl) + else if(!pHdl) { // #i103058# fallback when no model and/or Handle, both needed // for else-path @@ -1011,9 +1011,9 @@ OUString ImpPathForDragAndCreate::getSpecialDragComment(const SdrDragStat& rDrag aStr.clear(); aStr += "dx=" - + mrSdrPathObject.GetModel()->GetMetricString(aNow.X() - aBeg.X(), true) + + mrSdrPathObject.getSdrModelFromSdrObject().GetMetricString(aNow.X() - aBeg.X(), true) + " dy=" - + mrSdrPathObject.GetModel()->GetMetricString(aNow.Y() - aBeg.Y(), true); + + mrSdrPathObject.getSdrModelFromSdrObject().GetMetricString(aNow.Y() - aBeg.Y(), true); if(!pDragData->IsMultiPointDrag()) { @@ -1040,7 +1040,7 @@ OUString ImpPathForDragAndCreate::getSpecialDragComment(const SdrDragStat& rDrag sal_Int32 nLen(GetLen(aNow)); sal_Int32 nAngle(GetAngle(aNow)); aStr += " l=" - + mrSdrPathObject.GetModel()->GetMetricString(nLen, true) + + mrSdrPathObject.getSdrModelFromSdrObject().GetMetricString(nLen, true) + " " + SdrModel::GetAngleString(nAngle); } @@ -1083,7 +1083,7 @@ OUString ImpPathForDragAndCreate::getSpecialDragComment(const SdrDragStat& rDrag sal_Int32 nLen(GetLen(aPt)); sal_Int32 nAngle(GetAngle(aPt)); aStr += " l=" - + mrSdrPathObject.GetModel()->GetMetricString(nLen, true) + + mrSdrPathObject.getSdrModelFromSdrObject().GetMetricString(nLen, true) + " " + SdrModel::GetAngleString(nAngle); } @@ -1101,7 +1101,7 @@ OUString ImpPathForDragAndCreate::getSpecialDragComment(const SdrDragStat& rDrag sal_Int32 nLen(GetLen(aPt)); sal_Int32 nAngle(GetAngle(aPt)); aStr += "l=" - + mrSdrPathObject.GetModel()->GetMetricString(nLen, true) + + mrSdrPathObject.getSdrModelFromSdrObject().GetMetricString(nLen, true) + " " + SdrModel::GetAngleString(nAngle); } @@ -1628,14 +1628,21 @@ sdr::contact::ViewContact* SdrPathObj::CreateObjectSpecificViewContact() } -SdrPathObj::SdrPathObj(SdrObjKind eNewKind) -: meKind(eNewKind) +SdrPathObj::SdrPathObj( + SdrModel& rSdrModel, + SdrObjKind eNewKind) +: SdrTextObj(rSdrModel), + meKind(eNewKind) { bClosedObj = IsClosed(); } -SdrPathObj::SdrPathObj(SdrObjKind eNewKind, const basegfx::B2DPolyPolygon& rPathPoly) -: maPathPolygon(rPathPoly), +SdrPathObj::SdrPathObj( + SdrModel& rSdrModel, + SdrObjKind eNewKind, + const basegfx::B2DPolyPolygon& rPathPoly) +: SdrTextObj(rSdrModel), + maPathPolygon(rPathPoly), meKind(eNewKind) { bClosedObj = IsClosed(); @@ -1821,9 +1828,9 @@ sal_uInt16 SdrPathObj::GetObjIdentifier() const return sal_uInt16(meKind); } -SdrPathObj* SdrPathObj::Clone() const +SdrPathObj* SdrPathObj::Clone(SdrModel* pTargetModel) const { - return CloneHelper< SdrPathObj >(); + return CloneHelper< SdrPathObj >(pTargetModel); } SdrPathObj& SdrPathObj::operator=(const SdrPathObj& rObj) @@ -2879,7 +2886,7 @@ bool SdrPathObj::TRGetBaseGeometry(basegfx::B2DHomMatrix& rMatrix, basegfx::B2DP } // position maybe relative to anchorpos, convert - if( pModel && pModel->IsWriter() ) + if( getSdrModelFromSdrObject().IsWriter() ) { if(GetAnchorPos().X() || GetAnchorPos().Y()) { @@ -2988,7 +2995,7 @@ void SdrPathObj::TRSetBaseGeometry(const basegfx::B2DHomMatrix& rMatrix, const b } } - if( pModel && pModel->IsWriter() ) + if( getSdrModelFromSdrObject().IsWriter() ) { // if anchor is used, make position relative to it if(GetAnchorPos().X() || GetAnchorPos().Y()) diff --git a/svx/source/svdraw/svdorect.cxx b/svx/source/svdraw/svdorect.cxx index 7f85da4b71a8..e68b38ce3205 100644 --- a/svx/source/svdraw/svdorect.cxx +++ b/svx/source/svdraw/svdorect.cxx @@ -62,21 +62,26 @@ sdr::contact::ViewContact* SdrRectObj::CreateObjectSpecificViewContact() } -SdrRectObj::SdrRectObj() -: mpXPoly(nullptr) +SdrRectObj::SdrRectObj(SdrModel& rSdrModel) +: SdrTextObj(rSdrModel), + mpXPoly(nullptr) { bClosedObj=true; } -SdrRectObj::SdrRectObj(const tools::Rectangle& rRect) -: SdrTextObj(rRect), +SdrRectObj::SdrRectObj( + SdrModel& rSdrModel, + const tools::Rectangle& rRect) +: SdrTextObj(rSdrModel, rRect), mpXPoly(nullptr) { bClosedObj=true; } -SdrRectObj::SdrRectObj(SdrObjKind eNewTextKind) -: SdrTextObj(eNewTextKind), +SdrRectObj::SdrRectObj( + SdrModel& rSdrModel, + SdrObjKind eNewTextKind) +: SdrTextObj(rSdrModel, eNewTextKind), mpXPoly(nullptr) { DBG_ASSERT(eTextKind==OBJ_TEXT || eTextKind==OBJ_TEXTEXT || @@ -85,8 +90,11 @@ SdrRectObj::SdrRectObj(SdrObjKind eNewTextKind) bClosedObj=true; } -SdrRectObj::SdrRectObj(SdrObjKind eNewTextKind, const tools::Rectangle& rRect) -: SdrTextObj(eNewTextKind,rRect), +SdrRectObj::SdrRectObj( + SdrModel& rSdrModel, + SdrObjKind eNewTextKind, + const tools::Rectangle& rRect) +: SdrTextObj(rSdrModel, eNewTextKind, rRect), mpXPoly(nullptr) { DBG_ASSERT(eTextKind==OBJ_TEXT || eTextKind==OBJ_TEXTEXT || @@ -99,21 +107,6 @@ SdrRectObj::~SdrRectObj() { } -SdrRectObj& SdrRectObj::operator=(const SdrRectObj& rCopy) -{ - if ( this == &rCopy ) - return *this; - - SdrTextObj::operator=( rCopy ); - - if ( rCopy.mpXPoly ) - mpXPoly.reset( new XPolygon( *rCopy.mpXPoly ) ); - else - mpXPoly.reset(); - - return *this; -} - void SdrRectObj::SetXPolyDirty() { mpXPoly.reset(); @@ -266,9 +259,24 @@ OUString SdrRectObj::TakeObjNamePlural() const return ImpGetResStr(pResId); } -SdrRectObj* SdrRectObj::Clone() const +SdrRectObj* SdrRectObj::Clone(SdrModel* pTargetModel) const { - return CloneHelper< SdrRectObj >(); + return CloneHelper< SdrRectObj >(pTargetModel); +} + +SdrRectObj& SdrRectObj::operator=(const SdrRectObj& rCopy) +{ + if ( this == &rCopy ) + return *this; + + SdrTextObj::operator=( rCopy ); + + if ( rCopy.mpXPoly ) + mpXPoly.reset( new XPolygon( *rCopy.mpXPoly ) ); + else + mpXPoly.reset(); + + return *this; } basegfx::B2DPolyPolygon SdrRectObj::TakeXorPoly() const diff --git a/svx/source/svdraw/svdotext.cxx b/svx/source/svdraw/svdotext.cxx index cf4448fac249..63ca33f850fc 100644 --- a/svx/source/svdraw/svdotext.cxx +++ b/svx/source/svdraw/svdotext.cxx @@ -64,25 +64,20 @@ using namespace com::sun::star; - // BaseProperties section - sdr::properties::BaseProperties* SdrTextObj::CreateObjectSpecificProperties() { return new sdr::properties::TextProperties(*this); } - // DrawContact section - sdr::contact::ViewContact* SdrTextObj::CreateObjectSpecificViewContact() { return new sdr::contact::ViewContactOfTextObj(*this); } - -SdrTextObj::SdrTextObj() -: SdrAttrObj(), +SdrTextObj::SdrTextObj(SdrModel& rSdrModel) +: SdrAttrObj(rSdrModel), mpText(nullptr), pEdtOutl(nullptr), eTextKind(OBJ_TEXT) @@ -102,8 +97,10 @@ SdrTextObj::SdrTextObj() mbInDownScale = false; } -SdrTextObj::SdrTextObj(const tools::Rectangle& rNewRect) -: SdrAttrObj(), +SdrTextObj::SdrTextObj( + SdrModel& rSdrModel, + const tools::Rectangle& rNewRect) +: SdrAttrObj(rSdrModel), maRect(rNewRect), mpText(nullptr), pEdtOutl(nullptr), @@ -125,8 +122,10 @@ SdrTextObj::SdrTextObj(const tools::Rectangle& rNewRect) mbSupportTextIndentingOnLineWidthChange = true; } -SdrTextObj::SdrTextObj(SdrObjKind eNewTextKind) -: SdrAttrObj(), +SdrTextObj::SdrTextObj( + SdrModel& rSdrModel, + SdrObjKind eNewTextKind) +: SdrAttrObj(rSdrModel), mpText(nullptr), pEdtOutl(nullptr), eTextKind(eNewTextKind) @@ -146,8 +145,11 @@ SdrTextObj::SdrTextObj(SdrObjKind eNewTextKind) mbSupportTextIndentingOnLineWidthChange = true; } -SdrTextObj::SdrTextObj(SdrObjKind eNewTextKind, const tools::Rectangle& rNewRect) -: SdrAttrObj(), +SdrTextObj::SdrTextObj( + SdrModel& rSdrModel, + SdrObjKind eNewTextKind, + const tools::Rectangle& rNewRect) +: SdrAttrObj(rSdrModel), maRect(rNewRect), mpText(nullptr), pEdtOutl(nullptr), @@ -171,25 +173,19 @@ SdrTextObj::SdrTextObj(SdrObjKind eNewTextKind, const tools::Rectangle& rNewRect SdrTextObj::~SdrTextObj() { - if( pModel ) - { - SdrOutliner& rOutl = pModel->GetHitTestOutliner(); - if( rOutl.GetTextObj() == this ) - rOutl.SetTextObj( nullptr ); - } - + SdrOutliner& rOutl(getSdrModelFromSdrObject().GetHitTestOutliner()); + if( rOutl.GetTextObj() == this ) + rOutl.SetTextObj( nullptr ); mpText.reset(); - ImpDeregisterLink(); } void SdrTextObj::FitFrameToTextSize() { - DBG_ASSERT(pModel!=nullptr,"SdrTextObj::FitFrameToTextSize(): pModel=NULL!"); ImpJustifyRect(maRect); SdrText* pText = getActiveText(); - if( pText==nullptr || !pText->GetOutlinerParaObject() || pModel==nullptr) + if(pText==nullptr || !pText->GetOutlinerParaObject()) return; SdrOutliner& rOutliner=ImpGetDrawOutliner(); @@ -478,39 +474,6 @@ void SdrTextObj::SetPage(SdrPage* pNewPage) } } -void SdrTextObj::SetModel(SdrModel* pNewModel) -{ - SdrModel* pOldModel=pModel; - bool bLinked=IsLinkedText(); - bool bChg=pNewModel!=pModel; - - if (bLinked && bChg) - { - ImpDeregisterLink(); - } - - SdrAttrObj::SetModel(pNewModel); - - if( bChg ) - { - if( pNewModel != nullptr && pOldModel != nullptr ) - SetTextSizeDirty(); - - sal_Int32 nCount = getTextCount(); - for( sal_Int32 nText = 0; nText < nCount; nText++ ) - { - SdrText* pText = getText( nText ); - if( pText ) - pText->SetModel( pNewModel ); - } - } - - if (bLinked && bChg) - { - ImpRegisterLink(); - } -} - void SdrTextObj::NbcSetEckenradius(long nRad) { SetObjectItem(makeSdrEckenradiusItem(nRad)); @@ -524,7 +487,7 @@ void SdrTextObj::AdaptTextMinSize() // Only do this for text frame. return; - if (pModel && pModel->IsPasteResize()) + if (getSdrModelFromSdrObject().IsPasteResize()) // Don't do this during paste resize. return; @@ -754,11 +717,9 @@ void SdrTextObj::TakeTextRect( SdrOutliner& rOutliner, tools::Rectangle& rTextRe if (pPara) { - bool bHitTest = false; - if( pModel ) - bHitTest = &pModel->GetHitTestOutliner() == &rOutliner; - + const bool bHitTest(&getSdrModelFromSdrObject().GetHitTestOutliner() == &rOutliner); const SdrTextObj* pTestObj = rOutliner.GetTextObj(); + if( !pTestObj || !bHitTest || pTestObj != this || pTestObj->GetOutlinerParaObject() != pOutlinerParaObject ) { @@ -1049,9 +1010,9 @@ OUString SdrTextObj::TakeObjNamePlural() const return sName; } -SdrTextObj* SdrTextObj::Clone() const +SdrTextObj* SdrTextObj::Clone(SdrModel* pTargetModel) const { - return CloneHelper< SdrTextObj >(); + return CloneHelper< SdrTextObj >(pTargetModel); } SdrTextObj& SdrTextObj::operator=(const SdrTextObj& rObj) @@ -1111,7 +1072,7 @@ basegfx::B2DPolyPolygon SdrTextObj::TakeContour() const basegfx::B2DPolyPolygon aRetval(SdrAttrObj::TakeContour()); // and now add the BoundRect of the text, if necessary - if ( pModel && GetOutlinerParaObject() && !IsFontwork() && !IsContourTextFrame() ) + if ( GetOutlinerParaObject() && !IsFontwork() && !IsContourTextFrame() ) { // using Clone()-Paint() strategy inside TakeContour() leaves a destroyed // SdrObject as pointer in DrawOutliner. Set *this again in fetching the outliner @@ -1213,7 +1174,7 @@ void SdrTextObj::ImpInitDrawOutliner( SdrOutliner& rOutl ) const SdrOutliner& SdrTextObj::ImpGetDrawOutliner() const { - SdrOutliner& rOutl=pModel->GetDrawOutliner(this); + SdrOutliner& rOutl(getSdrModelFromSdrObject().GetDrawOutliner(this)); // Code extracted to ImpInitDrawOutliner() ImpInitDrawOutliner( rOutl ); @@ -1261,7 +1222,7 @@ void SdrTextObj::ImpSetupDrawOutlinerForPaint( bool bContourFrame, double SdrTextObj::GetFontScaleY() const { SdrText* pText = getActiveText(); - if (pText == nullptr || !pText->GetOutlinerParaObject() || pModel == nullptr) + if (pText == nullptr || !pText->GetOutlinerParaObject()) return 1.0; SdrOutliner& rOutliner = ImpGetDrawOutliner(); @@ -1403,17 +1364,21 @@ void SdrTextObj::UpdateOutlinerFormatting( SdrOutliner& rOutl, tools::Rectangle& tools::Rectangle aAnchorRect; Fraction aFitXCorrection(1,1); - bool bContourFrame=IsContourTextFrame(); - - if( GetModel() ) - { - MapMode aMapMode(GetModel()->GetScaleUnit(), Point(0,0), - GetModel()->GetScaleFraction(), - GetModel()->GetScaleFraction()); - rOutl.SetRefMapMode(aMapMode); - } + const bool bContourFrame(IsContourTextFrame()); + const MapMode aMapMode( + getSdrModelFromSdrObject().GetScaleUnit(), + Point(0,0), + getSdrModelFromSdrObject().GetScaleFraction(), + getSdrModelFromSdrObject().GetScaleFraction()); - ImpSetupDrawOutlinerForPaint( bContourFrame, rOutl, aTextRect, aAnchorRect, rPaintRect, aFitXCorrection ); + rOutl.SetRefMapMode(aMapMode); + ImpSetupDrawOutlinerForPaint( + bContourFrame, + rOutl, + aTextRect, + aAnchorRect, + rPaintRect, + aFitXCorrection); } @@ -1561,7 +1526,7 @@ TextChain *SdrTextObj::GetTextChain() const //if (!IsChainable()) // return NULL; - return pModel->GetTextChain(); + return getSdrModelFromSdrObject().GetTextChain(); } bool SdrTextObj::IsVerticalWriting() const @@ -1670,7 +1635,7 @@ bool SdrTextObj::TRGetBaseGeometry(basegfx::B2DHomMatrix& rMatrix, basegfx::B2DP basegfx::B2DTuple aTranslate(aRectangle.Left(), aRectangle.Top()); // position maybe relative to anchorpos, convert - if( pModel && pModel->IsWriter() ) + if( getSdrModelFromSdrObject().IsWriter() ) { if(GetAnchorPos().X() || GetAnchorPos().Y()) { @@ -1769,7 +1734,7 @@ void SdrTextObj::TRSetBaseGeometry(const basegfx::B2DHomMatrix& rMatrix, const b } // if anchor is used, make position relative to it - if( pModel && pModel->IsWriter() ) + if( getSdrModelFromSdrObject().IsWriter() ) { if(GetAnchorPos().X() || GetAnchorPos().Y()) { diff --git a/svx/source/svdraw/svdotextdecomposition.cxx b/svx/source/svdraw/svdotextdecomposition.cxx index af6977fc3cbe..b50736972d35 100644 --- a/svx/source/svdraw/svdotextdecomposition.cxx +++ b/svx/source/svdraw/svdotextdecomposition.cxx @@ -973,8 +973,9 @@ void SdrTextObj::impDecomposeBlockTextPrimitive( // Usual processing - always grow in one of directions bool bAllowGrowVertical = !bVerticalWriting; bool bAllowGrowHorizontal = bVerticalWriting; + // Compatibility mode for tdf#99729 - if (pModel->IsAnchoredTextOverflowLegacy()) + if (getSdrModelFromSdrObject().IsAnchoredTextOverflowLegacy()) { bAllowGrowVertical = bHorizontalIsBlock; bAllowGrowHorizontal = bVerticalIsBlock; @@ -1466,7 +1467,7 @@ void SdrTextObj::impHandleChainingEventsDuringDecomposition(SdrOutliner &rOutlin if (bIsOverflow && !IsInEditMode()) { // Initialize Chaining Outliner - SdrOutliner &rChainingOutl = pModel->GetChainingOutliner(this); + SdrOutliner &rChainingOutl(getSdrModelFromSdrObject().GetChainingOutliner(this)); ImpInitDrawOutliner( rChainingOutl ); rChainingOutl.SetUpdateMode(true); // We must pass the chaining outliner otherwise we would mess up decomposition diff --git a/svx/source/svdraw/svdotxat.cxx b/svx/source/svdraw/svdotxat.cxx index f4c9528d4125..e88e55519930 100644 --- a/svx/source/svdraw/svdotxat.cxx +++ b/svx/source/svdraw/svdotxat.cxx @@ -62,10 +62,6 @@ bool SdrTextObj::AdjustTextFrameWidthAndHeight( tools::Rectangle& rR, bool bHgt, // Not a text frame. Bail out. return false; - if (!pModel) - // Model doesn't exist. Bail out. - return false; - if (rR.IsEmpty()) // Empty rectangle. return false; @@ -95,7 +91,7 @@ bool SdrTextObj::AdjustTextFrameWidthAndHeight( tools::Rectangle& rR, bool bHgt, aNewSize.AdjustWidth( -1 ); aNewSize.AdjustHeight( -1 ); Size aMaxSiz(100000, 100000); - Size aTmpSiz = pModel->GetMaxObjSize(); + Size aTmpSiz(getSdrModelFromSdrObject().GetMaxObjSize()); if (aTmpSiz.Width()) aMaxSiz.setWidth( aTmpSiz.Width() ); @@ -312,7 +308,7 @@ bool SdrTextObj::AdjustTextFrameWidthAndHeight() void SdrTextObj::ImpSetTextStyleSheetListeners() { - SfxStyleSheetBasePool* pStylePool=pModel!=nullptr ? pModel->GetStyleSheetPool() : nullptr; + SfxStyleSheetBasePool* pStylePool(getSdrModelFromSdrObject().GetStyleSheetPool()); if (pStylePool!=nullptr) { std::vector<OUString> aStyleNames; diff --git a/svx/source/svdraw/svdotxed.cxx b/svx/source/svdraw/svdotxed.cxx index 3290435144b1..bb3e60d9291b 100644 --- a/svx/source/svdraw/svdotxed.cxx +++ b/svx/source/svdraw/svdotxed.cxx @@ -49,7 +49,7 @@ bool SdrTextObj::BegTextEdit(SdrOutliner& rOutl) if ( !IsOutlText() ) nOutlinerMode = OutlinerMode::TextObject; rOutl.Init( nOutlinerMode ); - rOutl.SetRefDevice( pModel->GetRefDevice() ); + rOutl.SetRefDevice(getSdrModelFromSdrObject().GetRefDevice()); bool bFitToSize(IsFitToSize()); bool bContourFrame=IsContourTextFrame(); @@ -146,11 +146,9 @@ void SdrTextObj::TakeTextEditArea(Size* pPaperMin, Size* pPaperMax, tools::Recta Size aAnkSiz(aViewInit.GetSize()); aAnkSiz.AdjustWidth( -1 ); aAnkSiz.AdjustHeight( -1 ); // because GetSize() adds 1 Size aMaxSiz(1000000,1000000); - if (pModel!=nullptr) { - Size aTmpSiz(pModel->GetMaxObjSize()); - if (aTmpSiz.Width()!=0) aMaxSiz.setWidth(aTmpSiz.Width() ); - if (aTmpSiz.Height()!=0) aMaxSiz.setHeight(aTmpSiz.Height() ); - } + Size aTmpSiz(getSdrModelFromSdrObject().GetMaxObjSize()); + if (aTmpSiz.Width()!=0) aMaxSiz.setWidth(aTmpSiz.Width() ); + if (aTmpSiz.Height()!=0) aMaxSiz.setHeight(aTmpSiz.Height() ); // Done earlier since used in else tree below SdrTextHorzAdjust eHAdj(GetTextHorizontalAdjust()); diff --git a/svx/source/svdraw/svdotxln.cxx b/svx/source/svdraw/svdotxln.cxx index 75964d95d60b..27d4b9679da8 100644 --- a/svx/source/svdraw/svdotxln.cxx +++ b/svx/source/svdraw/svdotxln.cxx @@ -67,8 +67,9 @@ void ImpSdrObjTextLink::Closed() const OUString& /*rMimeType*/, const css::uno::Any & /*rValue */) { bool bForceReload = false; - SdrModel* pModel = pSdrObj ? pSdrObj->GetModel() : nullptr; - sfx2::LinkManager* pLinkManager= pModel ? pModel->GetLinkManager() : nullptr; + SdrModel* pModel(pSdrObj ? &pSdrObj->getSdrModelFromSdrObject() : nullptr); + sfx2::LinkManager* pLinkManager(pModel ? pModel->GetLinkManager() : nullptr); + if( pLinkManager ) { ImpSdrObjTextLinkUserData* pData=pSdrObj->GetLinkUserData(); @@ -254,7 +255,7 @@ ImpSdrObjTextLinkUserData* SdrTextObj::GetLinkUserData() const void SdrTextObj::ImpRegisterLink() { ImpSdrObjTextLinkUserData* pData=GetLinkUserData(); - sfx2::LinkManager* pLinkManager=pModel!=nullptr ? pModel->GetLinkManager() : nullptr; + sfx2::LinkManager* pLinkManager(getSdrModelFromSdrObject().GetLinkManager()); if (pLinkManager!=nullptr && pData!=nullptr && pData->pLink==nullptr) { // don't register twice pData->pLink = new ImpSdrObjTextLink(this); pLinkManager->InsertFileLink(*pData->pLink,OBJECT_CLIENT_FILE,pData->aFileName, @@ -266,7 +267,7 @@ void SdrTextObj::ImpRegisterLink() void SdrTextObj::ImpDeregisterLink() { ImpSdrObjTextLinkUserData* pData=GetLinkUserData(); - sfx2::LinkManager* pLinkManager=pModel!=nullptr ? pModel->GetLinkManager() : nullptr; + sfx2::LinkManager* pLinkManager(getSdrModelFromSdrObject().GetLinkManager()); if (pLinkManager!=nullptr && pData!=nullptr && pData->pLink!=nullptr) { // don't register twice // when doing Remove, *pLink is deleted implicitly pLinkManager->Remove( pData->pLink.get() ); diff --git a/svx/source/svdraw/svdotxtr.cxx b/svx/source/svdraw/svdotxtr.cxx index 40eca1077e38..1a6d4a50a358 100644 --- a/svx/source/svdraw/svdotxtr.cxx +++ b/svx/source/svdraw/svdotxtr.cxx @@ -175,7 +175,7 @@ void SdrTextObj::NbcResize(const Point& rRef, const Fraction& xFact, const Fract AdaptTextMinSize(); - if(bTextFrame && (!pModel || !pModel->IsPasteResize())) + if(bTextFrame && !getSdrModelFromSdrObject().IsPasteResize()) { NbcAdjustTextFrameWidthAndHeight(); } @@ -313,7 +313,7 @@ SdrObject* SdrTextObj::ImpConvertContainedTextToSdrPathObjs(bool bToPoly) const if(nResultCount) { // prepare own target - SdrObjGroup* pGroup = new SdrObjGroup(); + SdrObjGroup* pGroup = new SdrObjGroup(getSdrModelFromSdrObject()); SdrObjList* pObjectList = pGroup->GetSubList(); // process results @@ -355,7 +355,10 @@ SdrObject* SdrTextObj::ImpConvertContainedTextToSdrPathObjs(bool bToPoly) const aAttributeSet.Put(XFillStyleItem(drawing::FillStyle_SOLID)); // create filled SdrPathObj - pPathObj = new SdrPathObj(OBJ_PATHFILL, aPolyPolygon); + pPathObj = new SdrPathObj( + getSdrModelFromSdrObject(), + OBJ_PATHFILL, + aPolyPolygon); } else { @@ -366,18 +369,16 @@ SdrObject* SdrTextObj::ImpConvertContainedTextToSdrPathObjs(bool bToPoly) const aAttributeSet.Put(XFillStyleItem(drawing::FillStyle_NONE)); // create line SdrPathObj - pPathObj = new SdrPathObj(OBJ_PATHLINE, aPolyPolygon); + pPathObj = new SdrPathObj( + getSdrModelFromSdrObject(), + OBJ_PATHLINE, + aPolyPolygon); } // copy basic information from original pPathObj->ImpSetAnchorPos(GetAnchorPos()); pPathObj->NbcSetLayer(GetLayer()); - - if(GetModel()) - { - pPathObj->SetModel(GetModel()); - pPathObj->NbcSetStyleSheet(GetStyleSheet(), true); - } + pPathObj->NbcSetStyleSheet(GetStyleSheet(), true); // apply prepared ItemSet and add to target pPathObj->SetMergedItemSet(aAttributeSet); @@ -433,7 +434,10 @@ SdrObject* SdrTextObj::ImpConvertMakeObj(const basegfx::B2DPolyPolygon& rPolyPol ePathKind = bClosed ? OBJ_POLY : OBJ_PLIN; } - SdrPathObj* pPathObj = new SdrPathObj(ePathKind, aB2DPolyPolygon); + SdrPathObj* pPathObj = new SdrPathObj( + getSdrModelFromSdrObject(), + ePathKind, + aB2DPolyPolygon); if(bBezier) { @@ -443,18 +447,11 @@ SdrObject* SdrTextObj::ImpConvertMakeObj(const basegfx::B2DPolyPolygon& rPolyPol pPathObj->ImpSetAnchorPos(aAnchor); pPathObj->NbcSetLayer(GetLayer()); - - if(pModel) - { - pPathObj->SetModel(pModel); - - sdr::properties::ItemChangeBroadcaster aC(*pPathObj); - - pPathObj->ClearMergedItem(); - pPathObj->SetMergedItemSet(GetObjectItemSet()); - pPathObj->GetProperties().BroadcastItemChange(aC); - pPathObj->NbcSetStyleSheet(GetStyleSheet(), true); - } + sdr::properties::ItemChangeBroadcaster aC(*pPathObj); + pPathObj->ClearMergedItem(); + pPathObj->SetMergedItemSet(GetObjectItemSet()); + pPathObj->GetProperties().BroadcastItemChange(aC); + pPathObj->NbcSetStyleSheet(GetStyleSheet(), true); return pPathObj; } @@ -489,7 +486,7 @@ SdrObject* SdrTextObj::ImpConvertAddText(SdrObject* pObj, bool bBezier) const else { // not yet a group, create one and add partial and new shapes - SdrObjGroup* pGrp=new SdrObjGroup; + SdrObjGroup* pGrp=new SdrObjGroup(getSdrModelFromSdrObject()); SdrObjList* pOL=pGrp->GetSubList(); pOL->InsertObject(pObj); pOL->InsertObject(pText); diff --git a/svx/source/svdraw/svdouno.cxx b/svx/source/svdraw/svdouno.cxx index 6e364c33ade1..4a0e071ca8b9 100644 --- a/svx/source/svdraw/svdouno.cxx +++ b/svx/source/svdraw/svdouno.cxx @@ -145,9 +145,11 @@ namespace } } - -SdrUnoObj::SdrUnoObj(const OUString& rModelName) -: m_pImpl( new SdrUnoObjDataHolder ) +SdrUnoObj::SdrUnoObj( + SdrModel& rSdrModel, + const OUString& rModelName) +: SdrRectObj(rSdrModel), + m_pImpl( new SdrUnoObjDataHolder ) { bIsUnoObj = true; @@ -158,9 +160,12 @@ SdrUnoObj::SdrUnoObj(const OUString& rModelName) CreateUnoControlModel(rModelName); } -SdrUnoObj::SdrUnoObj(const OUString& rModelName, - const uno::Reference< lang::XMultiServiceFactory >& rxSFac) -: m_pImpl( new SdrUnoObjDataHolder ) +SdrUnoObj::SdrUnoObj( + SdrModel& rSdrModel, + const OUString& rModelName, + const uno::Reference< lang::XMultiServiceFactory >& rxSFac) +: SdrRectObj(rSdrModel), + m_pImpl( new SdrUnoObjDataHolder ) { bIsUnoObj = true; @@ -250,9 +255,9 @@ OUString SdrUnoObj::TakeObjNamePlural() const return ImpGetResStr(STR_ObjNamePluralUno); } -SdrUnoObj* SdrUnoObj::Clone() const +SdrUnoObj* SdrUnoObj::Clone(SdrModel* pTargetModel) const { - return CloneHelper< SdrUnoObj >(); + return CloneHelper< SdrUnoObj >(pTargetModel); } SdrUnoObj& SdrUnoObj::operator= (const SdrUnoObj& rObj) @@ -328,38 +333,6 @@ bool SdrUnoObj::hasSpecialDrag() const return false; } -bool SdrUnoObj::supportsFullDrag() const -{ - // override to have the possibility to enable/disable in debug and - // to check some things out. Current solution is working, so default is - // enabled - static bool bDoSupportFullDrag(true); - - return bDoSupportFullDrag; -} - -SdrObject* SdrUnoObj::getFullDragClone() const -{ - SdrObject* pRetval = nullptr; - static bool bHandleSpecial(false); - - if(bHandleSpecial) - { - // special handling for SdrUnoObj (FormControl). Create a SdrGrafObj - // for drag containing the graphical representation. This does not work too - // well, so the default is to simply clone - pRetval = new SdrGrafObj(SdrDragView::GetObjGraphic(GetModel(), this), GetLogicRect()); - } - else - { - // call parent (simply clone) - pRetval = SdrRectObj::getFullDragClone(); - } - - return pRetval; -} - - void SdrUnoObj::NbcSetLayer( SdrLayerID _nLayer ) { if ( GetLayer() == _nLayer ) diff --git a/svx/source/svdraw/svdovirt.cxx b/svx/source/svdraw/svdovirt.cxx index 2ffcdc313473..4306ecd577fa 100644 --- a/svx/source/svdraw/svdovirt.cxx +++ b/svx/source/svdraw/svdovirt.cxx @@ -42,8 +42,10 @@ sdr::contact::ViewContact* SdrVirtObj::CreateObjectSpecificViewContact() return new sdr::contact::ViewContactOfVirtObj(*this); } - -SdrVirtObj::SdrVirtObj(SdrObject& rNewObj): +SdrVirtObj::SdrVirtObj( + SdrModel& rSdrModel, + SdrObject& rNewObj) +: SdrObject(rSdrModel), rRefObj(rNewObj) { bVirtObj=true; // this is only a virtual object @@ -56,7 +58,6 @@ SdrVirtObj::~SdrVirtObj() rRefObj.DelReference(*this); } - const SdrObject& SdrVirtObj::GetReferencedObj() const { return rRefObj; @@ -81,13 +82,6 @@ void SdrVirtObj::NbcSetAnchorPos(const Point& rAnchorPos) aAnchor=rAnchorPos; } - -void SdrVirtObj::SetModel(SdrModel* pNewModel) -{ - SdrObject::SetModel(pNewModel); - rRefObj.SetModel(pNewModel); -} - void SdrVirtObj::TakeObjInfo(SdrObjTransformInfoRec& rInfo) const { rRefObj.TakeObjInfo(rInfo); @@ -128,15 +122,29 @@ void SdrVirtObj::RecalcBoundRect() aOutRect+=aAnchor; } -SdrVirtObj* SdrVirtObj::Clone() const +SdrVirtObj* SdrVirtObj::Clone(SdrModel* pTargetModel) const { - return new SdrVirtObj(rRefObj); // only a further reference + return CloneHelper< SdrVirtObj >(pTargetModel); + // TTTT not sure if the above works - how could SdrObjFactory::MakeNewObject + // create an object wit correct rRefObj (?) OTOH VirtObj probably needs not + // to be cloned ever - only used in Writer for multiple instances e.g. Header/Footer + // return new SdrVirtObj( + // getSdrModelFromSdrObject(), + // rRefObj); // only a further reference } SdrVirtObj& SdrVirtObj::operator=(const SdrVirtObj& rObj) -{ // reference different object?? +{ SdrObject::operator=(rObj); - aAnchor=rObj.aAnchor; + + // reference different object?? TTTT -> yes! + rRefObj.DelReference(*this); + rRefObj = rObj.rRefObj; + rRefObj.AddReference(*this); + + aSnapRect = rObj.aSnapRect; + aAnchor = rObj.aAnchor; + return *this; } @@ -266,24 +274,11 @@ bool SdrVirtObj::supportsFullDrag() const SdrObject* SdrVirtObj::getFullDragClone() const { - static bool bSpecialHandling(false); - SdrObject* pRetval = nullptr; - - if(bSpecialHandling) - { - // special handling for VirtObj. Do not create another - // reference to rRefObj, this would allow to change that - // one on drag. Instead, create a SdrGrafObj for drag containing - // the graphical representation - pRetval = new SdrGrafObj(SdrDragView::GetObjGraphic(GetModel(), this), GetLogicRect()); - } - else - { - SdrObject& rReferencedObject = const_cast<SdrVirtObj*>(this)->ReferencedObj(); - pRetval = new SdrGrafObj(SdrDragView::GetObjGraphic(GetModel(), &rReferencedObject), GetLogicRect()); - } - - return pRetval; + SdrObject& rReferencedObject = const_cast<SdrVirtObj*>(this)->ReferencedObj(); + return new SdrGrafObj( + getSdrModelFromSdrObject(), + SdrDragView::GetObjGraphic(rReferencedObject), + GetLogicRect()); } bool SdrVirtObj::beginSpecialDrag(SdrDragStat& rDrag) const diff --git a/svx/source/svdraw/svdpage.cxx b/svx/source/svdraw/svdpage.cxx index 7ff4129691ff..2dff0a900148 100644 --- a/svx/source/svdraw/svdpage.cxx +++ b/svx/source/svdraw/svdpage.cxx @@ -70,13 +70,12 @@ public: static const sal_Int32 InitialObjectContainerCapacity (64); -SdrObjList::SdrObjList(SdrModel* pNewModel, SdrPage* pNewPage): - maList(), +SdrObjList::SdrObjList(SdrPage* pNewPage) +: maList(), mxNavigationOrder(), mbIsNavigationOrderDirty(false) { maList.reserve(InitialObjectContainerCapacity); - pModel=pNewModel; pPage=pNewPage; pUpList=nullptr; bObjOrdNumsDirty=false; @@ -85,58 +84,46 @@ SdrObjList::SdrObjList(SdrModel* pNewModel, SdrPage* pNewPage): eListKind=SdrObjListKind::Unknown; } -SdrObjList::SdrObjList(): - maList(), - mxNavigationOrder(), - mbIsNavigationOrderDirty(false) +SdrObjList::~SdrObjList() { - maList.reserve(InitialObjectContainerCapacity); - pModel=nullptr; - pPage=nullptr; - pUpList=nullptr; - bObjOrdNumsDirty=false; - bRectsDirty=false; - pOwnerObj=nullptr; - eListKind=SdrObjListKind::Unknown; + Clear(); // delete contents of container } -SdrObjList::~SdrObjList() +SdrObjList* SdrObjList::CloneSdrObjList(SdrModel* pNewModel) const { - - // To avoid that the Clear() method will broadcast changes when in destruction - // which would call virtual method (not allowed in destructor), the model is set - // to NULL here. - pModel = nullptr; - - Clear(); // delete contents of container + SdrObjList* pObjList = new SdrObjList(); + pObjList->lateInitSdrObjList(*this, pNewModel); + return pObjList; } -void SdrObjList::lateInit(const SdrObjList& rSrcList) +void SdrObjList::lateInitSdrObjList(const SdrObjList& rSrcList, SdrModel* pNewModel) { // this function is only supposed to be called once, right after construction assert(maList.empty()); - eListKind=rSrcList.eListKind; - CopyObjects(rSrcList); + CopyObjects(rSrcList, pNewModel); } -void SdrObjList::CopyObjects(const SdrObjList& rSrcList) +void SdrObjList::CopyObjects(const SdrObjList& rSrcList, SdrModel* pNewModel) { Clear(); - bObjOrdNumsDirty=false; - bRectsDirty =false; - size_t nCloneErrCnt = 0; - const size_t nCount = rSrcList.GetObjCount(); - for (size_t no=0; no<nCount; ++no) { - SdrObject* pSO=rSrcList.GetObj(no); + bObjOrdNumsDirty = false; + bRectsDirty = false; + size_t nCloneErrCnt(0); + const size_t nCount(rSrcList.GetObjCount()); - SdrObject* pDO = pSO->Clone(); + for (size_t no(0); no < nCount; ++no) + { + SdrObject* pSO(rSrcList.GetObj(no)); + SdrObject* pDO(pSO->Clone(pNewModel)); - if (pDO!=nullptr) { - pDO->SetModel(pModel); + if(nullptr != pDO) + { pDO->SetPage(pPage); NbcInsertObject(pDO, SAL_MAX_SIZE); - } else { + } + else + { nCloneErrCnt++; } } @@ -209,9 +196,9 @@ void SdrObjList::CopyObjects(const SdrObjList& rSrcList) void SdrObjList::Clear() { - bool bObjectsRemoved(false); + SdrModel* pSdrModelFromRemovedSdrObject(nullptr); - while( ! maList.empty()) + while(!maList.empty()) { // remove last object from list SdrObject* pObj = maList.back(); @@ -221,22 +208,22 @@ void SdrObjList::Clear() // to delete the object and thus refresh visualisations pObj->GetViewContact().flushViewObjectContacts(); - bObjectsRemoved = true; - - // sent remove hint (after removal, see RemoveObject()) - if(pModel) + if(nullptr == pSdrModelFromRemovedSdrObject) { - SdrHint aHint(SdrHintKind::ObjectRemoved, *pObj, pPage); - pModel->Broadcast(aHint); + pSdrModelFromRemovedSdrObject = &pObj->getSdrModelFromSdrObject(); } + // sent remove hint (after removal, see RemoveObject()) + SdrHint aHint(SdrHintKind::ObjectRemoved, *pObj, pPage); + pObj->getSdrModelFromSdrObject().Broadcast(aHint); + // delete the object itself SdrObject::Free( pObj ); } - if(pModel && bObjectsRemoved) + if(nullptr != pSdrModelFromRemovedSdrObject) { - pModel->SetChanged(); + pSdrModelFromRemovedSdrObject->SetChanged(); } } @@ -257,23 +244,6 @@ void SdrObjList::SetPage(SdrPage* pNewPage) } } -SdrModel* SdrObjList::GetModel() const -{ - return pModel; -} - -void SdrObjList::SetModel(SdrModel* pNewModel) -{ - if (pModel!=pNewModel) { - pModel=pNewModel; - const size_t nCount = GetObjCount(); - for (size_t i=0; i<nCount; ++i) { - SdrObject* pObj=GetObj(i); - pObj->SetModel(pModel); - } - } -} - void SdrObjList::RecalcObjOrdNums() { const size_t nCount = GetObjCount(); @@ -369,18 +339,15 @@ void SdrObjList::InsertObject(SdrObject* pObj, size_t nPos) pOwnerObj->ActionChanged(); } - if(pModel) + // TODO: We need a different broadcast here! + // Repaint from object number ... (heads-up: GroupObj) + if(pObj->GetPage()) { - // TODO: We need a different broadcast here! - // Repaint from object number ... (heads-up: GroupObj) - if(pObj->GetPage()) - { - SdrHint aHint(SdrHintKind::ObjectInserted, *pObj); - pModel->Broadcast(aHint); - } - - pModel->SetChanged(); + SdrHint aHint(SdrHintKind::ObjectInserted, *pObj); + pObj->getSdrModelFromSdrObject().Broadcast(aHint); } + + pObj->getSdrModelFromSdrObject().SetChanged(); } } @@ -432,16 +399,17 @@ SdrObject* SdrObjList::RemoveObject(size_t nObjNum) { // flushViewObjectContacts() clears the VOC's and those invalidate pObj->GetViewContact().flushViewObjectContacts(); - DBG_ASSERT(pObj->IsInserted(),"The object does not have the status Inserted."); - if (pModel!=nullptr) { - // TODO: We need a different broadcast here. - if (pObj->GetPage()!=nullptr) { - SdrHint aHint(SdrHintKind::ObjectRemoved, *pObj); - pModel->Broadcast(aHint); - } - pModel->SetChanged(); + + // TODO: We need a different broadcast here. + if (pObj->GetPage()!=nullptr) + { + SdrHint aHint(SdrHintKind::ObjectRemoved, *pObj); + pObj->getSdrModelFromSdrObject().Broadcast(aHint); } + + pObj->getSdrModelFromSdrObject().SetChanged(); + pObj->SetInserted(false); // calls, among other things, the UserCall pObj->SetObjList(nullptr); pObj->SetPage(nullptr); @@ -514,13 +482,14 @@ SdrObject* SdrObjList::ReplaceObject(SdrObject* pNewObj, size_t nObjNum) DBG_ASSERT(pObj!=nullptr,"SdrObjList::ReplaceObject: Could not find object to remove."); if (pObj!=nullptr) { DBG_ASSERT(pObj->IsInserted(),"SdrObjList::ReplaceObject: the object does not have status Inserted."); - if (pModel!=nullptr) { - // TODO: We need a different broadcast here. - if (pObj->GetPage()!=nullptr) { - SdrHint aHint(SdrHintKind::ObjectRemoved, *pObj); - pModel->Broadcast(aHint); - } + + // TODO: We need a different broadcast here. + if (pObj->GetPage()!=nullptr) + { + SdrHint aHint(SdrHintKind::ObjectRemoved, *pObj); + pObj->getSdrModelFromSdrObject().Broadcast(aHint); } + pObj->SetInserted(false); pObj->SetObjList(nullptr); pObj->SetPage(nullptr); @@ -538,14 +507,15 @@ SdrObject* SdrObjList::ReplaceObject(SdrObject* pNewObj, size_t nObjNum) impChildInserted(*pNewObj); pNewObj->SetInserted(true); - if (pModel!=nullptr) { - // TODO: We need a different broadcast here. - if (pNewObj->GetPage()!=nullptr) { - SdrHint aHint(SdrHintKind::ObjectInserted, *pNewObj); - pModel->Broadcast(aHint); - } - pModel->SetChanged(); + + // TODO: We need a different broadcast here. + if (pNewObj->GetPage()!=nullptr) { + SdrHint aHint(SdrHintKind::ObjectInserted, *pNewObj); + pNewObj->getSdrModelFromSdrObject().Broadcast(aHint); } + + pNewObj->getSdrModelFromSdrObject().SetChanged(); + SetRectsDirty(); } return pObj; @@ -574,13 +544,11 @@ SdrObject* SdrObjList::SetObjectOrdNum(size_t nOldObjNum, size_t nNewObjNum) pObj->SetOrdNum(nNewObjNum); bObjOrdNumsDirty=true; - if (pModel!=nullptr) - { - // TODO: We need a different broadcast here. - if (pObj->GetPage()!=nullptr) - pModel->Broadcast(SdrHint(SdrHintKind::ObjectChange, *pObj)); - pModel->SetChanged(); - } + + // TODO: We need a different broadcast here. + if (pObj->GetPage()!=nullptr) + pObj->getSdrModelFromSdrObject().Broadcast(SdrHint(SdrHintKind::ObjectChange, *pObj)); + pObj->getSdrModelFromSdrObject().SetChanged(); } return pObj; } @@ -781,8 +749,7 @@ void SdrObjList::SetObjectNavigationPosition ( mbIsNavigationOrderDirty = true; // The navigation order is written out to file so mark the model as modified. - if (pModel != nullptr) - pModel->SetChanged(); + rObject.getSdrModelFromSdrObject().SetChanged(); } } @@ -1048,20 +1015,18 @@ void SdrPageProperties::ImpAddStyleSheet(SfxStyleSheet& rNewStyleSheet) void ImpPageChange(SdrPage& rSdrPage) { rSdrPage.ActionChanged(); - - if(rSdrPage.GetModel()) - { - rSdrPage.GetModel()->SetChanged(); - SdrHint aHint(SdrHintKind::PageOrderChange, &rSdrPage); - rSdrPage.GetModel()->Broadcast(aHint); - } + rSdrPage.getSdrModelFromSdrPage().SetChanged(); + SdrHint aHint(SdrHintKind::PageOrderChange, &rSdrPage); + rSdrPage.getSdrModelFromSdrPage().Broadcast(aHint); } SdrPageProperties::SdrPageProperties(SdrPage& rSdrPage) : SfxListener(), mpSdrPage(&rSdrPage), mpStyleSheet(nullptr), - maProperties(mpSdrPage->GetModel()->GetItemPool(), svl::Items<XATTR_FILL_FIRST, XATTR_FILL_LAST>{}) + maProperties( + mpSdrPage->getSdrModelFromSdrPage().GetItemPool(), + svl::Items<XATTR_FILL_FIRST, XATTR_FILL_LAST>{}) { if(!rSdrPage.IsMasterPage()) { @@ -1136,18 +1101,23 @@ void SdrPageProperties::SetStyleSheet(SfxStyleSheet* pStyleSheet) } -SdrPage::SdrPage(SdrModel& rNewModel, bool bMasterPage) -: SdrObjList(&rNewModel, this), +SdrPage::SdrPage(SdrModel& rModel, bool bMasterPage) +: tools::WeakBase(), + SdrObjList(this), + maPageUsers(), mpViewContact(nullptr), + mrSdrModelFromSdrPage(rModel), mnWidth(10), mnHeight(10), mnBorderLeft(0), mnBorderUpper(0), mnBorderRight(0), mnBorderLower(0), - mpLayerAdmin(new SdrLayerAdmin(&rNewModel.GetLayerAdmin())), + mpLayerAdmin(new SdrLayerAdmin(&rModel.GetLayerAdmin())), mpSdrPageProperties(nullptr), + mxUnoPage(), mpMasterPageDescriptor(nullptr), + aPrefVisiLayers(), nPageNum(0), mbMaster(bMasterPage), mbInserted(false), @@ -1160,27 +1130,6 @@ SdrPage::SdrPage(SdrModel& rNewModel, bool bMasterPage) mpSdrPageProperties.reset(new SdrPageProperties(*this)); } -SdrPage::SdrPage(const SdrPage& rSrcPage) -: SdrObjList(rSrcPage.pModel, this), - mpViewContact(nullptr), - mnWidth(rSrcPage.mnWidth), - mnHeight(rSrcPage.mnHeight), - mnBorderLeft(rSrcPage.mnBorderLeft), - mnBorderUpper(rSrcPage.mnBorderUpper), - mnBorderRight(rSrcPage.mnBorderRight), - mnBorderLower(rSrcPage.mnBorderLower), - mpLayerAdmin(new SdrLayerAdmin(rSrcPage.pModel->GetLayerAdmin())), - mpSdrPageProperties(nullptr), - mpMasterPageDescriptor(nullptr), - nPageNum(rSrcPage.nPageNum), - mbMaster(rSrcPage.mbMaster), - mbInserted(false), - mbObjectsNotPersistent(rSrcPage.mbObjectsNotPersistent), - mbPageBorderOnlyLeftRight(rSrcPage.mbPageBorderOnlyLeftRight) -{ - aPrefVisiLayers.SetAll(); -} - SdrPage::~SdrPage() { if( mxUnoPage.is() ) try @@ -1218,18 +1167,13 @@ SdrPage::~SdrPage() mpSdrPageProperties.reset(); } -void SdrPage::lateInit(const SdrPage& rSrcPage, SdrModel* const pNewModel) +void SdrPage::lateInit(const SdrPage& rSrcPage) { assert(!mpViewContact); - assert(!mpSdrPageProperties); + // SdrPageProperties get set by SdrPage::SdrPage already, so do not assert anymore + // assert(!mpSdrPageProperties); assert(!mxUnoPage.is()); - if (pNewModel && (pNewModel != pModel)) - { - pModel = pNewModel; - impl_setModelForLayerAdmin(pNewModel); - } - // copy all the local parameters to make this instance // a valid copy of source page before copying and inserting // the contained objects @@ -1268,24 +1212,18 @@ void SdrPage::lateInit(const SdrPage& rSrcPage, SdrModel* const pNewModel) } // Now copy the contained objects - SdrObjList::lateInit(rSrcPage); + SdrObjList::lateInitSdrObjList(rSrcPage, &getSdrModelFromSdrPage()); // be careful and correct eListKind, a member of SdrObjList which // will be changed by the SdrObjList::lateInit before... eListKind = (mbMaster) ? SdrObjListKind::MasterPage : SdrObjListKind::DrawPage; } -SdrPage* SdrPage::Clone() const -{ - return Clone(nullptr); -} - SdrPage* SdrPage::Clone(SdrModel* pNewModel) const { - if (pNewModel==nullptr) pNewModel=pModel; - SdrPage* pPage2=new SdrPage(*pNewModel); - pPage2->lateInit(*this); - return pPage2; + SdrPage* pClonedPage(new SdrPage(nullptr == pNewModel ? getSdrModelFromSdrPage() : *pNewModel)); + pClonedPage->lateInit(*this); + return pClonedPage; } void SdrPage::SetSize(const Size& aSiz) @@ -1435,59 +1373,6 @@ sal_Int32 SdrPage::GetLowerBorder() const return mnBorderLower; } -void SdrPage::impl_setModelForLayerAdmin(SdrModel* const pNewModel) -{ - if (pNewModel!=nullptr) { - mpLayerAdmin->SetParent(&pNewModel->GetLayerAdmin()); - } else { - mpLayerAdmin->SetParent(nullptr); - } - mpLayerAdmin->SetModel(pNewModel); -} - -void SdrPage::SetModel(SdrModel* pNewModel) -{ - SdrModel* pOldModel=pModel; - SdrObjList::SetModel(pNewModel); - - if (pNewModel!=pOldModel) - { - impl_setModelForLayerAdmin( pNewModel ); - - // create new SdrPageProperties with new model (due to SfxItemSet there) - // and copy ItemSet and StyleSheet - std::unique_ptr<SdrPageProperties> pNew(new SdrPageProperties(*this)); - - if(!IsMasterPage()) - { - const SfxItemSet& rOldSet = getSdrPageProperties().GetItemSet(); - SfxItemSet* pNewSet = rOldSet.Clone(false, &pNewModel->GetItemPool()); - //ensure checkForUniqueItem is called so new pages which have e.g. - //XFillBitmapItem set, do not conflict with an existing XFillBitmapItem - //with the same name but different properties - SdrModel::MigrateItemSet(&rOldSet, pNewSet, pNewModel); - pNew->PutItemSet(*pNewSet); - delete pNewSet; - } - - pNew->SetStyleSheet(getSdrPageProperties().GetStyleSheet()); - - mpSdrPageProperties = std::move(pNew); - } - - // update listeners at possible API wrapper object - if( pOldModel != pNewModel ) - { - if( mxUnoPage.is() ) - { - SvxDrawPage* pPage2 = SvxDrawPage::getImplementation( mxUnoPage ); - if( pPage2 ) - pPage2->ChangeModel( pNewModel ); - } - } -} - - // #i68775# React on PageNum changes (from Model in most cases) void SdrPage::SetPageNum(sal_uInt16 nNew) { @@ -1507,11 +1392,11 @@ sal_uInt16 SdrPage::GetPageNum() const return 0; if (mbMaster) { - if (pModel && pModel->IsMPgNumsDirty()) - pModel->RecalcPageNums(true); + if (getSdrModelFromSdrPage().IsMPgNumsDirty()) + getSdrModelFromSdrPage().RecalcPageNums(true); } else { - if (pModel && pModel->IsPagNumsDirty()) - pModel->RecalcPageNums(false); + if (getSdrModelFromSdrPage().IsPagNumsDirty()) + getSdrModelFromSdrPage().RecalcPageNums(false); } return nPageNum; } @@ -1521,11 +1406,7 @@ void SdrPage::SetChanged() // For test purposes, use the new ViewContact for change // notification now. ActionChanged(); - - if( pModel ) - { - pModel->SetChanged(); - } + getSdrModelFromSdrPage().SetChanged(); } diff --git a/svx/source/svdraw/svdpagv.cxx b/svx/source/svdraw/svdpagv.cxx index da88ec5907f3..ff6349894259 100644 --- a/svx/source/svdraw/svdpagv.cxx +++ b/svx/source/svdraw/svdpagv.cxx @@ -898,15 +898,25 @@ sal_uInt16 SdrPageView::GetEnteredLevel() const void SdrPageView::CheckAktGroup() { - SdrObject* pGrp=GetAktGroup(); - while (pGrp!=nullptr && - (!pGrp->IsInserted() || pGrp->GetObjList()==nullptr || - pGrp->GetPage()==nullptr || pGrp->GetModel()==nullptr)) { // anything outside of the borders? - pGrp=pGrp->GetUpGroup(); + SdrObject* pGrp(GetAktGroup()); + + while(nullptr != pGrp && + (!pGrp->IsInserted() || nullptr == pGrp->GetObjList() || nullptr == pGrp->GetPage())) + { + // anything outside of the borders? + pGrp = pGrp->GetUpGroup(); } - if (pGrp!=GetAktGroup()) { - if (pGrp!=nullptr) EnterGroup(pGrp); - else LeaveAllGroup(); + + if(pGrp != GetAktGroup()) + { + if(nullptr != pGrp) + { + EnterGroup(pGrp); + } + else + { + LeaveAllGroup(); + } } } diff --git a/svx/source/svdraw/svdpntv.cxx b/svx/source/svdraw/svdpntv.cxx index 48c971d61792..ba0e252da346 100644 --- a/svx/source/svdraw/svdpntv.cxx +++ b/svx/source/svdraw/svdpntv.cxx @@ -181,9 +181,12 @@ void SdrPaintView::ImpClearVars() maGridColor = COL_BLACK; } -SdrPaintView::SdrPaintView(SdrModel* pModel, OutputDevice* pOut) -: mpPageView(nullptr), - maDefaultAttr(pModel->GetItemPool()), +SdrPaintView::SdrPaintView( + SdrModel& rSdrModel, + OutputDevice* pOut) +: mrSdrModelFromSdrView(rSdrModel), + mpPageView(nullptr), + maDefaultAttr(rSdrModel.GetItemPool()), mbBufferedOutputAllowed(false), mbBufferedOverlayAllowed(false), mbPagePaintingAllowed(true), @@ -192,7 +195,7 @@ SdrPaintView::SdrPaintView(SdrModel* pModel, OutputDevice* pOut) mbHideDraw(false), mbHideFormControl(false) { - mpModel=pModel; + mpModel=&rSdrModel; ImpClearVars(); if(pOut) diff --git a/svx/source/svdraw/svdpoev.cxx b/svx/source/svdraw/svdpoev.cxx index 509eb112dd96..56e32865e012 100644 --- a/svx/source/svdraw/svdpoev.cxx +++ b/svx/source/svdraw/svdpoev.cxx @@ -44,8 +44,10 @@ void SdrPolyEditView::ImpResetPolyPossibilityFlags() bSetMarkedSegmentsKindPossible=false; } -SdrPolyEditView::SdrPolyEditView(SdrModel* pModel1, OutputDevice* pOut): - SdrEditView(pModel1,pOut) +SdrPolyEditView::SdrPolyEditView( + SdrModel& rSdrModel, + OutputDevice* pOut) +: SdrEditView(rSdrModel, pOut) { ImpResetPolyPossibilityFlags(); } diff --git a/svx/source/svdraw/svdsnpv.cxx b/svx/source/svdraw/svdsnpv.cxx index 94f1f5affc00..10aacc3f87fd 100644 --- a/svx/source/svdraw/svdsnpv.cxx +++ b/svx/source/svdraw/svdsnpv.cxx @@ -165,30 +165,31 @@ void ImplHelpLineOverlay::SetPosition(const basegfx::B2DPoint& rNewPosition) } } - -SdrSnapView::SdrSnapView(SdrModel* pModel1, OutputDevice* pOut) - : SdrPaintView(pModel1,pOut) - , mpPageOriginOverlay(nullptr) - , mpHelpLineOverlay(nullptr) - , nMagnSizPix(4) - , nSnapAngle(1500) - , nEliminatePolyPointLimitAngle(0) - , eCrookMode(SdrCrookMode::Rotate) - , bSnapEnab(true) - , bGridSnap(true) - , bBordSnap(true) - , bHlplSnap(true) - , bOFrmSnap(true) - , bOPntSnap(false) - , bOConSnap(true) - , bMoveSnapOnlyTopLeft(false) - , bOrtho(false) - , bBigOrtho(true) - , bAngleSnapEnab(false) - , bMoveOnlyDragging(false) - , bSlantButShear(false) - , bCrookNoContortion(false) - , bEliminatePolyPoints(false) +SdrSnapView::SdrSnapView( + SdrModel& rSdrModel, + OutputDevice* pOut) +: SdrPaintView(rSdrModel, pOut) + ,mpPageOriginOverlay(nullptr) + ,mpHelpLineOverlay(nullptr) + ,nMagnSizPix(4) + ,nSnapAngle(1500) + ,nEliminatePolyPointLimitAngle(0) + ,eCrookMode(SdrCrookMode::Rotate) + ,bSnapEnab(true) + ,bGridSnap(true) + ,bBordSnap(true) + ,bHlplSnap(true) + ,bOFrmSnap(true) + ,bOPntSnap(false) + ,bOConSnap(true) + ,bMoveSnapOnlyTopLeft(false) + ,bOrtho(false) + ,bBigOrtho(true) + ,bAngleSnapEnab(false) + ,bMoveOnlyDragging(false) + ,bSlantButShear(false) + ,bCrookNoContortion(false) + ,bEliminatePolyPoints(false) { } diff --git a/svx/source/svdraw/svdtext.cxx b/svx/source/svdraw/svdtext.cxx index 159f863cb54c..549578832885 100644 --- a/svx/source/svdraw/svdtext.cxx +++ b/svx/source/svdraw/svdtext.cxx @@ -31,7 +31,6 @@ SdrText::SdrText( SdrTextObj& rObject ) : mpOutlinerParaObject( nullptr ) , mrObject( rObject ) -, mpModel( rObject.GetModel() ) , mbPortionInfoChecked( false ) { OSL_ENSURE(&mrObject, "SdrText created without SdrTextObj (!)"); @@ -48,11 +47,12 @@ void SdrText::CheckPortionInfo( SdrOutliner& rOutliner ) { // #i102062# no action when the Outliner is the HitTestOutliner, // this will remove WrongList info at the OPO - if(mpModel && &rOutliner == &mpModel->GetHitTestOutliner()) + if(&rOutliner == &mrObject.getSdrModelFromSdrObject().GetHitTestOutliner()) return; // TODO: optimization: we could create a BigTextObject mbPortionInfoChecked=true; + if(mpOutlinerParaObject!=nullptr && rOutliner.ShouldCreateBigTextObject()) { // #i102062# MemoryLeak closed @@ -76,16 +76,15 @@ void SdrText::SetOutlinerParaObject( OutlinerParaObject* pTextObject ) { if( mpOutlinerParaObject.get() != pTextObject ) { - if( mpModel ) + // Update HitTestOutliner + const SdrTextObj* pTestObj(mrObject.getSdrModelFromSdrObject().GetHitTestOutliner().GetTextObj()); + + if(pTestObj && pTestObj->GetOutlinerParaObject() == mpOutlinerParaObject.get()) { - // Update HitTestOutliner - const SdrTextObj* pTestObj = mpModel->GetHitTestOutliner().GetTextObj(); - if( pTestObj && pTestObj->GetOutlinerParaObject() == mpOutlinerParaObject.get() ) - mpModel->GetHitTestOutliner().SetTextObj( nullptr ); + mrObject.getSdrModelFromSdrObject().GetHitTestOutliner().SetTextObj(nullptr); } mpOutlinerParaObject.reset(pTextObject); - mbPortionInfoChecked = false; } } @@ -98,82 +97,33 @@ OutlinerParaObject* SdrText::GetOutlinerParaObject() const /** returns the current OutlinerParaObject and removes it from this instance */ OutlinerParaObject* SdrText::RemoveOutlinerParaObject() { - if( mpModel ) + // Update HitTestOutliner + const SdrTextObj* pTestObj(mrObject.getSdrModelFromSdrObject().GetHitTestOutliner().GetTextObj()); + + if(pTestObj && pTestObj->GetOutlinerParaObject() == mpOutlinerParaObject.get()) { - // Update HitTestOutliner - const SdrTextObj* pTestObj = mpModel->GetHitTestOutliner().GetTextObj(); - if( pTestObj && pTestObj->GetOutlinerParaObject() == mpOutlinerParaObject.get() ) - mpModel->GetHitTestOutliner().SetTextObj( nullptr ); + mrObject.getSdrModelFromSdrObject().GetHitTestOutliner().SetTextObj(nullptr); } OutlinerParaObject* pOPO = mpOutlinerParaObject.release(); - mbPortionInfoChecked = false; return pOPO; } -void SdrText::SetModel( SdrModel* pNewModel ) -{ - if( pNewModel == mpModel ) - return; - - SdrModel* pOldModel = mpModel; - mpModel = pNewModel; - - if( !mpOutlinerParaObject || pOldModel==nullptr || pNewModel==nullptr) - return; - - bool bHgtSet = GetObjectItemSet().GetItemState(EE_CHAR_FONTHEIGHT) == SfxItemState::SET; - - MapUnit aOldUnit(pOldModel->GetScaleUnit()); - MapUnit aNewUnit(pNewModel->GetScaleUnit()); - bool bScaleUnitChanged=aNewUnit!=aOldUnit; - // Now move the OutlinerParaObject into a new Pool. - // TODO: We should compare the DefTab and RefDevice of both Models to - // see whether we need to use AutoGrow! - sal_Int32 nOldFontHgt=pOldModel->GetDefaultFontHeight(); - sal_Int32 nNewFontHgt=pNewModel->GetDefaultFontHeight(); - bool bDefHgtChanged=nNewFontHgt!=nOldFontHgt; - bool bSetHgtItem=bDefHgtChanged && !bHgtSet; - if (bSetHgtItem) - { - // fix the value of HeightItem, so - // 1. it remains and - // 2. DoStretchChars gets the right value - SetObjectItem(SvxFontHeightItem(nOldFontHgt, 100, EE_CHAR_FONTHEIGHT)); - } - // now use the Outliner, etc. so the above SetAttr can work at all - SdrOutliner& rOutliner = mrObject.ImpGetDrawOutliner(); - rOutliner.SetText(*mpOutlinerParaObject); - mpOutlinerParaObject.reset(); - if (bScaleUnitChanged) - { - Fraction aMetricFactor=GetMapFactor(aOldUnit,aNewUnit).X(); - - if (bSetHgtItem) - { - // Now correct the frame attribute - nOldFontHgt=BigMulDiv(nOldFontHgt,aMetricFactor.GetNumerator(),aMetricFactor.GetDenominator()); - SetObjectItem(SvxFontHeightItem(nOldFontHgt, 100, EE_CHAR_FONTHEIGHT)); - } - } - SetOutlinerParaObject(rOutliner.CreateParaObject()); - mpOutlinerParaObject->ClearPortionInfo(); - mbPortionInfoChecked=false; - rOutliner.Clear(); -} - void SdrText::ForceOutlinerParaObject( OutlinerMode nOutlMode ) { - if( mpModel && !mpOutlinerParaObject ) + if(!mpOutlinerParaObject) { - std::unique_ptr<Outliner> pOutliner(SdrMakeOutliner(nOutlMode, *mpModel)); - if( pOutliner ) + std::unique_ptr<Outliner> pOutliner( + SdrMakeOutliner( + nOutlMode, + mrObject.getSdrModelFromSdrObject())); + + if(pOutliner) { - Outliner& aDrawOutliner = mpModel->GetDrawOutliner(); + Outliner& aDrawOutliner(mrObject.getSdrModelFromSdrObject().GetDrawOutliner()); pOutliner->SetCalcFieldValueHdl( aDrawOutliner.GetCalcFieldValueHdl() ); - pOutliner->SetStyleSheet( 0, GetStyleSheet()); OutlinerParaObject* pOutlinerParaObject = pOutliner->CreateParaObject(); SetOutlinerParaObject( pOutlinerParaObject ); diff --git a/svx/source/svdraw/svdundo.cxx b/svx/source/svdraw/svdundo.cxx index 1c6ec236f34b..22720cfb4ca4 100644 --- a/svx/source/svdraw/svdundo.cxx +++ b/svx/source/svdraw/svdundo.cxx @@ -209,8 +209,8 @@ OUString SdrUndoGroup::GetSdrRepeatComment(SdrView& /*rView*/) const } SdrUndoObj::SdrUndoObj(SdrObject& rNewObj) - : SdrUndoAction(*rNewObj.GetModel()) - , pObj(&rNewObj) +: SdrUndoAction(rNewObj.getSdrModelFromSdrObject()) + ,pObj(&rNewObj) { } @@ -237,10 +237,10 @@ void SdrUndoObj::ImpTakeDescriptionStr(const char* pStrCacheID, OUString& rStr, // common call method for possible change of the page when UNDO/REDO is triggered void SdrUndoObj::ImpShowPageOfThisObject() { - if(pObj && pObj->IsInserted() && pObj->GetPage() && pObj->GetModel()) + if(pObj && pObj->IsInserted() && pObj->GetPage()) { SdrHint aHint(SdrHintKind::SwitchToPage, *pObj, pObj->GetPage()); - pObj->GetModel()->Broadcast(aHint); + pObj->getSdrModelFromSdrObject().Broadcast(aHint); } } @@ -275,7 +275,7 @@ SdrUndoAttrObj::SdrUndoAttrObj(SdrObject& rNewObj, bool bStyleSheet1, bool bSave if(bIsGroup) { // it's a group object! - pUndoGroup.reset( new SdrUndoGroup(*pObj->GetModel()) ); + pUndoGroup.reset(new SdrUndoGroup(pObj->getSdrModelFromSdrObject())); const size_t nObjCount(pOL->GetObjCount()); for(size_t nObjNum = 0; nObjNum < nObjCount; ++nObjNum) @@ -343,9 +343,9 @@ void SdrUndoAttrObj::Undo() mxRedoStyleSheet = pObj->GetStyleSheet(); SfxStyleSheet* pSheet = dynamic_cast< SfxStyleSheet* >(mxUndoStyleSheet.get()); - if(pSheet && pObj->GetModel() && pObj->GetModel()->GetStyleSheetPool()) + if(pSheet && pObj->getSdrModelFromSdrObject().GetStyleSheetPool()) { - ensureStyleSheetInStyleSheetPool(*pObj->GetModel()->GetStyleSheetPool(), *pSheet); + ensureStyleSheetInStyleSheetPool(*pObj->getSdrModelFromSdrObject().GetStyleSheetPool(), *pSheet); pObj->SetStyleSheet(pSheet, true); } else @@ -426,9 +426,9 @@ void SdrUndoAttrObj::Redo() mxUndoStyleSheet = pObj->GetStyleSheet(); SfxStyleSheet* pSheet = dynamic_cast< SfxStyleSheet* >(mxRedoStyleSheet.get()); - if(pSheet && pObj->GetModel() && pObj->GetModel()->GetStyleSheetPool()) + if(pSheet && pObj->getSdrModelFromSdrObject().GetStyleSheetPool()) { - ensureStyleSheetInStyleSheetPool(*pObj->GetModel()->GetStyleSheetPool(), *pSheet); + ensureStyleSheetInStyleSheetPool(*pObj->getSdrModelFromSdrObject().GetStyleSheetPool(), *pSheet); pObj->SetStyleSheet(pSheet, true); } else @@ -581,7 +581,7 @@ SdrUndoGeoObj::SdrUndoGeoObj(SdrObject& rNewObj) // this is a group object! // If this were 3D scene, we'd only add an Undo for the scene itself // (which we do elsewhere). - pUndoGroup.reset(new SdrUndoGroup(*pObj->GetModel())); + pUndoGroup.reset(new SdrUndoGroup(pObj->getSdrModelFromSdrObject())); const size_t nObjCount = pOL->GetObjCount(); for (size_t nObjNum = 0; nObjNum<nObjCount; ++nObjNum) { pUndoGroup->AddAction(new SdrUndoGeoObj(*pOL->GetObj(nObjNum))); @@ -1335,8 +1335,8 @@ OUString SdrUndoMoveLayer::GetComment() const SdrUndoPage::SdrUndoPage(SdrPage& rNewPg) - : SdrUndoAction(*rNewPg.GetModel()) - , mrPage(rNewPg) +: SdrUndoAction(rNewPg.getSdrModelFromSdrPage()) + ,mrPage(rNewPg) { } @@ -1657,7 +1657,7 @@ void SdrUndoPageRemoveMasterPage::Undo() { if(mbOldHadMasterPage) { - mrPage.TRG_SetMasterPage(*mrPage.GetModel()->GetMasterPage(maOldMasterPageNumber)); + mrPage.TRG_SetMasterPage(*mrPage.getSdrModelFromSdrPage().GetMasterPage(maOldMasterPageNumber)); mrPage.TRG_SetMasterPageVisibleLayers(maOldSet); } } @@ -1695,7 +1695,7 @@ void SdrUndoPageChangeMasterPage::Undo() if(mbOldHadMasterPage) { mrPage.TRG_ClearMasterPage(); - mrPage.TRG_SetMasterPage(*mrPage.GetModel()->GetMasterPage(maOldMasterPageNumber)); + mrPage.TRG_SetMasterPage(*mrPage.getSdrModelFromSdrPage().GetMasterPage(maOldMasterPageNumber)); mrPage.TRG_SetMasterPageVisibleLayers(maOldSet); } } @@ -1706,7 +1706,7 @@ void SdrUndoPageChangeMasterPage::Redo() if(mbNewHadMasterPage) { mrPage.TRG_ClearMasterPage(); - mrPage.TRG_SetMasterPage(*mrPage.GetModel()->GetMasterPage(maNewMasterPageNumber)); + mrPage.TRG_SetMasterPage(*mrPage.getSdrModelFromSdrPage().GetMasterPage(maNewMasterPageNumber)); mrPage.TRG_SetMasterPageVisibleLayers(maNewSet); } } diff --git a/svx/source/svdraw/svdview.cxx b/svx/source/svdraw/svdview.cxx index db460ea89d45..d9eb52432957 100644 --- a/svx/source/svdraw/svdview.cxx +++ b/svx/source/svdraw/svdview.cxx @@ -146,15 +146,15 @@ SdrDropMarkerOverlay::~SdrDropMarkerOverlay() // OverlayManager and deletes them. } - -SdrView::SdrView(SdrModel* pModel1, OutputDevice* pOut) -: SdrCreateView(pModel1,pOut), +SdrView::SdrView( + SdrModel& rSdrModel, + OutputDevice* pOut) +: SdrCreateView(rSdrModel, pOut), bNoExtendedMouseDispatcher(false), bNoExtendedKeyDispatcher(false), mbMasterPagePaintCaching(false) { maAccessibilityOptions.AddListener(this); - onAccessibilityOptionsChanged(); } diff --git a/svx/source/svdraw/svdviter.cxx b/svx/source/svdraw/svdviter.cxx index 2dbd8b5f3bb2..044526e6e638 100644 --- a/svx/source/svdraw/svdviter.cxx +++ b/svx/source/svdraw/svdviter.cxx @@ -38,7 +38,7 @@ void SdrViewIter::ImpInitVars() SdrViewIter::SdrViewIter(const SdrPage* pPage) { mpPage = pPage; - mpModel = pPage ? pPage->GetModel() : nullptr; + mpModel = pPage ? &pPage->getSdrModelFromSdrPage() : nullptr; mpObject = nullptr; mbNoMasterPage = false; ImpInitVars(); @@ -48,7 +48,7 @@ SdrViewIter::SdrViewIter(const SdrPage* pPage) SdrViewIter::SdrViewIter(const SdrObject* pObject) { mpObject = pObject; - mpModel = pObject ? pObject->GetModel() : nullptr; + mpModel = pObject ? &pObject->getSdrModelFromSdrObject() : nullptr; mpPage = pObject ? pObject->GetPage() : nullptr; mbNoMasterPage = false; diff --git a/svx/source/svdraw/svdxcgv.cxx b/svx/source/svdraw/svdxcgv.cxx index 1011c8a11e87..58fc73351181 100644 --- a/svx/source/svdraw/svdxcgv.cxx +++ b/svx/source/svdraw/svdxcgv.cxx @@ -57,8 +57,10 @@ using namespace com::sun::star; -SdrExchangeView::SdrExchangeView(SdrModel* pModel1, OutputDevice* pOut): - SdrObjEditView(pModel1,pOut) +SdrExchangeView::SdrExchangeView( + SdrModel& rSdrModel, + OutputDevice* pOut) +: SdrObjEditView(rSdrModel, pOut) { } @@ -143,8 +145,11 @@ bool SdrExchangeView::Paste(const OUString& rStr, const Point& rPos, SdrObjList* if (pPage!=nullptr) { aTextRect.SetSize(pPage->GetSize()); } - SdrRectObj* pObj=new SdrRectObj(OBJ_TEXT,aTextRect); - pObj->SetModel(mpModel); + SdrRectObj* pObj = new SdrRectObj( + getSdrModelFromSdrView(), + OBJ_TEXT, + aTextRect); + pObj->SetLayer(nLayer); pObj->NbcSetText(rStr); // SetText before SetAttr, else SetAttr doesn't work! if (mpDefaultStyleSheet!=nullptr) pObj->NbcSetStyleSheet(mpDefaultStyleSheet, false); @@ -180,8 +185,11 @@ bool SdrExchangeView::Paste(SvStream& rInput, EETextFormat eFormat, const Point& if (pPage!=nullptr) { aTextRect.SetSize(pPage->GetSize()); } - SdrRectObj* pObj=new SdrRectObj(OBJ_TEXT,aTextRect); - pObj->SetModel(mpModel); + SdrRectObj* pObj = new SdrRectObj( + getSdrModelFromSdrView(), + OBJ_TEXT, + aTextRect); + pObj->SetLayer(nLayer); if (mpDefaultStyleSheet!=nullptr) pObj->NbcSetStyleSheet(mpDefaultStyleSheet, false); @@ -201,9 +209,9 @@ bool SdrExchangeView::Paste(SvStream& rInput, EETextFormat eFormat, const Point& ImpPasteObject(pObj,*pLst,aPos,aSiz,MapMode(eMap,Point(0,0),aMap,aMap),nOptions); // b4967543 - if(pObj->GetModel() && pObj->GetOutlinerParaObject()) + if(pObj->GetOutlinerParaObject()) { - SdrOutliner& rOutliner = pObj->GetModel()->GetHitTestOutliner(); + SdrOutliner& rOutliner = pObj->getSdrModelFromSdrObject().GetHitTestOutliner(); rOutliner.SetText(*pObj->GetOutlinerParaObject()); if(1 == rOutliner.GetParagraphCount()) @@ -212,7 +220,7 @@ bool SdrExchangeView::Paste(SvStream& rInput, EETextFormat eFormat, const Point& if(pCandidate) { - if(pObj->GetModel()->GetStyleSheetPool() == &pCandidate->GetPool()) + if(pObj->getSdrModelFromSdrObject().GetStyleSheetPool() == &pCandidate->GetPool()) { pObj->NbcSetStyleSheet(pCandidate, true); } @@ -305,15 +313,13 @@ bool SdrExchangeView::Paste( { if(bResize) { - pNewObj->GetModel()->SetPasteResize(true); + pNewObj->getSdrModelFromSdrObject().SetPasteResize(true); pNewObj->NbcResize(aPt0,aXResize,aYResize); - pNewObj->GetModel()->SetPasteResize(false); + pNewObj->getSdrModelFromSdrObject().SetPasteResize(false); } // #i39861# - pNewObj->SetModel(pDstLst->GetModel()); pNewObj->SetPage(pDstLst->GetPage()); - pNewObj->NbcMove(aSiz); const SdrPage* pPg = pDstLst->GetPage(); @@ -345,7 +351,7 @@ bool SdrExchangeView::Paste( pDstLst->InsertObject(pNewObj, SAL_MAX_SIZE); if( bUndo ) - AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoNewObject(*pNewObj)); + AddUndo(getSdrModelFromSdrView().GetSdrUndoFactory().CreateUndoNewObject(*pNewObj)); if (bMark) { // Don't already set Markhandles! @@ -414,7 +420,7 @@ void SdrExchangeView::ImpPasteObject(SdrObject* pObj, SdrObjList& rLst, const Po rLst.InsertObject(pObj, SAL_MAX_SIZE); if( IsUndoEnabled() ) - AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoNewObject(*pObj)); + AddUndo(getSdrModelFromSdrView().GetSdrUndoFactory().CreateUndoNewObject(*pObj)); SdrPageView* pMarkPV=nullptr; SdrPageView* pPV = GetSdrPageView(); @@ -579,7 +585,7 @@ Graphic SdrExchangeView::GetAllMarkedGraphic() const if( AreObjectsMarked() ) { if( ( 1 == GetMarkedObjectCount() ) && GetSdrMarkByIndex( 0 ) ) - aRet = SdrExchangeView::GetObjGraphic( mpModel, GetMarkedObjectByIndex( 0 ) ); + aRet = SdrExchangeView::GetObjGraphic(*GetMarkedObjectByIndex(0)); else aRet = GetMarkedObjMetaFile(); } @@ -588,68 +594,68 @@ Graphic SdrExchangeView::GetAllMarkedGraphic() const } -Graphic SdrExchangeView::GetObjGraphic( const SdrModel* pModel, const SdrObject* pObj ) +Graphic SdrExchangeView::GetObjGraphic(const SdrObject& rSdrObject) { Graphic aRet; - if( pModel && pObj ) - { - // try to get a graphic from the object first - const SdrGrafObj* pSdrGrafObj = dynamic_cast< const SdrGrafObj* >(pObj); - const SdrOle2Obj* pSdrOle2Obj = dynamic_cast< const SdrOle2Obj* >(pObj); + // try to get a graphic from the object first + const SdrGrafObj* pSdrGrafObj(dynamic_cast< const SdrGrafObj* >(&rSdrObject)); + const SdrOle2Obj* pSdrOle2Obj(dynamic_cast< const SdrOle2Obj* >(&rSdrObject)); - if(pSdrGrafObj) + if(pSdrGrafObj) + { + if(pSdrGrafObj->isEmbeddedVectorGraphicData()) { - if(pSdrGrafObj->isEmbeddedVectorGraphicData()) - { - // get Metafile for Svg content - aRet = pSdrGrafObj->getMetafileFromEmbeddedVectorGraphicData(); - } - else - { - // Make behaviour coherent with metafile - // recording below (which of course also takes - // view-transformed objects) - aRet = pSdrGrafObj->GetTransformedGraphic(); - } + // get Metafile for Svg content + aRet = pSdrGrafObj->getMetafileFromEmbeddedVectorGraphicData(); } - else if(pSdrOle2Obj) + else { - if ( pSdrOle2Obj->GetGraphic() ) - aRet = *pSdrOle2Obj->GetGraphic(); + // Make behaviour coherent with metafile + // recording below (which of course also takes + // view-transformed objects) + aRet = pSdrGrafObj->GetTransformedGraphic(); } - - // if graphic could not be retrieved => go the hard way and create a MetaFile - if( ( GraphicType::NONE == aRet.GetType() ) || ( GraphicType::Default == aRet.GetType() ) ) + } + else if(pSdrOle2Obj) + { + if(pSdrOle2Obj->GetGraphic()) { - ScopedVclPtrInstance< VirtualDevice > pOut; - GDIMetaFile aMtf; - const tools::Rectangle aBoundRect( pObj->GetCurrentBoundRect() ); - const MapMode aMap( pModel->GetScaleUnit(), - Point(), - pModel->GetScaleFraction(), - pModel->GetScaleFraction() ); - - pOut->EnableOutput( false ); - pOut->SetMapMode( aMap ); - aMtf.Record( pOut ); - pObj->SingleObjectPainter( *pOut.get() ); - aMtf.Stop(); - aMtf.WindStart(); - - // #i99268# replace the original offset from using XOutDev's SetOffset - // NOT (as tried with #i92760#) with another MapMode which gets recorded - // by the Metafile itself (what always leads to problems), but by - // moving the result directly - aMtf.Move(-aBoundRect.Left(), -aBoundRect.Top()); - - aMtf.SetPrefMapMode( aMap ); - aMtf.SetPrefSize( aBoundRect.GetSize() ); + aRet = *pSdrOle2Obj->GetGraphic(); + } + } - if( aMtf.GetActionSize() ) - aRet = aMtf; + // if graphic could not be retrieved => go the hard way and create a MetaFile + if((GraphicType::NONE == aRet.GetType()) || (GraphicType::Default == aRet.GetType())) + { + ScopedVclPtrInstance< VirtualDevice > pOut; + GDIMetaFile aMtf; + const tools::Rectangle aBoundRect(rSdrObject.GetCurrentBoundRect()); + const MapMode aMap(rSdrObject.getSdrModelFromSdrObject().GetScaleUnit(), + Point(), + rSdrObject.getSdrModelFromSdrObject().GetScaleFraction(), + rSdrObject.getSdrModelFromSdrObject().GetScaleFraction()); + + pOut->EnableOutput(false); + pOut->SetMapMode(aMap); + aMtf.Record(pOut); + rSdrObject.SingleObjectPainter(*pOut.get()); + aMtf.Stop(); + aMtf.WindStart(); + + // #i99268# replace the original offset from using XOutDev's SetOffset + // NOT (as tried with #i92760#) with another MapMode which gets recorded + // by the Metafile itself (what always leads to problems), but by + // moving the result directly + aMtf.Move(-aBoundRect.Left(), -aBoundRect.Top()); + aMtf.SetPrefMapMode(aMap); + aMtf.SetPrefSize(aBoundRect.GetSize()); + + if(aMtf.GetActionSize()) + { + aRet = aMtf; } - } + } return aRet; } @@ -703,7 +709,6 @@ void SdrExchangeView::DrawMarkedObj(OutputDevice& rOut) const } } - SdrModel* SdrExchangeView::GetMarkedObjModel() const { // Sorting the MarkList here might be problematic in the future, so @@ -729,15 +734,16 @@ SdrModel* SdrExchangeView::GetMarkedObjModel() const { // convert SdrPageObj's to a graphic representation, because // virtual connection to referenced page gets lost in new model - pNewObj = new SdrGrafObj( GetObjGraphic( mpModel, pObj ), pObj->GetLogicRect() ); + pNewObj = new SdrGrafObj( + *pNeuMod, + GetObjGraphic(*pObj), + pObj->GetLogicRect()); pNewObj->SetPage( pNeuPag ); - pNewObj->SetModel( pNeuMod ); } else { pNewObj = pObj->Clone(); pNewObj->SetPage( pNeuPag ); - pNewObj->SetModel( pNeuMod ); } pNeuPag->InsertObject(pNewObj, SAL_MAX_SIZE); @@ -750,8 +756,8 @@ SdrModel* SdrExchangeView::GetMarkedObjModel() const // New mechanism to re-create the connections of cloned connectors aCloneList.CopyConnections(); } + return pNeuMod; } - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svx/source/table/cell.cxx b/svx/source/table/cell.cxx index cd1973848746..0f733d0c6e5d 100644 --- a/svx/source/table/cell.cxx +++ b/svx/source/table/cell.cxx @@ -392,21 +392,31 @@ rtl::Reference< Cell > Cell::create( SdrTableObj& rTableObj ) } -Cell::Cell( SdrTableObj& rTableObj ) -: SdrText( rTableObj ) -, SvxUnoTextBase( ImplGetSvxUnoOutlinerTextCursorSvxPropertySet() ) -, mpPropSet( ImplGetSvxCellPropertySet() ) -, mpProperties( new sdr::properties::CellProperties( rTableObj, this ) ) -, mnCellContentType( CellContentType_EMPTY ) -, mfValue( 0.0 ) -, mnError( 0 ) -, mbMerged( false ) -, mnRowSpan( 1 ) -, mnColSpan( 1 ) -, mxTable( rTableObj.getTable() ) -{ - if( rTableObj.GetModel() ) - SetModel( rTableObj.GetModel() ); +Cell::Cell( + SdrTableObj& rTableObj) +: SdrText(rTableObj) + ,SvxUnoTextBase( ImplGetSvxUnoOutlinerTextCursorSvxPropertySet() ) + ,mpPropSet( ImplGetSvxCellPropertySet() ) + ,mpProperties( new sdr::properties::CellProperties( rTableObj, this ) ) + ,mnCellContentType( CellContentType_EMPTY ) + ,mfValue( 0.0 ) + ,mnError( 0 ) + ,mbMerged( false ) + ,mnRowSpan( 1 ) + ,mnColSpan( 1 ) + ,mxTable( rTableObj.getTable() ) +{ + // Caution: Old SetModel() indirectly did a very necessary thing here, + // it created a valid SvxTextEditSource which is needed to bind contained + // Text to the UNO API and thus to save/load and more. Added version without + // model change. + // Also done was (not needed, for reference): + // SetStyleSheet( nullptr, true ); + // ForceOutlinerParaObject( OutlinerMode::TextObject ); + if(nullptr == GetEditSource()) + { + SetEditSource(new SvxTextEditSource(&GetObject(), this)); + } } @@ -440,37 +450,6 @@ void Cell::dispose() SetOutlinerParaObject( nullptr ); } - -void Cell::SetModel(SdrModel* pNewModel) -{ - SvxTextEditSource* pTextEditSource = dynamic_cast< SvxTextEditSource* >( GetEditSource() ); - if( (GetModel() != pNewModel) || ( pNewModel && !pTextEditSource) ) - { - if( mpProperties ) - { - SfxItemPool* pItemPool = mpProperties->GetObjectItemSet().GetPool(); - - // test for correct pool in ItemSet; move to new pool if necessary - if( pNewModel && pItemPool && pItemPool != &pNewModel->GetItemPool()) - mpProperties->MoveToItemPool(pItemPool, &pNewModel->GetItemPool(), pNewModel); - } - - if( pTextEditSource ) - { - pTextEditSource->ChangeModel( pNewModel ); - } - else - { - SetEditSource( new SvxTextEditSource( &GetObject(), this ) ); - } - - SetStyleSheet( nullptr, true ); - SdrText::SetModel( pNewModel ); - ForceOutlinerParaObject( OutlinerMode::TextObject ); - } -} - - void Cell::merge( sal_Int32 nColumnSpan, sal_Int32 nRowSpan ) { if ((mnColSpan != nColumnSpan) || (mnRowSpan != nRowSpan) || mbMerged) @@ -537,12 +516,13 @@ void Cell::replaceContentAndFormating( const CellRef& xSourceCell ) { mpProperties->SetMergedItemSet( xSourceCell->GetObjectItemSet() ); SetOutlinerParaObject( new OutlinerParaObject(*xSourceCell->GetOutlinerParaObject()) ); - SdrTableObj& rTableObj = dynamic_cast< SdrTableObj& >( GetObject() ); SdrTableObj& rSourceTableObj = dynamic_cast< SdrTableObj& >( xSourceCell->GetObject() ); - if(rSourceTableObj.GetModel() != rTableObj.GetModel()) + if(&rSourceTableObj.getSdrModelFromSdrObject() != &rTableObj.getSdrModelFromSdrObject()) { + // TTTT should not happen - if, then a clone may be needed + // Maybe add a assertion here later SetStyleSheet( nullptr, true ); } } @@ -564,12 +544,13 @@ void Cell::copyFormatFrom( const CellRef& xSourceCell ) if( xSourceCell.is() && mpProperties ) { mpProperties->SetMergedItemSet( xSourceCell->GetObjectItemSet() ); - SdrTableObj& rTableObj = dynamic_cast< SdrTableObj& >( GetObject() ); SdrTableObj& rSourceTableObj = dynamic_cast< SdrTableObj& >( xSourceCell->GetObject() ); - if(rSourceTableObj.GetModel() != rTableObj.GetModel()) + if(&rSourceTableObj.getSdrModelFromSdrObject() != &rTableObj.getSdrModelFromSdrObject()) { + // TTTT should not happen - if, then a clone may be needed + // Maybe add a assertion here later SetStyleSheet( nullptr, true ); } @@ -812,10 +793,11 @@ void Cell::SetOutlinerParaObject( OutlinerParaObject* pTextObject ) void Cell::AddUndo() { SdrObject& rObj = GetObject(); - if( rObj.IsInserted() && GetModel() && GetModel()->IsUndoEnabled() ) + + if( rObj.IsInserted() && rObj.getSdrModelFromSdrObject().IsUndoEnabled() ) { CellRef xCell( this ); - GetModel()->AddUndo( new CellUndo( &rObj, xCell ) ); + rObj.getSdrModelFromSdrObject().AddUndo( new CellUndo( &rObj, xCell ) ); // Undo action for the after-text-edit-ended stack. SdrTableObj* pTableObj = dynamic_cast<sdr::table::SdrTableObj*>(&rObj); @@ -1019,7 +1001,7 @@ void SAL_CALL Cell::setPropertyValue( const OUString& rPropertyName, const Any& { ::SolarMutexGuard aGuard; - if( (mpProperties == nullptr) || (GetModel() == nullptr) ) + if(mpProperties == nullptr) throw DisposedException(); const SfxItemPropertySimpleEntry* pMap = mpPropSet->getPropertyMapEntry(rPropertyName); @@ -1111,7 +1093,7 @@ void SAL_CALL Cell::setPropertyValue( const OUString& rPropertyName, const Any& } default: { - SfxItemSet aSet( GetModel()->GetItemPool(), {{pMap->nWID, pMap->nWID}}); + SfxItemSet aSet(GetObject().getSdrModelFromSdrObject().GetItemPool(), {{pMap->nWID, pMap->nWID}}); aSet.Put(mpProperties->GetItem(pMap->nWID)); bool bSpecial = false; @@ -1131,7 +1113,7 @@ void SAL_CALL Cell::setPropertyValue( const OUString& rPropertyName, const Any& OUString aApiName; if( rValue >>= aApiName ) { - if( SvxShape::SetFillAttribute( pMap->nWID, aApiName, aSet, GetModel() ) ) + if(SvxShape::SetFillAttribute(pMap->nWID, aApiName, aSet, &GetObject().getSdrModelFromSdrObject())) bSpecial = true; } } @@ -1148,7 +1130,7 @@ void SAL_CALL Cell::setPropertyValue( const OUString& rPropertyName, const Any& { // fetch the default from ItemPool if(SfxItemPool::IsWhich(pMap->nWID)) - aSet.Put(GetModel()->GetItemPool().GetDefaultItem(pMap->nWID)); + aSet.Put(GetObject().getSdrModelFromSdrObject().GetItemPool().GetDefaultItem(pMap->nWID)); } if( aSet.GetItemState( pMap->nWID ) == SfxItemState::SET ) @@ -1158,7 +1140,7 @@ void SAL_CALL Cell::setPropertyValue( const OUString& rPropertyName, const Any& } } - GetModel()->SetChanged(); + GetObject().getSdrModelFromSdrObject().SetChanged(); mpProperties->SetMergedItemSetAndBroadcast( aSet ); return; } @@ -1172,7 +1154,7 @@ Any SAL_CALL Cell::getPropertyValue( const OUString& PropertyName ) { ::SolarMutexGuard aGuard; - if( (mpProperties == nullptr) || (GetModel() == nullptr) ) + if(mpProperties == nullptr) throw DisposedException(); const SfxItemPropertySimpleEntry* pMap = mpPropSet->getPropertyMapEntry(PropertyName); @@ -1231,7 +1213,7 @@ Any SAL_CALL Cell::getPropertyValue( const OUString& PropertyName ) } default: { - SfxItemSet aSet( GetModel()->GetItemPool(), {{pMap->nWID, pMap->nWID}}); + SfxItemSet aSet(GetObject().getSdrModelFromSdrObject().GetItemPool(), {{pMap->nWID, pMap->nWID}}); aSet.Put(mpProperties->GetItem(pMap->nWID)); Any aAny; @@ -1241,7 +1223,7 @@ Any SAL_CALL Cell::getPropertyValue( const OUString& PropertyName ) { // fetch the default from ItemPool if(SfxItemPool::IsWhich(pMap->nWID)) - aSet.Put(GetModel()->GetItemPool().GetDefaultItem(pMap->nWID)); + aSet.Put(GetObject().getSdrModelFromSdrObject().GetItemPool().GetDefaultItem(pMap->nWID)); } if( aSet.Count() ) @@ -1283,7 +1265,7 @@ void SAL_CALL Cell::setPropertyValues( const Sequence< OUString >& aPropertyName { ::SolarMutexGuard aSolarGuard; - if( (mpProperties == nullptr) || (GetModel() == nullptr) ) + if(mpProperties == nullptr) throw DisposedException(); const sal_Int32 nCount = aPropertyNames.getLength(); @@ -1313,7 +1295,7 @@ Sequence< Any > SAL_CALL Cell::getPropertyValues( const Sequence< OUString >& aP { ::SolarMutexGuard aSolarGuard; - if( (mpProperties == nullptr) || (GetModel() == nullptr) ) + if(mpProperties == nullptr) throw DisposedException(); const sal_Int32 nCount = aPropertyNames.getLength(); @@ -1364,7 +1346,7 @@ PropertyState SAL_CALL Cell::getPropertyState( const OUString& PropertyName ) { ::SolarMutexGuard aGuard; - if( (mpProperties == nullptr) || (GetModel() == nullptr) ) + if(mpProperties == nullptr) throw DisposedException(); const SfxItemPropertySimpleEntry* pMap = mpPropSet->getPropertyMapEntry(PropertyName); @@ -1467,7 +1449,7 @@ Sequence< PropertyState > SAL_CALL Cell::getPropertyStates( const Sequence< OUSt { ::SolarMutexGuard aGuard; - if( (mpProperties == nullptr) || (GetModel() == nullptr) ) + if(mpProperties == nullptr) throw DisposedException(); const sal_Int32 nCount = aPropertyName.getLength(); @@ -1497,7 +1479,7 @@ void SAL_CALL Cell::setPropertyToDefault( const OUString& PropertyName ) { ::SolarMutexGuard aGuard; - if( (mpProperties == nullptr) || (GetModel() == nullptr) ) + if(mpProperties == nullptr) throw DisposedException(); const SfxItemPropertySimpleEntry* pMap = mpPropSet->getPropertyMapEntry(PropertyName); @@ -1527,7 +1509,7 @@ void SAL_CALL Cell::setPropertyToDefault( const OUString& PropertyName ) } } - GetModel()->SetChanged(); + GetObject().getSdrModelFromSdrObject().SetChanged(); return; } throw UnknownPropertyException( PropertyName, static_cast<cppu::OWeakObject*>(this)); @@ -1538,7 +1520,7 @@ Any SAL_CALL Cell::getPropertyDefault( const OUString& aPropertyName ) { ::SolarMutexGuard aGuard; - if( (mpProperties == nullptr) || (GetModel() == nullptr) ) + if(mpProperties == nullptr) throw DisposedException(); const SfxItemPropertySimpleEntry* pMap = mpPropSet->getPropertyMapEntry(aPropertyName); @@ -1565,8 +1547,8 @@ Any SAL_CALL Cell::getPropertyDefault( const OUString& aPropertyName ) { if( SfxItemPool::IsWhich(pMap->nWID) ) { - SfxItemSet aSet( GetModel()->GetItemPool(), {{pMap->nWID, pMap->nWID}}); - aSet.Put(GetModel()->GetItemPool().GetDefaultItem(pMap->nWID)); + SfxItemSet aSet(GetObject().getSdrModelFromSdrObject().GetItemPool(), {{pMap->nWID, pMap->nWID}}); + aSet.Put(GetObject().getSdrModelFromSdrObject().GetItemPool().GetDefaultItem(pMap->nWID)); return GetAnyForItem( aSet, pMap ); } } diff --git a/svx/source/table/cellcursor.cxx b/svx/source/table/cellcursor.cxx index db68fdb61ab4..b6368837cfc5 100644 --- a/svx/source/table/cellcursor.cxx +++ b/svx/source/table/cellcursor.cxx @@ -242,11 +242,11 @@ void SAL_CALL CellCursor::merge( ) if( !mxTable.is() || (mxTable->getSdrTableObj() == nullptr) ) throw DisposedException(); - SdrModel* pModel = mxTable->getSdrTableObj()->GetModel(); - const bool bUndo = pModel && mxTable->getSdrTableObj()->IsInserted() && pModel->IsUndoEnabled(); + SdrModel& rModel(mxTable->getSdrTableObj()->getSdrModelFromSdrObject()); + const bool bUndo(mxTable->getSdrTableObj()->IsInserted() && rModel.IsUndoEnabled()); if( bUndo ) - pModel->BegUndo( ImpGetResStr(STR_TABLE_MERGE) ); + rModel.BegUndo( ImpGetResStr(STR_TABLE_MERGE) ); try { @@ -260,10 +260,9 @@ void SAL_CALL CellCursor::merge( ) } if( bUndo ) - pModel->EndUndo(); + rModel.EndUndo(); - if( pModel ) - pModel->SetChanged(); + rModel.SetChanged(); } @@ -503,10 +502,11 @@ void SAL_CALL CellCursor::split( sal_Int32 nColumns, sal_Int32 nRows ) if( !mxTable.is() || (mxTable->getSdrTableObj() == nullptr) ) throw DisposedException(); - SdrModel* pModel = mxTable->getSdrTableObj()->GetModel(); - const bool bUndo = pModel && mxTable->getSdrTableObj()->IsInserted() && pModel->IsUndoEnabled(); + SdrModel& rModel(mxTable->getSdrTableObj()->getSdrModelFromSdrObject()); + const bool bUndo(mxTable->getSdrTableObj()->IsInserted() && rModel.IsUndoEnabled()); + if( bUndo ) - pModel->BegUndo( ImpGetResStr(STR_TABLE_SPLIT) ); + rModel.BegUndo( ImpGetResStr(STR_TABLE_SPLIT) ); try { @@ -526,10 +526,9 @@ void SAL_CALL CellCursor::split( sal_Int32 nColumns, sal_Int32 nRows ) } if( bUndo ) - pModel->EndUndo(); + rModel.EndUndo(); - if( pModel ) - pModel->SetChanged(); + rModel.SetChanged(); } diff --git a/svx/source/table/svdotable.cxx b/svx/source/table/svdotable.cxx index dab61a948e33..f8b23626b281 100644 --- a/svx/source/table/svdotable.cxx +++ b/svx/source/table/svdotable.cxx @@ -684,7 +684,7 @@ sal_Int32 SdrTableObjImpl::getRowCount() const void SdrTableObjImpl::LayoutTable( tools::Rectangle& rArea, bool bFitWidth, bool bFitHeight ) { - if( mpLayouter && mpTableObj->GetModel() ) + if(mpLayouter) { // Optimization: SdrTableObj::SetChanged() can call this very often, repeatedly // with the same settings, noticeably increasing load time. Skip if already done. @@ -749,20 +749,20 @@ sdr::contact::ViewContact* SdrTableObj::CreateObjectSpecificViewContact() return new sdr::contact::ViewContactOfTableObj(*this); } - -SdrTableObj::SdrTableObj(SdrModel* _pModel) +SdrTableObj::SdrTableObj(SdrModel& rSdrModel) +: SdrTextObj(rSdrModel) { - pModel = _pModel; init( 1, 1 ); } - -SdrTableObj::SdrTableObj(SdrModel* _pModel, const ::tools::Rectangle& rNewRect, sal_Int32 nColumns, sal_Int32 nRows) -: SdrTextObj( rNewRect ) -, maLogicRect( rNewRect ) +SdrTableObj::SdrTableObj( + SdrModel& rSdrModel, + const ::tools::Rectangle& rNewRect, + sal_Int32 nColumns, + sal_Int32 nRows) +: SdrTextObj(rSdrModel, rNewRect) + ,maLogicRect(rNewRect) { - pModel = _pModel; - if( nColumns <= 0 ) nColumns = 1; @@ -779,6 +779,16 @@ void SdrTableObj::init( sal_Int32 nColumns, sal_Int32 nRows ) mpImpl = new SdrTableObjImpl; mpImpl->init( this, nColumns, nRows ); + + // Stuff done from old SetModel: + if( !maLogicRect.IsEmpty() ) + { + maRect = maLogicRect; + mpImpl->LayoutTable( maRect, false, false ); + } + + // Also init from old SetModel: + mpImpl->SetModel(&getSdrModelFromSdrObject()); } @@ -1349,28 +1359,6 @@ sal_uInt16 SdrTableObj::GetObjIdentifier() const return static_cast<sal_uInt16>(OBJ_TABLE); } - -void SdrTableObj::SetModel(SdrModel* pNewModel) -{ - SdrModel* pOldModel = GetModel(); - if( pNewModel != pOldModel ) - { - SdrTextObj::SetModel(pNewModel); - - if( mpImpl.is() ) - { - mpImpl->SetModel( pNewModel ); - - if( !maLogicRect.IsEmpty() ) - { - maRect = maLogicRect; - mpImpl->LayoutTable( maRect, false, false ); - } - } - } -} - - void SdrTableObj::TakeTextRect( SdrOutliner& rOutliner, tools::Rectangle& rTextRect, bool bNoEditText, tools::Rectangle* pAnchorRect, bool /*bLineWidth*/ ) const { if( mpImpl.is() ) @@ -1418,9 +1406,9 @@ void SdrTableObj::TakeTextRect( const CellPos& rPos, SdrOutliner& rOutliner, too if (pPara) { - const bool bHitTest = pModel && (&pModel->GetHitTestOutliner() == &rOutliner); + const bool bHitTest(&getSdrModelFromSdrObject().GetHitTestOutliner() == &rOutliner); + const SdrTextObj* pTestObj(rOutliner.GetTextObj()); - const SdrTextObj* pTestObj = rOutliner.GetTextObj(); if( !pTestObj || !bHitTest || (pTestObj != this) || (pTestObj->GetOutlinerParaObject() != xCell->GetOutlinerParaObject()) ) { if( bHitTest ) // #i33696# take back fix #i27510# @@ -1565,12 +1553,9 @@ void SdrTableObj::TakeTextEditArea( const CellPos& rPos, Size* pPaperMin, Size* aAnkSiz.AdjustWidth( -1 ); aAnkSiz.AdjustHeight( -1 ); // because GetSize() increments by one Size aMaxSiz(aAnkSiz.Width(),1000000); - if (pModel!=nullptr) - { - Size aTmpSiz(pModel->GetMaxObjSize()); - if (aTmpSiz.Height()!=0) - aMaxSiz.setHeight(aTmpSiz.Height() ); - } + Size aTmpSiz(getSdrModelFromSdrObject().GetMaxObjSize()); + if (aTmpSiz.Height()!=0) + aMaxSiz.setHeight(aTmpSiz.Height() ); CellRef xCell( mpImpl->getCell( rPos ) ); SdrTextVertAdjust eVAdj = xCell.is() ? xCell->GetTextVerticalAdjust() : SDRTEXTVERTADJUST_TOP; @@ -1661,9 +1646,9 @@ OUString SdrTableObj::TakeObjNamePlural() const } -SdrTableObj* SdrTableObj::Clone() const +SdrTableObj* SdrTableObj::Clone(SdrModel* pTargetModel) const { - return CloneHelper< SdrTableObj >(); + return CloneHelper< SdrTableObj >(pTargetModel); } SdrTableObj& SdrTableObj::operator=(const SdrTableObj& rObj) @@ -1724,20 +1709,20 @@ bool SdrTableObj::BegTextEdit(SdrOutliner& rOutl) mbInEditMode = true; rOutl.Init( OutlinerMode::TextObject ); - rOutl.SetRefDevice( pModel->GetRefDevice() ); + rOutl.SetRefDevice(getSdrModelFromSdrObject().GetRefDevice()); - bool bUpdMerk=rOutl.GetUpdateMode(); - if (bUpdMerk) rOutl.SetUpdateMode(false); - Size aPaperMin; - Size aPaperMax; - tools::Rectangle aEditArea; - TakeTextEditArea(&aPaperMin,&aPaperMax,&aEditArea,nullptr); + bool bUpdMerk=rOutl.GetUpdateMode(); + if (bUpdMerk) rOutl.SetUpdateMode(false); + Size aPaperMin; + Size aPaperMax; + tools::Rectangle aEditArea; + TakeTextEditArea(&aPaperMin,&aPaperMax,&aEditArea,nullptr); - rOutl.SetMinAutoPaperSize(aPaperMin); - rOutl.SetMaxAutoPaperSize(aPaperMax); - rOutl.SetPaperSize(aPaperMax); + rOutl.SetMinAutoPaperSize(aPaperMin); + rOutl.SetMaxAutoPaperSize(aPaperMax); + rOutl.SetPaperSize(aPaperMax); - if (bUpdMerk) rOutl.SetUpdateMode(true); + if (bUpdMerk) rOutl.SetUpdateMode(true); EEControlBits nStat=rOutl.GetControlWord(); nStat |= EEControlBits::AUTOPAGESIZE; @@ -1758,14 +1743,14 @@ bool SdrTableObj::BegTextEdit(SdrOutliner& rOutl) void SdrTableObj::EndTextEdit(SdrOutliner& rOutl) { - if (GetModel() && GetModel()->IsUndoEnabled() && !mpImpl->maUndos.empty()) + if (getSdrModelFromSdrObject().IsUndoEnabled() && !mpImpl->maUndos.empty()) { // These actions should be on the undo stack after text edit. for (std::unique_ptr<SdrUndoAction>& pAction : mpImpl->maUndos) - GetModel()->AddUndo(pAction.release()); + getSdrModelFromSdrObject().AddUndo(pAction.release()); mpImpl->maUndos.clear(); - GetModel()->AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*this)); + getSdrModelFromSdrObject().AddUndo(getSdrModelFromSdrObject().GetSdrUndoFactory().CreateUndoGeoObject(*this)); } if(rOutl.IsModified()) @@ -1810,16 +1795,15 @@ void SdrTableObj::NbcSetOutlinerParaObject( OutlinerParaObject* pTextObject) CellRef xCell( getActiveCell() ); if( xCell.is() ) { - if( pModel ) + // Update HitTestOutliner + const SdrTextObj* pTestObj(getSdrModelFromSdrObject().GetHitTestOutliner().GetTextObj()); + + if(pTestObj && pTestObj->GetOutlinerParaObject() == xCell->GetOutlinerParaObject()) { - // Update HitTestOutliner - const SdrTextObj* pTestObj = pModel->GetHitTestOutliner().GetTextObj(); - if( pTestObj && pTestObj->GetOutlinerParaObject() == xCell->GetOutlinerParaObject() ) - pModel->GetHitTestOutliner().SetTextObj( nullptr ); + getSdrModelFromSdrObject().GetHitTestOutliner().SetTextObj(nullptr); } xCell->SetOutlinerParaObject( pTextObject ); - SetTextSizeDirty(); NbcAdjustTextFrameWidthAndHeight(); } @@ -1891,7 +1875,7 @@ bool SdrTableObj::AdjustTextFrameWidthAndHeight() bool SdrTableObj::AdjustTextFrameWidthAndHeight(tools::Rectangle& rR, bool bHeight, bool bWidth) const { - if((pModel == nullptr) || rR.IsEmpty() || !mpImpl.is() || !mpImpl->mxTable.is() ) + if(rR.IsEmpty() || !mpImpl.is() || !mpImpl->mxTable.is()) return false; tools::Rectangle aRectangle( rR ); @@ -2203,7 +2187,7 @@ bool SdrTableObj::applySpecialDrag(SdrDragStat& rDrag) if( pEdgeHdl ) { - if( GetModel() && IsInserted() ) + if( IsInserted() ) { rDrag.SetEndDragChangesAttributes(true); rDrag.SetEndDragChangesLayout(true); @@ -2341,12 +2325,21 @@ void SdrTableObj::RestGeoData(const SdrObjGeoData& rGeo) } -SdrTableObj* SdrTableObj::CloneRange( const CellPos& rStart, const CellPos& rEnd ) +SdrTableObj* SdrTableObj::CloneRange( + const CellPos& rStart, + const CellPos& rEnd, + SdrModel& rTargetModel) { const sal_Int32 nColumns = rEnd.mnCol - rStart.mnCol + 1; const sal_Int32 nRows = rEnd.mnRow - rStart.mnRow + 1; - SdrTableObj* pNewTableObj = new SdrTableObj( GetModel(), GetCurrentBoundRect(), nColumns, nRows); + SdrTableObj* pNewTableObj( + new SdrTableObj( + rTargetModel, + GetCurrentBoundRect(), + nColumns, + nRows)); + pNewTableObj->setTableStyleSettings( getTableStyleSettings() ); pNewTableObj->setTableStyle( getTableStyle() ); diff --git a/svx/source/table/tablecolumn.cxx b/svx/source/table/tablecolumn.cxx index e6f1c4a77b6b..e4007b3b35cf 100644 --- a/svx/source/table/tablecolumn.cxx +++ b/svx/source/table/tablecolumn.cxx @@ -141,10 +141,10 @@ void SAL_CALL TableColumn::setFastPropertyValue( sal_Int32 nHandle, const Any& a bool bOk = false; bool bChange = false; - SdrModel* pModel = mxTableModel->getSdrTableObj()->GetModel(); - + SdrModel& rModel(mxTableModel->getSdrTableObj()->getSdrModelFromSdrObject()); TableColumnUndo* pUndo = nullptr; - if( mxTableModel.is() && mxTableModel->getSdrTableObj() && mxTableModel->getSdrTableObj()->IsInserted() && pModel && pModel->IsUndoEnabled() ) + + if( mxTableModel.is() && mxTableModel->getSdrTableObj() && mxTableModel->getSdrTableObj()->IsInserted() && rModel.IsUndoEnabled() ) { TableColumnRef xThis( this ); pUndo = new TableColumnUndo( xThis ); @@ -214,7 +214,7 @@ void SAL_CALL TableColumn::setFastPropertyValue( sal_Int32 nHandle, const Any& a { if( pUndo ) { - pModel->AddUndo( pUndo ); + rModel.AddUndo( pUndo ); pUndo = nullptr; } mxTableModel->setModified(true); diff --git a/svx/source/table/tablecontroller.cxx b/svx/source/table/tablecontroller.cxx index cc0b6de54254..aaf4af78bc8f 100644 --- a/svx/source/table/tablecontroller.cxx +++ b/svx/source/table/tablecontroller.cxx @@ -140,35 +140,44 @@ void SAL_CALL SvxTableControllerModifyListener::disposing( const css::lang::Even // class SvxTableController -rtl::Reference< sdr::SelectionController > CreateTableController( SdrObjEditView* pView, const SdrTableObj* pObj, const rtl::Reference< sdr::SelectionController >& xRefController ) +rtl::Reference< sdr::SelectionController > CreateTableController( + SdrView& rView, + const SdrTableObj& rObj, + const rtl::Reference< sdr::SelectionController >& xRefController ) { - return SvxTableController::create( pView, pObj, xRefController ); + return SvxTableController::create(rView, rObj, xRefController); } -rtl::Reference< sdr::SelectionController > SvxTableController::create( SdrObjEditView* pView, const SdrTableObj* pObj, const rtl::Reference< sdr::SelectionController >& xRefController ) +rtl::Reference< sdr::SelectionController > SvxTableController::create( + SdrView& rView, + const SdrTableObj& rObj, + const rtl::Reference< sdr::SelectionController >& xRefController ) { if( xRefController.is() ) { SvxTableController* pController = dynamic_cast< SvxTableController* >( xRefController.get() ); - if( pController && (pController->mxTableObj.get() == pObj) && (pController->mpView == pView) ) + + if(pController && (pController->mxTableObj.get() == &rObj) && (&pController->mrView == &rView)) + { return xRefController; + } } - return new SvxTableController( pView, pObj ); + + return new SvxTableController(rView, rObj); } -SvxTableController::SvxTableController( SdrObjEditView* pView, const SdrTableObj* pObj ) -: mbCellSelectionMode(false) -, mbLeftButtonDown(false) -, mpSelectionOverlay(nullptr) -, mpView( dynamic_cast< SdrView* >( pView ) ) -, mxTableObj( const_cast< SdrTableObj* >( pObj ) ) -, mpModel( nullptr ) -, mnUpdateEvent( nullptr ) +SvxTableController::SvxTableController( + SdrView& rView, + const SdrTableObj& rObj) +: mbCellSelectionMode(false) + ,mbLeftButtonDown(false) + ,mpSelectionOverlay(nullptr) + ,mrView(rView) + ,mxTableObj(const_cast< SdrTableObj* >(&rObj)) + ,mnUpdateEvent( nullptr ) { - mpModel = mxTableObj->GetModel(); - mxTableObj->getActiveCellPos( maCursorFirstPos ); maCursorLastPos = maCursorFirstPos; @@ -202,11 +211,14 @@ SvxTableController::~SvxTableController() bool SvxTableController::onKeyInput(const KeyEvent& rKEvt, vcl::Window* pWindow ) { - if( !checkTableObject() ) + if(!checkTableObject()) return false; + SdrTableObj& rTableObj(*mxTableObj.get()); + SdrModel& rModel(rTableObj.getSdrModelFromSdrObject()); + // check if we are read only - if( mpModel && mpModel->IsReadOnly()) + if( rModel.IsReadOnly()) { switch( rKEvt.GetKeyCode().GetCode() ) { @@ -252,7 +264,7 @@ bool SvxTableController::onMouseButtonDown(const MouseEvent& rMEvt, vcl::Window* if (comphelper::LibreOfficeKit::isActive() && !pWindow) { // Tiled rendering: get the window that has the disabled map mode. - if (OutputDevice* pOutputDevice = mpView->GetFirstOutputDevice()) + if (OutputDevice* pOutputDevice = mrView.GetFirstOutputDevice()) { if (pOutputDevice->GetOutDevType() == OUTDEV_WINDOW) pWindow = static_cast<vcl::Window*>(pOutputDevice); @@ -263,7 +275,7 @@ bool SvxTableController::onMouseButtonDown(const MouseEvent& rMEvt, vcl::Window* return false; SdrViewEvent aVEvt; - if( !rMEvt.IsRight() && mpView->PickAnything(rMEvt,SdrMouseEventKind::BUTTONDOWN, aVEvt) == SdrHitKind::Handle ) + if( !rMEvt.IsRight() && mrView.PickAnything(rMEvt,SdrMouseEventKind::BUTTONDOWN, aVEvt) == SdrHitKind::Handle ) return false; TableHitKind eHit = mxTableObj->CheckTableHit(pixelToLogic(rMEvt.GetPosPixel(), pWindow), maMouseDownPos.mnCol, maMouseDownPos.mnRow); @@ -284,7 +296,7 @@ bool SvxTableController::onMouseButtonDown(const MouseEvent& rMEvt, vcl::Window* { RemoveSelection(); - SdrHdl* pHdl = mpView->PickHandle(pixelToLogic(rMEvt.GetPosPixel(), pWindow)); + SdrHdl* pHdl = mrView.PickHandle(pixelToLogic(rMEvt.GetPosPixel(), pWindow)); if( pHdl ) { @@ -304,7 +316,7 @@ bool SvxTableController::onMouseButtonDown(const MouseEvent& rMEvt, vcl::Window* if (comphelper::LibreOfficeKit::isActive() && rMEvt.GetClicks() == 2 && rMEvt.IsLeft() && eHit == TableHitKind::CellTextArea) { bool bEmptyOutliner = false; - if (Outliner* pOutliner = mpView->GetTextEditOutliner()) + if (Outliner* pOutliner = mrView.GetTextEditOutliner()) { if (pOutliner->GetParagraphCount() == 1) { @@ -318,7 +330,7 @@ bool SvxTableController::onMouseButtonDown(const MouseEvent& rMEvt, vcl::Window* StartSelection(maMouseDownPos); setSelectedCells(maMouseDownPos, maMouseDownPos); // Update graphic selection, should be hidden now. - mpView->AdjustMarkHdl(); + mrView.AdjustMarkHdl(); return true; } } @@ -382,7 +394,7 @@ void SvxTableController::onSelectionHasChanged() } else { - const SdrMarkList& rMarkList= mpView->GetMarkedObjectList(); + const SdrMarkList& rMarkList= mrView.GetMarkedObjectList(); if( rMarkList.GetMarkCount() == 1 ) bSelected = mxTableObj.get() == rMarkList.GetMark(0)->GetMarkedSdrObj(); /* fdo#46186 Selecting the table means selecting the entire cells */ @@ -407,12 +419,13 @@ void SvxTableController::onSelectionHasChanged() void SvxTableController::GetState( SfxItemSet& rSet ) { - if( !mxTable.is() || !mxTableObj.is() || !mxTableObj->GetModel() ) + if(!mxTable.is() || !mxTableObj.is()) return; + SdrTableObj& rTableObj(*mxTableObj.get()); + SdrModel& rModel(rTableObj.getSdrModelFromSdrObject()); std::unique_ptr<SfxItemSet> xSet; - - bool bVertDone = false; + bool bVertDone(false); // Iterate over all requested items in the set. SfxWhichIter aIter( rSet ); @@ -425,15 +438,11 @@ void SvxTableController::GetState( SfxItemSet& rSet ) case SID_TABLE_VERT_CENTER: case SID_TABLE_VERT_NONE: { - if( !mxTable.is() || !mxTableObj->GetModel() ) - { - rSet.DisableItem(nWhich); - } - else if(!bVertDone) + if(!bVertDone) { if (!xSet) { - xSet.reset(new SfxItemSet( mxTableObj->GetModel()->GetItemPool() )); + xSet.reset(new SfxItemSet(rModel.GetItemPool())); MergeAttrFromSelectedCells(*xSet, false); } @@ -505,277 +514,270 @@ void SvxTableController::GetState( SfxItemSet& rSet ) void SvxTableController::onInsert( sal_uInt16 nSId, const SfxItemSet* pArgs ) { - sdr::table::SdrTableObj* pTableObj = mxTableObj.get(); - if( !pTableObj ) + if(!checkTableObject()) return; - if( mxTable.is() ) try - { + SdrTableObj& rTableObj(*mxTableObj.get()); + SdrModel& rModel(rTableObj.getSdrModelFromSdrObject()); + bool bInsertAfter = true; + sal_uInt16 nCount = 0; - bool bInsertAfter = true; - sal_uInt16 nCount = 0; - if( pArgs ) + if( pArgs ) + { + const SfxPoolItem* pItem = nullptr; + pArgs->GetItemState(nSId, false, &pItem); + if (pItem) { - const SfxPoolItem* pItem = nullptr; - pArgs->GetItemState(nSId, false, &pItem); - if (pItem) - { - nCount = static_cast<const SfxInt16Item*>(pItem)->GetValue(); - if(SfxItemState::SET == pArgs->GetItemState(SID_TABLE_PARAM_INSERT_AFTER, true, &pItem)) - bInsertAfter = static_cast<const SfxBoolItem*>(pItem)->GetValue(); - } + nCount = static_cast<const SfxInt16Item*>(pItem)->GetValue(); + if(SfxItemState::SET == pArgs->GetItemState(SID_TABLE_PARAM_INSERT_AFTER, true, &pItem)) + bInsertAfter = static_cast<const SfxBoolItem*>(pItem)->GetValue(); } + } - CellPos aStart, aEnd; - if( hasSelectedCells() ) - { - getSelectedCells( aStart, aEnd ); - } - else + CellPos aStart, aEnd; + if( hasSelectedCells() ) + { + getSelectedCells( aStart, aEnd ); + } + else + { + if( bInsertAfter ) { - if( bInsertAfter ) - { - aStart.mnCol = mxTable->getColumnCount() - 1; - aStart.mnRow = mxTable->getRowCount() - 1; - aEnd = aStart; - } + aStart.mnCol = mxTable->getColumnCount() - 1; + aStart.mnRow = mxTable->getRowCount() - 1; + aEnd = aStart; } + } - if( pTableObj->IsTextEditActive() ) - mpView->SdrEndTextEdit(true); + if( rTableObj.IsTextEditActive() ) + mrView.SdrEndTextEdit(true); - RemoveSelection(); + RemoveSelection(); - const OUString sSize( "Size" ); + const OUString sSize( "Size" ); + const bool bUndo(rModel.IsUndoEnabled()); - const bool bUndo = mpModel && mpModel->IsUndoEnabled(); + switch( nSId ) + { + case SID_TABLE_INSERT_COL: + { + TableModelNotifyGuard aGuard( mxTable.get() ); - switch( nSId ) - { - case SID_TABLE_INSERT_COL: + if( bUndo ) { - TableModelNotifyGuard aGuard( mxTable.get() ); + rModel.BegUndo( ImpGetResStr(STR_TABLE_INSCOL) ); + rModel.AddUndo(rModel.GetSdrUndoFactory().CreateUndoGeoObject(rTableObj)); + } - if( bUndo ) - { - mpModel->BegUndo( ImpGetResStr(STR_TABLE_INSCOL) ); - mpModel->AddUndo( mpModel->GetSdrUndoFactory().CreateUndoGeoObject(*pTableObj) ); - } + Reference< XTableColumns > xCols( mxTable->getColumns() ); + const sal_Int32 nNewColumns = (nCount == 0) ? (aEnd.mnCol - aStart.mnCol + 1) : nCount; + const sal_Int32 nNewStartColumn = aEnd.mnCol + (bInsertAfter ? 1 : 0); + xCols->insertByIndex( nNewStartColumn, nNewColumns ); - Reference< XTableColumns > xCols( mxTable->getColumns() ); - const sal_Int32 nNewColumns = (nCount == 0) ? (aEnd.mnCol - aStart.mnCol + 1) : nCount; - const sal_Int32 nNewStartColumn = aEnd.mnCol + (bInsertAfter ? 1 : 0); - xCols->insertByIndex( nNewStartColumn, nNewColumns ); + for( sal_Int32 nOffset = 0; nOffset < nNewColumns; nOffset++ ) + { + // Resolves fdo#61540 + // On Insert before, the reference column whose size is going to be + // used for newly created column(s) is wrong. As the new columns are + // inserted before the reference column, the reference column moved + // to the new position by no., of new columns i.e (earlier+newcolumns). + Reference< XPropertySet >(xCols->getByIndex(nNewStartColumn+nOffset), UNO_QUERY_THROW )-> + setPropertyValue( sSize, + Reference< XPropertySet >(xCols->getByIndex( bInsertAfter?nNewStartColumn-1:nNewStartColumn+nNewColumns ), UNO_QUERY_THROW )-> + getPropertyValue( sSize ) ); + } - for( sal_Int32 nOffset = 0; nOffset < nNewColumns; nOffset++ ) - { - // Resolves fdo#61540 - // On Insert before, the reference column whose size is going to be - // used for newly created column(s) is wrong. As the new columns are - // inserted before the reference column, the reference column moved - // to the new position by no., of new columns i.e (earlier+newcolumns). - Reference< XPropertySet >(xCols->getByIndex(nNewStartColumn+nOffset), UNO_QUERY_THROW )-> - setPropertyValue( sSize, - Reference< XPropertySet >(xCols->getByIndex( bInsertAfter?nNewStartColumn-1:nNewStartColumn+nNewColumns ), UNO_QUERY_THROW )-> - getPropertyValue( sSize ) ); - } + // Copy cell properties + sal_Int32 nPropSrcCol = (bInsertAfter ? aEnd.mnCol : aStart.mnCol + nNewColumns); + sal_Int32 nRowSpan = 0; + bool bNewSpan = false; - // Copy cell properties - sal_Int32 nPropSrcCol = (bInsertAfter ? aEnd.mnCol : aStart.mnCol + nNewColumns); - sal_Int32 nRowSpan = 0; - bool bNewSpan = false; + for( sal_Int32 nRow = 0; nRow < mxTable->getRowCount(); ++nRow ) + { + CellRef xSourceCell( dynamic_cast< Cell* >( mxTable->getCellByPosition( nPropSrcCol, nRow ).get() ) ); - for( sal_Int32 nRow = 0; nRow < mxTable->getRowCount(); ++nRow ) + // When we insert new COLUMNs, we want to copy ROW spans. + if (xSourceCell.is() && nRowSpan == 0) { - CellRef xSourceCell( dynamic_cast< Cell* >( mxTable->getCellByPosition( nPropSrcCol, nRow ).get() ) ); + // we are not in a span yet. Let's find out if the current cell is in a span. + sal_Int32 nColSpan = sal_Int32(); + sal_Int32 nSpanInfoCol = sal_Int32(); - // When we insert new COLUMNs, we want to copy ROW spans. - if (xSourceCell.is() && nRowSpan == 0) + if( xSourceCell->getRowSpan() > 1 ) { - // we are not in a span yet. Let's find out if the current cell is in a span. - sal_Int32 nColSpan = sal_Int32(); - sal_Int32 nSpanInfoCol = sal_Int32(); - - if( xSourceCell->getRowSpan() > 1 ) - { - // The current cell is the top-left cell in a span. - // Get the span info and propagate it to the target. - nRowSpan = xSourceCell->getRowSpan(); - nColSpan = xSourceCell->getColumnSpan(); - nSpanInfoCol = nPropSrcCol; - } - else if( xSourceCell->isMerged() ) + // The current cell is the top-left cell in a span. + // Get the span info and propagate it to the target. + nRowSpan = xSourceCell->getRowSpan(); + nColSpan = xSourceCell->getColumnSpan(); + nSpanInfoCol = nPropSrcCol; + } + else if( xSourceCell->isMerged() ) + { + // The current cell is a middle cell in a 2D span. + // Look for the top-left cell in the span. + for( nSpanInfoCol = nPropSrcCol - 1; nSpanInfoCol >= 0; --nSpanInfoCol ) { - // The current cell is a middle cell in a 2D span. - // Look for the top-left cell in the span. - for( nSpanInfoCol = nPropSrcCol - 1; nSpanInfoCol >= 0; --nSpanInfoCol ) + CellRef xMergeInfoCell( dynamic_cast< Cell* >( mxTable->getCellByPosition( nSpanInfoCol, nRow ).get() ) ); + if (xMergeInfoCell.is() && !xMergeInfoCell->isMerged()) { - CellRef xMergeInfoCell( dynamic_cast< Cell* >( mxTable->getCellByPosition( nSpanInfoCol, nRow ).get() ) ); - if (xMergeInfoCell.is() && !xMergeInfoCell->isMerged()) - { - nRowSpan = xMergeInfoCell->getRowSpan(); - nColSpan = xMergeInfoCell->getColumnSpan(); - break; - } + nRowSpan = xMergeInfoCell->getRowSpan(); + nColSpan = xMergeInfoCell->getColumnSpan(); + break; } - if( nRowSpan == 1 ) - nRowSpan = 0; } - - // The target columns are outside the span; Start a new span. - if( nRowSpan > 0 && ( nNewStartColumn < nSpanInfoCol || nSpanInfoCol + nColSpan <= nNewStartColumn ) ) - bNewSpan = true; + if( nRowSpan == 1 ) + nRowSpan = 0; } - // Now copy the properties from the source to the targets - for( sal_Int32 nOffset = 0; nOffset < nNewColumns; nOffset++ ) + // The target columns are outside the span; Start a new span. + if( nRowSpan > 0 && ( nNewStartColumn < nSpanInfoCol || nSpanInfoCol + nColSpan <= nNewStartColumn ) ) + bNewSpan = true; + } + + // Now copy the properties from the source to the targets + for( sal_Int32 nOffset = 0; nOffset < nNewColumns; nOffset++ ) + { + CellRef xTargetCell( dynamic_cast< Cell* >( mxTable->getCellByPosition( nNewStartColumn + nOffset, nRow ).get() ) ); + if( xTargetCell.is() ) { - CellRef xTargetCell( dynamic_cast< Cell* >( mxTable->getCellByPosition( nNewStartColumn + nOffset, nRow ).get() ) ); - if( xTargetCell.is() ) + if( nRowSpan > 0 ) { - if( nRowSpan > 0 ) - { - if( bNewSpan ) - xTargetCell->merge( 1, nRowSpan ); - else - xTargetCell->setMerged(); - } - xTargetCell->copyFormatFrom( xSourceCell ); + if( bNewSpan ) + xTargetCell->merge( 1, nRowSpan ); + else + xTargetCell->setMerged(); } + xTargetCell->copyFormatFrom( xSourceCell ); } + } - if( nRowSpan > 0 ) - { - --nRowSpan; - bNewSpan = false; - } + if( nRowSpan > 0 ) + { + --nRowSpan; + bNewSpan = false; } + } - if( bUndo ) - mpModel->EndUndo(); + if( bUndo ) + rModel.EndUndo(); - aStart.mnCol = nNewStartColumn; - aStart.mnRow = 0; - aEnd.mnCol = aStart.mnCol + nNewColumns - 1; - aEnd.mnRow = mxTable->getRowCount() - 1; - break; - } + aStart.mnCol = nNewStartColumn; + aStart.mnRow = 0; + aEnd.mnCol = aStart.mnCol + nNewColumns - 1; + aEnd.mnRow = mxTable->getRowCount() - 1; + break; + } - case SID_TABLE_INSERT_ROW: + case SID_TABLE_INSERT_ROW: + { + TableModelNotifyGuard aGuard( mxTable.get() ); + + if( bUndo ) { - TableModelNotifyGuard aGuard( mxTable.get() ); + rModel.BegUndo( ImpGetResStr(STR_TABLE_INSROW ) ); + rModel.AddUndo(rModel.GetSdrUndoFactory().CreateUndoGeoObject(rTableObj)); + } - if( bUndo ) - { - mpModel->BegUndo( ImpGetResStr(STR_TABLE_INSROW ) ); - mpModel->AddUndo( mpModel->GetSdrUndoFactory().CreateUndoGeoObject(*pTableObj) ); - } + Reference< XTableRows > xRows( mxTable->getRows() ); + const sal_Int32 nNewRows = (nCount == 0) ? (aEnd.mnRow - aStart.mnRow + 1) : nCount; + const sal_Int32 nNewRowStart = aEnd.mnRow + (bInsertAfter ? 1 : 0); + xRows->insertByIndex( nNewRowStart, nNewRows ); - Reference< XTableRows > xRows( mxTable->getRows() ); - const sal_Int32 nNewRows = (nCount == 0) ? (aEnd.mnRow - aStart.mnRow + 1) : nCount; - const sal_Int32 nNewRowStart = aEnd.mnRow + (bInsertAfter ? 1 : 0); - xRows->insertByIndex( nNewRowStart, nNewRows ); + for( sal_Int32 nOffset = 0; nOffset < nNewRows; nOffset++ ) + { + Reference< XPropertySet >( xRows->getByIndex( aEnd.mnRow + nOffset + 1 ), UNO_QUERY_THROW )-> + setPropertyValue( sSize, + Reference< XPropertySet >( xRows->getByIndex( aStart.mnRow + nOffset ), UNO_QUERY_THROW )-> + getPropertyValue( sSize ) ); + } - for( sal_Int32 nOffset = 0; nOffset < nNewRows; nOffset++ ) - { - Reference< XPropertySet >( xRows->getByIndex( aEnd.mnRow + nOffset + 1 ), UNO_QUERY_THROW )-> - setPropertyValue( sSize, - Reference< XPropertySet >( xRows->getByIndex( aStart.mnRow + nOffset ), UNO_QUERY_THROW )-> - getPropertyValue( sSize ) ); - } + // Copy the cell properties + sal_Int32 nPropSrcRow = (bInsertAfter ? aEnd.mnRow : aStart.mnRow + nNewRows); + sal_Int32 nColSpan = 0; + bool bNewSpan = false; - // Copy the cell properties - sal_Int32 nPropSrcRow = (bInsertAfter ? aEnd.mnRow : aStart.mnRow + nNewRows); - sal_Int32 nColSpan = 0; - bool bNewSpan = false; + for( sal_Int32 nCol = 0; nCol < mxTable->getColumnCount(); ++nCol ) + { + CellRef xSourceCell( dynamic_cast< Cell* >( mxTable->getCellByPosition( nCol, nPropSrcRow ).get() ) ); - for( sal_Int32 nCol = 0; nCol < mxTable->getColumnCount(); ++nCol ) - { - CellRef xSourceCell( dynamic_cast< Cell* >( mxTable->getCellByPosition( nCol, nPropSrcRow ).get() ) ); + if (!xSourceCell.is()) + continue; - if (!xSourceCell.is()) - continue; + // When we insert new ROWs, we want to copy COLUMN spans. + if( nColSpan == 0 ) + { + // we are not in a span yet. Let's find out if the current cell is in a span. + sal_Int32 nRowSpan = sal_Int32(); + sal_Int32 nSpanInfoRow = sal_Int32(); - // When we insert new ROWs, we want to copy COLUMN spans. - if( nColSpan == 0 ) + if( xSourceCell->getColumnSpan() > 1 ) { - // we are not in a span yet. Let's find out if the current cell is in a span. - sal_Int32 nRowSpan = sal_Int32(); - sal_Int32 nSpanInfoRow = sal_Int32(); - - if( xSourceCell->getColumnSpan() > 1 ) - { - // The current cell is the top-left cell in a span. - // Get the span info and propagate it to the target. - nColSpan = xSourceCell->getColumnSpan(); - nRowSpan = xSourceCell->getRowSpan(); - nSpanInfoRow = nPropSrcRow; - } - else if( xSourceCell->isMerged() ) - { - // The current cell is a middle cell in a 2D span. - // Look for the top-left cell in the span. - for( nSpanInfoRow = nPropSrcRow - 1; nSpanInfoRow >= 0; --nSpanInfoRow ) - { - CellRef xMergeInfoCell( dynamic_cast< Cell* >( mxTable->getCellByPosition( nCol, nSpanInfoRow ).get() ) ); - if (xMergeInfoCell.is() && !xMergeInfoCell->isMerged()) - { - nColSpan = xMergeInfoCell->getColumnSpan(); - nRowSpan = xMergeInfoCell->getRowSpan(); - break; - } - } - if( nColSpan == 1 ) - nColSpan = 0; - } - - // Inserted rows are outside the span; Start a new span. - if( nColSpan > 0 && ( nNewRowStart < nSpanInfoRow || nSpanInfoRow + nRowSpan <= nNewRowStart ) ) - bNewSpan = true; + // The current cell is the top-left cell in a span. + // Get the span info and propagate it to the target. + nColSpan = xSourceCell->getColumnSpan(); + nRowSpan = xSourceCell->getRowSpan(); + nSpanInfoRow = nPropSrcRow; } - - // Now copy the properties from the source to the targets - for( sal_Int32 nOffset = 0; nOffset < nNewRows; ++nOffset ) + else if( xSourceCell->isMerged() ) { - CellRef xTargetCell( dynamic_cast< Cell* >( mxTable->getCellByPosition( nCol, nNewRowStart + nOffset ).get() ) ); - if( xTargetCell.is() ) + // The current cell is a middle cell in a 2D span. + // Look for the top-left cell in the span. + for( nSpanInfoRow = nPropSrcRow - 1; nSpanInfoRow >= 0; --nSpanInfoRow ) { - if( nColSpan > 0 ) + CellRef xMergeInfoCell( dynamic_cast< Cell* >( mxTable->getCellByPosition( nCol, nSpanInfoRow ).get() ) ); + if (xMergeInfoCell.is() && !xMergeInfoCell->isMerged()) { - if( bNewSpan ) - xTargetCell->merge( nColSpan, 1 ); - else - xTargetCell->setMerged(); + nColSpan = xMergeInfoCell->getColumnSpan(); + nRowSpan = xMergeInfoCell->getRowSpan(); + break; } - xTargetCell->copyFormatFrom( xSourceCell ); } + if( nColSpan == 1 ) + nColSpan = 0; } - if( nColSpan > 0 ) + // Inserted rows are outside the span; Start a new span. + if( nColSpan > 0 && ( nNewRowStart < nSpanInfoRow || nSpanInfoRow + nRowSpan <= nNewRowStart ) ) + bNewSpan = true; + } + + // Now copy the properties from the source to the targets + for( sal_Int32 nOffset = 0; nOffset < nNewRows; ++nOffset ) + { + CellRef xTargetCell( dynamic_cast< Cell* >( mxTable->getCellByPosition( nCol, nNewRowStart + nOffset ).get() ) ); + if( xTargetCell.is() ) { - --nColSpan; - bNewSpan = false; + if( nColSpan > 0 ) + { + if( bNewSpan ) + xTargetCell->merge( nColSpan, 1 ); + else + xTargetCell->setMerged(); + } + xTargetCell->copyFormatFrom( xSourceCell ); } } - if( bUndo ) - mpModel->EndUndo(); - - aStart.mnCol = 0; - aStart.mnRow = nNewRowStart; - aEnd.mnCol = mxTable->getColumnCount() - 1; - aEnd.mnRow = aStart.mnRow + nNewRows - 1; - break; - } + if( nColSpan > 0 ) + { + --nColSpan; + bNewSpan = false; + } } - StartSelection( aStart ); - UpdateSelection( aEnd ); + if( bUndo ) + rModel.EndUndo(); + + aStart.mnCol = 0; + aStart.mnRow = nNewRowStart; + aEnd.mnCol = mxTable->getColumnCount() - 1; + aEnd.mnRow = aStart.mnRow + nNewRows - 1; + break; } - catch( Exception& ) - { - OSL_FAIL("svx::SvxTableController::onInsert(), exception caught!"); } + + StartSelection( aStart ); + UpdateSelection( aEnd ); } @@ -791,7 +793,7 @@ void SvxTableController::onDelete( sal_uInt16 nSId ) getSelectedCells( aStart, aEnd ); if( pTableObj->IsTextEditActive() ) - mpView->SdrEndTextEdit(true); + mrView.SdrEndTextEdit(true); RemoveSelection(); @@ -830,7 +832,7 @@ void SvxTableController::onDelete( sal_uInt16 nSId ) } if( bDeleteTable ) - mpView->DeleteMarkedObj(); + mrView.DeleteMarkedObj(); else UpdateTableShape(); } @@ -886,15 +888,16 @@ namespace void SvxTableController::onFormatTable( SfxRequest const & rReq ) { - sdr::table::SdrTableObj* pTableObj = mxTableObj.get(); - if( !pTableObj ) + if(!mxTableObj.is()) return; + SdrTableObj& rTableObj(*mxTableObj.get()); + SdrModel& rModel(rTableObj.getSdrModelFromSdrObject()); const SfxItemSet* pArgs = rReq.GetArgs(); - if( !pArgs && pTableObj->GetModel() ) + if(!pArgs) { - SfxItemSet aNewAttr( pTableObj->GetModel()->GetItemPool() ); + SfxItemSet aNewAttr(rModel.GetItemPool()); // merge drawing layer text distance items into SvxBoxItem used by the dialog SvxBoxItem aBoxItem(mergeDrawinglayerTextDistancesAndSvxBoxItem(aNewAttr)); @@ -907,7 +910,11 @@ void SvxTableController::onFormatTable( SfxRequest const & rReq ) aNewAttr.Put( aBoxInfoItem ); SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); - ScopedVclPtr<SfxAbstractTabDialog> xDlg( pFact ? pFact->CreateSvxFormatCellsDialog( &aNewAttr, pTableObj->GetModel(), pTableObj) : nullptr ); + ScopedVclPtr<SfxAbstractTabDialog> xDlg( pFact ? pFact->CreateSvxFormatCellsDialog( + &aNewAttr, + rModel, + &rTableObj) : nullptr ); + // Even Cancel Button is returning positive(101) value, if (xDlg.get() && xDlg->Execute() == RET_OK) { @@ -1026,16 +1033,19 @@ void SvxTableController::Execute( SfxRequest& rReq ) void SvxTableController::SetTableStyle( const SfxItemSet* pArgs ) { - SdrTableObj* pTableObj = mxTableObj.get(); - SdrModel* pModel = pTableObj ? pTableObj->GetModel() : nullptr; + if(!checkTableObject()) + return; - if( !pTableObj || !pModel || !pArgs || (SfxItemState::SET != pArgs->GetItemState(SID_TABLE_STYLE, false)) ) + SdrTableObj& rTableObj(*mxTableObj.get()); + SdrModel& rModel(rTableObj.getSdrModelFromSdrObject()); + + if(!pArgs || (SfxItemState::SET != pArgs->GetItemState(SID_TABLE_STYLE, false))) return; const SfxStringItem* pArg = dynamic_cast< const SfxStringItem* >( &pArgs->Get( SID_TABLE_STYLE ) ); if( pArg && mxTable.is() ) try { - Reference< XStyleFamiliesSupplier > xSFS( pModel->getUnoModel(), UNO_QUERY_THROW ); + Reference< XStyleFamiliesSupplier > xSFS( rModel.getUnoModel(), UNO_QUERY_THROW ); Reference< XNameAccess > xFamilyNameAccess( xSFS->getStyleFamilies(), UNO_QUERY_THROW ); const OUString sFamilyName( "table" ); Reference< XNameAccess > xTableFamilyAccess( xFamilyNameAccess->getByName( sFamilyName ), UNO_QUERY_THROW ); @@ -1045,15 +1055,15 @@ void SvxTableController::SetTableStyle( const SfxItemSet* pArgs ) // found table style with the same name Reference< XIndexAccess > xNewTableStyle( xTableFamilyAccess->getByName( pArg->GetValue() ), UNO_QUERY_THROW ); - const bool bUndo = pModel->IsUndoEnabled(); + const bool bUndo = rModel.IsUndoEnabled(); if( bUndo ) { - pModel->BegUndo( ImpGetResStr(STR_TABLE_STYLE) ); - pModel->AddUndo( new TableStyleUndo( *pTableObj ) ); + rModel.BegUndo(ImpGetResStr(STR_TABLE_STYLE)); + rModel.AddUndo(new TableStyleUndo(rTableObj)); } - pTableObj->setTableStyle( xNewTableStyle ); + rTableObj.setTableStyle( xNewTableStyle ); const sal_Int32 nRowCount = mxTable->getRowCount(); const sal_Int32 nColCount = mxTable->getColumnCount(); @@ -1098,7 +1108,7 @@ void SvxTableController::SetTableStyle( const SfxItemSet* pArgs ) } if( bUndo ) - pModel->EndUndo(); + rModel.EndUndo(); } } catch( Exception& ) @@ -1109,14 +1119,13 @@ void SvxTableController::SetTableStyle( const SfxItemSet* pArgs ) void SvxTableController::SetTableStyleSettings( const SfxItemSet* pArgs ) { - SdrTableObj* pTableObj = mxTableObj.get(); - SdrModel* pModel = pTableObj ? pTableObj->GetModel() : nullptr; - - if( !pTableObj || !pModel ) + if(!checkTableObject()) return; - TableStyleSettings aSettings( pTableObj->getTableStyleSettings() ); + SdrTableObj& rTableObj(*mxTableObj.get()); + SdrModel& rModel(rTableObj.getSdrModelFromSdrObject()); + TableStyleSettings aSettings(rTableObj.getTableStyleSettings() ); const SfxPoolItem *pPoolItem=nullptr; if( SfxItemState::SET == pArgs->GetItemState(ID_VAL_USEFIRSTROWSTYLE, false,&pPoolItem) ) @@ -1137,36 +1146,38 @@ void SvxTableController::SetTableStyleSettings( const SfxItemSet* pArgs ) if( SfxItemState::SET == pArgs->GetItemState(ID_VAL_USEBANDINGCOLUMNSTYLE, false,&pPoolItem) ) aSettings.mbUseColumnBanding = static_cast< const SfxBoolItem* >(pPoolItem)->GetValue(); - if( aSettings == pTableObj->getTableStyleSettings() ) + if( aSettings == rTableObj.getTableStyleSettings() ) return; - const bool bUndo = pModel->IsUndoEnabled(); + const bool bUndo(rModel.IsUndoEnabled()); if( bUndo ) { - pModel->BegUndo( ImpGetResStr(STR_TABLE_STYLE_SETTINGS) ); - pModel->AddUndo( new TableStyleUndo( *pTableObj ) ); + rModel.BegUndo( ImpGetResStr(STR_TABLE_STYLE_SETTINGS) ); + rModel.AddUndo(new TableStyleUndo(rTableObj)); } - pTableObj->setTableStyleSettings( aSettings ); + rTableObj.setTableStyleSettings( aSettings ); if( bUndo ) - pModel->EndUndo(); + rModel.EndUndo(); } void SvxTableController::SetVertical( sal_uInt16 nSId ) { - SdrTableObj* pTableObj = mxTableObj.get(); - if( !mxTable.is() || !pTableObj ) + if(!checkTableObject()) return; + SdrTableObj& rTableObj(*mxTableObj.get()); + SdrModel& rModel(rTableObj.getSdrModelFromSdrObject()); + TableModelNotifyGuard aGuard( mxTable.get() ); + const bool bUndo(rModel.IsUndoEnabled()); - bool bUndo = mpModel && mpModel->IsUndoEnabled(); if (bUndo) { - mpModel->BegUndo(ImpGetResStr(STR_TABLE_NUMFORMAT)); - mpModel->AddUndo(mpModel->GetSdrUndoFactory().CreateUndoAttrObject(*pTableObj)); + rModel.BegUndo(ImpGetResStr(STR_TABLE_NUMFORMAT)); + rModel.AddUndo(rModel.GetSdrUndoFactory().CreateUndoAttrObject(rTableObj)); } CellPos aStart, aEnd; @@ -1208,7 +1219,7 @@ void SvxTableController::SetVertical( sal_uInt16 nSId ) UpdateTableShape(); if (bUndo) - mpModel->EndUndo(); + rModel.EndUndo(); } void SvxTableController::MergeMarkedCells() @@ -1219,7 +1230,7 @@ void SvxTableController::MergeMarkedCells() if( pTableObj ) { if( pTableObj->IsTextEditActive() ) - mpView->SdrEndTextEdit(true); + mrView.SdrEndTextEdit(true); TableModelNotifyGuard aGuard( mxTable.get() ); MergeRange( aStart.mnCol, aStart.mnRow, aEnd.mnCol, aEnd.mnRow ); @@ -1228,102 +1239,102 @@ void SvxTableController::MergeMarkedCells() void SvxTableController::SplitMarkedCells() { - if( mxTable.is() ) - { - CellPos aStart, aEnd; - getSelectedCells( aStart, aEnd ); + if(!checkTableObject() || !mxTable.is()) + return; - SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); - ScopedVclPtr< SvxAbstractSplitTableDialog > xDlg( pFact ? pFact->CreateSvxSplitTableDialog( nullptr, false, 99 ) : nullptr ); - if( xDlg.get() && xDlg->Execute() ) - { - const sal_Int32 nCount = xDlg->GetCount() - 1; - if( nCount < 1 ) - return; + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + ScopedVclPtr< SvxAbstractSplitTableDialog > xDlg( pFact ? pFact->CreateSvxSplitTableDialog( nullptr, false, 99 ) : nullptr ); - getSelectedCells( aStart, aEnd ); + if( xDlg.get() && xDlg->Execute() ) + { + const sal_Int32 nCount = xDlg->GetCount() - 1; - Reference< XMergeableCellRange > xRange( mxTable->createCursorByRange( mxTable->getCellRangeByPosition( aStart.mnCol, aStart.mnRow, aEnd.mnCol, aEnd.mnRow ) ), UNO_QUERY_THROW ); + if( nCount < 1 ) + return; - const sal_Int32 nRowCount = mxTable->getRowCount(); - const sal_Int32 nColCount = mxTable->getColumnCount(); + CellPos aStart, aEnd; + getSelectedCells( aStart, aEnd ); + Reference< XMergeableCellRange > xRange( mxTable->createCursorByRange( mxTable->getCellRangeByPosition( aStart.mnCol, aStart.mnRow, aEnd.mnCol, aEnd.mnRow ) ), UNO_QUERY_THROW ); + const sal_Int32 nRowCount = mxTable->getRowCount(); + const sal_Int32 nColCount = mxTable->getColumnCount(); + SdrTableObj& rTableObj(*mxTableObj.get()); + if( rTableObj.IsTextEditActive() ) + mrView.SdrEndTextEdit(true); - SdrTableObj* pTableObj = mxTableObj.get(); - if( pTableObj ) - { - if( pTableObj->IsTextEditActive() ) - mpView->SdrEndTextEdit(true); + TableModelNotifyGuard aGuard( mxTable.get() ); + SdrModel& rModel(rTableObj.getSdrModelFromSdrObject()); + const bool bUndo(rModel.IsUndoEnabled()); - TableModelNotifyGuard aGuard( mxTable.get() ); + if( bUndo ) + { + rModel.BegUndo( ImpGetResStr(STR_TABLE_SPLIT) ); + rModel.AddUndo(rModel.GetSdrUndoFactory().CreateUndoGeoObject(rTableObj)); + } - const bool bUndo = mpModel && mpModel->IsUndoEnabled(); - if( bUndo ) - { - mpModel->BegUndo( ImpGetResStr(STR_TABLE_SPLIT) ); - mpModel->AddUndo( mpModel->GetSdrUndoFactory().CreateUndoGeoObject(*pTableObj) ); - } + if( xDlg->IsHorizontal() ) + { + xRange->split( 0, nCount ); + } + else + { + xRange->split( nCount, 0 ); + } - if( xDlg->IsHorizontal() ) - { - xRange->split( 0, nCount ); - } - else - { - xRange->split( nCount, 0 ); - } + if( bUndo ) + rModel.EndUndo(); - if( bUndo ) - mpModel->EndUndo(); - } - aEnd.mnRow += mxTable->getRowCount() - nRowCount; - aEnd.mnCol += mxTable->getColumnCount() - nColCount; + aEnd.mnRow += mxTable->getRowCount() - nRowCount; + aEnd.mnCol += mxTable->getColumnCount() - nColCount; - setSelectedCells( aStart, aEnd ); - } + setSelectedCells( aStart, aEnd ); } } void SvxTableController::DistributeColumns() { - SdrTableObj* pTableObj = mxTableObj.get(); - if( pTableObj ) - { - const bool bUndo = mpModel && mpModel->IsUndoEnabled(); - if( bUndo ) - { - mpModel->BegUndo( ImpGetResStr(STR_TABLE_DISTRIBUTE_COLUMNS) ); - mpModel->AddUndo( mpModel->GetSdrUndoFactory().CreateUndoGeoObject(*pTableObj) ); - } + if(!checkTableObject()) + return; - CellPos aStart, aEnd; - getSelectedCells( aStart, aEnd ); - pTableObj->DistributeColumns( aStart.mnCol, aEnd.mnCol ); + SdrTableObj& rTableObj(*mxTableObj.get()); + SdrModel& rModel(rTableObj.getSdrModelFromSdrObject()); + const bool bUndo(rModel.IsUndoEnabled()); - if( bUndo ) - mpModel->EndUndo(); + if( bUndo ) + { + rModel.BegUndo( ImpGetResStr(STR_TABLE_DISTRIBUTE_COLUMNS) ); + rModel.AddUndo(rModel.GetSdrUndoFactory().CreateUndoGeoObject(rTableObj)); } + + CellPos aStart, aEnd; + getSelectedCells( aStart, aEnd ); + rTableObj.DistributeColumns( aStart.mnCol, aEnd.mnCol ); + + if( bUndo ) + rModel.EndUndo(); } void SvxTableController::DistributeRows() { - SdrTableObj* pTableObj = mxTableObj.get(); - if( pTableObj ) - { - const bool bUndo = mpModel && mpModel->IsUndoEnabled(); - if( bUndo ) - { - mpModel->BegUndo( ImpGetResStr(STR_TABLE_DISTRIBUTE_ROWS) ); - mpModel->AddUndo( mpModel->GetSdrUndoFactory().CreateUndoGeoObject(*pTableObj) ); - } + if(!checkTableObject()) + return; - CellPos aStart, aEnd; - getSelectedCells( aStart, aEnd ); - pTableObj->DistributeRows( aStart.mnRow, aEnd.mnRow ); + SdrTableObj& rTableObj(*mxTableObj.get()); + SdrModel& rModel(rTableObj.getSdrModelFromSdrObject()); + const bool bUndo(rModel.IsUndoEnabled()); - if( bUndo ) - mpModel->EndUndo(); + if( bUndo ) + { + rModel.BegUndo( ImpGetResStr(STR_TABLE_DISTRIBUTE_ROWS) ); + rModel.AddUndo(rModel.GetSdrUndoFactory().CreateUndoGeoObject(rTableObj)); } + + CellPos aStart, aEnd; + getSelectedCells( aStart, aEnd ); + rTableObj.DistributeRows( aStart.mnRow, aEnd.mnRow ); + + if( bUndo ) + rModel.EndUndo(); } bool SvxTableController::HasMarked() @@ -1333,12 +1344,15 @@ bool SvxTableController::HasMarked() bool SvxTableController::DeleteMarked() { - if (!HasMarked()) + if(!checkTableObject() || !HasMarked()) return false; - const bool bUndo = mpModel && mpModel->IsUndoEnabled(); + SdrTableObj& rTableObj(*mxTableObj.get()); + SdrModel& rModel(rTableObj.getSdrModelFromSdrObject()); + const bool bUndo(rModel.IsUndoEnabled()); + if (bUndo) - mpModel->BegUndo(ImpGetResStr(STR_TABLE_DELETE_CELL_CONTENTS)); + rModel.BegUndo(ImpGetResStr(STR_TABLE_DELETE_CELL_CONTENTS)); CellPos aStart, aEnd; getSelectedCells( aStart, aEnd ); @@ -1357,7 +1371,7 @@ bool SvxTableController::DeleteMarked() } if (bUndo) - mpModel->EndUndo(); + rModel.EndUndo(); UpdateTableShape(); return true; @@ -1444,8 +1458,7 @@ SvxTableController::TblAction SvxTableController::getKeyboardAction(const KeyEve { const bool bMod1 = rKEvt.GetKeyCode().IsMod1(); // ctrl const bool bMod2 = rKEvt.GetKeyCode().IsMod2(); // Alt - - const bool bTextEdit = mpView->IsTextEdit(); + const bool bTextEdit = mrView.IsTextEdit(); TblAction nAction = TblAction::HandledByView; @@ -1576,7 +1589,7 @@ SvxTableController::TblAction SvxTableController::getKeyboardAction(const KeyEve } bool bTextMove = false; - OutlinerView* pOLV = mpView->GetTextEditOutlinerView(); + OutlinerView* pOLV = mrView.GetTextEditOutlinerView(); if( pOLV ) { RemoveSelection(); @@ -1740,7 +1753,7 @@ bool SvxTableController::executeAction(TblAction nAction, bool bSelect, vcl::Win void SvxTableController::gotoCell(const CellPos& rPos, bool bSelect, vcl::Window* pWindow, TblAction nAction /*= TblAction::NONE */) { if( mxTableObj.is() && mxTableObj->IsTextEditActive() ) - mpView->SdrEndTextEdit(true); + mrView.SdrEndTextEdit(true); if( bSelect ) { @@ -1787,22 +1800,29 @@ const CellPos& SvxTableController::getSelectionEnd() void SvxTableController::MergeRange( sal_Int32 nFirstCol, sal_Int32 nFirstRow, sal_Int32 nLastCol, sal_Int32 nLastRow ) { - if( mxTable.is() ) try + if(!checkTableObject() || !mxTable.is()) + return; + + try { Reference< XMergeableCellRange > xRange( mxTable->createCursorByRange( mxTable->getCellRangeByPosition( nFirstCol, nFirstRow,nLastCol, nLastRow ) ), UNO_QUERY_THROW ); + if( xRange->isMergeable() ) { - const bool bUndo = mpModel && mpModel->IsUndoEnabled(); + SdrTableObj& rTableObj(*mxTableObj.get()); + SdrModel& rModel(rTableObj.getSdrModelFromSdrObject()); + const bool bUndo(rModel.IsUndoEnabled()); + if( bUndo ) { - mpModel->BegUndo( ImpGetResStr(STR_TABLE_MERGE) ); - mpModel->AddUndo( mpModel->GetSdrUndoFactory().CreateUndoGeoObject(*mxTableObj.get()) ); + rModel.BegUndo( ImpGetResStr(STR_TABLE_MERGE) ); + rModel.AddUndo(rModel.GetSdrUndoFactory().CreateUndoGeoObject(rTableObj)); } xRange->merge(); if( bUndo ) - mpModel->EndUndo(); + rModel.EndUndo(); } } catch( Exception& ) @@ -1848,16 +1868,20 @@ void SvxTableController::findMergeOrigin( CellPos& rPos ) void SvxTableController::EditCell(const CellPos& rPos, vcl::Window* pWindow, TblAction nAction /*= TblAction::NONE */) { - SdrPageView* pPV = mpView->GetSdrPageView(); + SdrPageView* pPV(mrView.GetSdrPageView()); - sdr::table::SdrTableObj* pTableObj = mxTableObj.get(); - if( pTableObj && pTableObj->GetPage() == pPV->GetPage() ) + if(nullptr == pPV || !checkTableObject()) + return; + + SdrTableObj& rTableObj(*mxTableObj.get()); + + if(rTableObj.GetPage() == pPV->GetPage()) { bool bEmptyOutliner = false; - if(!pTableObj->GetOutlinerParaObject() && mpView->GetTextEditOutliner()) + if(!rTableObj.GetOutlinerParaObject() && mrView.GetTextEditOutliner()) { - ::Outliner* pOutl = mpView->GetTextEditOutliner(); + ::Outliner* pOutl = mrView.GetTextEditOutliner(); sal_Int32 nParaCnt = pOutl->GetParagraphCount(); Paragraph* p1stPara = pOutl->GetParagraph( 0 ); @@ -1874,28 +1898,30 @@ void SvxTableController::EditCell(const CellPos& rPos, vcl::Window* pWindow, Tbl CellPos aPos( rPos ); findMergeOrigin( aPos ); - if( pTableObj != mpView->GetTextEditObject() || bEmptyOutliner || !pTableObj->IsTextEditActive( aPos ) ) + if( &rTableObj != mrView.GetTextEditObject() || bEmptyOutliner || !rTableObj.IsTextEditActive( aPos ) ) { - if( pTableObj->IsTextEditActive() ) - mpView->SdrEndTextEdit(true); + if( rTableObj.IsTextEditActive() ) + mrView.SdrEndTextEdit(true); - pTableObj->setActiveCell( aPos ); + rTableObj.setActiveCell( aPos ); // create new outliner, owner will be the SdrObjEditView - SdrOutliner* pOutl = mpModel ? SdrMakeOutliner(OutlinerMode::OutlineObject, *mpModel) : nullptr; - if (pOutl && pTableObj->IsVerticalWriting()) + SdrModel& rModel(rTableObj.getSdrModelFromSdrObject()); + SdrOutliner* pOutl(SdrMakeOutliner(OutlinerMode::OutlineObject, rModel)); + + if (pOutl && rTableObj.IsVerticalWriting()) pOutl->SetVertical( true ); - if (mpView->SdrBeginTextEdit(pTableObj, pPV, pWindow, true, pOutl)) + if (mrView.SdrBeginTextEdit(&rTableObj, pPV, pWindow, true, pOutl)) { maCursorLastPos = maCursorFirstPos = rPos; - OutlinerView* pOLV = mpView->GetTextEditOutlinerView(); + OutlinerView* pOLV = mrView.GetTextEditOutlinerView(); // Move cursor to end of text ESelection aNewSelection; - const WritingMode eMode = pTableObj->GetWritingMode(); + const WritingMode eMode = rTableObj.GetWritingMode(); if (((nAction == TblAction::GotoLeftCell) || (nAction == TblAction::GotoRightCell)) && (eMode != WritingMode_TB_RL)) { const bool bLast = ((nAction == TblAction::GotoLeftCell) && (eMode == WritingMode_LR_TB)) || @@ -1913,11 +1939,11 @@ void SvxTableController::EditCell(const CellPos& rPos, vcl::Window* pWindow, Tbl void SvxTableController::StopTextEdit() { - if(mpView->IsTextEdit()) + if(mrView.IsTextEdit()) { - mpView->SdrEndTextEdit(); - mpView->SetCurrentObj(OBJ_TABLE); - mpView->SetEditMode(SdrViewEditMode::Edit); + mrView.SdrEndTextEdit(); + mrView.SetCurrentObj(OBJ_TABLE); + mrView.SetEditMode(SdrViewEditMode::Edit); } } @@ -1971,7 +1997,7 @@ void SvxTableController::getSelectedCells( CellPos& rFirst, CellPos& rLast ) } while(bExt); } - else if( mpView && mpView->IsTextEdit() ) + else if(mrView.IsTextEdit()) { rFirst = getSelectionStart(); findMergeOrigin( rFirst ); @@ -2010,7 +2036,7 @@ void SvxTableController::StartSelection( const CellPos& rPos ) StopTextEdit(); mbCellSelectionMode = true; maCursorLastPos = maCursorFirstPos = rPos; - mpView->MarkListHasChanged(); + mrView.MarkListHasChanged(); } @@ -2025,53 +2051,58 @@ void SvxTableController::setSelectedCells( const CellPos& rStart, const CellPos& bool SvxTableController::ChangeFontSize(bool bGrow, const FontList* pFontList) { - if (mxTable.is()) - { - if (mpView->IsTextEdit()) - return true; + if(!checkTableObject() || !mxTable.is()) + return false; - CellPos aStart, aEnd; - if(hasSelectedCells()) - { - getSelectedCells(aStart, aEnd); - } - else - { - aStart.mnRow = 0; - aStart.mnCol = 0; - aEnd.mnRow = mxTable->getRowCount() - 1; - aEnd.mnCol = mxTable->getColumnCount() - 1; - } + SdrTableObj& rTableObj(*mxTableObj.get()); + SdrModel& rModel(rTableObj.getSdrModelFromSdrObject()); - for (sal_Int32 nRow = aStart.mnRow; nRow <= aEnd.mnRow; nRow++) + if (mrView.IsTextEdit()) + return true; + + CellPos aStart, aEnd; + + if(hasSelectedCells()) + { + getSelectedCells(aStart, aEnd); + } + else + { + aStart.mnRow = 0; + aStart.mnCol = 0; + aEnd.mnRow = mxTable->getRowCount() - 1; + aEnd.mnCol = mxTable->getColumnCount() - 1; + } + + for (sal_Int32 nRow = aStart.mnRow; nRow <= aEnd.mnRow; nRow++) + { + for (sal_Int32 nCol = aStart.mnCol; nCol <= aEnd.mnCol; nCol++) { - for (sal_Int32 nCol = aStart.mnCol; nCol <= aEnd.mnCol; nCol++) + CellRef xCell(dynamic_cast< Cell* >(mxTable->getCellByPosition(nCol, nRow).get())); + if (xCell.is()) { - CellRef xCell(dynamic_cast< Cell* >(mxTable->getCellByPosition(nCol, nRow).get())); - if (xCell.is()) - { - if (mpModel && mpModel->IsUndoEnabled()) - xCell->AddUndo(); + if (rModel.IsUndoEnabled()) + xCell->AddUndo(); - SfxItemSet aCellSet(xCell->GetItemSet()); - if (EditView::ChangeFontSize(bGrow, aCellSet, pFontList)) - { - xCell->SetMergedItemSetAndBroadcast(aCellSet, false); - } + SfxItemSet aCellSet(xCell->GetItemSet()); + if (EditView::ChangeFontSize(bGrow, aCellSet, pFontList)) + { + xCell->SetMergedItemSetAndBroadcast(aCellSet, false); } } } - UpdateTableShape(); - return true; } - return false; + + UpdateTableShape(); + + return true; } void SvxTableController::UpdateSelection( const CellPos& rPos ) { maCursorLastPos = rPos; - mpView->MarkListHasChanged(); + mrView.MarkListHasChanged(); } @@ -2099,7 +2130,7 @@ void SvxTableController::RemoveSelection() if( mbCellSelectionMode ) { mbCellSelectionMode = false; - mpView->MarkListHasChanged(); + mrView.MarkListHasChanged(); } } @@ -2136,14 +2167,14 @@ void SvxTableController::updateSelectionOverlay() aRanges.push_back( a2DRange ); ::Color aHighlight( COL_BLUE ); - OutputDevice* pOutDev = mpView->GetFirstOutputDevice(); + OutputDevice* pOutDev = mrView.GetFirstOutputDevice(); if( pOutDev ) aHighlight = pOutDev->GetSettings().GetStyleSettings().GetHighlightColor(); - const sal_uInt32 nCount = mpView->PaintWindowCount(); + const sal_uInt32 nCount = mrView.PaintWindowCount(); for( sal_uInt32 nIndex = 0; nIndex < nCount; nIndex++ ) { - SdrPaintWindow* pPaintWindow = mpView->GetPaintWindow(nIndex); + SdrPaintWindow* pPaintWindow = mrView.GetPaintWindow(nIndex); if( pPaintWindow ) { rtl::Reference < sdr::overlay::OverlayManager > xOverlayManager = pPaintWindow->GetOverlayManager(); @@ -2500,13 +2531,15 @@ void SvxTableController::UpdateTableShape() void SvxTableController::SetAttrToSelectedCells(const SfxItemSet& rAttr, bool bReplaceAll) { - if( !mxTable.is() ) + if(!checkTableObject() || !mxTable.is()) return; - const bool bUndo = mpModel && mpModel->IsUndoEnabled(); + SdrTableObj& rTableObj(*mxTableObj.get()); + SdrModel& rModel(rTableObj.getSdrModelFromSdrObject()); + const bool bUndo(rModel.IsUndoEnabled()); if( bUndo ) - mpModel->BegUndo( ImpGetResStr(STR_TABLE_NUMFORMAT) ); + rModel.BegUndo( ImpGetResStr(STR_TABLE_NUMFORMAT) ); CellPos aStart, aEnd; getSelectedCells( aStart, aEnd ); @@ -2544,7 +2577,7 @@ void SvxTableController::SetAttrToSelectedCells(const SfxItemSet& rAttr, bool bR UpdateTableShape(); if( bUndo ) - mpModel->EndUndo(); + rModel.EndUndo(); } @@ -2554,9 +2587,9 @@ bool SvxTableController::GetAttributes(SfxItemSet& rTargetSet, bool bOnlyHardAtt { MergeAttrFromSelectedCells( rTargetSet, bOnlyHardAttr ); - if( mpView->IsTextEdit() ) + if( mrView.IsTextEdit() ) { - OutlinerView* pTextEditOutlinerView = mpView->GetTextEditOutlinerView(); + OutlinerView* pTextEditOutlinerView = mrView.GetTextEditOutlinerView(); if(pTextEditOutlinerView) { // FALSE= consider InvalidItems not as the default, but as "holes" @@ -2575,7 +2608,7 @@ bool SvxTableController::GetAttributes(SfxItemSet& rTargetSet, bool bOnlyHardAtt bool SvxTableController::SetAttributes(const SfxItemSet& rSet, bool bReplaceAll) { - if( mbCellSelectionMode || mpView->IsTextEdit() ) + if( mbCellSelectionMode || mrView.IsTextEdit() ) { SetAttrToSelectedCells( rSet, bReplaceAll ); return true; @@ -2588,16 +2621,17 @@ bool SvxTableController::GetMarkedObjModel( SdrPage* pNewPage ) { if( mxTableObj.is() && mbCellSelectionMode && pNewPage ) try { - sdr::table::SdrTableObj& rTableObj = *mxTableObj.get(); - + sdr::table::SdrTableObj& rTableObj(*mxTableObj.get()); CellPos aStart, aEnd; - getSelectedCells( aStart, aEnd ); - - SdrTableObj* pNewTableObj = rTableObj.CloneRange( aStart, aEnd ); - - pNewTableObj->SetPage( pNewPage ); - pNewTableObj->SetModel( pNewPage->GetModel() ); - + getSelectedCells(aStart, aEnd); + + // Clone to new SdrModel + SdrTableObj* pNewTableObj( + rTableObj.CloneRange( + aStart, + aEnd, + pNewPage->getSdrModelFromSdrPage())); + pNewTableObj->SetPage(pNewPage); pNewPage->InsertObject(pNewTableObj, SAL_MAX_SIZE); return true; @@ -2606,13 +2640,14 @@ bool SvxTableController::GetMarkedObjModel( SdrPage* pNewPage ) { OSL_FAIL( "svx::SvxTableController::GetMarkedObjModel(), exception caught!" ); } + return false; } bool SvxTableController::PasteObjModel( const SdrModel& rModel ) { - if( mxTableObj.is() && mpView && (rModel.GetPageCount() >= 1) ) + if( mxTableObj.is() && (rModel.GetPageCount() >= 1) ) { const SdrPage* pPastePage = rModel.GetPage(0); if( pPastePage && pPastePage->GetObjCount() == 1 ) @@ -2647,8 +2682,8 @@ bool SvxTableController::PasteObject( SdrTableObj const * pPasteTableObj ) CellPos aStart, aEnd; getSelectedCells( aStart, aEnd ); - if( mpView->IsTextEdit() ) - mpView->SdrEndTextEdit(true); + if( mrView.IsTextEdit() ) + mrView.SdrEndTextEdit(true); sal_Int32 nColumns = mxTable->getColumnCount(); sal_Int32 nRows = mxTable->getRowCount(); @@ -2692,51 +2727,51 @@ bool SvxTableController::TakeFormatPaintBrush( std::shared_ptr< SfxItemSet >& /* bool SvxTableController::ApplyFormatPaintBrush( SfxItemSet& rFormatSet, bool bNoCharacterFormats, bool bNoParagraphFormats ) { - if( mbCellSelectionMode ) + if(!mbCellSelectionMode) { - SdrTextObj* pTableObj = dynamic_cast<SdrTextObj*>( mxTableObj.get() ); - if( !pTableObj ) - return false; + return false; + } - const bool bUndo = mpModel && mpModel->IsUndoEnabled(); + if(!checkTableObject()) + return false; - if( bUndo ) - mpModel->BegUndo( ImpGetResStr(STR_TABLE_NUMFORMAT) ); + SdrTableObj& rTableObj(*mxTableObj.get()); + SdrModel& rModel(rTableObj.getSdrModelFromSdrObject()); + const bool bUndo(rModel.IsUndoEnabled()); - CellPos aStart, aEnd; - getSelectedCells( aStart, aEnd ); + if( bUndo ) + rModel.BegUndo(ImpGetResStr(STR_TABLE_NUMFORMAT)); - const bool bFrame = (rFormatSet.GetItemState( SDRATTR_TABLE_BORDER ) == SfxItemState::SET) || (rFormatSet.GetItemState( SDRATTR_TABLE_BORDER_INNER ) == SfxItemState::SET); + CellPos aStart, aEnd; + getSelectedCells( aStart, aEnd ); + const bool bFrame = (rFormatSet.GetItemState( SDRATTR_TABLE_BORDER ) == SfxItemState::SET) || (rFormatSet.GetItemState( SDRATTR_TABLE_BORDER_INNER ) == SfxItemState::SET); - for( sal_Int32 nRow = aStart.mnRow; nRow <= aEnd.mnRow; nRow++ ) + for( sal_Int32 nRow = aStart.mnRow; nRow <= aEnd.mnRow; nRow++ ) + { + for( sal_Int32 nCol = aStart.mnCol; nCol <= aEnd.mnCol; nCol++ ) { - for( sal_Int32 nCol = aStart.mnCol; nCol <= aEnd.mnCol; nCol++ ) + CellRef xCell( dynamic_cast< Cell* >( mxTable->getCellByPosition( nCol, nRow ).get() ) ); + if( xCell.is() ) { - CellRef xCell( dynamic_cast< Cell* >( mxTable->getCellByPosition( nCol, nRow ).get() ) ); - if( xCell.is() ) - { - if (bUndo) - xCell->AddUndo(); - SdrText* pText = static_cast< SdrText* >( xCell.get() ); - SdrObjEditView::ApplyFormatPaintBrushToText( rFormatSet, *pTableObj, pText, bNoCharacterFormats, bNoParagraphFormats ); - } + if (bUndo) + xCell->AddUndo(); + SdrText* pText = static_cast< SdrText* >( xCell.get() ); + SdrObjEditView::ApplyFormatPaintBrushToText( rFormatSet, rTableObj, pText, bNoCharacterFormats, bNoParagraphFormats ); } } + } - if( bFrame ) - { - ApplyBorderAttr( rFormatSet ); - } - - UpdateTableShape(); + if( bFrame ) + { + ApplyBorderAttr( rFormatSet ); + } - if( bUndo ) - mpModel->EndUndo(); + UpdateTableShape(); - return true; + if( bUndo ) + rModel.EndUndo(); - } - return false; + return true; } @@ -3077,26 +3112,22 @@ bool SvxTableController::isColumnSelected( sal_Int32 nColumn ) bool SvxTableController::isRowHeader() { - SdrTableObj* pTableObj = mxTableObj.get(); - SdrModel* pModel = pTableObj ? pTableObj->GetModel() : nullptr; - - if( !pTableObj || !pModel ) + if(!checkTableObject()) return false; - TableStyleSettings aSettings( pTableObj->getTableStyleSettings() ); + SdrTableObj& rTableObj(*mxTableObj.get()); + TableStyleSettings aSettings(rTableObj.getTableStyleSettings()); return aSettings.mbUseFirstRow; } bool SvxTableController::isColumnHeader() { - SdrTableObj* pTableObj = mxTableObj.get(); - SdrModel* pModel = pTableObj ? pTableObj->GetModel() : nullptr; - - if( !pTableObj || !pModel ) + if(!checkTableObject()) return false; - TableStyleSettings aSettings( pTableObj->getTableStyleSettings() ); + SdrTableObj& rTableObj(*mxTableObj.get()); + TableStyleSettings aSettings(rTableObj.getTableStyleSettings()); return aSettings.mbUseFirstColumn; } @@ -3125,7 +3156,7 @@ bool SvxTableController::setCursorLogicPosition(const Point& rPosition, bool bPo // No selection, but rPosition is at an other cell: start table selection. StartSelection(maMouseDownPos); // Update graphic selection, should be hidden now. - mpView->AdjustMarkHdl(); + mrView.AdjustMarkHdl(); } } diff --git a/svx/source/table/tablemodel.cxx b/svx/source/table/tablemodel.cxx index 033af2477a45..812e3de7fe26 100644 --- a/svx/source/table/tablemodel.cxx +++ b/svx/source/table/tablemodel.cxx @@ -554,7 +554,7 @@ void TableModel::unlockBroadcasts() void TableModel::notifyModification() { ::osl::MutexGuard guard( m_aMutex ); - if( (mnNotifyLock == 0) && mpTableObj && mpTableObj->GetModel() ) + if( (mnNotifyLock == 0) && mpTableObj ) { mbNotifyPending = false; @@ -602,8 +602,7 @@ void TableModel::insertColumns( sal_Int32 nIndex, sal_Int32 nCount ) { try { - SdrModel* pModel = mpTableObj->GetModel(); - + SdrModel& rModel(mpTableObj->getSdrModelFromSdrObject()); TableModelNotifyGuard aGuard( this ); nIndex = insert_range<ColumnVector,ColumnVector::iterator,TableColumnRef>( maColumns, nIndex, nCount ); @@ -619,11 +618,12 @@ void TableModel::insertColumns( sal_Int32 nIndex, sal_Int32 nCount ) aNewColumns[nOffset] = xNewCol; } - const bool bUndo = pModel && mpTableObj->IsInserted() && pModel->IsUndoEnabled(); + const bool bUndo(mpTableObj->IsInserted() && rModel.IsUndoEnabled()); + if( bUndo ) { - pModel->BegUndo( ImpGetResStr(STR_TABLE_INSCOL) ); - pModel->AddUndo( pModel->GetSdrUndoFactory().CreateUndoGeoObject(*mpTableObj) ); + rModel.BegUndo( ImpGetResStr(STR_TABLE_INSCOL) ); + rModel.AddUndo( rModel.GetSdrUndoFactory().CreateUndoGeoObject(*mpTableObj) ); TableModelRef xThis( this ); @@ -638,7 +638,7 @@ void TableModel::insertColumns( sal_Int32 nIndex, sal_Int32 nCount ) (*aCellIter++) = getCell( nIndex + nOffset, nRow ); } - pModel->AddUndo( new InsertColUndo( xThis, nIndex, aNewColumns, aNewCells ) ); + rModel.AddUndo( new InsertColUndo( xThis, nIndex, aNewColumns, aNewCells ) ); } const sal_Int32 nRowCount = getRowCountImpl(); @@ -660,11 +660,9 @@ void TableModel::insertColumns( sal_Int32 nIndex, sal_Int32 nCount ) } if( bUndo ) - pModel->EndUndo(); - - if( pModel ) - pModel->SetChanged(); + rModel.EndUndo(); + rModel.SetChanged(); } catch( Exception& ) { @@ -691,14 +689,13 @@ void TableModel::removeColumns( sal_Int32 nIndex, sal_Int32 nCount ) nCount = nColCount - nIndex; sal_Int32 nRows = getRowCountImpl(); + SdrModel& rModel(mpTableObj->getSdrModelFromSdrObject()); + const bool bUndo(mpTableObj->IsInserted() && rModel.IsUndoEnabled()); - SdrModel* pModel = mpTableObj->GetModel(); - - const bool bUndo = pModel && mpTableObj->IsInserted() && pModel->IsUndoEnabled(); if( bUndo ) { - pModel->BegUndo( ImpGetResStr(STR_UNDO_COL_DELETE) ); - pModel->AddUndo( pModel->GetSdrUndoFactory().CreateUndoGeoObject(*mpTableObj) ); + rModel.BegUndo( ImpGetResStr(STR_UNDO_COL_DELETE) ); + rModel.AddUndo( rModel.GetSdrUndoFactory().CreateUndoGeoObject(*mpTableObj) ); TableModelRef xThis( this ); ColumnVector aRemovedCols( nCount ); @@ -716,7 +713,7 @@ void TableModel::removeColumns( sal_Int32 nIndex, sal_Int32 nCount ) (*aCellIter++) = getCell( nIndex + nOffset, nRow ); } - pModel->AddUndo( new RemoveColUndo( xThis, nIndex, aRemovedCols, aRemovedCells ) ); + rModel.AddUndo( new RemoveColUndo( xThis, nIndex, aRemovedCols, aRemovedCells ) ); } // only rows before and inside the removed rows are considered @@ -769,10 +766,9 @@ void TableModel::removeColumns( sal_Int32 nIndex, sal_Int32 nCount ) maRows[nRows]->removeColumns( nIndex, nCount ); if( bUndo ) - pModel->EndUndo(); + rModel.EndUndo(); - if( pModel ) - pModel->SetChanged(); + rModel.SetChanged(); } catch( Exception& ) { @@ -789,8 +785,9 @@ void TableModel::insertRows( sal_Int32 nIndex, sal_Int32 nCount ) { if( nCount && mpTableObj ) { - SdrModel* pModel = mpTableObj->GetModel(); - const bool bUndo = pModel && mpTableObj->IsInserted() && pModel->IsUndoEnabled(); + SdrModel& rModel(mpTableObj->getSdrModelFromSdrObject()); + const bool bUndo(mpTableObj->IsInserted() && rModel.IsUndoEnabled()); + try { TableModelNotifyGuard aGuard( this ); @@ -808,10 +805,10 @@ void TableModel::insertRows( sal_Int32 nIndex, sal_Int32 nCount ) if( bUndo ) { - pModel->BegUndo( ImpGetResStr(STR_TABLE_INSROW) ); - pModel->AddUndo( pModel->GetSdrUndoFactory().CreateUndoGeoObject(*mpTableObj) ); + rModel.BegUndo( ImpGetResStr(STR_TABLE_INSROW) ); + rModel.AddUndo( rModel.GetSdrUndoFactory().CreateUndoGeoObject(*mpTableObj) ); TableModelRef xThis( this ); - pModel->AddUndo( new InsertRowUndo( xThis, nIndex, aNewRows ) ); + rModel.AddUndo( new InsertRowUndo( xThis, nIndex, aNewRows ) ); } // check if cells merge over new columns @@ -836,10 +833,9 @@ void TableModel::insertRows( sal_Int32 nIndex, sal_Int32 nCount ) OSL_FAIL("sdr::table::TableModel::insertRows(), exception caught!"); } if( bUndo ) - pModel->EndUndo(); + rModel.EndUndo(); - if( pModel ) - pModel->SetChanged(); + rModel.SetChanged(); updateRows(); setModified(true); @@ -853,8 +849,8 @@ void TableModel::removeRows( sal_Int32 nIndex, sal_Int32 nCount ) if( mpTableObj && nCount && (nIndex >= 0) && (nIndex < nRowCount) ) { - SdrModel* pModel = mpTableObj->GetModel(); - const bool bUndo = pModel && mpTableObj->IsInserted()&& pModel->IsUndoEnabled(); + SdrModel& rModel(mpTableObj->getSdrModelFromSdrObject()); + const bool bUndo(mpTableObj->IsInserted() && rModel.IsUndoEnabled()); try { @@ -866,8 +862,8 @@ void TableModel::removeRows( sal_Int32 nIndex, sal_Int32 nCount ) if( bUndo ) { - pModel->BegUndo( ImpGetResStr(STR_UNDO_ROW_DELETE) ); - pModel->AddUndo( pModel->GetSdrUndoFactory().CreateUndoGeoObject(*mpTableObj) ); + rModel.BegUndo( ImpGetResStr(STR_UNDO_ROW_DELETE) ); + rModel.AddUndo( rModel.GetSdrUndoFactory().CreateUndoGeoObject(*mpTableObj) ); TableModelRef xThis( this ); @@ -875,7 +871,7 @@ void TableModel::removeRows( sal_Int32 nIndex, sal_Int32 nCount ) for( sal_Int32 nOffset = 0; nOffset < nCount; ++nOffset ) aRemovedRows[nOffset] = maRows[nIndex+nOffset]; - pModel->AddUndo( new RemoveRowUndo( xThis, nIndex, aRemovedRows ) ); + rModel.AddUndo( new RemoveRowUndo( xThis, nIndex, aRemovedRows ) ); } // only rows before and inside the removed rows are considered @@ -926,10 +922,9 @@ void TableModel::removeRows( sal_Int32 nIndex, sal_Int32 nCount ) remove_range<RowVector,RowVector::iterator>( maRows, nIndex, nCount ); if( bUndo ) - pModel->EndUndo(); + rModel.EndUndo(); - if( pModel ) - pModel->SetChanged(); + rModel.SetChanged(); } catch( Exception& ) { @@ -1050,10 +1045,11 @@ void TableModel::optimize() void TableModel::merge( sal_Int32 nCol, sal_Int32 nRow, sal_Int32 nColSpan, sal_Int32 nRowSpan ) { - SdrModel* pModel = mpTableObj->GetModel(); - - const bool bUndo = pModel && mpTableObj->IsInserted() && pModel->IsUndoEnabled(); + if(nullptr == mpTableObj) + return; + SdrModel& rModel(mpTableObj->getSdrModelFromSdrObject()); + const bool bUndo(mpTableObj->IsInserted() && rModel.IsUndoEnabled()); const sal_Int32 nLastRow = nRow + nRowSpan; const sal_Int32 nLastCol = nCol + nColSpan; diff --git a/svx/source/table/tablerow.cxx b/svx/source/table/tablerow.cxx index 43010ad698fe..cf765b47830a 100644 --- a/svx/source/table/tablerow.cxx +++ b/svx/source/table/tablerow.cxx @@ -206,14 +206,15 @@ void SAL_CALL TableRow::setName( const OUString& aName ) void SAL_CALL TableRow::setFastPropertyValue( sal_Int32 nHandle, const Any& aValue ) { - bool bOk = false; - bool bChange = false; + if(!mxTableModel.is() || nullptr == mxTableModel->getSdrTableObj()) + return; - TableRowUndo* pUndo = nullptr; - - SdrModel* pModel = mxTableModel->getSdrTableObj()->GetModel(); - - const bool bUndo = mxTableModel.is() && mxTableModel->getSdrTableObj() && mxTableModel->getSdrTableObj()->IsInserted() && pModel && pModel->IsUndoEnabled(); + SdrTableObj& rTableObj(*mxTableModel->getSdrTableObj()); + SdrModel& rModel(rTableObj.getSdrModelFromSdrObject()); + bool bOk(false); + bool bChange(false); + TableRowUndo* pUndo(nullptr); + const bool bUndo(rTableObj.IsInserted() && rModel.IsUndoEnabled()); if( bUndo ) { @@ -276,6 +277,7 @@ void SAL_CALL TableRow::setFastPropertyValue( sal_Int32 nHandle, const Any& aVal delete pUndo; throw UnknownPropertyException( OUString::number(nHandle), static_cast<cppu::OWeakObject*>(this)); } + if( !bOk ) { delete pUndo; @@ -286,7 +288,7 @@ void SAL_CALL TableRow::setFastPropertyValue( sal_Int32 nHandle, const Any& aVal { if( pUndo ) { - pModel->AddUndo( pUndo ); + rModel.AddUndo( pUndo ); pUndo = nullptr; } mxTableModel->setModified(true); diff --git a/svx/source/table/tablertfimporter.cxx b/svx/source/table/tablertfimporter.cxx index 714e0c62c4ed..b50efb35bc3a 100644 --- a/svx/source/table/tablertfimporter.cxx +++ b/svx/source/table/tablertfimporter.cxx @@ -132,8 +132,8 @@ private: SdrTableRTFParser::SdrTableRTFParser( SdrTableObj& rTableObj ) : mrTableObj( rTableObj ) -, mpOutliner( SdrMakeOutliner( OutlinerMode::TextObject, *rTableObj.GetModel() ) ) -, mrItemPool( rTableObj.GetModel()->GetItemPool() ) +, mpOutliner( SdrMakeOutliner( OutlinerMode::TextObject, rTableObj.getSdrModelFromSdrObject() ) ) +, mrItemPool( rTableObj.getSdrModelFromSdrObject().GetItemPool() ) , mnLastToken( 0 ) , mbNewDef( false ) , mnStartPara( 0 ) diff --git a/svx/source/table/tableundo.cxx b/svx/source/table/tableundo.cxx index 9a14948b1dfe..493c895057dc 100644 --- a/svx/source/table/tableundo.cxx +++ b/svx/source/table/tableundo.cxx @@ -35,10 +35,10 @@ using namespace ::com::sun::star::table; namespace sdr { namespace table { CellUndo::CellUndo( const tools::WeakReference<SdrObject>& xObjRef, const CellRef& xCell ) - : SdrUndoAction( *xCell->GetModel() ) - , mxObjRef( xObjRef ) - , mxCell( xCell ) - , mbUndo( true ) +: SdrUndoAction(xCell->GetObject().getSdrModelFromSdrObject()) + ,mxObjRef( xObjRef ) + ,mxCell( xCell ) + ,mbUndo( true ) { if( mxCell.is() && mxObjRef.is() ) { @@ -162,10 +162,10 @@ static void Dispose( RowVector& rRows ) InsertRowUndo::InsertRowUndo( const TableModelRef& xTable, sal_Int32 nIndex, RowVector& aNewRows ) - : SdrUndoAction( *xTable->getSdrTableObj()->GetModel() ) - , mxTable( xTable ) - , mnIndex( nIndex ) - , mbUndo( true ) +: SdrUndoAction(xTable->getSdrTableObj()->getSdrModelFromSdrObject()) + ,mxTable( xTable ) + ,mnIndex( nIndex ) + ,mbUndo( true ) { maRows.swap( aNewRows ); } @@ -202,10 +202,10 @@ void InsertRowUndo::Redo() RemoveRowUndo::RemoveRowUndo( const TableModelRef& xTable, sal_Int32 nIndex, RowVector& aRemovedRows ) - : SdrUndoAction( *xTable->getSdrTableObj()->GetModel() ) - , mxTable( xTable ) - , mnIndex( nIndex ) - , mbUndo( true ) +: SdrUndoAction(xTable->getSdrTableObj()->getSdrModelFromSdrObject()) + ,mxTable( xTable ) + ,mnIndex( nIndex ) + ,mbUndo( true ) { maRows.swap( aRemovedRows ); } @@ -258,10 +258,10 @@ static void Dispose( CellVector& rCells ) InsertColUndo::InsertColUndo( const TableModelRef& xTable, sal_Int32 nIndex, ColumnVector& aNewCols, CellVector& aCells ) - : SdrUndoAction( *xTable->getSdrTableObj()->GetModel() ) - , mxTable( xTable ) - , mnIndex( nIndex ) - , mbUndo( true ) +: SdrUndoAction(xTable->getSdrTableObj()->getSdrModelFromSdrObject()) + ,mxTable( xTable ) + ,mnIndex( nIndex ) + ,mbUndo( true ) { maColumns.swap( aNewCols ); maCells.swap( aCells ); @@ -302,10 +302,10 @@ void InsertColUndo::Redo() RemoveColUndo::RemoveColUndo( const TableModelRef& xTable, sal_Int32 nIndex, ColumnVector& aNewCols, CellVector& aCells ) - : SdrUndoAction( *xTable->getSdrTableObj()->GetModel() ) - , mxTable( xTable ) - , mnIndex( nIndex ) - , mbUndo( true ) +: SdrUndoAction(xTable->getSdrTableObj()->getSdrModelFromSdrObject()) + ,mxTable( xTable ) + ,mnIndex( nIndex ) + ,mbUndo( true ) { maColumns.swap( aNewCols ); maCells.swap( aCells ); @@ -346,9 +346,9 @@ void RemoveColUndo::Redo() TableColumnUndo::TableColumnUndo( const TableColumnRef& xCol ) - : SdrUndoAction( *xCol->mxTableModel->getSdrTableObj()->GetModel() ) - , mxCol( xCol ) - , mbHasRedoData( false ) +: SdrUndoAction(xCol->mxTableModel->getSdrTableObj()->getSdrModelFromSdrObject()) + ,mxCol( xCol ) + ,mbHasRedoData( false ) { getData( maUndoData ); } @@ -412,7 +412,7 @@ void TableColumnUndo::getData( Data& rData ) TableRowUndo::TableRowUndo( const TableRowRef& xRow ) - : SdrUndoAction( *xRow->mxTableModel->getSdrTableObj()->GetModel() ) +: SdrUndoAction(xRow->mxTableModel->getSdrTableObj()->getSdrModelFromSdrObject()) , mxRow( xRow ) , mbHasRedoData( false ) { @@ -475,9 +475,9 @@ void TableRowUndo::getData( Data& rData ) TableStyleUndo::TableStyleUndo( const SdrTableObj& rTableObj ) - : SdrUndoAction( *rTableObj.GetModel() ) - , mxObjRef( const_cast< sdr::table::SdrTableObj*>( &rTableObj ) ) - , mbHasRedoData(false) +: SdrUndoAction(rTableObj.getSdrModelFromSdrObject()) + ,mxObjRef( const_cast< sdr::table::SdrTableObj*>( &rTableObj ) ) + ,mbHasRedoData(false) { getData( maUndoData ); } diff --git a/svx/source/tbxctrls/fontworkgallery.cxx b/svx/source/tbxctrls/fontworkgallery.cxx index cca40d210b01..1dadd4983cf5 100644 --- a/svx/source/tbxctrls/fontworkgallery.cxx +++ b/svx/source/tbxctrls/fontworkgallery.cxx @@ -197,7 +197,8 @@ void FontWorkGalleryDialog::insertSelectedFontwork() SdrPage* pPage = pModel->GetPage(0); if( pPage && pPage->GetObjCount() ) { - SdrObject* pNewObject = pPage->GetObj(0)->Clone(); + // Clone directly to target SdrModel + SdrObject* pNewObject(pPage->GetObj(0)->Clone(mpDestModel)); // center shape on current view OutputDevice* pOutDev = mpSdrView->GetFirstOutputDevice(); @@ -210,16 +211,15 @@ void FontWorkGalleryDialog::insertSelectedFontwork() aPagePos.AdjustY( -(aObjRect.GetHeight() / 2) ); tools::Rectangle aNewObjectRectangle(aPagePos, aObjRect.GetSize()); SdrPageView* pPV = mpSdrView->GetSdrPageView(); - pNewObject->SetLogicRect(aNewObjectRectangle); + if ( mppSdrObject ) { *mppSdrObject = pNewObject; - (*mppSdrObject)->SetModel( mpDestModel ); } else if( pPV ) { - mpSdrView->InsertObjectAtView( pNewObject, *pPV ); + mpSdrView->InsertObjectAtView( pNewObject, *pPV ); } } } diff --git a/svx/source/unodraw/UnoGraphicExporter.cxx b/svx/source/unodraw/UnoGraphicExporter.cxx index 9fb0d021930a..a70c99ae3109 100644 --- a/svx/source/unodraw/UnoGraphicExporter.cxx +++ b/svx/source/unodraw/UnoGraphicExporter.cxx @@ -108,24 +108,21 @@ namespace { Fraction maScaleX; Fraction maScaleY; - explicit ExportSettings( SdrModel const * pDoc ); + explicit ExportSettings(const SdrModel& rSdrModel); }; - ExportSettings::ExportSettings( SdrModel const * pDoc ) - : mnWidth( 0 ) - , mnHeight( 0 ) - , mbExportOnlyBackground( false ) - , mbScrollText( false ) - , mbUseHighContrast( false ) - , mbTranslucent( false ) - , maScaleX( 1, 1 ) - , maScaleY( 1, 1 ) + ExportSettings::ExportSettings(const SdrModel& rSdrModel) + : mnWidth( 0 ) + ,mnHeight( 0 ) + ,mbExportOnlyBackground( false ) + ,mbScrollText( false ) + ,mbUseHighContrast( false ) + ,mbTranslucent( false ) + ,maScaleX( 1, 1 ) + ,maScaleY( 1, 1 ) { - if( pDoc ) - { - maScaleX = pDoc->GetScaleFraction(); - maScaleY = pDoc->GetScaleFraction(); - } + maScaleX = rSdrModel.GetScaleFraction(); + maScaleY = rSdrModel.GetScaleFraction(); } /** implements a component to export shapes or pages to external graphic formats. @@ -421,13 +418,15 @@ VclPtr<VirtualDevice> GraphicExporter::CreatePageVDev( SdrPage* pPage, sal_uIntP if(bSuccess) { - std::unique_ptr<SdrView> pView(new SdrView(mpDoc, pVDev)); + std::unique_ptr<SdrView> pView(new SdrView(*mpDoc, pVDev)); + pView->SetPageVisible( false ); pView->SetBordVisible( false ); pView->SetGridVisible( false ); pView->SetHlplVisible( false ); pView->SetGlueVisible( false ); pView->ShowSdrPage(pPage); + vcl::Region aRegion (tools::Rectangle( aPoint, aPageSize ) ); ImplExportCheckVisisbilityRedirector aRedirector( mpCurrentPage ); @@ -631,7 +630,9 @@ bool GraphicExporter::GetGraphic( ExportSettings const & rSettings, Graphic& aGr if(pCorrectProperties) { - pTempBackgroundShape = new SdrRectObj(tools::Rectangle(Point(0,0), pPage->GetSize())); + pTempBackgroundShape = new SdrRectObj( + *mpDoc, + tools::Rectangle(Point(0,0), pPage->GetSize())); pTempBackgroundShape->SetMergedItemSet(pCorrectProperties->GetItemSet()); pTempBackgroundShape->SetMergedItem(XLineStyleItem(drawing::LineStyle_NONE)); pTempBackgroundShape->NbcSetStyleSheet(pCorrectProperties->GetStyleSheet(), true); @@ -683,13 +684,14 @@ bool GraphicExporter::GetGraphic( ExportSettings const & rSettings, Graphic& aGr } std::unique_ptr<SdrView> xLocalView; + if (FmFormModel* pFormModel = dynamic_cast<FmFormModel*>(mpDoc)) { - xLocalView.reset(new FmFormView(pFormModel, aVDev) ); + xLocalView.reset(new FmFormView(*pFormModel, aVDev)); } else { - xLocalView.reset(new SdrView(mpDoc, aVDev)); + xLocalView.reset(new SdrView(*mpDoc, aVDev)); } ScopedVclPtr<VirtualDevice> pVDev(CreatePageVDev( pPage, nWidthPix, nHeightPix )); @@ -715,13 +717,14 @@ bool GraphicExporter::GetGraphic( ExportSettings const & rSettings, Graphic& aGr // create a view std::unique_ptr< SdrView > pView; + if (FmFormModel *pFormModel = dynamic_cast<FmFormModel*>(mpDoc)) { - pView.reset(new FmFormView(pFormModel, aVDev)); + pView.reset(new FmFormView(*pFormModel, aVDev)); } else { - pView.reset(new SdrView( mpDoc, aVDev )); + pView.reset(new SdrView(*mpDoc, aVDev)); } pView->SetBordVisible( false ); @@ -997,8 +1000,8 @@ sal_Bool SAL_CALL GraphicExporter::filter( const Sequence< PropertyValue >& aDes GraphicFilter &rFilter = GraphicFilter::GetGraphicFilter(); // get the arguments from the descriptor - ExportSettings aSettings( mpDoc ); - ParseSettings( aDescriptor, aSettings ); + ExportSettings aSettings(*mpDoc); + ParseSettings(aDescriptor, aSettings); const sal_uInt16 nFilter = !aSettings.maMediaType.isEmpty() ? rFilter.GetExportFormatNumberForMediaType( aSettings.maMediaType ) @@ -1136,7 +1139,7 @@ void SAL_CALL GraphicExporter::setSourceDocument( const Reference< lang::XCompon if( nullptr == mpUnoPage || nullptr == mpUnoPage->GetSdrPage() ) break; - mpDoc = mpUnoPage->GetSdrPage()->GetModel(); + mpDoc = &mpUnoPage->GetSdrPage()->getSdrModelFromSdrPage(); // Step 4: If we got a generic XShapes test all contained shapes // if they belong to the same XDrawPage @@ -1246,7 +1249,7 @@ Graphic SvxGetGraphicForShape( SdrObject& rShape ) rtl::Reference< GraphicExporter > xExporter( new GraphicExporter() ); Reference< XComponent > xComp( rShape.getUnoShape(), UNO_QUERY_THROW ); xExporter->setSourceDocument( xComp ); - ExportSettings aSettings( rShape.GetModel() ); + ExportSettings aSettings(rShape.getSdrModelFromSdrObject()); xExporter->GetGraphic( aSettings, aGraphic, true/*bVector*/ ); } catch( Exception& ) diff --git a/svx/source/unodraw/tableshape.cxx b/svx/source/unodraw/tableshape.cxx index a34815611bca..281dfa288ea9 100644 --- a/svx/source/unodraw/tableshape.cxx +++ b/svx/source/unodraw/tableshape.cxx @@ -59,8 +59,8 @@ bool SvxTableShape::setPropertyValueImpl( if( !(rValue >>= xTemplate) ) throw IllegalArgumentException(); - if( mpObj.is() ) - static_cast< sdr::table::SdrTableObj* >( mpObj.get() )->setTableStyle(xTemplate); + if( HasSdrObject() ) + static_cast< sdr::table::SdrTableObj* >( GetSdrObject() )->setTableStyle(xTemplate); return true; } @@ -71,9 +71,9 @@ bool SvxTableShape::setPropertyValueImpl( case OWN_ATTR_TABLETEMPLATE_BANDINGROWS: case OWN_ATTR_TABLETEMPLATE_BANDINGCOULUMNS: { - if( mpObj.is() ) + if( HasSdrObject() ) { - TableStyleSettings aSettings( static_cast< sdr::table::SdrTableObj* >( mpObj.get() )->getTableStyleSettings() ); + TableStyleSettings aSettings( static_cast< sdr::table::SdrTableObj* >( GetSdrObject() )->getTableStyleSettings() ); switch( pProperty->nWID ) { @@ -85,7 +85,7 @@ bool SvxTableShape::setPropertyValueImpl( case OWN_ATTR_TABLETEMPLATE_BANDINGCOULUMNS: rValue >>= aSettings.mbUseColumnBanding; break; } - static_cast< sdr::table::SdrTableObj* >( mpObj.get() )->setTableStyleSettings(aSettings); + static_cast< sdr::table::SdrTableObj* >( GetSdrObject() )->setTableStyleSettings(aSettings); } return true; @@ -106,25 +106,25 @@ bool SvxTableShape::getPropertyValueImpl( { case OWN_ATTR_OLEMODEL: { - if( mpObj.is() ) + if( HasSdrObject() ) { - rValue <<= static_cast< sdr::table::SdrTableObj* >( mpObj.get() )->getTable(); + rValue <<= static_cast< sdr::table::SdrTableObj* >( GetSdrObject() )->getTable(); } return true; } case OWN_ATTR_TABLETEMPLATE: { - if( mpObj.is() ) + if( HasSdrObject() ) { - rValue <<= static_cast< sdr::table::SdrTableObj* >( mpObj.get() )->getTableStyle(); + rValue <<= static_cast< sdr::table::SdrTableObj* >( GetSdrObject() )->getTableStyle(); } return true; } case OWN_ATTR_BITMAP: { - if( mpObj.is() ) + if( HasSdrObject() ) { - Graphic aGraphic( SvxGetGraphicForShape( *mpObj.get() ) ); + Graphic aGraphic( SvxGetGraphicForShape( *GetSdrObject() ) ); rValue <<= aGraphic.GetXGraphic(); } return true; @@ -136,9 +136,9 @@ bool SvxTableShape::getPropertyValueImpl( case OWN_ATTR_TABLETEMPLATE_BANDINGROWS: case OWN_ATTR_TABLETEMPLATE_BANDINGCOULUMNS: { - if( mpObj.is() ) + if( HasSdrObject() ) { - TableStyleSettings aSettings( static_cast< sdr::table::SdrTableObj* >( mpObj.get() )->getTableStyleSettings() ); + TableStyleSettings aSettings( static_cast< sdr::table::SdrTableObj* >( GetSdrObject() )->getTableStyleSettings() ); switch( pProperty->nWID ) { @@ -163,14 +163,14 @@ bool SvxTableShape::getPropertyValueImpl( void SvxTableShape::lock() { SvxShape::lock(); - if( mpObj.is() ) - static_cast< sdr::table::SdrTableObj* >( mpObj.get() )->uno_lock(); + if( HasSdrObject() ) + static_cast< sdr::table::SdrTableObj* >( GetSdrObject() )->uno_lock(); } void SvxTableShape::unlock() { - if( mpObj.is() ) - static_cast< sdr::table::SdrTableObj* >( mpObj.get() )->uno_unlock(); + if( HasSdrObject() ) + static_cast< sdr::table::SdrTableObj* >( GetSdrObject() )->uno_unlock(); SvxShape::unlock(); } diff --git a/svx/source/unodraw/unomod.cxx b/svx/source/unodraw/unomod.cxx index 4f0ea1fcddab..dd1d1317f7a6 100644 --- a/svx/source/unodraw/unomod.cxx +++ b/svx/source/unodraw/unomod.cxx @@ -246,8 +246,26 @@ uno::Sequence< OUString > SvxUnoDrawMSFactory::concatServiceNames( uno::Sequence return aSeq; } -SvxUnoDrawingModel::SvxUnoDrawingModel( SdrModel* pDoc ) throw() -: SfxBaseModel(nullptr), mpDoc( pDoc ) +SdrModel* SvxUnoDrawingModel::getSdrModelFromUnoModel() const +{ + return mpDoc; +} + +SvxUnoDrawingModel::SvxUnoDrawingModel(SdrModel* pDoc) throw() +: SfxBaseModel(nullptr), + SvxFmMSFactory(), + css::drawing::XDrawPagesSupplier(), + css::lang::XServiceInfo(), + css::ucb::XAnyCompareFactory(), + mpDoc(pDoc), + mxDrawPagesAccess(), + mxDashTable(), + mxGradientTable(), + mxHatchTable(), + mxBitmapTable(), + mxTransGradientTable(), + mxMarkerTable(), + maTypeSequence() { } diff --git a/svx/source/unodraw/unopage.cxx b/svx/source/unodraw/unopage.cxx index d7f14d3676c5..3dc69e899965 100644 --- a/svx/source/unodraw/unopage.cxx +++ b/svx/source/unodraw/unopage.cxx @@ -61,12 +61,11 @@ using namespace ::com::sun::star::drawing; UNO3_GETIMPLEMENTATION_IMPL( SvxDrawPage ); -SvxDrawPage::SvxDrawPage(SdrPage* pInPage) - : mrBHelper(getMutex()) - , mpPage(pInPage) - , mpModel(mpPage->GetModel()) // register at broadcaster - , mpView(new SdrView(mpModel)) // create (hidden) view - +SvxDrawPage::SvxDrawPage(SdrPage* pInPage) // TTTT should be reference +: mrBHelper(getMutex()) + ,mpPage(pInPage) + ,mpModel(&pInPage->getSdrModelFromSdrPage()) // register at broadcaster + ,mpView(new SdrView(pInPage->getSdrModelFromSdrPage())) // create (hidden) view { mpView->SetDesignMode(); } @@ -192,6 +191,24 @@ void SAL_CALL SvxDrawPage::add( const uno::Reference< drawing::XShape >& xShape return; SdrObject *pObj = pShape->GetSdrObject(); + bool bNeededToClone(false); + + if(nullptr != pObj && &pObj->getSdrModelFromSdrObject() != &mpPage->getSdrModelFromSdrPage()) + { + // TTTT UNO API tries to add an existing SvxShape to this SvxDrawPage, + // but these use different SdrModels. It was possible before to completely + // 'change' a SdrObject to another SdrModel (including dangerous MigrateItemPool + // stuff), but is no longer. We need to Clone the SdrObject to the target model + // and ::Create a new SvxShape (set SdrObject there, take obver values, ...) + SdrObject* pClonedSdrShape(pObj->Clone(&mpPage->getSdrModelFromSdrPage())); + pObj->setUnoShape(nullptr); + pClonedSdrShape->setUnoShape(xShape); + // pShape->InvalidateSdrObject(); + // pShape->Create(pClonedSdrShape, this); + SdrObject::Free(pObj); + pObj = pClonedSdrShape; + bNeededToClone = true; + } if(!pObj) { @@ -200,8 +217,20 @@ void SAL_CALL SvxDrawPage::add( const uno::Reference< drawing::XShape >& xShape } else if ( !pObj->IsInserted() ) { - pObj->SetModel(mpModel); mpPage->InsertObject( pObj ); + + if(bNeededToClone) + { + // TTTT Unfortunately in SdrObject::SetPage (see there) the + // xShape/UnoShape at the newly cloned SDrObject is *removed* again, + // so re-set it here, the caller *may need it* (e.g. Writer) + uno::Reference< uno::XInterface > xShapeCheck(pObj->getWeakUnoShape()); + + if( !xShapeCheck.is() ) + { + pObj->setUnoShape(xShape); + } + } } pShape->Create( pObj, this ); @@ -209,7 +238,6 @@ void SAL_CALL SvxDrawPage::add( const uno::Reference< drawing::XShape >& xShape if ( !pObj->IsInserted() ) { - pObj->SetModel(mpModel); mpPage->InsertObject( pObj ); } @@ -242,7 +270,6 @@ void SAL_CALL SvxDrawPage::addBottom( const uno::Reference< drawing::XShape >& x } else if ( !pObj->IsInserted() ) { - pObj->SetModel(mpModel); mpPage->InsertObject( pObj, 0 ); } @@ -251,7 +278,6 @@ void SAL_CALL SvxDrawPage::addBottom( const uno::Reference< drawing::XShape >& x if ( !pObj->IsInserted() ) { - pObj->SetModel(mpModel); mpPage->InsertObject( pObj, 0 ); } @@ -465,7 +491,7 @@ void SAL_CALL SvxDrawPage::ungroup( const Reference< drawing::XShapeGroup >& aGr mpModel->SetChanged(); } -SdrObject *SvxDrawPage::CreateSdrObject_(const Reference< drawing::XShape > & xShape) +SdrObject* SvxDrawPage::CreateSdrObject_(const Reference< drawing::XShape > & xShape) { sal_uInt16 nType = 0; SdrInventor nInventor; @@ -480,7 +506,13 @@ SdrObject *SvxDrawPage::CreateSdrObject_(const Reference< drawing::XShape > & xS awt::Point aPos = xShape->getPosition(); tools::Rectangle aRect( Point( aPos.X, aPos.Y ), Size( aSize.Width, aSize.Height ) ); - SdrObject* pNewObj = SdrObjFactory::MakeNewObject(nInventor, nType, aRect, mpPage); + SdrObject* pNewObj = SdrObjFactory::MakeNewObject( + *mpModel, + nInventor, + nType, + mpPage, + &aRect); + if (!pNewObj) return nullptr; @@ -680,39 +712,37 @@ SvxShape* SvxDrawPage::CreateShapeByTypeAndInventor( sal_uInt16 nType, SdrInvent SdrPage* pSdrPage = mpPage->GetSdrPage(); if( pSdrPage ) { - SdrModel* pSdrModel = pSdrPage->GetModel(); - if( pSdrModel ) + SdrModel& rSdrModel(pSdrPage->getSdrModelFromSdrPage()); + ::comphelper::IEmbeddedHelper *pPersist = rSdrModel.GetPersist(); + + if( pPersist ) { - ::comphelper::IEmbeddedHelper *pPersist = pSdrModel->GetPersist(); - if( pPersist ) + uno::Reference < embed::XEmbeddedObject > xObject = pPersist->getEmbeddedObjectContainer(). + GetEmbeddedObject( static_cast< SdrOle2Obj* >( pObj )->GetPersistName() ); + + // TODO CL->KA: Why is this not working anymore? + if( xObject.is() ) { - uno::Reference < embed::XEmbeddedObject > xObject = pPersist->getEmbeddedObjectContainer(). - GetEmbeddedObject( static_cast< SdrOle2Obj* >( pObj )->GetPersistName() ); + SvGlobalName aClassId( xObject->getClassID() ); - // TODO CL->KA: Why is this not working anymore? - if( xObject.is() ) + const SvGlobalName aAppletClassId( SO3_APPLET_CLASSID ); + const SvGlobalName aPluginClassId( SO3_PLUGIN_CLASSID ); + const SvGlobalName aIFrameClassId( SO3_IFRAME_CLASSID ); + + if( aPluginClassId == aClassId ) + { + pRet = new SvxPluginShape( pObj ); + nType = OBJ_OLE2_PLUGIN; + } + else if( aAppletClassId == aClassId ) { - SvGlobalName aClassId( xObject->getClassID() ); - - const SvGlobalName aAppletClassId( SO3_APPLET_CLASSID ); - const SvGlobalName aPluginClassId( SO3_PLUGIN_CLASSID ); - const SvGlobalName aIFrameClassId( SO3_IFRAME_CLASSID ); - - if( aPluginClassId == aClassId ) - { - pRet = new SvxPluginShape( pObj ); - nType = OBJ_OLE2_PLUGIN; - } - else if( aAppletClassId == aClassId ) - { - pRet = new SvxAppletShape( pObj ); - nType = OBJ_OLE2_APPLET; - } - else if( aIFrameClassId == aClassId ) - { - pRet = new SvxFrameShape( pObj ); - nType = OBJ_FRAME; - } + pRet = new SvxAppletShape( pObj ); + nType = OBJ_OLE2_APPLET; + } + else if( aIFrameClassId == aClassId ) + { + pRet = new SvxFrameShape( pObj ); + nType = OBJ_FRAME; } } } @@ -812,7 +842,6 @@ SdrObject *SvxDrawPage::CreateSdrObject( const Reference< drawing::XShape > & xS SdrObject* pObj = CreateSdrObject_( xShape ); if( pObj) { - pObj->SetModel(mpModel); if ( !pObj->IsInserted() && !pObj->IsDoNotInsertIntoPageAutomatically() ) { if(bBeginning) @@ -847,21 +876,6 @@ SvxShape* CreateSvxShapeByTypeAndInventor(sal_uInt16 nType, SdrInventor nInvento return SvxDrawPage::CreateShapeByTypeAndInventor( nType, nInventor, nullptr, nullptr, referer ); } -void SvxDrawPage::ChangeModel( SdrModel* pNewModel ) -{ - if( pNewModel != mpModel ) - { - mpModel = pNewModel; - - if( mpView ) - { - delete mpView; - mpView = new SdrView( mpModel ); - mpView->SetDesignMode(); - } - } -} - /** returns a StarOffice API wrapper for the given SdrPage */ uno::Reference< drawing::XDrawPage > GetXDrawPageForSdrPage( SdrPage* pPage ) throw () { diff --git a/svx/source/unodraw/unoshap2.cxx b/svx/source/unodraw/unoshap2.cxx index 8c5fc28b8fd0..34106635f1cb 100644 --- a/svx/source/unodraw/unoshap2.cxx +++ b/svx/source/unodraw/unoshap2.cxx @@ -181,7 +181,7 @@ void SAL_CALL SvxShapeGroup::leaveGroup( ) void SvxShapeGroup::addUnoShape( const uno::Reference< drawing::XShape >& xShape, size_t nPos ) { - if (!mpObj.is() || !mxPage.is()) + if (!HasSdrObject() || !mxPage.is()) { OSL_FAIL("could not add XShape to group shape!"); return; @@ -201,8 +201,10 @@ void SvxShapeGroup::addUnoShape( const uno::Reference< drawing::XShape >& xShape if( pSdrShape->IsInserted() ) pSdrShape->GetObjList()->RemoveObject( pSdrShape->GetOrdNum() ); - mpObj->GetSubList()->InsertObject(pSdrShape, nPos); - pSdrShape->SetModel(mpObj->GetModel()); + GetSdrObject()->GetSubList()->InsertObject(pSdrShape, nPos); + // TTTT Was created using mpModel in CreateSdrObject_ above + // TTTT may be good to add a assertion here for the future + // pSdrShape->SetModel(GetSdrObject()->GetModel()); // #85922# It makes no sense to set the layer asked // from the group object since these is an iteration @@ -217,8 +219,7 @@ void SvxShapeGroup::addUnoShape( const uno::Reference< drawing::XShape >& xShape // would be created when this connection would not already exist. pShape->Create( pSdrShape, mxPage.get() ); - if( mpModel ) - mpModel->SetChanged(); + GetSdrObject()->getSdrModelFromSdrObject().SetChanged(); } // XShapes @@ -241,7 +242,7 @@ void SAL_CALL SvxShapeGroup::remove( const uno::Reference< drawing::XShape >& xS if( pShape ) pSdrShape = pShape->GetSdrObject(); - if( !mpObj.is() || pSdrShape == nullptr || pSdrShape->GetObjList()->GetOwnerObj() != mpObj.get() ) + if( !HasSdrObject() || pSdrShape == nullptr || pSdrShape->GetObjList()->GetOwnerObj() != GetSdrObject() ) throw uno::RuntimeException(); SdrObjList& rList = *pSdrShape->GetObjList(); @@ -278,8 +279,7 @@ void SAL_CALL SvxShapeGroup::remove( const uno::Reference< drawing::XShape >& xS SAL_WARN( "svx", "Fatality! SdrObject is not belonging to its SdrObjList! [CL]" ); } - if( mpModel ) - mpModel->SetChanged(); + GetSdrObject()->getSdrModelFromSdrObject().SetChanged(); } void SAL_CALL SvxShapeGroup::addTop( const uno::Reference< drawing::XShape >& xShape ) @@ -305,10 +305,10 @@ sal_Int32 SAL_CALL SvxShapeGroup::getCount() { ::SolarMutexGuard aGuard; - if(!mpObj.is() || !mpObj->GetSubList()) + if(!HasSdrObject() || !GetSdrObject()->GetSubList()) throw uno::RuntimeException(); - sal_Int32 nRetval = mpObj->GetSubList()->GetObjCount(); + sal_Int32 nRetval = GetSdrObject()->GetSubList()->GetObjCount(); return nRetval; } @@ -317,13 +317,13 @@ uno::Any SAL_CALL SvxShapeGroup::getByIndex( sal_Int32 Index ) { ::SolarMutexGuard aGuard; - if( !mpObj.is() || mpObj->GetSubList() == nullptr ) + if( !HasSdrObject() || GetSdrObject()->GetSubList() == nullptr ) throw uno::RuntimeException(); - if( Index<0 || mpObj->GetSubList()->GetObjCount() <= static_cast<size_t>(Index) ) + if( Index<0 || GetSdrObject()->GetSubList()->GetObjCount() <= static_cast<size_t>(Index) ) throw lang::IndexOutOfBoundsException(); - SdrObject* pDestObj = mpObj->GetSubList()->GetObj( Index ); + SdrObject* pDestObj = GetSdrObject()->GetSubList()->GetObj( Index ); if(pDestObj == nullptr) throw lang::IndexOutOfBoundsException(); @@ -345,7 +345,7 @@ sal_Bool SAL_CALL SvxShapeGroup::hasElements() { ::SolarMutexGuard aGuard; - return mpObj.is() && mpObj->GetSubList() && (mpObj->GetSubList()->GetObjCount() > 0); + return HasSdrObject() && GetSdrObject()->GetSubList() && (GetSdrObject()->GetSubList()->GetObjCount() > 0); } SvxShapeConnector::SvxShapeConnector(SdrObject* pObj) @@ -438,10 +438,9 @@ void SAL_CALL SvxShapeConnector::connectStart( const uno::Reference< drawing::XC SvxShape* pShape = SvxShape::getImplementation( xRef ); if( pShape ) - mpObj->ConnectToNode( true, pShape->mpObj.get() ); + GetSdrObject()->ConnectToNode( true, pShape->GetSdrObject() ); - if( mpModel ) - mpModel->SetChanged(); + GetSdrObject()->getSdrModelFromSdrObject().SetChanged(); } @@ -452,11 +451,10 @@ void SAL_CALL SvxShapeConnector::connectEnd( const uno::Reference< drawing::XCon Reference< drawing::XShape > xRef( xShape, UNO_QUERY ); SvxShape* pShape = SvxShape::getImplementation( xRef ); - if( mpObj.is() && pShape ) - mpObj->ConnectToNode( false, pShape->mpObj.get() ); + if( HasSdrObject() && pShape ) + GetSdrObject()->ConnectToNode( false, pShape->GetSdrObject() ); - if( mpModel ) - mpModel->SetChanged(); + GetSdrObject()->getSdrModelFromSdrObject().SetChanged(); } @@ -464,11 +462,10 @@ void SAL_CALL SvxShapeConnector::disconnectBegin( const uno::Reference< drawing: { ::SolarMutexGuard aGuard; - if(mpObj.is()) - mpObj->DisconnectFromNode( true ); + if(HasSdrObject()) + GetSdrObject()->DisconnectFromNode( true ); - if( mpModel ) - mpModel->SetChanged(); + GetSdrObject()->getSdrModelFromSdrObject().SetChanged(); } @@ -476,11 +473,10 @@ void SAL_CALL SvxShapeConnector::disconnectEnd( const uno::Reference< drawing::X { ::SolarMutexGuard aGuard; - if(mpObj.is()) - mpObj->DisconnectFromNode( false ); + if(HasSdrObject()) + GetSdrObject()->DisconnectFromNode( false ); - if( mpModel ) - mpModel->SetChanged(); + GetSdrObject()->getSdrModelFromSdrObject().SetChanged(); } SvxShapeControl::SvxShapeControl(SdrObject* pObj) @@ -572,7 +568,7 @@ Reference< awt::XControlModel > SAL_CALL SvxShapeControl::getControl() Reference< awt::XControlModel > xModel; - SdrUnoObj* pUnoObj = dynamic_cast< SdrUnoObj * >(mpObj.get()); + SdrUnoObj* pUnoObj = dynamic_cast< SdrUnoObj * >(GetSdrObject()); if( pUnoObj ) xModel = pUnoObj->GetUnoControlModel(); @@ -584,12 +580,11 @@ void SAL_CALL SvxShapeControl::setControl( const Reference< awt::XControlModel > { ::SolarMutexGuard aGuard; - SdrUnoObj* pUnoObj = dynamic_cast< SdrUnoObj * >(mpObj.get()); + SdrUnoObj* pUnoObj = dynamic_cast< SdrUnoObj * >(GetSdrObject()); if( pUnoObj ) pUnoObj->SetUnoControlModel( xControl ); - if( mpModel ) - mpModel->SetChanged(); + GetSdrObject()->getSdrModelFromSdrObject().SetChanged(); } static struct @@ -983,14 +978,14 @@ bool SvxShapePolyPolygon::setPropertyValueImpl( const OUString& rName, const Sfx { if( auto s = o3tl::tryAccess<drawing::PointSequenceSequence>(rValue) ) { - if( mpObj.is() ) + if( HasSdrObject() ) { basegfx::B2DPolyPolygon aNewPolyPolygon; basegfx::B2DHomMatrix aNewHomogenMatrix; - mpObj->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon); + GetSdrObject()->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon); aNewPolyPolygon = ImplSvxPointSequenceSequenceToB2DPolyPolygon(s); - mpObj->TRSetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon); + GetSdrObject()->TRSetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon); } return true; } @@ -1093,8 +1088,8 @@ bool SvxShapePolyPolygon::getPropertyValueImpl( const OUString& rName, const Sfx basegfx::B2DPolyPolygon aNewPolyPolygon; basegfx::B2DHomMatrix aNewHomogenMatrix; - if(mpObj.is()) - mpObj->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon); + if(HasSdrObject()) + GetSdrObject()->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon); drawing::PointSequenceSequence aRetval(aNewPolyPolygon.count()); B2DPolyPolygonToSvxPointSequenceSequence(aNewPolyPolygon, aRetval); @@ -1147,8 +1142,8 @@ void SvxShapePolyPolygon::SetPolygon(const basegfx::B2DPolyPolygon& rNew) { ::SolarMutexGuard aGuard; - if(mpObj.is()) - static_cast<SdrPathObj*>(mpObj.get())->SetPathPoly(rNew); + if(HasSdrObject()) + static_cast<SdrPathObj*>(GetSdrObject())->SetPathPoly(rNew); } @@ -1156,9 +1151,9 @@ basegfx::B2DPolyPolygon SvxShapePolyPolygon::GetPolygon() const throw() { ::SolarMutexGuard aGuard; - if(mpObj.is()) + if(HasSdrObject()) { - return static_cast<SdrPathObj*>(mpObj.get())->GetPathPoly(); + return static_cast<SdrPathObj*>(GetSdrObject())->GetPathPoly(); } else { @@ -1195,15 +1190,15 @@ bool SvxShapePolyPolygonBezier::setPropertyValueImpl( const OUString& rName, con { if( auto s = o3tl::tryAccess<drawing::PolyPolygonBezierCoords>(rValue) ) { - if( mpObj.is() ) + if( HasSdrObject() ) { basegfx::B2DPolyPolygon aNewPolyPolygon; basegfx::B2DHomMatrix aNewHomogenMatrix; - mpObj->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon); + GetSdrObject()->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon); aNewPolyPolygon = basegfx::unotools::polyPolygonBezierToB2DPolyPolygon( *s); - mpObj->TRSetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon); + GetSdrObject()->TRSetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon); } return true; } @@ -1236,7 +1231,7 @@ bool SvxShapePolyPolygonBezier::getPropertyValueImpl( const OUString& rName, con // pack a tools::PolyPolygon in a struct tools::PolyPolygon basegfx::B2DPolyPolygon aNewPolyPolygon; basegfx::B2DHomMatrix aNewHomogenMatrix; - mpObj.get()->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon); + GetSdrObject()->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon); drawing::PolyPolygonBezierCoords aRetval; basegfx::unotools::b2DPolyPolygonToPolyPolygonBezier(aNewPolyPolygon, aRetval); @@ -1259,8 +1254,8 @@ void SvxShapePolyPolygonBezier::SetPolygon(const basegfx::B2DPolyPolygon& rNew) { ::SolarMutexGuard aGuard; - if(mpObj.is()) - static_cast<SdrPathObj*>(mpObj.get())->SetPathPoly(rNew); + if(HasSdrObject()) + static_cast<SdrPathObj*>(GetSdrObject())->SetPathPoly(rNew); } @@ -1268,9 +1263,9 @@ basegfx::B2DPolyPolygon SvxShapePolyPolygonBezier::GetPolygon() const throw() { ::SolarMutexGuard aGuard; - if(mpObj.is()) + if(HasSdrObject()) { - return static_cast<SdrPathObj*>(mpObj.get())->GetPathPoly(); + return static_cast<SdrPathObj*>(GetSdrObject())->GetPathPoly(); } else { @@ -1303,7 +1298,7 @@ bool SvxGraphicObject::setPropertyValueImpl( const OUString& rName, const SfxIte if( GraphicConverter::Import( aMemStm, aGraphic ) == ERRCODE_NONE ) { - static_cast<SdrGrafObj*>(mpObj.get())->SetGraphic(aGraphic); + static_cast<SdrGrafObj*>(GetSdrObject())->SetGraphic(aGraphic); bOk = true; } } @@ -1312,7 +1307,7 @@ bool SvxGraphicObject::setPropertyValueImpl( const OUString& rName, const SfxIte auto xGraphic = rValue.get<uno::Reference<graphic::XGraphic>>(); if (xGraphic.is()) { - static_cast<SdrGrafObj*>(mpObj.get())->SetGraphic(Graphic(xGraphic)); + static_cast<SdrGrafObj*>(GetSdrObject())->SetGraphic(Graphic(xGraphic)); bOk = true; } } @@ -1323,7 +1318,7 @@ bool SvxGraphicObject::setPropertyValueImpl( const OUString& rName, const SfxIte { uno::Reference<graphic::XGraphic> xGraphic(xBitmap, uno::UNO_QUERY); Graphic aGraphic(xGraphic); - static_cast<SdrGrafObj*>(mpObj.get())->SetGraphic(aGraphic); + static_cast<SdrGrafObj*>(GetSdrObject())->SetGraphic(aGraphic); bOk = true; } } @@ -1339,9 +1334,9 @@ bool SvxGraphicObject::setPropertyValueImpl( const OUString& rName, const SfxIte if( !aStreamURL.startsWith( UNO_NAME_GRAPHOBJ_URLPKGPREFIX ) ) aStreamURL.clear(); - if( mpObj.is() ) + if( HasSdrObject() ) { - static_cast<SdrGrafObj*>(mpObj.get())->SetGrafStreamURL( aStreamURL ); + static_cast<SdrGrafObj*>(GetSdrObject())->SetGrafStreamURL( aStreamURL ); } bOk = true; } @@ -1353,7 +1348,7 @@ bool SvxGraphicObject::setPropertyValueImpl( const OUString& rName, const SfxIte Reference< graphic::XGraphic > xGraphic( rValue, uno::UNO_QUERY ); if( xGraphic.is() ) { - static_cast< SdrGrafObj*>( mpObj.get() )->SetGraphic( xGraphic ); + static_cast< SdrGrafObj*>( GetSdrObject() )->SetGraphic( xGraphic ); bOk = true; } break; @@ -1364,7 +1359,7 @@ bool SvxGraphicObject::setPropertyValueImpl( const OUString& rName, const SfxIte bool bIsSignatureLine; if (rValue >>= bIsSignatureLine) { - static_cast<SdrGrafObj*>(mpObj.get())->setIsSignatureLine(bIsSignatureLine); + static_cast<SdrGrafObj*>(GetSdrObject())->setIsSignatureLine(bIsSignatureLine); bOk = true; } break; @@ -1375,7 +1370,7 @@ bool SvxGraphicObject::setPropertyValueImpl( const OUString& rName, const SfxIte OUString aSignatureLineId; if (rValue >>= aSignatureLineId) { - static_cast<SdrGrafObj*>(mpObj.get())->setSignatureLineId(aSignatureLineId); + static_cast<SdrGrafObj*>(GetSdrObject())->setSignatureLineId(aSignatureLineId); bOk = true; } break; @@ -1386,7 +1381,7 @@ bool SvxGraphicObject::setPropertyValueImpl( const OUString& rName, const SfxIte OUString aSuggestedSignerName; if (rValue >>= aSuggestedSignerName) { - static_cast<SdrGrafObj*>(mpObj.get())->setSignatureLineSuggestedSignerName(aSuggestedSignerName); + static_cast<SdrGrafObj*>(GetSdrObject())->setSignatureLineSuggestedSignerName(aSuggestedSignerName); bOk = true; } break; @@ -1397,7 +1392,7 @@ bool SvxGraphicObject::setPropertyValueImpl( const OUString& rName, const SfxIte OUString aSuggestedSignerTitle; if (rValue >>= aSuggestedSignerTitle) { - static_cast<SdrGrafObj*>(mpObj.get())->setSignatureLineSuggestedSignerTitle(aSuggestedSignerTitle); + static_cast<SdrGrafObj*>(GetSdrObject())->setSignatureLineSuggestedSignerTitle(aSuggestedSignerTitle); bOk = true; } break; @@ -1408,7 +1403,7 @@ bool SvxGraphicObject::setPropertyValueImpl( const OUString& rName, const SfxIte OUString aSuggestedSignerEmail; if (rValue >>= aSuggestedSignerEmail) { - static_cast<SdrGrafObj*>(mpObj.get())->setSignatureLineSuggestedSignerEmail(aSuggestedSignerEmail); + static_cast<SdrGrafObj*>(GetSdrObject())->setSignatureLineSuggestedSignerEmail(aSuggestedSignerEmail); bOk = true; } break; @@ -1419,7 +1414,7 @@ bool SvxGraphicObject::setPropertyValueImpl( const OUString& rName, const SfxIte OUString aSigningInstructions; if (rValue >>= aSigningInstructions) { - static_cast<SdrGrafObj*>(mpObj.get())->setSignatureLineSigningInstructions(aSigningInstructions); + static_cast<SdrGrafObj*>(GetSdrObject())->setSignatureLineSigningInstructions(aSigningInstructions); bOk = true; } break; @@ -1430,7 +1425,7 @@ bool SvxGraphicObject::setPropertyValueImpl( const OUString& rName, const SfxIte bool bShowSignDate; if (rValue >>= bShowSignDate) { - static_cast<SdrGrafObj*>(mpObj.get())->setSignatureLineShowSignDate(bShowSignDate); + static_cast<SdrGrafObj*>(GetSdrObject())->setSignatureLineShowSignDate(bShowSignDate); bOk = true; } break; @@ -1441,7 +1436,7 @@ bool SvxGraphicObject::setPropertyValueImpl( const OUString& rName, const SfxIte bool bCanAddComment; if (rValue >>= bCanAddComment) { - static_cast<SdrGrafObj*>(mpObj.get())->setSignatureLineCanAddComment(bCanAddComment); + static_cast<SdrGrafObj*>(GetSdrObject())->setSignatureLineCanAddComment(bCanAddComment); bOk = true; } break; @@ -1452,7 +1447,7 @@ bool SvxGraphicObject::setPropertyValueImpl( const OUString& rName, const SfxIte Reference<graphic::XGraphic> xGraphic(rValue, uno::UNO_QUERY); if (xGraphic.is()) { - static_cast<SdrGrafObj*>(mpObj.get())->setSignatureLineUnsignedGraphic(xGraphic); + static_cast<SdrGrafObj*>(GetSdrObject())->setSignatureLineUnsignedGraphic(xGraphic); bOk = true; } break; @@ -1465,8 +1460,7 @@ bool SvxGraphicObject::setPropertyValueImpl( const OUString& rName, const SfxIte if( !bOk ) throw lang::IllegalArgumentException(); - if( mpModel ) - mpModel->SetChanged(); + GetSdrObject()->getSdrModelFromSdrObject().SetChanged(); return true; } @@ -1477,7 +1471,7 @@ bool SvxGraphicObject::getPropertyValueImpl( const OUString& rName, const SfxIte { case OWN_ATTR_VALUE_FILLBITMAP: { - const Graphic& rGraphic = static_cast<SdrGrafObj*>(mpObj.get())->GetGraphic(); + const Graphic& rGraphic = static_cast<SdrGrafObj*>(GetSdrObject())->GetGraphic(); if (rGraphic.GetType() != GraphicType::GdiMetafile) { @@ -1499,7 +1493,7 @@ bool SvxGraphicObject::getPropertyValueImpl( const OUString& rName, const SfxIte case OWN_ATTR_REPLACEMENT_GRAPHIC: { - const GraphicObject* pGrafObj = static_cast< SdrGrafObj* >(mpObj.get())->GetReplacementGraphicObject(); + const GraphicObject* pGrafObj = static_cast< SdrGrafObj* >(GetSdrObject())->GetReplacementGraphicObject(); if (pGrafObj) { @@ -1511,7 +1505,7 @@ bool SvxGraphicObject::getPropertyValueImpl( const OUString& rName, const SfxIte case OWN_ATTR_GRAFSTREAMURL: { - const OUString aStreamURL( static_cast<SdrGrafObj*>( mpObj.get() )->GetGrafStreamURL() ); + const OUString aStreamURL( static_cast<SdrGrafObj*>( GetSdrObject() )->GetGrafStreamURL() ); if( !aStreamURL.isEmpty() ) rValue <<= aStreamURL; break; @@ -1520,7 +1514,7 @@ bool SvxGraphicObject::getPropertyValueImpl( const OUString& rName, const SfxIte case OWN_ATTR_VALUE_GRAPHIC: { Reference<graphic::XGraphic> xGraphic; - auto pSdrGraphicObject = static_cast<SdrGrafObj*>(mpObj.get()); + auto pSdrGraphicObject = static_cast<SdrGrafObj*>(GetSdrObject()); if (pSdrGraphicObject->GetGraphicObject().GetType() != GraphicType::NONE) xGraphic = pSdrGraphicObject->GetGraphic().GetXGraphic(); rValue <<= xGraphic; @@ -1529,62 +1523,62 @@ bool SvxGraphicObject::getPropertyValueImpl( const OUString& rName, const SfxIte case OWN_ATTR_GRAPHIC_STREAM: { - rValue <<= static_cast< SdrGrafObj* >( mpObj.get() )->getInputStream(); + rValue <<= static_cast< SdrGrafObj* >( GetSdrObject() )->getInputStream(); break; } case OWN_ATTR_IS_SIGNATURELINE: { - rValue <<= static_cast<SdrGrafObj*>(mpObj.get())->isSignatureLine(); + rValue <<= static_cast<SdrGrafObj*>(GetSdrObject())->isSignatureLine(); break; } case OWN_ATTR_SIGNATURELINE_ID: { - rValue <<= static_cast<SdrGrafObj*>(mpObj.get())->getSignatureLineId(); + rValue <<= static_cast<SdrGrafObj*>(GetSdrObject())->getSignatureLineId(); break; } case OWN_ATTR_SIGNATURELINE_SUGGESTED_SIGNER_NAME: { - rValue <<= static_cast<SdrGrafObj*>(mpObj.get())->getSignatureLineSuggestedSignerName(); + rValue <<= static_cast<SdrGrafObj*>(GetSdrObject())->getSignatureLineSuggestedSignerName(); break; } case OWN_ATTR_SIGNATURELINE_SUGGESTED_SIGNER_TITLE: { - rValue <<= static_cast<SdrGrafObj*>(mpObj.get())->getSignatureLineSuggestedSignerTitle(); + rValue <<= static_cast<SdrGrafObj*>(GetSdrObject())->getSignatureLineSuggestedSignerTitle(); break; } case OWN_ATTR_SIGNATURELINE_SUGGESTED_SIGNER_EMAIL: { - rValue <<= static_cast<SdrGrafObj*>(mpObj.get())->getSignatureLineSuggestedSignerEmail(); + rValue <<= static_cast<SdrGrafObj*>(GetSdrObject())->getSignatureLineSuggestedSignerEmail(); break; } case OWN_ATTR_SIGNATURELINE_SIGNING_INSTRUCTIONS: { - rValue <<= static_cast<SdrGrafObj*>(mpObj.get())->getSignatureLineSigningInstructions(); + rValue <<= static_cast<SdrGrafObj*>(GetSdrObject())->getSignatureLineSigningInstructions(); break; } case OWN_ATTR_SIGNATURELINE_SHOW_SIGN_DATE: { - rValue <<= static_cast<SdrGrafObj*>(mpObj.get())->isSignatureLineShowSignDate(); + rValue <<= static_cast<SdrGrafObj*>(GetSdrObject())->isSignatureLineShowSignDate(); break; } case OWN_ATTR_SIGNATURELINE_CAN_ADD_COMMENT: { - rValue <<= static_cast<SdrGrafObj*>(mpObj.get())->isSignatureLineCanAddComment(); + rValue <<= static_cast<SdrGrafObj*>(GetSdrObject())->isSignatureLineCanAddComment(); break; } case OWN_ATTR_SIGNATURELINE_UNSIGNED_IMAGE: { Reference<graphic::XGraphic> xGraphic( - static_cast<SdrGrafObj*>(mpObj.get())->getSignatureLineUnsignedGraphic()); + static_cast<SdrGrafObj*>(GetSdrObject())->getSignatureLineUnsignedGraphic()); rValue <<= xGraphic; break; } @@ -1655,21 +1649,21 @@ uno::Sequence< sal_Int8 > SAL_CALL SvxCustomShape::getImplementationId() awt::Point SAL_CALL SvxCustomShape::getPosition() { ::SolarMutexGuard aGuard; - if ( mpModel && mpObj.is() ) + if ( HasSdrObject() ) { SdrAShapeObjGeoData aCustomShapeGeoData; - static_cast<SdrObjCustomShape*>(mpObj.get())->SaveGeoData( aCustomShapeGeoData ); + static_cast<SdrObjCustomShape*>(GetSdrObject())->SaveGeoData( aCustomShapeGeoData ); bool bMirroredX = false; bool bMirroredY = false; - if ( mpObj.is() ) + if ( HasSdrObject() ) { - bMirroredX = static_cast<SdrObjCustomShape*>(mpObj.get())->IsMirroredX(); - bMirroredY = static_cast<SdrObjCustomShape*>(mpObj.get())->IsMirroredY(); + bMirroredX = static_cast<SdrObjCustomShape*>(GetSdrObject())->IsMirroredX(); + bMirroredY = static_cast<SdrObjCustomShape*>(GetSdrObject())->IsMirroredY(); } // get aRect, this is the unrotated snaprect - tools::Rectangle aRect(static_cast<SdrObjCustomShape*>(mpObj.get())->GetLogicRect()); + tools::Rectangle aRect(static_cast<SdrObjCustomShape*>(GetSdrObject())->GetLogicRect()); tools::Rectangle aRectangle( aRect ); if ( bMirroredX || bMirroredY ) @@ -1723,8 +1717,8 @@ awt::Point SAL_CALL SvxCustomShape::getPosition() } Point aPt( aRectangle.TopLeft() ); - if( mpModel->IsWriter() ) - aPt -= mpObj->GetAnchorPos(); + if( GetSdrObject()->getSdrModelFromSdrObject().IsWriter() ) + aPt -= GetSdrObject()->GetAnchorPos(); ForceMetricTo100th_mm(aPt); return css::awt::Point( aPt.X(), aPt.Y() ); @@ -1738,7 +1732,7 @@ void SAL_CALL SvxCustomShape::setPropertyValue( const OUString& aPropertyName, c { ::SolarMutexGuard aGuard; - SdrObject* pObject = mpObj.get(); + SdrObject* pObject = GetSdrObject(); // tdf#98163 Use a custom slot to have filter code flush the UNO // API implementations of SdrObjCustomShape. Used e.g. by @@ -1824,7 +1818,7 @@ bool SvxCustomShape::getPropertyValueImpl( const OUString& rName, const SfxItemP { case SDRATTR_ROTATEANGLE: { - double fAngle = static_cast<SdrObjCustomShape*>(mpObj.get())->GetObjectRotation(); + double fAngle = static_cast<SdrObjCustomShape*>(GetSdrObject())->GetObjectRotation(); fAngle *= 100; rValue <<= static_cast<sal_Int32>(fAngle); return true; @@ -1836,13 +1830,13 @@ bool SvxCustomShape::getPropertyValueImpl( const OUString& rName, const SfxItemP void SvxCustomShape::createCustomShapeDefaults( const OUString& rValueType ) { - if (!mpObj.is()) + if (!HasSdrObject()) { OSL_FAIL("could not create Custom Shape Defaults!"); return; } - static_cast<SdrObjCustomShape*>(mpObj.get())->MergeDefaultAttributes( &rValueType ); + static_cast<SdrObjCustomShape*>(GetSdrObject())->MergeDefaultAttributes( &rValueType ); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svx/source/unodraw/unoshap3.cxx b/svx/source/unodraw/unoshap3.cxx index 66ac52b876db..663dcc9f6bd9 100644 --- a/svx/source/unodraw/unoshap3.cxx +++ b/svx/source/unodraw/unoshap3.cxx @@ -45,6 +45,7 @@ #include <basegfx/polygon/b3dpolygontools.hxx> #include <com/sun/star/drawing/PolyPolygonShape3D.hpp> #include <basegfx/polygon/b2dpolypolygontools.hxx> +#include <basegfx/matrix/b3dhommatrixtools.hxx> #include "shapeimpl.hxx" using namespace ::cppu; @@ -118,13 +119,13 @@ void SAL_CALL Svx3DSceneObject::add( const Reference< drawing::XShape >& xShape SvxShape* pShape = SvxShape::getImplementation( xShape ); - if(!mpObj.is() || !mxPage.is() || pShape == nullptr || nullptr != pShape->GetSdrObject() ) + if(!HasSdrObject() || !mxPage.is() || pShape == nullptr || nullptr != pShape->GetSdrObject() ) throw uno::RuntimeException(); SdrObject* pSdrShape = mxPage->CreateSdrObject_( xShape ); if( dynamic_cast<const E3dObject* >(pSdrShape) != nullptr ) { - mpObj->GetSubList()->NbcInsertObject( pSdrShape ); + GetSdrObject()->GetSubList()->NbcInsertObject( pSdrShape ); if(pShape) pShape->Create( pSdrShape, mxPage.get() ); @@ -135,8 +136,7 @@ void SAL_CALL Svx3DSceneObject::add( const Reference< drawing::XShape >& xShape throw uno::RuntimeException(); } - if( mpModel ) - mpModel->SetChanged(); + GetSdrObject()->getSdrModelFromSdrObject().SetChanged(); } @@ -146,11 +146,11 @@ void SAL_CALL Svx3DSceneObject::remove( const Reference< drawing::XShape >& xSha SvxShape* pShape = SvxShape::getImplementation( xShape ); - if(!mpObj.is() || pShape == nullptr) + if(!HasSdrObject() || pShape == nullptr) throw uno::RuntimeException(); SdrObject* pSdrShape = pShape->GetSdrObject(); - if(pSdrShape == nullptr || pSdrShape->GetObjList()->GetOwnerObj() != mpObj.get()) + if(pSdrShape == nullptr || pSdrShape->GetObjList()->GetOwnerObj() != GetSdrObject()) { throw uno::RuntimeException(); } @@ -184,8 +184,8 @@ sal_Int32 SAL_CALL Svx3DSceneObject::getCount() sal_Int32 nRetval = 0; - if(mpObj.is() && dynamic_cast<const E3dScene* >(mpObj.get()) != nullptr && mpObj->GetSubList()) - nRetval = mpObj->GetSubList()->GetObjCount(); + if(HasSdrObject() && dynamic_cast<const E3dScene* >(GetSdrObject()) != nullptr && GetSdrObject()->GetSubList()) + nRetval = GetSdrObject()->GetSubList()->GetObjCount(); return nRetval; } @@ -194,13 +194,13 @@ uno::Any SAL_CALL Svx3DSceneObject::getByIndex( sal_Int32 Index ) { SolarMutexGuard aGuard; - if( !mpObj.is() || mpObj->GetSubList() == nullptr ) + if( !HasSdrObject() || GetSdrObject()->GetSubList() == nullptr ) throw uno::RuntimeException(); - if( Index<0 || mpObj->GetSubList()->GetObjCount() <= static_cast<size_t>(Index) ) + if( Index<0 || GetSdrObject()->GetSubList()->GetObjCount() <= static_cast<size_t>(Index) ) throw lang::IndexOutOfBoundsException(); - SdrObject* pDestObj = mpObj->GetSubList()->GetObj( Index ); + SdrObject* pDestObj = GetSdrObject()->GetSubList()->GetObj( Index ); if(pDestObj == nullptr) throw lang::IndexOutOfBoundsException(); @@ -221,33 +221,16 @@ sal_Bool SAL_CALL Svx3DSceneObject::hasElements() { SolarMutexGuard aGuard; - return mpObj.is() && mpObj->GetSubList() && (mpObj->GetSubList()->GetObjCount() > 0); + return HasSdrObject() && GetSdrObject()->GetSubList() && (GetSdrObject()->GetSubList()->GetObjCount() > 0); } static bool ConvertHomogenMatrixToObject( E3dObject* pObject, const Any& rValue ) { - drawing::HomogenMatrix m; - if( rValue >>= m ) + drawing::HomogenMatrix aMat; + if( rValue >>= aMat ) { - basegfx::B3DHomMatrix aMat; - aMat.set(0, 0, m.Line1.Column1); - aMat.set(0, 1, m.Line1.Column2); - aMat.set(0, 2, m.Line1.Column3); - aMat.set(0, 3, m.Line1.Column4); - aMat.set(1, 0, m.Line2.Column1); - aMat.set(1, 1, m.Line2.Column2); - aMat.set(1, 2, m.Line2.Column3); - aMat.set(1, 3, m.Line2.Column4); - aMat.set(2, 0, m.Line3.Column1); - aMat.set(2, 1, m.Line3.Column2); - aMat.set(2, 2, m.Line3.Column3); - aMat.set(2, 3, m.Line3.Column4); - aMat.set(3, 0, m.Line4.Column1); - aMat.set(3, 1, m.Line4.Column2); - aMat.set(3, 2, m.Line4.Column3); - aMat.set(3, 3, m.Line4.Column4); - pObject->SetTransform(aMat); + pObject->SetTransform(basegfx::utils::UnoHomogenMatrixToB3DHomMatrix(aMat)); return true; } return false; @@ -257,22 +240,7 @@ static void ConvertObjectToHomogenMatric( E3dObject const * pObject, Any& rValue { drawing::HomogenMatrix aHomMat; const basegfx::B3DHomMatrix& rMat = pObject->GetTransform(); - aHomMat.Line1.Column1 = rMat.get(0, 0); - aHomMat.Line1.Column2 = rMat.get(0, 1); - aHomMat.Line1.Column3 = rMat.get(0, 2); - aHomMat.Line1.Column4 = rMat.get(0, 3); - aHomMat.Line2.Column1 = rMat.get(1, 0); - aHomMat.Line2.Column2 = rMat.get(1, 1); - aHomMat.Line2.Column3 = rMat.get(1, 2); - aHomMat.Line2.Column4 = rMat.get(1, 3); - aHomMat.Line3.Column1 = rMat.get(2, 0); - aHomMat.Line3.Column2 = rMat.get(2, 1); - aHomMat.Line3.Column3 = rMat.get(2, 2); - aHomMat.Line3.Column4 = rMat.get(2, 3); - aHomMat.Line4.Column1 = rMat.get(3, 0); - aHomMat.Line4.Column2 = rMat.get(3, 1); - aHomMat.Line4.Column3 = rMat.get(3, 2); - aHomMat.Line4.Column4 = rMat.get(3, 3); + basegfx::utils::B3DHomMatrixToUnoHomogenMatrix(rMat, aHomMat); rValue <<= aHomMat; } @@ -290,14 +258,14 @@ bool Svx3DSceneObject::setPropertyValueImpl( const OUString& rName, const SfxIte case OWN_ATTR_3D_VALUE_TRANSFORM_MATRIX: { // patch transformation matrix to the object - if( ConvertHomogenMatrixToObject( static_cast< E3dObject* >( mpObj.get() ), rValue ) ) + if( ConvertHomogenMatrixToObject( static_cast< E3dObject* >( GetSdrObject() ), rValue ) ) return true; break; } case OWN_ATTR_3D_VALUE_CAMERA_GEOMETRY: { // set CameraGeometry at scene - E3dScene* pScene = static_cast< E3dScene* >( mpObj.get() ); + E3dScene* pScene = static_cast< E3dScene* >( GetSdrObject() ); drawing::CameraGeometry aCamGeo; if(rValue >>= aCamGeo) @@ -402,13 +370,13 @@ bool Svx3DSceneObject::getPropertyValueImpl(const OUString& rName, const SfxItem case OWN_ATTR_3D_VALUE_TRANSFORM_MATRIX: { // patch object to a homogeneous 4x4 matrix - ConvertObjectToHomogenMatric( static_cast< E3dObject* >( mpObj.get() ), rValue ); + ConvertObjectToHomogenMatric( static_cast< E3dObject* >( GetSdrObject() ), rValue ); break; } case OWN_ATTR_3D_VALUE_CAMERA_GEOMETRY: { // get CameraGeometry from scene - E3dScene* pScene = static_cast< E3dScene* >( mpObj.get() ); + E3dScene* pScene = static_cast< E3dScene* >( GetSdrObject() ); drawing::CameraGeometry aCamGeo; // fill Vectors from scene camera @@ -464,7 +432,7 @@ bool Svx3DCubeObject::setPropertyValueImpl( const OUString& rName, const SfxItem case OWN_ATTR_3D_VALUE_TRANSFORM_MATRIX: { // pack transformationmatrix to the object - if( ConvertHomogenMatrixToObject( static_cast< E3dObject* >( mpObj.get() ), rValue ) ) + if( ConvertHomogenMatrixToObject( static_cast< E3dObject* >( GetSdrObject() ), rValue ) ) return true; break; } @@ -475,7 +443,7 @@ bool Svx3DCubeObject::setPropertyValueImpl( const OUString& rName, const SfxItem if( rValue >>= aUnoPos ) { basegfx::B3DPoint aPos(aUnoPos.PositionX, aUnoPos.PositionY, aUnoPos.PositionZ); - static_cast< E3dCubeObj* >( mpObj.get() )->SetCubePos(aPos); + static_cast< E3dCubeObj* >( GetSdrObject() )->SetCubePos(aPos); return true; } break; @@ -487,7 +455,7 @@ bool Svx3DCubeObject::setPropertyValueImpl( const OUString& rName, const SfxItem if( rValue >>= aDirection ) { basegfx::B3DVector aSize(aDirection.DirectionX, aDirection.DirectionY, aDirection.DirectionZ); - static_cast< E3dCubeObj* >( mpObj.get() )->SetCubeSize(aSize); + static_cast< E3dCubeObj* >( GetSdrObject() )->SetCubeSize(aSize); return true; } break; @@ -498,7 +466,7 @@ bool Svx3DCubeObject::setPropertyValueImpl( const OUString& rName, const SfxItem // pack sal_Bool bPosIsCenter to the object if( rValue >>= bNew ) { - static_cast< E3dCubeObj* >( mpObj.get() )->SetPosIsCenter(bNew); + static_cast< E3dCubeObj* >( GetSdrObject() )->SetPosIsCenter(bNew); return true; } break; @@ -517,13 +485,13 @@ bool Svx3DCubeObject::getPropertyValueImpl( const OUString& rName, const SfxItem case OWN_ATTR_3D_VALUE_TRANSFORM_MATRIX: { // pack transformation to a homogeneous matrix - ConvertObjectToHomogenMatric( static_cast< E3dObject* >( mpObj.get() ), rValue ); + ConvertObjectToHomogenMatric( static_cast< E3dObject* >( GetSdrObject() ), rValue ); break; } case OWN_ATTR_3D_VALUE_POSITION: { // pack position - const basegfx::B3DPoint& rPos = static_cast<E3dCubeObj*>(mpObj.get())->GetCubePos(); + const basegfx::B3DPoint& rPos = static_cast<E3dCubeObj*>(GetSdrObject())->GetCubePos(); drawing::Position3D aPos; aPos.PositionX = rPos.getX(); @@ -536,7 +504,7 @@ bool Svx3DCubeObject::getPropertyValueImpl( const OUString& rName, const SfxItem case OWN_ATTR_3D_VALUE_SIZE: { // pack size - const basegfx::B3DVector& rSize = static_cast<E3dCubeObj*>(mpObj.get())->GetCubeSize(); + const basegfx::B3DVector& rSize = static_cast<E3dCubeObj*>(GetSdrObject())->GetCubeSize(); drawing::Direction3D aDir; aDir.DirectionX = rSize.getX(); @@ -548,7 +516,7 @@ bool Svx3DCubeObject::getPropertyValueImpl( const OUString& rName, const SfxItem } case OWN_ATTR_3D_VALUE_POS_IS_CENTER: { - rValue <<= static_cast<E3dCubeObj*>(mpObj.get())->GetPosIsCenter(); + rValue <<= static_cast<E3dCubeObj*>(GetSdrObject())->GetPosIsCenter(); break; } default: @@ -583,7 +551,7 @@ bool Svx3DSphereObject::setPropertyValueImpl( const OUString& rName, const SfxIt case OWN_ATTR_3D_VALUE_TRANSFORM_MATRIX: { // pack transformation matrix to the object - if( ConvertHomogenMatrixToObject( static_cast< E3dObject* >( mpObj.get() ), rValue ) ) + if( ConvertHomogenMatrixToObject( static_cast< E3dObject* >( GetSdrObject() ), rValue ) ) return true; break; } @@ -595,7 +563,7 @@ bool Svx3DSphereObject::setPropertyValueImpl( const OUString& rName, const SfxIt if( rValue >>= aUnoPos ) { basegfx::B3DPoint aPos(aUnoPos.PositionX, aUnoPos.PositionY, aUnoPos.PositionZ); - static_cast<E3dSphereObj*>(mpObj.get())->SetCenter(aPos); + static_cast<E3dSphereObj*>(GetSdrObject())->SetCenter(aPos); return true; } break; @@ -608,7 +576,7 @@ bool Svx3DSphereObject::setPropertyValueImpl( const OUString& rName, const SfxIt if( rValue >>= aDir ) { basegfx::B3DVector aPos(aDir.DirectionX, aDir.DirectionY, aDir.DirectionZ); - static_cast<E3dSphereObj*>(mpObj.get())->SetSize(aPos); + static_cast<E3dSphereObj*>(GetSdrObject())->SetSize(aPos); return true; } break; @@ -627,13 +595,13 @@ bool Svx3DSphereObject::getPropertyValueImpl( const OUString& rName, const SfxIt case OWN_ATTR_3D_VALUE_TRANSFORM_MATRIX: { // pack transformation to a homogeneous matrix - ConvertObjectToHomogenMatric( static_cast< E3dObject* >( mpObj.get() ), rValue ); + ConvertObjectToHomogenMatric( static_cast< E3dObject* >( GetSdrObject() ), rValue ); break; } case OWN_ATTR_3D_VALUE_POSITION: { // pack position - const basegfx::B3DPoint& rPos = static_cast<E3dSphereObj*>(mpObj.get())->Center(); + const basegfx::B3DPoint& rPos = static_cast<E3dSphereObj*>(GetSdrObject())->Center(); drawing::Position3D aPos; aPos.PositionX = rPos.getX(); @@ -646,7 +614,7 @@ bool Svx3DSphereObject::getPropertyValueImpl( const OUString& rName, const SfxIt case OWN_ATTR_3D_VALUE_SIZE: { // pack size - const basegfx::B3DVector& rSize = static_cast<E3dSphereObj*>(mpObj.get())->Size(); + const basegfx::B3DVector& rSize = static_cast<E3dSphereObj*>(GetSdrObject())->Size(); drawing::Direction3D aDir; aDir.DirectionX = rSize.getX(); @@ -776,7 +744,7 @@ bool Svx3DLatheObject::setPropertyValueImpl( const OUString& rName, const SfxIte case OWN_ATTR_3D_VALUE_TRANSFORM_MATRIX: { // pack transformation matrix to the object - if( ConvertHomogenMatrixToObject( static_cast< E3dObject* >( mpObj.get() ), rValue ) ) + if( ConvertHomogenMatrixToObject( static_cast< E3dObject* >( GetSdrObject() ), rValue ) ) return true; break; } @@ -791,18 +759,18 @@ bool Svx3DLatheObject::setPropertyValueImpl( const OUString& rName, const SfxIte // #105127# SetPolyPoly3D sets the Svx3DVerticalSegmentsItem to the number // of points of the polygon. Thus, value gets lost. To avoid this, rescue // item here and re-set after setting the polygon. - const sal_uInt32 nPrevVerticalSegs(static_cast<E3dLatheObj*>(mpObj.get())->GetVerticalSegments()); + const sal_uInt32 nPrevVerticalSegs(static_cast<E3dLatheObj*>(GetSdrObject())->GetVerticalSegments()); // set polygon const basegfx::B3DHomMatrix aIdentity; const basegfx::B2DPolyPolygon aB2DPolyPolygon(basegfx::utils::createB2DPolyPolygonFromB3DPolyPolygon(aNewB3DPolyPolygon, aIdentity)); - static_cast<E3dLatheObj*>(mpObj.get())->SetPolyPoly2D(aB2DPolyPolygon); - const sal_uInt32 nPostVerticalSegs(static_cast<E3dLatheObj*>(mpObj.get())->GetVerticalSegments()); + static_cast<E3dLatheObj*>(GetSdrObject())->SetPolyPoly2D(aB2DPolyPolygon); + const sal_uInt32 nPostVerticalSegs(static_cast<E3dLatheObj*>(GetSdrObject())->GetVerticalSegments()); if(nPrevVerticalSegs != nPostVerticalSegs) { // restore the vertical segment count - static_cast<E3dLatheObj*>(mpObj.get())->SetMergedItem(makeSvx3DVerticalSegmentsItem(nPrevVerticalSegs)); + static_cast<E3dLatheObj*>(GetSdrObject())->SetMergedItem(makeSvx3DVerticalSegmentsItem(nPrevVerticalSegs)); } return true; } @@ -823,32 +791,14 @@ bool Svx3DLatheObject::getPropertyValueImpl( const OUString& rName, const SfxIte { // pack transformation to a homogeneous matrix drawing::HomogenMatrix aHomMat; - basegfx::B3DHomMatrix aMat = static_cast<E3dObject*>(mpObj.get())->GetTransform(); - - // pack evtl. transformed matrix to output - aHomMat.Line1.Column1 = aMat.get(0, 0); - aHomMat.Line1.Column2 = aMat.get(0, 1); - aHomMat.Line1.Column3 = aMat.get(0, 2); - aHomMat.Line1.Column4 = aMat.get(0, 3); - aHomMat.Line2.Column1 = aMat.get(1, 0); - aHomMat.Line2.Column2 = aMat.get(1, 1); - aHomMat.Line2.Column3 = aMat.get(1, 2); - aHomMat.Line2.Column4 = aMat.get(1, 3); - aHomMat.Line3.Column1 = aMat.get(2, 0); - aHomMat.Line3.Column2 = aMat.get(2, 1); - aHomMat.Line3.Column3 = aMat.get(2, 2); - aHomMat.Line3.Column4 = aMat.get(2, 3); - aHomMat.Line4.Column1 = aMat.get(3, 0); - aHomMat.Line4.Column2 = aMat.get(3, 1); - aHomMat.Line4.Column3 = aMat.get(3, 2); - aHomMat.Line4.Column4 = aMat.get(3, 3); - + basegfx::B3DHomMatrix aMat = static_cast<E3dObject*>(GetSdrObject())->GetTransform(); + basegfx::utils::B3DHomMatrixToUnoHomogenMatrix(aMat, aHomMat); rValue <<= aHomMat; break; } case OWN_ATTR_3D_VALUE_POLYPOLYGON3D: { - const basegfx::B2DPolyPolygon& rPolyPoly = static_cast<E3dLatheObj*>(mpObj.get())->GetPolyPoly2D(); + const basegfx::B2DPolyPolygon& rPolyPoly = static_cast<E3dLatheObj*>(GetSdrObject())->GetPolyPoly2D(); const basegfx::B3DPolyPolygon aB3DPolyPolygon(basegfx::utils::createB3DPolyPolygonFromB2DPolyPolygon(rPolyPoly)); B3dPolyPolygon_to_PolyPolygonShape3D(aB3DPolyPolygon, rValue); @@ -886,7 +836,7 @@ bool Svx3DExtrudeObject::setPropertyValueImpl( const OUString& rName, const SfxI case OWN_ATTR_3D_VALUE_TRANSFORM_MATRIX: { // pack transformation matrix to the object - if( ConvertHomogenMatrixToObject( static_cast< E3dObject* >( mpObj.get() ), rValue ) ) + if( ConvertHomogenMatrixToObject( static_cast< E3dObject* >( GetSdrObject() ), rValue ) ) return true; break; } @@ -902,7 +852,7 @@ bool Svx3DExtrudeObject::setPropertyValueImpl( const OUString& rName, const SfxI // set polygon const basegfx::B3DHomMatrix aIdentity; const basegfx::B2DPolyPolygon aB2DPolyPolygon(basegfx::utils::createB2DPolyPolygonFromB3DPolyPolygon(aNewB3DPolyPolygon, aIdentity)); - static_cast<E3dExtrudeObj*>(mpObj.get())->SetExtrudePolygon(aB2DPolyPolygon); + static_cast<E3dExtrudeObj*>(GetSdrObject())->SetExtrudePolygon(aB2DPolyPolygon); return true; } break; @@ -922,26 +872,8 @@ bool Svx3DExtrudeObject::getPropertyValueImpl( const OUString& rName, const SfxI { // pack transformation to a homogeneous matrix drawing::HomogenMatrix aHomMat; - basegfx::B3DHomMatrix aMat = static_cast<E3dObject*>(mpObj.get())->GetTransform(); - - // pack evtl. transformed matrix to output - aHomMat.Line1.Column1 = aMat.get(0, 0); - aHomMat.Line1.Column2 = aMat.get(0, 1); - aHomMat.Line1.Column3 = aMat.get(0, 2); - aHomMat.Line1.Column4 = aMat.get(0, 3); - aHomMat.Line2.Column1 = aMat.get(1, 0); - aHomMat.Line2.Column2 = aMat.get(1, 1); - aHomMat.Line2.Column3 = aMat.get(1, 2); - aHomMat.Line2.Column4 = aMat.get(1, 3); - aHomMat.Line3.Column1 = aMat.get(2, 0); - aHomMat.Line3.Column2 = aMat.get(2, 1); - aHomMat.Line3.Column3 = aMat.get(2, 2); - aHomMat.Line3.Column4 = aMat.get(2, 3); - aHomMat.Line4.Column1 = aMat.get(3, 0); - aHomMat.Line4.Column2 = aMat.get(3, 1); - aHomMat.Line4.Column3 = aMat.get(3, 2); - aHomMat.Line4.Column4 = aMat.get(3, 3); - + basegfx::B3DHomMatrix aMat = static_cast<E3dObject*>(GetSdrObject())->GetTransform(); + basegfx::utils::B3DHomMatrixToUnoHomogenMatrix(aMat, aHomMat); rValue <<= aHomMat; break; } @@ -949,7 +881,7 @@ bool Svx3DExtrudeObject::getPropertyValueImpl( const OUString& rName, const SfxI case OWN_ATTR_3D_VALUE_POLYPOLYGON3D: { // pack polygon definition - const basegfx::B2DPolyPolygon& rPolyPoly = static_cast<E3dExtrudeObj*>(mpObj.get())->GetExtrudePolygon(); + const basegfx::B2DPolyPolygon& rPolyPoly = static_cast<E3dExtrudeObj*>(GetSdrObject())->GetExtrudePolygon(); const basegfx::B3DPolyPolygon aB3DPolyPolygon(basegfx::utils::createB3DPolyPolygonFromB2DPolyPolygon(rPolyPoly)); B3dPolyPolygon_to_PolyPolygonShape3D(aB3DPolyPolygon, rValue); @@ -987,7 +919,7 @@ bool Svx3DPolygonObject::setPropertyValueImpl( const OUString& rName, const SfxI case OWN_ATTR_3D_VALUE_TRANSFORM_MATRIX: { // pack transformation matrix to the object - if( ConvertHomogenMatrixToObject( static_cast< E3dObject* >( mpObj.get() ), rValue ) ) + if( ConvertHomogenMatrixToObject( static_cast< E3dObject* >( GetSdrObject() ), rValue ) ) return true; break; } @@ -1001,7 +933,7 @@ bool Svx3DPolygonObject::setPropertyValueImpl( const OUString& rName, const SfxI if( PolyPolygonShape3D_to_B3dPolyPolygon( rValue, aNewB3DPolyPolygon, false ) ) { // set polygon - static_cast<E3dPolygonObj*>(mpObj.get())->SetPolyPolygon3D(aNewB3DPolyPolygon); + static_cast<E3dPolygonObj*>(GetSdrObject())->SetPolyPolygon3D(aNewB3DPolyPolygon); return true; } break; @@ -1015,7 +947,7 @@ bool Svx3DPolygonObject::setPropertyValueImpl( const OUString& rName, const SfxI if( PolyPolygonShape3D_to_B3dPolyPolygon( rValue, aNewB3DPolyPolygon, false ) ) { // set polygon - static_cast<E3dPolygonObj*>(mpObj.get())->SetPolyNormals3D(aNewB3DPolyPolygon); + static_cast<E3dPolygonObj*>(GetSdrObject())->SetPolyNormals3D(aNewB3DPolyPolygon); return true; } break; @@ -1031,7 +963,7 @@ bool Svx3DPolygonObject::setPropertyValueImpl( const OUString& rName, const SfxI // set polygon const basegfx::B3DHomMatrix aIdentity; const basegfx::B2DPolyPolygon aB2DPolyPolygon(basegfx::utils::createB2DPolyPolygonFromB3DPolyPolygon(aNewB3DPolyPolygon, aIdentity)); - static_cast<E3dPolygonObj*>(mpObj.get())->SetPolyTexture2D(aB2DPolyPolygon); + static_cast<E3dPolygonObj*>(GetSdrObject())->SetPolyTexture2D(aB2DPolyPolygon); return true; } break; @@ -1041,7 +973,7 @@ bool Svx3DPolygonObject::setPropertyValueImpl( const OUString& rName, const SfxI bool bNew = false; if( rValue >>= bNew ) { - static_cast<E3dPolygonObj*>(mpObj.get())->SetLineOnly(bNew); + static_cast<E3dPolygonObj*>(GetSdrObject())->SetLineOnly(bNew); return true; } break; @@ -1059,26 +991,26 @@ bool Svx3DPolygonObject::getPropertyValueImpl( const OUString& rName, const SfxI { case OWN_ATTR_3D_VALUE_TRANSFORM_MATRIX: { - ConvertObjectToHomogenMatric( static_cast< E3dObject* >( mpObj.get() ), rValue ); + ConvertObjectToHomogenMatric( static_cast< E3dObject* >( GetSdrObject() ), rValue ); break; } case OWN_ATTR_3D_VALUE_POLYPOLYGON3D: { - B3dPolyPolygon_to_PolyPolygonShape3D(static_cast<E3dPolygonObj*>(mpObj.get())->GetPolyPolygon3D(),rValue); + B3dPolyPolygon_to_PolyPolygonShape3D(static_cast<E3dPolygonObj*>(GetSdrObject())->GetPolyPolygon3D(),rValue); break; } case OWN_ATTR_3D_VALUE_NORMALSPOLYGON3D: { - B3dPolyPolygon_to_PolyPolygonShape3D(static_cast<E3dPolygonObj*>(mpObj.get())->GetPolyNormals3D(),rValue); + B3dPolyPolygon_to_PolyPolygonShape3D(static_cast<E3dPolygonObj*>(GetSdrObject())->GetPolyNormals3D(),rValue); break; } case OWN_ATTR_3D_VALUE_TEXTUREPOLYGON3D: { // pack texture definition - const basegfx::B2DPolyPolygon& rPolyPoly = static_cast<E3dPolygonObj*>(mpObj.get())->GetPolyTexture2D(); + const basegfx::B2DPolyPolygon& rPolyPoly = static_cast<E3dPolygonObj*>(GetSdrObject())->GetPolyTexture2D(); const basegfx::B3DPolyPolygon aB3DPolyPolygon(basegfx::utils::createB3DPolyPolygonFromB2DPolyPolygon(rPolyPoly)); B3dPolyPolygon_to_PolyPolygonShape3D(aB3DPolyPolygon,rValue); @@ -1087,7 +1019,7 @@ bool Svx3DPolygonObject::getPropertyValueImpl( const OUString& rName, const SfxI case OWN_ATTR_3D_VALUE_LINEONLY: { - rValue <<= static_cast<E3dPolygonObj*>(mpObj.get())->GetLineOnly(); + rValue <<= static_cast<E3dPolygonObj*>(GetSdrObject())->GetLineOnly(); break; } diff --git a/svx/source/unodraw/unoshap4.cxx b/svx/source/unodraw/unoshap4.cxx index a5ef378525f7..c9e40652e372 100644 --- a/svx/source/unodraw/unoshap4.cxx +++ b/svx/source/unodraw/unoshap4.cxx @@ -90,10 +90,10 @@ bool SvxOle2Shape::setPropertyValueImpl( const OUString& rName, const SfxItemPro // TODO/LATER: seems to make no sense for iconified object awt::Rectangle aVisArea; - if( (rValue >>= aVisArea) && dynamic_cast<const SdrOle2Obj* >(mpObj.get()) != nullptr) + if( (rValue >>= aVisArea) && dynamic_cast<const SdrOle2Obj* >(GetSdrObject()) != nullptr) { Size aTmp( aVisArea.X + aVisArea.Width, aVisArea.Y + aVisArea.Height ); - uno::Reference < embed::XEmbeddedObject > xObj = static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef(); + uno::Reference < embed::XEmbeddedObject > xObj = static_cast<SdrOle2Obj*>(GetSdrObject())->GetObjRef(); if( xObj.is() ) { try @@ -118,7 +118,7 @@ bool SvxOle2Shape::setPropertyValueImpl( const OUString& rName, const SfxItemPro sal_Int64 nAspect = 0; if( rValue >>= nAspect ) { - static_cast<SdrOle2Obj*>(mpObj.get())->SetAspect( nAspect ); + static_cast<SdrOle2Obj*>(GetSdrObject())->SetAspect( nAspect ); return true; } break; @@ -144,7 +144,7 @@ bool SvxOle2Shape::setPropertyValueImpl( const OUString& rName, const SfxItemPro if( xGraphic.is() ) { const Graphic aGraphic(xGraphic); - static_cast<SdrOle2Obj*>(mpObj.get())->SetGraphic(aGraphic); + static_cast<SdrOle2Obj*>(GetSdrObject())->SetGraphic(aGraphic); return true; } break; @@ -154,7 +154,7 @@ bool SvxOle2Shape::setPropertyValueImpl( const OUString& rName, const SfxItemPro uno::Reference< graphic::XGraphic > xGraphic( rValue, uno::UNO_QUERY ); if( xGraphic.is() ) { - SdrOle2Obj* pOle = dynamic_cast< SdrOle2Obj* >( mpObj.get() ); + SdrOle2Obj* pOle = dynamic_cast< SdrOle2Obj* >( GetSdrObject() ); if( pOle ) { GraphicObject aGrafObj( xGraphic ); @@ -172,10 +172,10 @@ bool SvxOle2Shape::setPropertyValueImpl( const OUString& rName, const SfxItemPro { SdrOle2Obj *pOle; #if OSL_DEBUG_LEVEL > 0 - pOle = dynamic_cast<SdrOle2Obj*>(mpObj.get()); + pOle = dynamic_cast<SdrOle2Obj*>(GetSdrObject()); assert(pOle); #else - pOle = static_cast<SdrOle2Obj*>(mpObj.get()); + pOle = static_cast<SdrOle2Obj*>(GetSdrObject()); #endif pOle->SetPersistName( aPersistName ); return true; @@ -220,7 +220,7 @@ bool SvxOle2Shape::getPropertyValueImpl( const OUString& rName, const SfxItemPro case OWN_ATTR_METAFILE: { - SdrOle2Obj* pObj = dynamic_cast<SdrOle2Obj*>(mpObj.get()); + SdrOle2Obj* pObj = dynamic_cast<SdrOle2Obj*>(GetSdrObject()); if( pObj ) { const Graphic* pGraphic = pObj->GetGraphic(); @@ -260,10 +260,10 @@ bool SvxOle2Shape::getPropertyValueImpl( const OUString& rName, const SfxItemPro case OWN_ATTR_OLE_VISAREA: { awt::Rectangle aVisArea; - if( dynamic_cast<const SdrOle2Obj* >(mpObj.get()) != nullptr) + if( dynamic_cast<const SdrOle2Obj* >(GetSdrObject()) != nullptr) { MapMode aMapMode( MapUnit::Map100thMM ); // the API uses this map mode - Size aTmp = static_cast<SdrOle2Obj*>(mpObj.get())->GetOrigObjSize( &aMapMode ); // get the size in the requested map mode + Size aTmp = static_cast<SdrOle2Obj*>(GetSdrObject())->GetOrigObjSize( &aMapMode ); // get the size in the requested map mode aVisArea = awt::Rectangle( 0, 0, aTmp.Width(), aTmp.Height() ); } @@ -273,14 +273,14 @@ bool SvxOle2Shape::getPropertyValueImpl( const OUString& rName, const SfxItemPro case OWN_ATTR_OLESIZE: { - Size aTmp( static_cast<SdrOle2Obj*>(mpObj.get())->GetOrigObjSize() ); + Size aTmp( static_cast<SdrOle2Obj*>(GetSdrObject())->GetOrigObjSize() ); rValue <<= awt::Size( aTmp.Width(), aTmp.Height() ); break; } case OWN_ATTR_OLE_ASPECT: { - rValue <<= static_cast<SdrOle2Obj*>(mpObj.get())->GetAspect(); + rValue <<= static_cast<SdrOle2Obj*>(GetSdrObject())->GetAspect(); break; } @@ -288,7 +288,7 @@ bool SvxOle2Shape::getPropertyValueImpl( const OUString& rName, const SfxItemPro case OWN_ATTR_OLE_EMBEDDED_OBJECT: case OWN_ATTR_OLE_EMBEDDED_OBJECT_NONEWCLIENT: { - SdrOle2Obj* pObj = dynamic_cast<SdrOle2Obj*>( mpObj.get() ); + SdrOle2Obj* pObj = dynamic_cast<SdrOle2Obj*>( GetSdrObject() ); if( pObj ) { uno::Reference < embed::XEmbeddedObject > xObj( pObj->GetObjRef() ); @@ -315,7 +315,7 @@ bool SvxOle2Shape::getPropertyValueImpl( const OUString& rName, const SfxItemPro case OWN_ATTR_VALUE_GRAPHIC: { uno::Reference< graphic::XGraphic > xGraphic; - const Graphic* pGraphic = static_cast<SdrOle2Obj*>( mpObj.get() )->GetGraphic(); + const Graphic* pGraphic = static_cast<SdrOle2Obj*>( GetSdrObject() )->GetGraphic(); if( pGraphic ) xGraphic = pGraphic->GetXGraphic(); rValue <<= xGraphic; @@ -325,7 +325,7 @@ bool SvxOle2Shape::getPropertyValueImpl( const OUString& rName, const SfxItemPro case OWN_ATTR_THUMBNAIL: { uno::Reference< graphic::XGraphic > xGraphic; - const Graphic* pGraphic = static_cast<SdrOle2Obj*>( mpObj.get() )->GetGraphic(); + const Graphic* pGraphic = static_cast<SdrOle2Obj*>( GetSdrObject() )->GetGraphic(); if( pGraphic ) xGraphic = pGraphic->GetXGraphic(); rValue <<= xGraphic; @@ -334,14 +334,14 @@ bool SvxOle2Shape::getPropertyValueImpl( const OUString& rName, const SfxItemPro case OWN_ATTR_PERSISTNAME: { OUString aPersistName; - SdrOle2Obj* pOle = dynamic_cast< SdrOle2Obj* >( mpObj.get() ); + SdrOle2Obj* pOle = dynamic_cast< SdrOle2Obj* >( GetSdrObject() ); if( pOle ) { aPersistName = pOle->GetPersistName(); if( !aPersistName.isEmpty() ) { - ::comphelper::IEmbeddedHelper *pPersist = mpObj->GetModel()->GetPersist(); + ::comphelper::IEmbeddedHelper* pPersist(GetSdrObject()->getSdrModelFromSdrObject().GetPersist()); if( (nullptr == pPersist) || !pPersist->getEmbeddedObjectContainer().HasEmbeddedObject( pOle->GetPersistName() ) ) aPersistName.clear(); } @@ -353,7 +353,7 @@ bool SvxOle2Shape::getPropertyValueImpl( const OUString& rName, const SfxItemPro case OWN_ATTR_OLE_LINKURL: { OUString aLinkURL; - SdrOle2Obj* pOle = dynamic_cast< SdrOle2Obj* >( mpObj.get() ); + SdrOle2Obj* pOle = dynamic_cast< SdrOle2Obj* >( GetSdrObject() ); if( pOle ) { @@ -376,12 +376,12 @@ bool SvxOle2Shape::createObject( const SvGlobalName &aClassName ) { DBG_TESTSOLARMUTEX(); - SdrOle2Obj* pOle2Obj = dynamic_cast< SdrOle2Obj* >( mpObj.get() ); + SdrOle2Obj* pOle2Obj = dynamic_cast< SdrOle2Obj* >( GetSdrObject() ); if ( !pOle2Obj || !pOle2Obj->IsEmpty() ) return false; // create storage and inplace object - ::comphelper::IEmbeddedHelper* pPersist = mpModel->GetPersist(); + ::comphelper::IEmbeddedHelper* pPersist = GetSdrObject()->getSdrModelFromSdrObject().GetPersist(); OUString aPersistName; OUString aTmpStr; if( SvxShape::getPropertyValue( UNO_NAME_OLE2_PERSISTNAME ) >>= aTmpStr ) @@ -438,13 +438,13 @@ void SvxOle2Shape::createLink( const OUString& aLinkURL ) { DBG_TESTSOLARMUTEX(); - SdrOle2Obj* pOle2Obj = dynamic_cast< SdrOle2Obj* >( mpObj.get() ); + SdrOle2Obj* pOle2Obj = dynamic_cast< SdrOle2Obj* >( GetSdrObject() ); if ( !pOle2Obj || !pOle2Obj->IsEmpty() ) return; OUString aPersistName; - ::comphelper::IEmbeddedHelper* pPersist = mpModel->GetPersist(); + ::comphelper::IEmbeddedHelper* pPersist = GetSdrObject()->getSdrModelFromSdrObject().GetPersist(); uno::Sequence< beans::PropertyValue > aMediaDescr( 1 ); aMediaDescr[0].Name = "URL"; @@ -497,10 +497,10 @@ void SvxOle2Shape::createLink( const OUString& aLinkURL ) void SvxOle2Shape::resetModifiedState() { - ::comphelper::IEmbeddedHelper* pPersist = mpModel ? mpModel->GetPersist() : nullptr; + ::comphelper::IEmbeddedHelper* pPersist = GetSdrObject()->getSdrModelFromSdrObject().GetPersist(); if( pPersist && !pPersist->isEnableSetModified() ) { - SdrOle2Obj* pOle = dynamic_cast< SdrOle2Obj* >( mpObj.get() ); + SdrOle2Obj* pOle = dynamic_cast< SdrOle2Obj* >( GetSdrObject() ); if( pOle && !pOle->IsEmpty() ) { uno::Reference < util::XModifiable > xMod( pOle->GetObjRef(), uno::UNO_QUERY ); @@ -515,7 +515,7 @@ const SvGlobalName SvxOle2Shape::GetClassName_Impl(OUString& rHexCLSID) { DBG_TESTSOLARMUTEX(); SvGlobalName aClassName; - SdrOle2Obj* pOle2Obj = dynamic_cast< SdrOle2Obj* >( mpObj.get() ); + SdrOle2Obj* pOle2Obj = dynamic_cast< SdrOle2Obj* >( GetSdrObject() ); if( pOle2Obj ) { @@ -523,7 +523,7 @@ const SvGlobalName SvxOle2Shape::GetClassName_Impl(OUString& rHexCLSID) if( pOle2Obj->IsEmpty() ) { - ::comphelper::IEmbeddedHelper* pPersist = mpModel->GetPersist(); + ::comphelper::IEmbeddedHelper* pPersist = GetSdrObject()->getSdrModelFromSdrObject().GetPersist(); if( pPersist ) { uno::Reference < embed::XEmbeddedObject > xObj = @@ -584,9 +584,9 @@ bool SvxAppletShape::setPropertyValueImpl( const OUString& rName, const SfxItemP { if( (pProperty->nWID >= OWN_ATTR_APPLET_DOCBASE) && (pProperty->nWID <= OWN_ATTR_APPLET_ISSCRIPT) ) { - if ( svt::EmbeddedObjectRef::TryRunningState( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef() ) ) + if ( svt::EmbeddedObjectRef::TryRunningState( static_cast<SdrOle2Obj*>(GetSdrObject())->GetObjRef() ) ) { - uno::Reference < beans::XPropertySet > xSet( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef()->getComponent(), uno::UNO_QUERY ); + uno::Reference < beans::XPropertySet > xSet( static_cast<SdrOle2Obj*>(GetSdrObject())->GetObjRef()->getComponent(), uno::UNO_QUERY ); if( xSet.is() ) { // allow exceptions to pass through @@ -605,9 +605,9 @@ bool SvxAppletShape::getPropertyValueImpl( const OUString& rName, const SfxItemP { if( (pProperty->nWID >= OWN_ATTR_APPLET_DOCBASE) && (pProperty->nWID <= OWN_ATTR_APPLET_ISSCRIPT) ) { - if ( svt::EmbeddedObjectRef::TryRunningState( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef() ) ) + if ( svt::EmbeddedObjectRef::TryRunningState( static_cast<SdrOle2Obj*>(GetSdrObject())->GetObjRef() ) ) { - uno::Reference < beans::XPropertySet > xSet( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef()->getComponent(), uno::UNO_QUERY ); + uno::Reference < beans::XPropertySet > xSet( static_cast<SdrOle2Obj*>(GetSdrObject())->GetObjRef()->getComponent(), uno::UNO_QUERY ); if( xSet.is() ) { rValue = xSet->getPropertyValue( rName ); @@ -655,9 +655,9 @@ bool SvxPluginShape::setPropertyValueImpl( const OUString& rName, const SfxItemP { if( (pProperty->nWID >= OWN_ATTR_PLUGIN_MIMETYPE) && (pProperty->nWID <= OWN_ATTR_PLUGIN_COMMANDS) ) { - if( svt::EmbeddedObjectRef::TryRunningState( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef() ) ) + if( svt::EmbeddedObjectRef::TryRunningState( static_cast<SdrOle2Obj*>(GetSdrObject())->GetObjRef() ) ) { - uno::Reference < beans::XPropertySet > xSet( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef()->getComponent(), uno::UNO_QUERY ); + uno::Reference < beans::XPropertySet > xSet( static_cast<SdrOle2Obj*>(GetSdrObject())->GetObjRef()->getComponent(), uno::UNO_QUERY ); if( xSet.is() ) { // allow exceptions to pass through @@ -676,9 +676,9 @@ bool SvxPluginShape::getPropertyValueImpl( const OUString& rName, const SfxItemP { if( (pProperty->nWID >= OWN_ATTR_PLUGIN_MIMETYPE) && (pProperty->nWID <= OWN_ATTR_PLUGIN_COMMANDS) ) { - if( svt::EmbeddedObjectRef::TryRunningState( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef() ) ) + if( svt::EmbeddedObjectRef::TryRunningState( static_cast<SdrOle2Obj*>(GetSdrObject())->GetObjRef() ) ) { - uno::Reference < beans::XPropertySet > xSet( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef()->getComponent(), uno::UNO_QUERY ); + uno::Reference < beans::XPropertySet > xSet( static_cast<SdrOle2Obj*>(GetSdrObject())->GetObjRef()->getComponent(), uno::UNO_QUERY ); if( xSet.is() ) { rValue = xSet->getPropertyValue( rName ); @@ -727,9 +727,9 @@ bool SvxFrameShape::setPropertyValueImpl( const OUString& rName, const SfxItemPr { if( (pProperty->nWID >= OWN_ATTR_FRAME_URL) && (pProperty->nWID <= OWN_ATTR_FRAME_MARGIN_HEIGHT) ) { - if( svt::EmbeddedObjectRef::TryRunningState( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef() ) ) + if( svt::EmbeddedObjectRef::TryRunningState( static_cast<SdrOle2Obj*>(GetSdrObject())->GetObjRef() ) ) { - uno::Reference < beans::XPropertySet > xSet( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef()->getComponent(), uno::UNO_QUERY ); + uno::Reference < beans::XPropertySet > xSet( static_cast<SdrOle2Obj*>(GetSdrObject())->GetObjRef()->getComponent(), uno::UNO_QUERY ); if( xSet.is() ) { // allow exceptions to pass through @@ -749,9 +749,9 @@ bool SvxFrameShape::getPropertyValueImpl(const OUString& rName, const SfxItemPro { if( (pProperty->nWID >= OWN_ATTR_FRAME_URL) && (pProperty->nWID <= OWN_ATTR_FRAME_MARGIN_HEIGHT) ) { - if( svt::EmbeddedObjectRef::TryRunningState( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef() ) ) + if( svt::EmbeddedObjectRef::TryRunningState( static_cast<SdrOle2Obj*>(GetSdrObject())->GetObjRef() ) ) { - uno::Reference < beans::XPropertySet > xSet( static_cast<SdrOle2Obj*>(mpObj.get())->GetObjRef()->getComponent(), uno::UNO_QUERY ); + uno::Reference < beans::XPropertySet > xSet( static_cast<SdrOle2Obj*>(GetSdrObject())->GetObjRef()->getComponent(), uno::UNO_QUERY ); if( xSet.is() ) { rValue = xSet->getPropertyValue( rName ); @@ -783,7 +783,7 @@ bool SvxMediaShape::setPropertyValueImpl( const OUString& rName, const SfxItemPr || (pProperty->nWID == OWN_ATTR_MEDIA_STREAM) || (pProperty->nWID == OWN_ATTR_MEDIA_MIMETYPE) ) { - SdrMediaObj* pMedia = static_cast< SdrMediaObj* >( mpObj.get() ); + SdrMediaObj* pMedia = static_cast< SdrMediaObj* >( GetSdrObject() ); ::avmedia::MediaItem aItem; bool bOk = false; @@ -926,7 +926,7 @@ bool SvxMediaShape::getPropertyValueImpl( const OUString& rName, const SfxItemPr || (pProperty->nWID == OWN_ATTR_MEDIA_MIMETYPE) || (pProperty->nWID == OWN_ATTR_FALLBACK_GRAPHIC)) { - SdrMediaObj* pMedia = static_cast< SdrMediaObj* >( mpObj.get() ); + SdrMediaObj* pMedia = static_cast< SdrMediaObj* >( GetSdrObject() ); const ::avmedia::MediaItem aItem( pMedia->getMediaProperties() ); switch( pProperty->nWID ) diff --git a/svx/source/unodraw/unoshape.cxx b/svx/source/unodraw/unoshape.cxx index 572b31c44313..c726444e814d 100644 --- a/svx/source/unodraw/unoshape.cxx +++ b/svx/source/unodraw/unoshape.cxx @@ -180,8 +180,7 @@ SvxShape::SvxShape( SdrObject* pObject ) , mbIsMultiPropertyCall(false) , mpPropSet(getSvxMapProvider().GetPropertySet(SVXMAP_SHAPE, SdrObject::GetGlobalDrawObjectItemPool())) , maPropMapEntries(getSvxMapProvider().GetMap(SVXMAP_SHAPE)) -, mpObj(pObject) -, mpModel(nullptr) +, mpSdrObjectWeakReference(pObject) , mnLockCount(0) { impl_construct(); @@ -194,8 +193,7 @@ SvxShape::SvxShape( SdrObject* pObject, const SfxItemPropertyMapEntry* pEntries, , mbIsMultiPropertyCall(false) , mpPropSet(pPropertySet) , maPropMapEntries(pEntries) -, mpObj(pObject) -, mpModel(nullptr) +, mpSdrObjectWeakReference(pObject) , mnLockCount(0) { impl_construct(); @@ -208,8 +206,7 @@ SvxShape::SvxShape() , mbIsMultiPropertyCall(false) , mpPropSet(getSvxMapProvider().GetPropertySet(SVXMAP_SHAPE, SdrObject::GetGlobalDrawObjectItemPool())) , maPropMapEntries(getSvxMapProvider().GetMap(SVXMAP_SHAPE)) -, mpObj(nullptr) -, mpModel(nullptr) +, mpSdrObjectWeakReference(nullptr) , mnLockCount(0) { impl_construct(); @@ -222,19 +219,19 @@ SvxShape::~SvxShape() throw() DBG_ASSERT( mnLockCount == 0, "Locked shape was disposed!" ); - if ( mpModel ) - EndListening( *mpModel ); - if ( mpImpl->mpMaster ) mpImpl->mpMaster->dispose(); - if ( mpObj.is() ) - mpObj->setUnoShape(nullptr); + if ( HasSdrObject() ) + { + EndListening(GetSdrObject()->getSdrModelFromSdrObject()); + GetSdrObject()->setUnoShape(nullptr); + } - if( HasSdrObjectOwnership() && mpObj.is() ) + if( HasSdrObjectOwnership() && HasSdrObject() ) { mpImpl->mbHasSdrObjectOwnership = false; - SdrObject* pObject = mpObj.get(); + SdrObject* pObject = GetSdrObject(); SdrObject::Free( pObject ); } @@ -248,13 +245,23 @@ void SvxShape::TakeSdrObjectOwnership() } +void SvxShape::InvalidateSdrObject() +{ + if(HasSdrObject()) + { + EndListening(GetSdrObject()->getSdrModelFromSdrObject()); + } + + mpSdrObjectWeakReference.reset( nullptr ); +}; + bool SvxShape::HasSdrObjectOwnership() const { if ( !mpImpl->mbHasSdrObjectOwnership ) return false; - OSL_ENSURE( mpObj.is(), "SvxShape::HasSdrObjectOwnership: have the ownership of an object which I don't know!" ); - return mpObj.is(); + OSL_ENSURE( HasSdrObject(), "SvxShape::HasSdrObjectOwnership: have the ownership of an object which I don't know!" ); + return HasSdrObject(); } @@ -335,40 +342,31 @@ void SvxShape::impl_construct() mpImpl->maPropertyNotifier.registerProvider( svx::ShapeProperty::Size, std::shared_ptr<svx::IPropertyValueProvider>( new ShapeSizeProvider( *mpImpl ) ) ); - if ( mpObj.is() ) + if ( HasSdrObject() ) + { + StartListening(GetSdrObject()->getSdrModelFromSdrObject()); impl_initFromSdrObject(); + } } void SvxShape::impl_initFromSdrObject() { DBG_TESTSOLARMUTEX(); - OSL_PRECOND( mpObj.is(), "SvxShape::impl_initFromSdrObject: not to be called without SdrObject!" ); - if ( !mpObj.is() ) + OSL_PRECOND( HasSdrObject(), "SvxShape::impl_initFromSdrObject: not to be called without SdrObject!" ); + if ( !HasSdrObject() ) return; osl_atomic_increment( &m_refCount ); { - mpObj->setUnoShape(*this); + GetSdrObject()->setUnoShape(*this); } osl_atomic_decrement( &m_refCount ); - auto pNewModel = mpObj->GetModel(); - - if (pNewModel != mpModel) - { - if (mpModel) - EndListening( *mpModel ); - if (pNewModel) - StartListening( *pNewModel ); - mpModel = pNewModel; - } - // #i40944# // Do not simply return when no model but do the type corrections // following below. - - const SdrInventor nInventor = mpObj->GetObjInventor(); + const SdrInventor nInventor = GetSdrObject()->GetObjInventor(); // is it one of ours (svx) ? if( nInventor == SdrInventor::Default || nInventor == SdrInventor::E3d || nInventor == SdrInventor::FmForm ) @@ -379,7 +377,7 @@ void SvxShape::impl_initFromSdrObject() } else { - mpImpl->mnObjId = mpObj->GetObjIdentifier(); + mpImpl->mnObjId = GetSdrObject()->GetObjIdentifier(); if( nInventor == SdrInventor::E3d ) mpImpl->mnObjId |= E3D_INVENTOR_FLAG; } @@ -412,16 +410,20 @@ void SvxShape::Create( SdrObject* pNewObj, SvxDrawPage* /*pNewPage*/ ) if ( pCreatedObj == pNewObj ) return; - DBG_ASSERT( pNewObj->GetModel(), "no model for SdrObject?" ); // Correct condition (#i52126#) mpImpl->mpCreatedObj = pNewObj; - if( mpObj.is() && mpObj->GetModel() ) + if( HasSdrObject() ) { - EndListening( *mpObj->GetModel() ); + EndListening( GetSdrObject()->getSdrModelFromSdrObject() ); } - mpObj.reset( pNewObj ); + mpSdrObjectWeakReference.reset( pNewObj ); + + if( HasSdrObject() ) + { + StartListening( GetSdrObject()->getSdrModelFromSdrObject() ); + } OSL_ENSURE( !mbIsMultiPropertyCall, "SvxShape::Create: hmm?" ); // this was previously set in impl_initFromSdrObject, but I think it was superfluous @@ -432,63 +434,29 @@ void SvxShape::Create( SdrObject* pNewObj, SvxDrawPage* /*pNewPage*/ ) ObtainSettingsFromPropertySet( *mpPropSet ); // save user call - SdrObjUserCall* pUser = mpObj->GetUserCall(); - mpObj->SetUserCall(nullptr); + SdrObjUserCall* pUser = GetSdrObject()->GetUserCall(); + GetSdrObject()->SetUserCall(nullptr); setPosition( maPosition ); setSize( maSize ); // restore user call after we set the initial size - mpObj->SetUserCall( pUser ); + GetSdrObject()->SetUserCall( pUser ); // if this shape was already named, use this name if( !maShapeName.isEmpty() ) { - mpObj->SetName( maShapeName ); + GetSdrObject()->SetName( maShapeName ); maShapeName.clear(); } } - -void SvxShape::ChangeModel( SdrModel* pNewModel ) -{ - DBG_TESTSOLARMUTEX(); - if( mpObj.is() && mpObj->GetModel() ) - { - if( mpObj->GetModel() != pNewModel ) - { - EndListening( *mpObj->GetModel() ); - } - } - - // Always listen to new model (#i52126#) - if( pNewModel ) - { - StartListening( *pNewModel ); - } - - // HACK #i53696# ChangeModel should be virtual, but it isn't. can't change that for 2.0.1 - SvxShapeText* pShapeText = dynamic_cast< SvxShapeText* >( this ); - if( pShapeText ) - { - SvxTextEditSource* pTextEditSource = dynamic_cast< SvxTextEditSource* >( pShapeText->GetEditSource() ); - if( pTextEditSource ) - pTextEditSource->ChangeModel( pNewModel ); - } - - mpModel = pNewModel; - - if( mpImpl->mpMaster ) - mpImpl->mpMaster->modelChanged( pNewModel ); -} - - void SvxShape::ForceMetricToItemPoolMetric(Pair& rPoint) const throw() { DBG_TESTSOLARMUTEX(); - if(mpModel) + if(HasSdrObject()) { - MapUnit eMapUnit = mpModel->GetItemPool().GetMetric(0); + MapUnit eMapUnit(GetSdrObject()->getSdrModelFromSdrObject().GetItemPool().GetMetric(0)); if(eMapUnit != MapUnit::Map100thMM) { switch(eMapUnit) @@ -512,9 +480,9 @@ void SvxShape::ForceMetricToItemPoolMetric(Pair& rPoint) const throw() void SvxShape::ForceMetricToItemPoolMetric(basegfx::B2DPolyPolygon& rPolyPolygon) const throw() { DBG_TESTSOLARMUTEX(); - if(mpModel) + if(HasSdrObject()) { - MapUnit eMapUnit = mpModel->GetItemPool().GetMetric(0); + MapUnit eMapUnit(GetSdrObject()->getSdrModelFromSdrObject().GetItemPool().GetMetric(0)); if(eMapUnit != MapUnit::Map100thMM) { switch(eMapUnit) @@ -542,9 +510,9 @@ void SvxShape::ForceMetricTo100th_mm(Pair& rPoint) const throw() { DBG_TESTSOLARMUTEX(); MapUnit eMapUnit = MapUnit::Map100thMM; - if(mpModel) + if(HasSdrObject()) { - eMapUnit = mpModel->GetItemPool().GetMetric(0); + eMapUnit = GetSdrObject()->getSdrModelFromSdrObject().GetItemPool().GetMetric(0); if(eMapUnit != MapUnit::Map100thMM) { switch(eMapUnit) @@ -569,9 +537,9 @@ void SvxShape::ForceMetricTo100th_mm(basegfx::B2DPolyPolygon& rPolyPolygon) cons { DBG_TESTSOLARMUTEX(); MapUnit eMapUnit = MapUnit::Map100thMM; - if(mpModel) + if(HasSdrObject()) { - eMapUnit = mpModel->GetItemPool().GetMetric(0); + eMapUnit = GetSdrObject()->getSdrModelFromSdrObject().GetItemPool().GetMetric(0); if(eMapUnit != MapUnit::Map100thMM) { switch(eMapUnit) @@ -651,15 +619,15 @@ void SvxItemPropertySet_ObtainSettingsFromPropertySet(const SvxItemPropertySet& void SvxShape::ObtainSettingsFromPropertySet(const SvxItemPropertySet& rPropSet) { DBG_TESTSOLARMUTEX(); - if(mpObj.is() && rPropSet.AreThereOwnUsrAnys() && mpModel) + if(HasSdrObject() && rPropSet.AreThereOwnUsrAnys()) { - SfxItemSet aSet( mpModel->GetItemPool(), svl::Items<SDRATTR_START, SDRATTR_END>{}); + SfxItemSet aSet( GetSdrObject()->getSdrModelFromSdrObject().GetItemPool(), svl::Items<SDRATTR_START, SDRATTR_END>{}); Reference< beans::XPropertySet > xShape( static_cast<OWeakObject*>(this), UNO_QUERY ); SvxItemPropertySet_ObtainSettingsFromPropertySet(rPropSet, aSet, xShape, &mpPropSet->getPropertyMap() ); - mpObj->SetMergedItemSetAndBroadcast(aSet); + GetSdrObject()->SetMergedItemSetAndBroadcast(aSet); - mpObj->ApplyNotPersistAttr( aSet ); + GetSdrObject()->ApplyNotPersistAttr( aSet ); } } @@ -668,20 +636,21 @@ uno::Any SvxShape::GetBitmap( bool bMetaFile /* = false */ ) const DBG_TESTSOLARMUTEX(); uno::Any aAny; - if( !mpObj.is() || mpModel == nullptr || !mpObj->IsInserted() || nullptr == mpObj->GetPage() ) + if( !HasSdrObject() || !GetSdrObject()->IsInserted() || nullptr == GetSdrObject()->GetPage() ) return aAny; ScopedVclPtrInstance< VirtualDevice > pVDev; pVDev->SetMapMode(MapMode(MapUnit::Map100thMM)); + SdrPage* pPage = GetSdrObject()->GetPage(); - SdrModel* pModel = mpObj->GetModel(); - SdrPage* pPage = mpObj->GetPage(); - - std::unique_ptr<E3dView> pView(new E3dView( pModel, pVDev.get() )); + std::unique_ptr<E3dView> pView( + new E3dView( + GetSdrObject()->getSdrModelFromSdrObject(), + pVDev.get())); pView->hideMarkHandles(); SdrPageView* pPageView = pView->ShowSdrPage(pPage); - SdrObject *pTempObj = mpObj.get(); + SdrObject *pTempObj = GetSdrObject(); pView->MarkObj(pTempObj,pPageView); tools::Rectangle aRect(pTempObj->GetCurrentBoundRect()); @@ -1011,7 +980,7 @@ uno::Sequence< sal_Int8 > SAL_CALL SvxShape::getImplementationId() void SvxShape::Notify( SfxBroadcaster&, const SfxHint& rHint ) throw() { DBG_TESTSOLARMUTEX(); - if( !mpObj.is() ) + if( !HasSdrObject() ) return; // #i55919# SdrHintKind::ObjectChange is only interesting if it's for this object @@ -1019,13 +988,14 @@ void SvxShape::Notify( SfxBroadcaster&, const SfxHint& rHint ) throw() const SdrHint* pSdrHint = dynamic_cast<const SdrHint*>(&rHint); if (!pSdrHint || ((pSdrHint->GetKind() != SdrHintKind::ModelCleared) && - (pSdrHint->GetKind() != SdrHintKind::ObjectChange || pSdrHint->GetObject() != mpObj.get() ))) + (pSdrHint->GetKind() != SdrHintKind::ObjectChange || pSdrHint->GetObject() != GetSdrObject() ))) return; - uno::Reference< uno::XInterface > xSelf( mpObj->getWeakUnoShape() ); + uno::Reference< uno::XInterface > xSelf( GetSdrObject()->getWeakUnoShape() ); if( !xSelf.is() ) { - mpObj.reset( nullptr ); + EndListening(GetSdrObject()->getSdrModelFromSdrObject()); + mpSdrObjectWeakReference.reset( nullptr ); return; } @@ -1041,7 +1011,6 @@ void SvxShape::Notify( SfxBroadcaster&, const SfxHint& rHint ) throw() case SdrHintKind::ModelCleared: { bClearMe = true; - mpModel = nullptr; break; } default: @@ -1050,13 +1019,30 @@ void SvxShape::Notify( SfxBroadcaster&, const SfxHint& rHint ) throw() if( bClearMe ) { - if( !HasSdrObjectOwnership() ) { - if( mpObj.is() ) - mpObj->setUnoShape( nullptr ); - mpObj.reset( nullptr ); + SdrObject* pSdrObject(GetSdrObject()); + + if(!HasSdrObjectOwnership()) + { + if(nullptr != pSdrObject) + { + EndListening(pSdrObject->getSdrModelFromSdrObject()); + pSdrObject->setUnoShape(nullptr); + } + + mpSdrObjectWeakReference.reset(nullptr); + + // SdrModel *is* going down, try to Free SdrObject even + // when !HasSdrObjectOwnership + if(nullptr != pSdrObject && !pSdrObject->IsInserted()) + { + SdrObject::Free(pSdrObject); + } } - if ( !mpImpl->mbDisposing ) + + if(!mpImpl->mbDisposing) + { dispose(); + } } } @@ -1125,14 +1111,14 @@ awt::Point SAL_CALL SvxShape::getPosition() { ::SolarMutexGuard aGuard; - if( mpObj.is() && mpModel) + if(HasSdrObject()) { - tools::Rectangle aRect( svx_getLogicRectHack(mpObj.get()) ); + tools::Rectangle aRect( svx_getLogicRectHack(GetSdrObject()) ); Point aPt( aRect.Left(), aRect.Top() ); // Position is relative to anchor, so recalc to absolute position - if( mpModel->IsWriter() ) - aPt -= mpObj->GetAnchorPos(); + if( GetSdrObject()->getSdrModelFromSdrObject().IsWriter() ) + aPt -= GetSdrObject()->GetAnchorPos(); ForceMetricTo100th_mm(aPt); return css::awt::Point( aPt.X(), aPt.Y() ); @@ -1148,25 +1134,25 @@ void SAL_CALL SvxShape::setPosition( const awt::Point& Position ) { ::SolarMutexGuard aGuard; - if( mpObj.is() && mpModel ) + if(HasSdrObject()) { // do NOT move 3D objects, this would change the homogen // transformation matrix - if(dynamic_cast<const E3dCompoundObject* >(mpObj.get()) == nullptr) + if(dynamic_cast<const E3dCompoundObject* >(GetSdrObject()) == nullptr) { - tools::Rectangle aRect( svx_getLogicRectHack(mpObj.get()) ); + tools::Rectangle aRect( svx_getLogicRectHack(GetSdrObject()) ); Point aLocalPos( Position.X, Position.Y ); ForceMetricToItemPoolMetric(aLocalPos); // Position is absolute, so recalc to position relative to anchor - if( mpModel->IsWriter() ) - aLocalPos += mpObj->GetAnchorPos(); + if( GetSdrObject()->getSdrModelFromSdrObject().IsWriter() ) + aLocalPos += GetSdrObject()->GetAnchorPos(); long nDX = aLocalPos.X() - aRect.Left(); long nDY = aLocalPos.Y() - aRect.Top(); - mpObj->Move( Size( nDX, nDY ) ); - mpModel->SetChanged(); + GetSdrObject()->Move( Size( nDX, nDY ) ); + GetSdrObject()->getSdrModelFromSdrObject().SetChanged(); } } @@ -1178,9 +1164,9 @@ awt::Size SAL_CALL SvxShape::getSize() { ::SolarMutexGuard aGuard; - if( mpObj.is() && mpModel) + if(HasSdrObject()) { - tools::Rectangle aRect( svx_getLogicRectHack(mpObj.get()) ); + tools::Rectangle aRect( svx_getLogicRectHack(GetSdrObject()) ); Size aObjSize( aRect.getWidth(), aRect.getHeight() ); ForceMetricTo100th_mm(aObjSize); return css::awt::Size( aObjSize.getWidth(), aObjSize.getHeight() ); @@ -1194,26 +1180,26 @@ void SAL_CALL SvxShape::setSize( const awt::Size& rSize ) { ::SolarMutexGuard aGuard; - if( mpObj.is() && mpModel) + if(HasSdrObject()) { // #i123539# optimization for 3D chart object generation: do not use UNO // API commands to get the range, this is too expensive since for 3D // scenes it may recalculate the whole scene since in AOO this depends // on the contained geometry (layouted to show all content) - const bool b3DConstruction(dynamic_cast< E3dObject* >(mpObj.get()) && mpModel->isLocked()); + const bool b3DConstruction(dynamic_cast< E3dObject* >(GetSdrObject()) && GetSdrObject()->getSdrModelFromSdrObject().isLocked()); tools::Rectangle aRect( b3DConstruction ? tools::Rectangle(maPosition.X, maPosition.Y, maSize.Width, maSize.Height) : - svx_getLogicRectHack(mpObj.get()) ); + svx_getLogicRectHack(GetSdrObject()) ); Size aLocalSize( rSize.Width, rSize.Height ); ForceMetricToItemPoolMetric(aLocalSize); - if(mpObj->GetObjInventor() == SdrInventor::Default && mpObj->GetObjIdentifier() == OBJ_MEASURE ) + if(GetSdrObject()->GetObjInventor() == SdrInventor::Default && GetSdrObject()->GetObjIdentifier() == OBJ_MEASURE ) { Fraction aWdt(aLocalSize.Width(),aRect.Right()-aRect.Left()); Fraction aHgt(aLocalSize.Height(),aRect.Bottom()-aRect.Top()); - Point aPt = mpObj->GetSnapRect().TopLeft(); - mpObj->Resize(aPt,aWdt,aHgt); + Point aPt = GetSdrObject()->GetSnapRect().TopLeft(); + GetSdrObject()->Resize(aPt,aWdt,aHgt); } else { @@ -1231,10 +1217,10 @@ void SAL_CALL SvxShape::setSize( const awt::Size& rSize ) else aRect.setHeight(aLocalSize.Height()); - svx_setLogicRectHack( mpObj.get(), aRect ); + svx_setLogicRectHack( GetSdrObject(), aRect ); } - mpModel->SetChanged(); + GetSdrObject()->getSdrModelFromSdrObject().SetChanged(); } maSize = rSize; } @@ -1244,9 +1230,9 @@ void SAL_CALL SvxShape::setSize( const awt::Size& rSize ) OUString SAL_CALL SvxShape::getName( ) { ::SolarMutexGuard aGuard; - if( mpObj.is() ) + if( HasSdrObject() ) { - return mpObj->GetName(); + return GetSdrObject()->GetName(); } else { @@ -1258,9 +1244,9 @@ OUString SAL_CALL SvxShape::getName( ) void SAL_CALL SvxShape::setName( const OUString& aName ) { ::SolarMutexGuard aGuard; - if( mpObj.is() ) + if( HasSdrObject() ) { - mpObj->SetName( aName ); + GetSdrObject()->SetName( aName ); } else { @@ -1296,47 +1282,42 @@ void SAL_CALL SvxShape::dispose() mpImpl->maDisposeListeners.disposeAndClear(aEvt); mpImpl->maPropertyNotifier.disposing(); - if ( mpObj.is() ) + if ( HasSdrObject() ) { + EndListening( GetSdrObject()->getSdrModelFromSdrObject() ); bool bFreeSdrObject = false; - if ( mpObj->IsInserted() && mpObj->GetPage() ) + if ( GetSdrObject()->IsInserted() && GetSdrObject()->GetPage() ) { OSL_ENSURE( HasSdrObjectOwnership(), "SvxShape::dispose: is the below code correct?" ); // normally, we are allowed to free the SdrObject only if we have its ownership. // Why isn't this checked here? - SdrPage* pPage = mpObj->GetPage(); + SdrPage* pPage = GetSdrObject()->GetPage(); // delete the SdrObject from the page const size_t nCount = pPage->GetObjCount(); for ( size_t nNum = 0; nNum < nCount; ++nNum ) { - if ( pPage->GetObj( nNum ) == mpObj.get() ) + if ( pPage->GetObj( nNum ) == GetSdrObject() ) { - OSL_VERIFY( pPage->RemoveObject( nNum ) == mpObj.get() ); + OSL_VERIFY( pPage->RemoveObject( nNum ) == GetSdrObject() ); bFreeSdrObject = true; break; } } } - mpObj->setUnoShape(nullptr); + GetSdrObject()->setUnoShape(nullptr); if ( bFreeSdrObject ) { // in case we have the ownership of the SdrObject, a Free // would do nothing. So ensure the ownership is reset. mpImpl->mbHasSdrObjectOwnership = false; - SdrObject* pObject = mpObj.get(); + SdrObject* pObject = GetSdrObject(); SdrObject::Free( pObject ); } } - - if( mpModel ) - { - EndListening( *mpModel ); - mpModel = nullptr; - } } @@ -1402,19 +1383,20 @@ void SAL_CALL SvxShape::removeVetoableChangeListener( const OUString& , const Re bool SvxShape::SetFillAttribute( sal_uInt16 nWID, const OUString& rName ) { - SfxItemSet aSet( mpModel->GetItemPool(), {{nWID, nWID}} ); - - if( SetFillAttribute( nWID, rName, aSet, mpModel ) ) + if(HasSdrObject()) { - //mpObj->SetItemSetAndBroadcast(aSet); - mpObj->SetMergedItemSetAndBroadcast(aSet); + SfxItemSet aSet( GetSdrObject()->getSdrModelFromSdrObject().GetItemPool(), {{nWID, nWID}} ); - return true; - } - else - { - return false; + if( SetFillAttribute( nWID, rName, aSet, &GetSdrObject()->getSdrModelFromSdrObject() ) ) + { + //GetSdrObject()->SetItemSetAndBroadcast(aSet); + GetSdrObject()->SetMergedItemSetAndBroadcast(aSet); + + return true; + } } + + return false; } @@ -1597,7 +1579,7 @@ void SvxShape::_setPropertyValue( const OUString& rPropertyName, const uno::Any& const SfxItemPropertySimpleEntry* pMap = mpPropSet->getPropertyMapEntry(rPropertyName); - if (!mpObj.is() || !mpModel) + if (!HasSdrObject()) { // Since we have no actual sdr object right now, remember all // properties in a list. These properties will be set when the sdr @@ -1612,6 +1594,7 @@ void SvxShape::_setPropertyValue( const OUString& rPropertyName, const uno::Any& // supported after creation. mpPropSet->setPropertyValue( pMap, rVal ); } + return; } @@ -1626,7 +1609,7 @@ void SvxShape::_setPropertyValue( const OUString& rPropertyName, const uno::Any& "Readonly property can't be set: " + rPropertyName, uno::Reference<drawing::XShape>(this)); - mpModel->SetChanged(); + GetSdrObject()->getSdrModelFromSdrObject().SetChanged(); if (setPropertyValueImpl(rPropertyName, pMap, rVal)) return; @@ -1648,7 +1631,7 @@ void SvxShape::_setPropertyValue( const OUString& rPropertyName, const uno::Any& { if( mpImpl->mpItemSet == nullptr ) { - pSet = mpImpl->mpItemSet = mpObj->GetMergedItemSet().Clone(); + pSet = mpImpl->mpItemSet = GetSdrObject()->GetMergedItemSet().Clone(); } else { @@ -1657,11 +1640,11 @@ void SvxShape::_setPropertyValue( const OUString& rPropertyName, const uno::Any& } else { - pSet = new SfxItemSet( mpModel->GetItemPool(), {{pMap->nWID, pMap->nWID}}); + pSet = new SfxItemSet( GetSdrObject()->getSdrModelFromSdrObject().GetItemPool(), {{pMap->nWID, pMap->nWID}}); } if( pSet->GetItemState( pMap->nWID ) != SfxItemState::SET ) - pSet->Put(mpObj->GetMergedItem(pMap->nWID)); + pSet->Put(GetSdrObject()->GetMergedItem(pMap->nWID)); if( !SvxUnoTextRangeBase::SetPropertyValueHelper( pMap, rVal, *pSet )) { @@ -1670,7 +1653,7 @@ void SvxShape::_setPropertyValue( const OUString& rPropertyName, const uno::Any& if(bIsNotPersist) { // not-persistent attribute, get those extra - mpObj->TakeNotPersistAttr(*pSet); + GetSdrObject()->TakeNotPersistAttr(*pSet); } } @@ -1678,7 +1661,7 @@ void SvxShape::_setPropertyValue( const OUString& rPropertyName, const uno::Any& { // get default from ItemPool if(SfxItemPool::IsWhich(pMap->nWID)) - pSet->Put(mpModel->GetItemPool().GetDefaultItem(pMap->nWID)); + pSet->Put(GetSdrObject()->getSdrModelFromSdrObject().GetItemPool().GetDefaultItem(pMap->nWID)); } if( pSet->GetItemState( pMap->nWID ) == SfxItemState::SET ) @@ -1690,7 +1673,7 @@ void SvxShape::_setPropertyValue( const OUString& rPropertyName, const uno::Any& if(bIsNotPersist) { // set not-persistent attribute extra - mpObj->ApplyNotPersistAttr( *pSet ); + GetSdrObject()->ApplyNotPersistAttr( *pSet ); delete pSet; } else @@ -1699,7 +1682,7 @@ void SvxShape::_setPropertyValue( const OUString& rPropertyName, const uno::Any& // will be set in setPropertyValues later if( !mbIsMultiPropertyCall ) { - mpObj->SetMergedItemSetAndBroadcast( *pSet ); + GetSdrObject()->SetMergedItemSetAndBroadcast( *pSet ); delete pSet; } @@ -1723,7 +1706,7 @@ uno::Any SvxShape::_getPropertyValue( const OUString& PropertyName ) const SfxItemPropertySimpleEntry* pMap = mpPropSet->getPropertyMapEntry(PropertyName); uno::Any aAny; - if( mpObj.is() && mpModel ) + if(HasSdrObject()) { if(pMap == nullptr ) throw beans::UnknownPropertyException( PropertyName, static_cast<cppu::OWeakObject*>(this)); @@ -1733,8 +1716,8 @@ uno::Any SvxShape::_getPropertyValue( const OUString& PropertyName ) DBG_ASSERT( pMap->nWID == SDRATTR_TEXTDIRECTION || (pMap->nWID < SDRATTR_NOTPERSIST_FIRST || pMap->nWID > SDRATTR_NOTPERSIST_LAST), "Not persist item not handled!" ); DBG_ASSERT( pMap->nWID < OWN_ATTR_VALUE_START || pMap->nWID > OWN_ATTR_VALUE_END, "Not item property not handled!" ); - SfxItemSet aSet( mpModel->GetItemPool(), {{pMap->nWID, pMap->nWID}}); - aSet.Put(mpObj->GetMergedItem(pMap->nWID)); + SfxItemSet aSet( GetSdrObject()->getSdrModelFromSdrObject().GetItemPool(), {{pMap->nWID, pMap->nWID}}); + aSet.Put(GetSdrObject()->GetMergedItem(pMap->nWID)); if(SvxUnoTextRangeBase::GetPropertyValueHelper( aSet, pMap, aAny )) return aAny; @@ -1744,7 +1727,7 @@ uno::Any SvxShape::_getPropertyValue( const OUString& PropertyName ) if(pMap->nWID >= SDRATTR_NOTPERSIST_FIRST && pMap->nWID <= SDRATTR_NOTPERSIST_LAST) { // not-persistent attribute, get those extra - mpObj->TakeNotPersistAttr(aSet); + GetSdrObject()->TakeNotPersistAttr(aSet); } } @@ -1752,7 +1735,7 @@ uno::Any SvxShape::_getPropertyValue( const OUString& PropertyName ) { // get default from ItemPool if(SfxItemPool::IsWhich(pMap->nWID)) - aSet.Put(mpModel->GetItemPool().GetDefaultItem(pMap->nWID)); + aSet.Put(GetSdrObject()->getSdrModelFromSdrObject().GetItemPool().GetDefaultItem(pMap->nWID)); } if(aSet.Count()) @@ -1817,8 +1800,8 @@ void SAL_CALL SvxShape::setPropertyValues( const css::uno::Sequence< OUString >& } } - if( mpImpl->mpItemSet && mpObj.is() ) - mpObj->SetMergedItemSetAndBroadcast( *mpImpl->mpItemSet ); + if( mpImpl->mpItemSet && HasSdrObject() ) + GetSdrObject()->SetMergedItemSetAndBroadcast( *mpImpl->mpItemSet ); } @@ -1920,10 +1903,10 @@ uno::Any SvxShape::GetAnyForItem( SfxItemSet const & aSet, const SfxItemProperty case SDRATTR_CIRCKIND: { - if( mpObj->GetObjInventor() == SdrInventor::Default) + if( GetSdrObject()->GetObjInventor() == SdrInventor::Default) { drawing::CircleKind eKind; - switch(mpObj->GetObjIdentifier()) + switch(GetSdrObject()->GetObjIdentifier()) { case OBJ_CIRC: // circle, ellipse eKind = drawing::CircleKind_FULL; @@ -1988,13 +1971,13 @@ beans::PropertyState SvxShape::_getPropertyState( const OUString& PropertyName ) const SfxItemPropertySimpleEntry* pMap = mpPropSet->getPropertyMapEntry(PropertyName); - if( !mpObj.is() || pMap == nullptr ) + if( !HasSdrObject() || pMap == nullptr ) throw beans::UnknownPropertyException( PropertyName, static_cast<cppu::OWeakObject*>(this)); beans::PropertyState eState; if( !getPropertyStateImpl( pMap, eState ) ) { - const SfxItemSet& rSet = mpObj->GetMergedItemSet(); + const SfxItemSet& rSet = GetSdrObject()->GetMergedItemSet(); switch( rSet.GetItemState( pMap->nWID, false ) ) { @@ -2063,7 +2046,7 @@ bool SvxShape::setPropertyValueImpl( const OUString&, const SfxItemPropertySimpl // #90763# position is relative to top left, make it absolute basegfx::B2DPolyPolygon aNewPolyPolygon; basegfx::B2DHomMatrix aNewHomogenMatrix; - mpObj->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon); + GetSdrObject()->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon); aVclPoint.AdjustX(basegfx::fround(aNewHomogenMatrix.get(0, 2)) ); aVclPoint.AdjustY(basegfx::fround(aNewHomogenMatrix.get(1, 2)) ); @@ -2072,12 +2055,12 @@ bool SvxShape::setPropertyValueImpl( const OUString&, const SfxItemPropertySimpl ForceMetricToItemPoolMetric(aVclPoint); // #88491# position relative to anchor - if( mpModel->IsWriter() ) + if( GetSdrObject()->getSdrModelFromSdrObject().IsWriter() ) { - aVclPoint += mpObj->GetAnchorPos(); + aVclPoint += GetSdrObject()->GetAnchorPos(); } - static_cast<SdrCaptionObj*>(mpObj.get())->SetTailPos(aVclPoint); + static_cast<SdrCaptionObj*>(GetSdrObject())->SetTailPos(aVclPoint); return true; } @@ -2091,7 +2074,7 @@ bool SvxShape::setPropertyValueImpl( const OUString&, const SfxItemPropertySimpl basegfx::B2DPolyPolygon aNewPolyPolygon; basegfx::B2DHomMatrix aNewHomogenMatrix; - mpObj->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon); + GetSdrObject()->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon); aNewHomogenMatrix.set(0, 0, aMatrix.Line1.Column1); aNewHomogenMatrix.set(0, 1, aMatrix.Line1.Column2); @@ -2103,7 +2086,7 @@ bool SvxShape::setPropertyValueImpl( const OUString&, const SfxItemPropertySimpl aNewHomogenMatrix.set(2, 1, aMatrix.Line3.Column2); aNewHomogenMatrix.set(2, 2, aMatrix.Line3.Column3); - mpObj->TRSetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon); + GetSdrObject()->TRSetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon); return true; } break; @@ -2114,12 +2097,12 @@ bool SvxShape::setPropertyValueImpl( const OUString&, const SfxItemPropertySimpl sal_Int32 nNewOrdNum = 0; if(rValue >>= nNewOrdNum) { - SdrObjList* pObjList = mpObj->GetObjList(); + SdrObjList* pObjList = GetSdrObject()->GetObjList(); if( pObjList ) { SdrObject* pCheck = - pObjList->SetObjectOrdNum( mpObj->GetOrdNum(), static_cast<size_t>(nNewOrdNum) ); - DBG_ASSERT( pCheck == mpObj.get(), "GetOrdNum() failed!" ); + pObjList->SetObjectOrdNum( GetSdrObject()->GetOrdNum(), static_cast<size_t>(nNewOrdNum) ); + DBG_ASSERT( pCheck == GetSdrObject(), "GetOrdNum() failed!" ); } return true; } @@ -2137,7 +2120,7 @@ bool SvxShape::setPropertyValueImpl( const OUString&, const SfxItemPropertySimpl tools::Rectangle aRect; aRect.SetPos(aTopLeft); aRect.SetSize(aObjSize); - mpObj->SetSnapRect(aRect); + GetSdrObject()->SetSnapRect(aRect); return true; } break; @@ -2147,7 +2130,7 @@ bool SvxShape::setPropertyValueImpl( const OUString&, const SfxItemPropertySimpl bool bMirror; if(rValue >>= bMirror ) { - SdrGrafObj* pObj = dynamic_cast< SdrGrafObj* >( mpObj.get() ); + SdrGrafObj* pObj = dynamic_cast< SdrGrafObj* >( GetSdrObject() ); if( pObj ) pObj->SetMirrored(bMirror); return true; @@ -2162,7 +2145,7 @@ bool SvxShape::setPropertyValueImpl( const OUString&, const SfxItemPropertySimpl case OWN_ATTR_EDGE_END_POS: case OWN_ATTR_EDGE_POLYPOLYGONBEZIER: { - SdrEdgeObj* pEdgeObj = dynamic_cast< SdrEdgeObj* >(mpObj.get()); + SdrEdgeObj* pEdgeObj = dynamic_cast< SdrEdgeObj* >(GetSdrObject()); if(pEdgeObj) { switch(pProperty->nWID) @@ -2196,8 +2179,8 @@ bool SvxShape::setPropertyValueImpl( const OUString&, const SfxItemPropertySimpl // perform metric change before applying anchor position, // because the anchor position is in pool metric. ForceMetricToItemPoolMetric( aPoint ); - if( mpModel->IsWriter() ) - aPoint += mpObj->GetAnchorPos(); + if( GetSdrObject()->getSdrModelFromSdrObject().IsWriter() ) + aPoint += GetSdrObject()->GetAnchorPos(); pEdgeObj->SetTailPoint( pProperty->nWID == OWN_ATTR_EDGE_START_POS, aPoint ); return true; @@ -2238,9 +2221,9 @@ bool SvxShape::setPropertyValueImpl( const OUString&, const SfxItemPropertySimpl { // Reintroduction of fix for issue i59051 (#i108851#) ForceMetricToItemPoolMetric( aNewPolyPolygon ); - if( mpModel->IsWriter() ) + if( GetSdrObject()->getSdrModelFromSdrObject().IsWriter() ) { - Point aPoint( mpObj->GetAnchorPos() ); + Point aPoint( GetSdrObject()->GetAnchorPos() ); aNewPolyPolygon.transform(basegfx::utils::createTranslateB2DHomMatrix(aPoint.X(), aPoint.Y())); } pEdgeObj->SetEdgeTrackPath( aNewPolyPolygon ); @@ -2254,7 +2237,7 @@ bool SvxShape::setPropertyValueImpl( const OUString&, const SfxItemPropertySimpl case OWN_ATTR_MEASURE_START_POS: case OWN_ATTR_MEASURE_END_POS: { - SdrMeasureObj* pMeasureObj = dynamic_cast< SdrMeasureObj* >(mpObj.get()); + SdrMeasureObj* pMeasureObj = dynamic_cast< SdrMeasureObj* >(GetSdrObject()); awt::Point aUnoPoint; if(pMeasureObj && ( rValue >>= aUnoPoint ) ) { @@ -2262,8 +2245,8 @@ bool SvxShape::setPropertyValueImpl( const OUString&, const SfxItemPropertySimpl // Reintroduction of fix for issue #i59051# (#i108851#) ForceMetricToItemPoolMetric( aPoint ); - if( mpModel->IsWriter() ) - aPoint += mpObj->GetAnchorPos(); + if( GetSdrObject()->getSdrModelFromSdrObject().IsWriter() ) + aPoint += GetSdrObject()->GetAnchorPos(); pMeasureObj->NbcSetPoint( aPoint, pProperty->nWID == OWN_ATTR_MEASURE_START_POS ? 0 : 1 ); pMeasureObj->SetChanged(); @@ -2283,8 +2266,8 @@ bool SvxShape::setPropertyValueImpl( const OUString&, const SfxItemPropertySimpl eMode = static_cast<drawing::BitmapMode>(nMode); } - mpObj->SetMergedItem( XFillBmpStretchItem( eMode == drawing::BitmapMode_STRETCH ) ); - mpObj->SetMergedItem( XFillBmpTileItem( eMode == drawing::BitmapMode_REPEAT ) ); + GetSdrObject()->SetMergedItem( XFillBmpStretchItem( eMode == drawing::BitmapMode_STRETCH ) ); + GetSdrObject()->SetMergedItem( XFillBmpTileItem( eMode == drawing::BitmapMode_REPEAT ) ); return true; } @@ -2293,10 +2276,10 @@ bool SvxShape::setPropertyValueImpl( const OUString&, const SfxItemPropertySimpl sal_Int16 nLayerId = sal_Int16(); if( rValue >>= nLayerId ) { - SdrLayer* pLayer = mpModel->GetLayerAdmin().GetLayerPerID(SdrLayerID(nLayerId)); + SdrLayer* pLayer = GetSdrObject()->getSdrModelFromSdrObject().GetLayerAdmin().GetLayerPerID(SdrLayerID(nLayerId)); if( pLayer ) { - mpObj->SetLayer(SdrLayerID(nLayerId)); + GetSdrObject()->SetLayer(SdrLayerID(nLayerId)); return true; } } @@ -2308,10 +2291,10 @@ bool SvxShape::setPropertyValueImpl( const OUString&, const SfxItemPropertySimpl OUString aLayerName; if( rValue >>= aLayerName ) { - const SdrLayer* pLayer=mpModel->GetLayerAdmin().GetLayer(aLayerName); + const SdrLayer* pLayer = GetSdrObject()->getSdrModelFromSdrObject().GetLayerAdmin().GetLayer(aLayerName); if( pLayer != nullptr ) { - mpObj->SetLayer( pLayer->GetID() ); + GetSdrObject()->SetLayer( pLayer->GetID() ); return true; } } @@ -2322,13 +2305,13 @@ bool SvxShape::setPropertyValueImpl( const OUString&, const SfxItemPropertySimpl sal_Int32 nAngle = 0; if( rValue >>= nAngle ) { - Point aRef1(mpObj->GetSnapRect().Center()); - nAngle -= mpObj->GetRotateAngle(); + Point aRef1(GetSdrObject()->GetSnapRect().Center()); + nAngle -= GetSdrObject()->GetRotateAngle(); if (nAngle!=0) { double nSin=sin(nAngle*nPi180); double nCos=cos(nAngle*nPi180); - mpObj->Rotate(aRef1,nAngle,nSin,nCos); + GetSdrObject()->Rotate(aRef1,nAngle,nSin,nCos); } return true; } @@ -2341,12 +2324,12 @@ bool SvxShape::setPropertyValueImpl( const OUString&, const SfxItemPropertySimpl sal_Int32 nShear = 0; if( rValue >>= nShear ) { - nShear -= mpObj->GetShearAngle(); + nShear -= GetSdrObject()->GetShearAngle(); if(nShear != 0 ) { - Point aRef1(mpObj->GetSnapRect().Center()); + Point aRef1(GetSdrObject()->GetSnapRect().Center()); double nTan=tan(nShear*nPi180); - mpObj->Shear(aRef1,nShear,nTan,false); + GetSdrObject()->Shear(aRef1,nShear,nTan,false); return true; } } @@ -2356,7 +2339,7 @@ bool SvxShape::setPropertyValueImpl( const OUString&, const SfxItemPropertySimpl case OWN_ATTR_INTEROPGRABBAG: { - mpObj->SetGrabBagItem(rValue); + GetSdrObject()->SetGrabBagItem(rValue); return true; } @@ -2365,7 +2348,7 @@ bool SvxShape::setPropertyValueImpl( const OUString&, const SfxItemPropertySimpl bool bMoveProtect; if( rValue >>= bMoveProtect ) { - mpObj->SetMoveProtect(bMoveProtect); + GetSdrObject()->SetMoveProtect(bMoveProtect); return true; } break; @@ -2375,7 +2358,7 @@ bool SvxShape::setPropertyValueImpl( const OUString&, const SfxItemPropertySimpl OUString aName; if( rValue >>= aName ) { - mpObj->SetName( aName ); + GetSdrObject()->SetName( aName ); return true; } break; @@ -2387,7 +2370,7 @@ bool SvxShape::setPropertyValueImpl( const OUString&, const SfxItemPropertySimpl OUString aTitle; if( rValue >>= aTitle ) { - mpObj->SetTitle( aTitle ); + GetSdrObject()->SetTitle( aTitle ); return true; } break; @@ -2397,7 +2380,7 @@ bool SvxShape::setPropertyValueImpl( const OUString&, const SfxItemPropertySimpl OUString aDescription; if( rValue >>= aDescription ) { - mpObj->SetDescription( aDescription ); + GetSdrObject()->SetDescription( aDescription ); return true; } break; @@ -2408,7 +2391,7 @@ bool SvxShape::setPropertyValueImpl( const OUString&, const SfxItemPropertySimpl bool bPrintable; if( rValue >>= bPrintable ) { - mpObj->SetPrintable(bPrintable); + GetSdrObject()->SetPrintable(bPrintable); return true; } break; @@ -2418,7 +2401,7 @@ bool SvxShape::setPropertyValueImpl( const OUString&, const SfxItemPropertySimpl bool bVisible; if( rValue >>= bVisible ) { - mpObj->SetVisible(bVisible); + GetSdrObject()->SetVisible(bVisible); return true; } break; @@ -2428,7 +2411,7 @@ bool SvxShape::setPropertyValueImpl( const OUString&, const SfxItemPropertySimpl bool bResizeProtect; if( rValue >>= bResizeProtect ) { - mpObj->SetResizeProtect(bResizeProtect); + GetSdrObject()->SetResizeProtect(bResizeProtect); return true; } break; @@ -2438,19 +2421,16 @@ bool SvxShape::setPropertyValueImpl( const OUString&, const SfxItemPropertySimpl sal_Int32 nPageNum = 0; if( (rValue >>= nPageNum) && ( nPageNum >= 0 ) && ( nPageNum <= 0xffff ) ) { - SdrPageObj* pPageObj = dynamic_cast< SdrPageObj* >(mpObj.get()); + SdrPageObj* pPageObj = dynamic_cast< SdrPageObj* >(GetSdrObject()); if( pPageObj ) { - SdrModel* pModel = pPageObj->GetModel(); + SdrModel& rModel(pPageObj->getSdrModelFromSdrObject()); SdrPage* pNewPage = nullptr; const sal_uInt16 nDestinationPageNum(static_cast<sal_uInt16>((nPageNum << 1) - 1)); - if(pModel) + if(nDestinationPageNum < rModel.GetPageCount()) { - if(nDestinationPageNum < pModel->GetPageCount()) - { - pNewPage = pModel->GetPage(nDestinationPageNum); - } + pNewPage = rModel.GetPage(nDestinationPageNum); } pPageObj->SetReferencedPage(pNewPage); @@ -2498,12 +2478,12 @@ bool SvxShape::getPropertyValueImpl( const OUString&, const SfxItemPropertySimpl { case OWN_ATTR_CAPTION_POINT: { - Point aVclPoint = static_cast<SdrCaptionObj*>(mpObj.get())->GetTailPos(); + Point aVclPoint = static_cast<SdrCaptionObj*>(GetSdrObject())->GetTailPos(); // #88491# make pos relative to anchor - if( mpModel->IsWriter() ) + if( GetSdrObject()->getSdrModelFromSdrObject().IsWriter() ) { - aVclPoint -= mpObj->GetAnchorPos(); + aVclPoint -= GetSdrObject()->GetAnchorPos(); } // #88657# metric of pool maybe twips (writer) @@ -2512,7 +2492,7 @@ bool SvxShape::getPropertyValueImpl( const OUString&, const SfxItemPropertySimpl // #90763# pos is absolute, make it relative to top left basegfx::B2DPolyPolygon aNewPolyPolygon; basegfx::B2DHomMatrix aNewHomogenMatrix; - mpObj->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon); + GetSdrObject()->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon); aVclPoint.AdjustX( -(basegfx::fround(aNewHomogenMatrix.get(0, 2))) ); aVclPoint.AdjustY( -(basegfx::fround(aNewHomogenMatrix.get(1, 2))) ); @@ -2526,7 +2506,7 @@ bool SvxShape::getPropertyValueImpl( const OUString&, const SfxItemPropertySimpl { basegfx::B2DPolyPolygon aNewPolyPolygon; basegfx::B2DHomMatrix aNewHomogenMatrix; - mpObj->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon); + GetSdrObject()->TRGetBaseGeometry(aNewHomogenMatrix, aNewPolyPolygon); drawing::HomogenMatrix3 aMatrix; aMatrix.Line1.Column1 = aNewHomogenMatrix.get(0, 0); @@ -2546,7 +2526,7 @@ bool SvxShape::getPropertyValueImpl( const OUString&, const SfxItemPropertySimpl case OWN_ATTR_ZORDER: { - rValue <<= static_cast<sal_Int32>(mpObj->GetOrdNum()); + rValue <<= static_cast<sal_Int32>(GetSdrObject()->GetOrdNum()); break; } @@ -2561,13 +2541,13 @@ bool SvxShape::getPropertyValueImpl( const OUString&, const SfxItemPropertySimpl case OWN_ATTR_ISFONTWORK: { - rValue <<= dynamic_cast<const SdrTextObj*>(mpObj.get()) != nullptr && static_cast<SdrTextObj*>(mpObj.get())->IsFontwork(); + rValue <<= dynamic_cast<const SdrTextObj*>(GetSdrObject()) != nullptr && static_cast<SdrTextObj*>(GetSdrObject())->IsFontwork(); break; } case OWN_ATTR_FRAMERECT: { - tools::Rectangle aRect( mpObj->GetSnapRect() ); + tools::Rectangle aRect( GetSdrObject()->GetSnapRect() ); Point aTopLeft( aRect.TopLeft() ); Size aObjSize( aRect.GetWidth(), aRect.GetHeight() ); ForceMetricTo100th_mm(aTopLeft); @@ -2581,7 +2561,7 @@ bool SvxShape::getPropertyValueImpl( const OUString&, const SfxItemPropertySimpl case OWN_ATTR_BOUNDRECT: { - tools::Rectangle aRect( mpObj->GetCurrentBoundRect() ); + tools::Rectangle aRect( GetSdrObject()->GetCurrentBoundRect() ); Point aTopLeft( aRect.TopLeft() ); Size aObjSize( aRect.GetWidth(), aRect.GetHeight() ); ForceMetricTo100th_mm(aTopLeft); @@ -2595,7 +2575,7 @@ bool SvxShape::getPropertyValueImpl( const OUString&, const SfxItemPropertySimpl case OWN_ATTR_LDNAME: { - OUString aName( mpObj->GetName() ); + OUString aName( GetSdrObject()->GetName() ); rValue <<= aName; break; } @@ -2603,11 +2583,11 @@ bool SvxShape::getPropertyValueImpl( const OUString&, const SfxItemPropertySimpl case OWN_ATTR_LDBITMAP: { OUString sId; - if( mpObj->GetObjInventor() == SdrInventor::Default && mpObj->GetObjIdentifier() == OBJ_OLE2 ) + if( GetSdrObject()->GetObjInventor() == SdrInventor::Default && GetSdrObject()->GetObjIdentifier() == OBJ_OLE2 ) { sId = RID_UNODRAW_OLE2; } - else if( mpObj->GetObjInventor() == SdrInventor::Default && mpObj->GetObjIdentifier() == OBJ_GRAF ) + else if( GetSdrObject()->GetObjInventor() == SdrInventor::Default && GetSdrObject()->GetObjIdentifier() == OBJ_GRAF ) { sId = RID_UNODRAW_GRAPHICS; } @@ -2626,8 +2606,8 @@ bool SvxShape::getPropertyValueImpl( const OUString&, const SfxItemPropertySimpl case OWN_ATTR_MIRRORED: { bool bMirror = false; - if( mpObj.is() && dynamic_cast<const SdrGrafObj*>(mpObj.get()) != nullptr ) - bMirror = static_cast<SdrGrafObj*>(mpObj.get())->IsMirrored(); + if( HasSdrObject() && dynamic_cast<const SdrGrafObj*>(GetSdrObject()) != nullptr ) + bMirror = static_cast<SdrGrafObj*>(GetSdrObject())->IsMirrored(); rValue <<= bMirror; break; @@ -2641,7 +2621,7 @@ bool SvxShape::getPropertyValueImpl( const OUString&, const SfxItemPropertySimpl case OWN_ATTR_GLUEID_TAIL: case OWN_ATTR_EDGE_POLYPOLYGONBEZIER: { - SdrEdgeObj* pEdgeObj = dynamic_cast<SdrEdgeObj*>(mpObj.get()); + SdrEdgeObj* pEdgeObj = dynamic_cast<SdrEdgeObj*>(GetSdrObject()); if(pEdgeObj) { switch(pProperty->nWID) @@ -2664,8 +2644,8 @@ bool SvxShape::getPropertyValueImpl( const OUString&, const SfxItemPropertySimpl case OWN_ATTR_EDGE_END_POS: { Point aPoint( pEdgeObj->GetTailPoint( pProperty->nWID == OWN_ATTR_EDGE_START_POS ) ); - if( mpModel->IsWriter() ) - aPoint -= mpObj->GetAnchorPos(); + if( GetSdrObject()->getSdrModelFromSdrObject().IsWriter() ) + aPoint -= GetSdrObject()->GetAnchorPos(); ForceMetricTo100th_mm( aPoint ); awt::Point aUnoPoint( aPoint.X(), aPoint.Y() ); @@ -2682,9 +2662,9 @@ bool SvxShape::getPropertyValueImpl( const OUString&, const SfxItemPropertySimpl case OWN_ATTR_EDGE_POLYPOLYGONBEZIER: { basegfx::B2DPolyPolygon aPolyPoly( pEdgeObj->GetEdgeTrackPath() ); - if( mpModel->IsWriter() ) + if( GetSdrObject()->getSdrModelFromSdrObject().IsWriter() ) { - Point aPoint( mpObj->GetAnchorPos() ); + Point aPoint( GetSdrObject()->GetAnchorPos() ); aPolyPoly.transform(basegfx::utils::createTranslateB2DHomMatrix(-aPoint.X(), -aPoint.Y())); } // Reintroduction of fix for issue #i59051# (#i108851#) @@ -2702,12 +2682,12 @@ bool SvxShape::getPropertyValueImpl( const OUString&, const SfxItemPropertySimpl case OWN_ATTR_MEASURE_START_POS: case OWN_ATTR_MEASURE_END_POS: { - SdrMeasureObj* pMeasureObj = dynamic_cast<SdrMeasureObj*>(mpObj.get()); + SdrMeasureObj* pMeasureObj = dynamic_cast<SdrMeasureObj*>(GetSdrObject()); if(pMeasureObj) { Point aPoint( pMeasureObj->GetPoint( pProperty->nWID == OWN_ATTR_MEASURE_START_POS ? 0 : 1 ) ); - if( mpModel->IsWriter() ) - aPoint -= mpObj->GetAnchorPos(); + if( GetSdrObject()->getSdrModelFromSdrObject().IsWriter() ) + aPoint -= GetSdrObject()->GetAnchorPos(); // Reintroduction of fix for issue #i59051# (#i108851#) ForceMetricTo100th_mm( aPoint ); @@ -2721,7 +2701,7 @@ bool SvxShape::getPropertyValueImpl( const OUString&, const SfxItemPropertySimpl case OWN_ATTR_FILLBMP_MODE: { - const SfxItemSet& rObjItemSet = mpObj->GetMergedItemSet(); + const SfxItemSet& rObjItemSet = GetSdrObject()->GetMergedItemSet(); const XFillBmpStretchItem* pStretchItem = &rObjItemSet.Get(XATTR_FILLBMP_STRETCH); const XFillBmpTileItem* pTileItem = &rObjItemSet.Get(XATTR_FILLBMP_TILE); @@ -2741,12 +2721,12 @@ bool SvxShape::getPropertyValueImpl( const OUString&, const SfxItemPropertySimpl break; } case SDRATTR_LAYERID: - rValue <<= sal_uInt16(sal_uInt8(mpObj->GetLayer())); + rValue <<= sal_uInt16(sal_uInt8(GetSdrObject()->GetLayer())); break; case SDRATTR_LAYERNAME: { - SdrLayer* pLayer = mpModel->GetLayerAdmin().GetLayerPerID(mpObj->GetLayer()); + SdrLayer* pLayer = GetSdrObject()->getSdrModelFromSdrObject().GetLayerAdmin().GetLayerPerID(GetSdrObject()->GetLayer()); if( pLayer ) { OUString aName( pLayer->GetName() ); @@ -2756,26 +2736,26 @@ bool SvxShape::getPropertyValueImpl( const OUString&, const SfxItemPropertySimpl } case SDRATTR_ROTATEANGLE: - rValue <<= static_cast<sal_Int32>(mpObj->GetRotateAngle()); + rValue <<= static_cast<sal_Int32>(GetSdrObject()->GetRotateAngle()); break; case SDRATTR_SHEARANGLE: - rValue <<= static_cast<sal_Int32>(mpObj->GetShearAngle()); + rValue <<= static_cast<sal_Int32>(GetSdrObject()->GetShearAngle()); break; case OWN_ATTR_INTEROPGRABBAG: { - mpObj->GetGrabBagItem(rValue); + GetSdrObject()->GetGrabBagItem(rValue); break; } case SDRATTR_OBJMOVEPROTECT: - rValue <<= mpObj->IsMoveProtect(); + rValue <<= GetSdrObject()->IsMoveProtect(); break; case SDRATTR_OBJECTNAME: { - OUString aName( mpObj->GetName() ); + OUString aName( GetSdrObject()->GetName() ); rValue <<= aName; break; } @@ -2783,33 +2763,33 @@ bool SvxShape::getPropertyValueImpl( const OUString&, const SfxItemPropertySimpl // #i68101# case OWN_ATTR_MISC_OBJ_TITLE: { - OUString aTitle( mpObj->GetTitle() ); + OUString aTitle( GetSdrObject()->GetTitle() ); rValue <<= aTitle; break; } case OWN_ATTR_MISC_OBJ_DESCRIPTION: { - OUString aDescription( mpObj->GetDescription() ); + OUString aDescription( GetSdrObject()->GetDescription() ); rValue <<= aDescription; break; } case SDRATTR_OBJPRINTABLE: - rValue <<= mpObj->IsPrintable(); + rValue <<= GetSdrObject()->IsPrintable(); break; case SDRATTR_OBJVISIBLE: - rValue <<= mpObj->IsVisible(); + rValue <<= GetSdrObject()->IsVisible(); break; case SDRATTR_OBJSIZEPROTECT: - rValue <<= mpObj->IsResizeProtect(); + rValue <<= GetSdrObject()->IsResizeProtect(); break; case OWN_ATTR_PAGE_NUMBER: { - SdrPageObj* pPageObj = dynamic_cast<SdrPageObj*>(mpObj.get()); + SdrPageObj* pPageObj = dynamic_cast<SdrPageObj*>(GetSdrObject()); if(pPageObj) { SdrPage* pPage = pPageObj->GetReferencedPage(); @@ -2823,18 +2803,18 @@ bool SvxShape::getPropertyValueImpl( const OUString&, const SfxItemPropertySimpl case OWN_ATTR_UINAME_SINGULAR: { - rValue <<= mpObj->TakeObjNameSingul(); + rValue <<= GetSdrObject()->TakeObjNameSingul(); break; } case OWN_ATTR_UINAME_PLURAL: { - rValue <<= mpObj->TakeObjNamePlural(); + rValue <<= GetSdrObject()->TakeObjNamePlural(); break; } case OWN_ATTR_METAFILE: { - SdrOle2Obj* pObj = dynamic_cast<SdrOle2Obj*>(mpObj.get()); + SdrOle2Obj* pObj = dynamic_cast<SdrOle2Obj*>(GetSdrObject()); if( pObj ) { const Graphic* pGraphic = pObj->GetGraphic(); @@ -2883,7 +2863,7 @@ bool SvxShape::getPropertyStateImpl( const SfxItemPropertySimpleEntry* pProperty { if( pProperty->nWID == OWN_ATTR_FILLBMP_MODE ) { - const SfxItemSet& rSet = mpObj->GetMergedItemSet(); + const SfxItemSet& rSet = GetSdrObject()->GetMergedItemSet(); if( rSet.GetItemState( XATTR_FILLBMP_STRETCH, false ) == SfxItemState::SET || rSet.GetItemState( XATTR_FILLBMP_TILE, false ) == SfxItemState::SET ) @@ -2913,8 +2893,8 @@ bool SvxShape::setPropertyToDefaultImpl( const SfxItemPropertySimpleEntry* pProp { if( pProperty->nWID == OWN_ATTR_FILLBMP_MODE ) { - mpObj->ClearMergedItem( XATTR_FILLBMP_STRETCH ); - mpObj->ClearMergedItem( XATTR_FILLBMP_TILE ); + GetSdrObject()->ClearMergedItem( XATTR_FILLBMP_STRETCH ); + GetSdrObject()->ClearMergedItem( XATTR_FILLBMP_TILE ); return true; } else if((pProperty->nWID >= OWN_ATTR_VALUE_START && pProperty->nWID <= OWN_ATTR_VALUE_END ) || @@ -2962,15 +2942,15 @@ void SvxShape::_setPropertyToDefault( const OUString& PropertyName ) const SfxItemPropertySimpleEntry* pProperty = mpPropSet->getPropertyMapEntry(PropertyName); - if( !mpObj.is() || mpModel == nullptr || pProperty == nullptr ) + if( !HasSdrObject() || pProperty == nullptr ) throw beans::UnknownPropertyException( PropertyName, static_cast<cppu::OWeakObject*>(this)); if( !setPropertyToDefaultImpl( pProperty ) ) { - mpObj->ClearMergedItem( pProperty->nWID ); + GetSdrObject()->ClearMergedItem( pProperty->nWID ); } - mpModel->SetChanged(); + GetSdrObject()->getSdrModelFromSdrObject().SetChanged(); } @@ -2992,7 +2972,7 @@ uno::Any SvxShape::_getPropertyDefault( const OUString& aPropertyName ) const SfxItemPropertySimpleEntry* pMap = mpPropSet->getPropertyMapEntry(aPropertyName); - if( !mpObj.is() || pMap == nullptr || mpModel == nullptr ) + if( !HasSdrObject() || pMap == nullptr ) throw beans::UnknownPropertyException( aPropertyName, static_cast<cppu::OWeakObject*>(this)); if(( pMap->nWID >= OWN_ATTR_VALUE_START && pMap->nWID <= OWN_ATTR_VALUE_END ) || @@ -3005,8 +2985,8 @@ uno::Any SvxShape::_getPropertyDefault( const OUString& aPropertyName ) if(!SfxItemPool::IsWhich(pMap->nWID)) throw beans::UnknownPropertyException( "No WhichID " + OUString::number(pMap->nWID) + " for " + aPropertyName, static_cast<cppu::OWeakObject*>(this)); - SfxItemSet aSet( mpModel->GetItemPool(), {{pMap->nWID, pMap->nWID}}); - aSet.Put(mpModel->GetItemPool().GetDefaultItem(pMap->nWID)); + SfxItemSet aSet( GetSdrObject()->getSdrModelFromSdrObject().GetItemPool(), {{pMap->nWID, pMap->nWID}}); + aSet.Put(GetSdrObject()->getSdrModelFromSdrObject().GetItemPool().GetDefaultItem(pMap->nWID)); return GetAnyForItem( aSet, pMap ); } @@ -3016,15 +2996,15 @@ void SvxShape::setAllPropertiesToDefault() { ::SolarMutexGuard aGuard; - if( !mpObj.is() ) + if( !HasSdrObject() ) throw lang::DisposedException(); - mpObj->ClearMergedItem(); // nWhich == 0 => all + GetSdrObject()->ClearMergedItem(); // nWhich == 0 => all - if(dynamic_cast<const SdrGrafObj*>(mpObj.get()) != nullptr) + if(dynamic_cast<const SdrGrafObj*>(GetSdrObject()) != nullptr) { // defaults for graphic objects have changed: - mpObj->SetMergedItem( XFillStyleItem( drawing::FillStyle_NONE ) ); - mpObj->SetMergedItem( XLineStyleItem( drawing::LineStyle_NONE ) ); + GetSdrObject()->SetMergedItem( XFillStyleItem( drawing::FillStyle_NONE ) ); + GetSdrObject()->SetMergedItem( XLineStyleItem( drawing::LineStyle_NONE ) ); } // #i68523# special handling for Svx3DCharacterModeItem, this is not saved @@ -3032,13 +3012,12 @@ void SvxShape::setAllPropertiesToDefault() // does not load lathe or extrude objects, it is possible to set the items // here. // For other solution possibilities, see task description. - if( dynamic_cast<const E3dLatheObj* >(mpObj.get()) != nullptr|| dynamic_cast<const E3dExtrudeObj* >(mpObj.get()) != nullptr) + if( dynamic_cast<const E3dLatheObj* >(GetSdrObject()) != nullptr|| dynamic_cast<const E3dExtrudeObj* >(GetSdrObject()) != nullptr) { - mpObj->SetMergedItem(Svx3DCharacterModeItem(true)); + GetSdrObject()->SetMergedItem(Svx3DCharacterModeItem(true)); } - if (mpModel) - mpModel->SetChanged(); + GetSdrObject()->getSdrModelFromSdrObject().SetChanged(); } void SvxShape::setPropertiesToDefault( @@ -3126,9 +3105,9 @@ uno::Sequence< OUString > SvxShape::_getSupportedServiceNames() { ::SolarMutexGuard aGuard; - if( mpObj.is() && mpObj->GetObjInventor() == SdrInventor::Default) + if( HasSdrObject() && GetSdrObject()->GetObjInventor() == SdrInventor::Default) { - const sal_uInt16 nIdent = mpObj->GetObjIdentifier(); + const sal_uInt16 nIdent = GetSdrObject()->GetObjIdentifier(); switch(nIdent) { @@ -3653,10 +3632,10 @@ uno::Sequence< OUString > SvxShape::_getSupportedServiceNames() } } } - else if( mpObj.is() && mpObj->GetObjInventor() == SdrInventor::FmForm) + else if( HasSdrObject() && GetSdrObject()->GetObjInventor() == SdrInventor::FmForm) { #if OSL_DEBUG_LEVEL > 0 - const sal_uInt16 nIdent = mpObj->GetObjIdentifier(); + const sal_uInt16 nIdent = GetSdrObject()->GetObjIdentifier(); OSL_ENSURE( nIdent == OBJ_UNO, "SvxShape::_getSupportedServiceNames: SdrInventor::FmForm, but no UNO object?" ); #endif static uno::Sequence< OUString > *pSeq = nullptr; @@ -3687,9 +3666,9 @@ uno::Reference< container::XIndexContainer > SAL_CALL SvxShape::getGluePoints() ::SolarMutexGuard aGuard; uno::Reference< container::XIndexContainer > xGluePoints( mxGluePoints ); - if( mpObj.is() && !xGluePoints.is() ) + if( HasSdrObject() && !xGluePoints.is() ) { - uno::Reference< container::XIndexContainer > xNew( SvxUnoGluePointAccess_createInstance( mpObj.get() ), uno::UNO_QUERY ); + uno::Reference< container::XIndexContainer > xNew( SvxUnoGluePointAccess_createInstance( GetSdrObject() ), uno::UNO_QUERY ); mxGluePoints = xGluePoints = xNew; } @@ -3701,9 +3680,9 @@ uno::Reference<uno::XInterface> SAL_CALL SvxShape::getParent() { ::SolarMutexGuard aGuard; - if( mpObj.is() && mpObj->GetObjList() ) + if( HasSdrObject() && GetSdrObject()->GetObjList() ) { - SdrObjList* pObjList = mpObj->GetObjList(); + SdrObjList* pObjList = GetSdrObject()->GetObjList(); switch (pObjList->GetListKind()) { @@ -3823,7 +3802,7 @@ void SvxShape::updateShapeKind() case OBJ_PATHPOLY: case OBJ_PATHPLIN: { - const sal_uInt32 nId = mpObj->GetObjIdentifier(); + const sal_uInt32 nId = GetSdrObject()->GetObjIdentifier(); if( nId != mpImpl->mnObjId ) { @@ -3838,7 +3817,7 @@ void SvxShape::updateShapeKind() SvxShapeText::SvxShapeText(SdrObject* pObject) : SvxShape( pObject, getSvxMapProvider().GetMap(SVXMAP_TEXT), getSvxMapProvider().GetPropertySet(SVXMAP_TEXT, SdrObject::GetGlobalDrawObjectItemPool()) ), SvxUnoTextBase( ImplGetSvxUnoOutlinerTextCursorSvxPropertySet() ) { - if( pObject && pObject->GetModel() ) + if( pObject ) SetEditSource( new SvxTextEditSource( pObject, nullptr ) ); } @@ -3846,7 +3825,7 @@ SvxShapeText::SvxShapeText(SdrObject* pObject) SvxShapeText::SvxShapeText(SdrObject* pObject, const SfxItemPropertyMapEntry* pPropertyMap, const SvxItemPropertySet* pPropertySet) : SvxShape( pObject, pPropertyMap, pPropertySet ), SvxUnoTextBase( ImplGetSvxUnoOutlinerTextCursorSvxPropertySet() ) { - if( pObject && pObject->GetModel() ) + if( pObject ) SetEditSource( new SvxTextEditSource( pObject, nullptr ) ); } @@ -4002,7 +3981,7 @@ bool SvxShapeText::setPropertyValueImpl( const OUString& rName, const SfxItemPro if( pProperty->nWID == SDRATTR_TEXTDIRECTION ) { - SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( mpObj.get() ); + SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( GetSdrObject() ); if( pTextObj ) { css::text::WritingMode eMode; @@ -4020,7 +3999,7 @@ bool SvxShapeText::getPropertyValueImpl( const OUString& rName, const SfxItemPro { if( pProperty->nWID == SDRATTR_TEXTDIRECTION ) { - SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( mpObj.get() ); + SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( GetSdrObject() ); if( pTextObj && pTextObj->IsVerticalWriting() ) rValue <<= css::text::WritingMode_TB_RL; else diff --git a/svx/source/unodraw/unoshtxt.cxx b/svx/source/unodraw/unoshtxt.cxx index 4cb601c3495f..f09305dd9939 100644 --- a/svx/source/unodraw/unoshtxt.cxx +++ b/svx/source/unodraw/unoshtxt.cxx @@ -80,11 +80,11 @@ class SvxTextEditSourceImpl : public SfxListener, public SfxBroadcaster, public private: oslInterlockedCount maRefCount; - SdrObject* mpObject; + SdrObject* mpObject; // TTTT could be reference (?) SdrText* mpText; SdrView* mpView; VclPtr<const vcl::Window> mpWindow; - SdrModel* mpModel; + SdrModel* mpModel; // TTTT probably not needed -> use SdrModel from SdrObject (?) SdrOutliner* mpOutliner; SvxOutlinerForwarder* mpTextForwarder; SvxDrawOutlinerViewForwarder* mpViewForwarder; // if non-NULL, use GetViewModeTextForwarder text forwarder @@ -147,8 +147,6 @@ public: virtual void ObjectInDestruction(const SdrObject& rObject) override; - void ChangeModel( SdrModel* pNewModel ); - void UpdateOutliner(); }; @@ -159,7 +157,7 @@ SvxTextEditSourceImpl::SvxTextEditSourceImpl( SdrObject* pObject, SdrText* pText mpText ( pText ), mpView ( nullptr ), mpWindow ( nullptr ), - mpModel ( pObject ? pObject->GetModel() : nullptr ), + mpModel ( pObject ? &pObject->getSdrModelFromSdrObject() : nullptr ), // TTTT should be reference mpOutliner ( nullptr ), mpTextForwarder ( nullptr ), mpViewForwarder ( nullptr ), @@ -195,7 +193,7 @@ SvxTextEditSourceImpl::SvxTextEditSourceImpl( SdrObject& rObject, SdrText* pText mpText ( pText ), mpView ( &rView ), mpWindow ( &rWindow ), - mpModel ( rObject.GetModel() ), + mpModel ( &rObject.getSdrModelFromSdrObject() ), // TTTT should be reference mpOutliner ( nullptr ), mpTextForwarder ( nullptr ), mpViewForwarder ( nullptr ), @@ -264,51 +262,6 @@ void SvxTextEditSourceImpl::release() delete this; } -void SvxTextEditSourceImpl::ChangeModel( SdrModel* pNewModel ) -{ - if( mpModel != pNewModel ) - { - if( mpModel ) - EndListening( *mpModel ); - - if( mpOutliner ) - { - if( mpModel ) - mpModel->disposeOutliner( mpOutliner ); - else - delete mpOutliner; - mpOutliner = nullptr; - } - - if( mpView ) - { - EndListening( *mpView ); - mpView = nullptr; - } - - mpWindow = nullptr; - m_xLinguServiceManager.clear(); - - mpModel = pNewModel; - - if( mpTextForwarder ) - { - delete mpTextForwarder; - mpTextForwarder = nullptr; - } - - if( mpViewForwarder ) - { - delete mpViewForwarder; - mpViewForwarder = nullptr; - } - - if( mpModel ) - StartListening( *mpModel ); - } -} - - void SvxTextEditSourceImpl::Notify(SfxBroadcaster& rBC, const SfxHint& rHint) { // #i105988 keep reference to this object @@ -638,7 +591,7 @@ SvxTextForwarder* SvxTextEditSourceImpl::GetBackgroundTextForwarder() bool bVertical = pOutlinerParaObject && pOutlinerParaObject->IsVertical(); // set objects style sheet on empty outliner - SfxStyleSheetPool* pPool = static_cast<SfxStyleSheetPool*>(mpObject->GetModel()->GetStyleSheetPool()); + SfxStyleSheetPool* pPool = static_cast<SfxStyleSheetPool*>(mpObject->getSdrModelFromSdrObject().GetStyleSheetPool()); if( pPool ) mpOutliner->SetStyleSheetPool( pPool ); @@ -709,10 +662,7 @@ SvxTextForwarder* SvxTextEditSourceImpl::GetTextForwarder() return nullptr; if( mpModel == nullptr ) - mpModel = mpObject->GetModel(); - - if( mpModel == nullptr ) - return nullptr; + mpModel = &mpObject->getSdrModelFromSdrObject(); // distinguish the cases // a) connected to view, maybe edit mode is active, can work directly on the EditOutliner @@ -763,10 +713,7 @@ SvxEditViewForwarder* SvxTextEditSourceImpl::GetEditViewForwarder( bool bCreate return nullptr; if( mpModel == nullptr ) - mpModel = mpObject->GetModel(); - - if( mpModel == nullptr ) - return nullptr; + mpModel = &mpObject->getSdrModelFromSdrObject(); // shall we delete? if( mpViewForwarder ) @@ -1108,11 +1055,6 @@ const SvxUnoTextRangeBaseList& SvxTextEditSource::getRanges() const return mpImpl->getRanges(); } -void SvxTextEditSource::ChangeModel( SdrModel* pNewModel ) -{ - mpImpl->ChangeModel( pNewModel ); -} - void SvxTextEditSource::UpdateOutliner() { mpImpl->UpdateOutliner(); diff --git a/svx/source/unogallery/unogaltheme.cxx b/svx/source/unogallery/unogaltheme.cxx index 404a9bb897dd..1bf753bc3066 100644 --- a/svx/source/unogallery/unogaltheme.cxx +++ b/svx/source/unogallery/unogaltheme.cxx @@ -254,13 +254,14 @@ void SAL_CALL GalleryTheme::update( ) uno::Reference< drawing::XDrawPages > xDrawPages( xDrawPagesSupplier->getDrawPages(), uno::UNO_QUERY_THROW ); uno::Reference< drawing::XDrawPage > xPage( xDrawPages->getByIndex( 0 ), uno::UNO_QUERY_THROW ); SvxDrawPage* pUnoPage = xPage.is() ? SvxDrawPage::getImplementation( xPage ) : nullptr; - SdrModel* pOrigModel = pUnoPage ? pUnoPage->GetSdrPage()->GetModel() : nullptr; + SdrModel* pOrigModel = pUnoPage ? &pUnoPage->GetSdrPage()->getSdrModelFromSdrPage() : nullptr; SdrPage* pOrigPage = pUnoPage ? pUnoPage->GetSdrPage() : nullptr; if (pOrigPage && pOrigModel) { FmFormModel* pTmpModel = new FmFormModel(&pOrigModel->GetItemPool()); - SdrPage* pNewPage = pOrigPage->Clone(); + // Clone to new target SdrModel + SdrPage* pNewPage = pOrigPage->Clone(pTmpModel); pTmpModel->InsertPage(pNewPage, 0); uno::Reference< lang::XComponent > xDrawing( new GalleryDrawingModel( pTmpModel ) ); |