/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
// An frequently programming error is to release the last // reference to this object in the disposing message. // Make it robust, hold a self Reference.
uno::Reference< lang::XComponent > xSelf( this );
// Guard dispose against multiple threading // Remark: It is an error to call dispose more than once
{
std::unique_lock aGuard( m_aMutex ); if( m_bDisposed ) return;
m_bDisposed = true;
}
// Create an event with this as sender
css::document::EventObject aEvt;
aEvt.Source.set(uno::Reference<uno::XInterface>::query( static_cast<lang::XComponent *>(this) )); // inform all listeners to release this object // The listener container are automatically cleared
{
std::unique_lock aGuard( m_aMutex );
maEventListeners.disposeAndClear( aGuard, aEvt );
} // notify subclasses to do their dispose
disposing();
}
if(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 over values, ...)
rtl::Reference<SdrObject> pClonedSdrShape(pObj->CloneSdrObject(mpPage->getSdrModelFromSdrPage()));
pObj->setUnoShape(nullptr);
pClonedSdrShape->setUnoShape(pShape); // pShape->InvalidateSdrObject(); // pShape->Create(pClonedSdrShape, this);
pObj = std::move(pClonedSdrShape);
bNeededToClone = true;
}
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< drawing::XShape > xShapeCheck(pObj->getWeakUnoShape());
pShape->Create( pObj.get(), this );
OSL_ENSURE( pShape->GetSdrObject() == pObj.get(), "SvxDrawPage::add: shape does not know about its newly created SdrObject!" );
if ( !pObj->IsInserted() )
{
mpPage->InsertObject( pObj.get() );
}
pShape->Create( pObj.get(), this );
OSL_ENSURE( pShape->GetSdrObject() == pObj.get(), "SvxDrawPage::add: shape does not know about its newly created SdrObject!" );
if ( !pObj->IsInserted() )
{
mpPage->InsertObject( pObj.get(), 0 );
}
uno::Any SAL_CALL SvxDrawPage::getByIndex( sal_Int32 Index )
{
SolarMutexGuard aGuard;
if( (mpModel == nullptr) || (mpPage == nullptr) ) throw lang::DisposedException(u"Model or Page was already disposed!"_ustr);
if ( Index < 0 || o3tl::make_unsigned(Index) >= mpPage->GetObjCount() ) throw lang::IndexOutOfBoundsException("Index (" + OUString::number(Index)
+ ") needs to be a positive integer smaller than the shape count ("
+ OUString::number(mpPage->GetObjCount()) + ")!");
SdrObject* pObj = mpPage->GetObj( Index ); if( pObj == nullptr ) throw uno::RuntimeException("Runtime exception thrown while getting a ref to the SdrObject at index: "
+ OUString::number(Index));
// ATTENTION: SelectObjectsInView selects the css::drawing::Shapes // only in the given SdrPageView. It hasn't to be the visible SdrPageView. void SvxDrawPage::SelectObjectsInView( const Reference< drawing::XShapes > & aShapes, SdrPageView* pPageView ) noexcept
{
SAL_WARN_IF(!pPageView, "svx", "SdrPageView is NULL!");
SAL_WARN_IF(!mpView, "svx", "SdrView is NULL!");
// ATTENTION: SelectObjectInView selects the shape only in the given SdrPageView. // It hasn't to be the visible SdrPageView. void SvxDrawPage::SelectObjectInView( const Reference< drawing::XShape > & xShape, SdrPageView* pPageView ) noexcept
{
SAL_WARN_IF(!pPageView, "svx", "SdrPageView is NULL!");
SAL_WARN_IF(!mpView, "svx", "SdrView is NULL!");
switch( nInventor )
{ case SdrInventor::FmForm:
{ returnnew SvxShapeControl( pObj );
} case SdrInventor::E3d:
{ switch( nType )
{ case SdrObjKind::E3D_Scene :
pRet = new Svx3DSceneObject( pObj, mpPage ); break; case SdrObjKind::E3D_Cube :
pRet = new Svx3DCubeObject( pObj ); break; case SdrObjKind::E3D_Sphere :
pRet = new Svx3DSphereObject( pObj ); break; case SdrObjKind::E3D_Lathe :
pRet = new Svx3DLatheObject( pObj ); break; case SdrObjKind::E3D_Extrusion :
pRet = new Svx3DExtrudeObject( pObj ); break; case SdrObjKind::E3D_Polygon :
pRet = new Svx3DPolygonObject( pObj ); break; default: // unknown 3D-object on page
assert(false && "the IsInventor3D function must be wrong");
pRet = new SvxShape( pObj ); break;
} break;
} case SdrInventor::Default:
{ switch( nType )
{ case SdrObjKind::Group:
pRet = new SvxShapeGroup( pObj, mpPage ); break; case SdrObjKind::Line:
pRet = new SvxShapePolyPolygon( pObj ); break; case SdrObjKind::Rectangle: case SdrObjKind::Annotation:
pRet = new SvxShapeRect( pObj ); break; case SdrObjKind::CircleOrEllipse: case SdrObjKind::CircleSection: case SdrObjKind::CircleArc: case SdrObjKind::CircleCut:
pRet = new SvxShapeCircle( pObj ); break; case SdrObjKind::Polygon:
pRet = new SvxShapePolyPolygon( pObj ); break; case SdrObjKind::PolyLine:
pRet = new SvxShapePolyPolygon( pObj ); break; case SdrObjKind::PathLine:
pRet = new SvxShapePolyPolygon( pObj ); break; case SdrObjKind::PathFill:
pRet = new SvxShapePolyPolygon( pObj ); break; case SdrObjKind::FreehandLine:
pRet = new SvxShapePolyPolygon( pObj ); break; case SdrObjKind::FreehandFill:
pRet = new SvxShapePolyPolygon( pObj ); break; case SdrObjKind::Caption:
pRet = new SvxShapeCaption( pObj ); break; case SdrObjKind::TitleText: case SdrObjKind::OutlineText: case SdrObjKind::Text:
pRet = new SvxShapeText( pObj ); break; case SdrObjKind::Graphic:
pRet = new SvxGraphicObject( pObj ); break; case SdrObjKind::OLEPluginFrame:
pRet = new SvxFrameShape( pObj, referer ); break; case SdrObjKind::OLE2Applet:
pRet = new SvxAppletShape( pObj, referer ); break; case SdrObjKind::OLE2Plugin:
pRet = new SvxPluginShape( pObj, referer ); break; case SdrObjKind::OLE2:
{ if( pObj && !pObj->IsEmptyPresObj() && mpPage )
{
SdrPage* pSdrPage = mpPage->GetSdrPage(); if( pSdrPage )
{
SdrModel& rSdrModel(pSdrPage->getSdrModelFromSdrPage());
::comphelper::IEmbeddedHelper *pPersist = rSdrModel.GetPersist();
if( aPluginClassId == aClassId )
{
pRet = new SvxPluginShape( pObj, referer );
nType = SdrObjKind::OLE2Plugin;
} elseif( aAppletClassId == aClassId )
{
pRet = new SvxAppletShape( pObj, referer );
nType = SdrObjKind::OLE2Applet;
} elseif( aIFrameClassId == aClassId )
{
pRet = new SvxFrameShape( pObj, referer );
nType = SdrObjKind::OLEPluginFrame;
}
}
}
}
} if( pRet == nullptr )
{
SvxUnoPropertyMapProvider& rSvxMapProvider = getSvxMapProvider();
pRet = new SvxOle2Shape( pObj, referer, rSvxMapProvider.GetMap(SVXMAP_OLE2), rSvxMapProvider.GetPropertySet(SVXMAP_OLE2, SdrObject::GetGlobalDrawObjectItemPool()) );
}
} break; case SdrObjKind::Edge:
pRet = new SvxShapeConnector( pObj ); break; case SdrObjKind::PathPoly:
pRet = new SvxShapePolyPolygon( pObj ); break; case SdrObjKind::PathPolyLine:
pRet = new SvxShapePolyPolygon( pObj ); break; case SdrObjKind::Page:
{
SvxUnoPropertyMapProvider& rSvxMapProvider = getSvxMapProvider();
pRet = new SvxShape( pObj, rSvxMapProvider.GetMap(SVXMAP_PAGE), rSvxMapProvider.GetPropertySet(SVXMAP_PAGE, SdrObject::GetGlobalDrawObjectItemPool()) );
} break; case SdrObjKind::Measure:
pRet = new SvxShapeDimensioning( pObj ); break; case SdrObjKind::UNO:
pRet = new SvxShapeControl( pObj ); break; case SdrObjKind::CustomShape:
pRet = new SvxCustomShape( pObj ); break; case SdrObjKind::Media:
pRet = new SvxMediaShape( pObj, referer ); break; case SdrObjKind::Table:
pRet = new SvxTableShape( pObj ); break; default: // unknown 2D-object on page
assert(false && "Not implemented Starone-Shape created");
pRet = new SvxShapeText( pObj ); break;
} break;
} default: // unknown inventor
{
assert(false && "Unknown Inventor in SvxDrawPage::CreateShape()"); break;
}
}
if(pRet)
{
SdrObjKind nObjId = nType;
switch(nObjId)
{ case SdrObjKind::CircleCut: // segment of circle case SdrObjKind::CircleArc: // arc of circle case SdrObjKind::CircleSection: // sector
nObjId = SdrObjKind::CircleOrEllipse; break;
case SdrObjKind::TitleText: case SdrObjKind::OutlineText:
nObjId = SdrObjKind::Text; break; default: ;
}
// helper that returns true if the given XShape is member of the given // XDrawPage or it's MasterPage (aka associated) bool IsXShapeAssociatedWithXDrawPage( const css::uno::Reference<css::drawing::XShape>& rxShape, const css::uno::Reference< css::drawing::XDrawPage >& rxDrawPage) noexcept
{ if (!rxShape) returnfalse;
if (!rxDrawPage) returnfalse;
const SdrObject* pSdrObject(SdrObject::getSdrObjectFromXShape(rxShape)); if (nullptr == pSdrObject) returnfalse;
SdrPage* pSdrPage(GetSdrPageFromXDrawPage(rxDrawPage)); if (nullptr == pSdrPage) returnfalse;
const SdrPage* pPageFromObj(pSdrObject->getSdrPageFromSdrObject()); if (nullptr == pPageFromObj) returnfalse;
if (pSdrPage == pPageFromObj) // given XShape is member of given XDrawPage returntrue;
if (pSdrPage->TRG_HasMasterPage()) if (&pSdrPage->TRG_GetMasterPage() == pPageFromObj) // given XShape is member of MasterPage of given XDrawPage returntrue;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.