/* -*- 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 .
*/
while(!maList.empty())
{ // remove last object from list
rtl::Reference<SdrObject> pObj(maList.back());
RemoveObjectFromContainer(maList.size()-1);
// flushViewObjectContacts() is done since SdrObject::Free is not guaranteed // to delete the object and thus refresh visualisations
pObj->GetViewContact().flushViewObjectContacts();
// sent remove hint (after removal, see RemoveObject()) // TTTT SdrPage not needed, can be accessed using SdrObject
SdrHint aHint(SdrHintKind::ObjectRemoved, *pObj, getSdrPageFromSdrObjList());
pObj->getSdrModelFromSdrObject().Broadcast(aHint);
if(nullptr == getSdrObjectFromSdrObjList() && nullptr == getSdrPageFromSdrObjList())
{
OSL_ENSURE(false, "SdrObjList which is not part of SdrPage or SdrObject (!)"); return;
}
// Wires up the connections
aCloneList.CopyConnections(); #ifdef DBG_UTIL if (nCloneErrCnt != 0)
{
OStringBuffer aStr("SdrObjList::operator=(): Error when cloning ");
void SdrObjList::NbcInsertObject(SdrObject* pObj, size_t nPos)
{
DBG_ASSERT(pObj!=nullptr,"SdrObjList::NbcInsertObject(NULL)"); if (pObj==nullptr) return;
DBG_ASSERT(!pObj->IsInserted(),"The object already has the status Inserted."); const size_t nCount = GetObjCount(); if (nPos>nCount) nPos=nCount;
InsertObjectIntoContainer(*pObj,nPos);
if (nPos<nCount) mbObjOrdNumsDirty=true;
pObj->SetOrdNum(nPos);
pObj->setParentOfSdrObject(this);
// Inform the parent about change to allow invalidations at // evtl. existing parent visualisations
impChildInserted(*pObj);
if (!mbRectsDirty) {
mbRectsDirty = true;
}
pObj->InsertedStateChange(); // calls the UserCall (among others)
}
// if anchor is used, reset it before grouping if(getSdrObjectFromSdrObjList())
{ const Point& rAnchorPos = pObj->GetAnchorPos(); if(rAnchorPos.X() || rAnchorPos.Y())
pObj->NbcSetAnchorPos(Point());
}
// do insert to new group
NbcInsertObject(pObj, nPos);
// In case the object is inserted into a group and doesn't overlap with // the group's other members, it needs an own repaint.
SdrObject* pParentSdrObject(getSdrObjectFromSdrObjList());
if(pParentSdrObject)
{ // only repaint here
pParentSdrObject->ActionChanged();
}
// TODO: We need a different broadcast here! // Repaint from object number ... (heads-up: GroupObj) if(pObj->getSdrPageFromSdrObject() && !pObj->getSdrModelFromSdrObject().isLocked())
{
SdrHint aHint(SdrHintKind::ObjectInserted, *pObj);
pObj->getSdrModelFromSdrObject().Broadcast(aHint);
}
DBG_ASSERT(pObj!=nullptr,"Could not find object to remove."); if (pObj!=nullptr)
{ // flushViewObjectContacts() clears the VOC's and those invalidate
pObj->GetViewContact().flushViewObjectContacts();
DBG_ASSERT(pObj->IsInserted(),"The object does not have the status Inserted.");
// tdf#121022 Do first remove from SdrObjList - InsertedStateChange // relies now on IsInserted which uses getParentSdrObjListFromSdrObject
pObj->setParentOfSdrObject(nullptr);
// calls UserCall, among other
pObj->InsertedStateChange();
if (!mbObjOrdNumsDirty)
{ // optimizing for the case that the last object has to be removed if (nObjNum+1!=nCount) {
mbObjOrdNumsDirty=true;
}
}
SetSdrObjListRectsDirty();
} return pObj;
}
DBG_ASSERT(pObj!=nullptr,"Object to remove not found."); if(pObj)
{ // flushViewObjectContacts() clears the VOC's and those invalidate
pObj->GetViewContact().flushViewObjectContacts();
DBG_ASSERT(pObj->IsInserted(),"The object does not have the status Inserted.");
// TODO: We need a different broadcast here. if (pObj->getSdrPageFromSdrObject()!=nullptr)
{
SdrHint aHint(SdrHintKind::ObjectRemoved, *pObj);
pObj->getSdrModelFromSdrObject().Broadcast(aHint);
}
pObj->getSdrModelFromSdrObject().SetChanged();
// tdf#121022 Do first remove from SdrObjList - InsertedStateChange // relies now on IsInserted which uses getParentSdrObjListFromSdrObject
pObj->setParentOfSdrObject(nullptr);
// calls, among other things, the UserCall
pObj->InsertedStateChange();
if (!mbObjOrdNumsDirty)
{ // optimization for the case that the last object is removed if (nObjNum+1!=nCount) {
mbObjOrdNumsDirty=true;
}
}
if(pParentSdrObject && !GetObjCount())
{ // empty group created; it needs to be repainted since it's // visualization changes
pParentSdrObject->ActionChanged();
}
} return pObj;
}
rtl::Reference<SdrObject> pObj=maList[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.");
// TODO: We need a different broadcast here. if (pObj->getSdrPageFromSdrObject()!=nullptr)
{
SdrHint aHint(SdrHintKind::ObjectRemoved, *pObj);
pObj->getSdrModelFromSdrObject().Broadcast(aHint);
}
// Change parent and replace in SdrObjList
pObj->setParentOfSdrObject(nullptr);
ReplaceObjectInContainer(*pNewObj,nObjNum);
// tdf#121022 InsertedStateChange uses the parent // to detect if pObj is inserted or not, so have to call // it *after* changing these settings, else an obviously wrong // 'SdrUserCallType::Inserted' would be sent
pObj->InsertedStateChange();
// flushViewObjectContacts() clears the VOC's and those // trigger the evtl. needed invalidate(s)
pObj->GetViewContact().flushViewObjectContacts();
// Setup data at new SdrObject - it already *is* inserted to // the SdrObjList due to 'ReplaceObjectInContainer' above
pNewObj->SetOrdNum(nObjNum);
pNewObj->setParentOfSdrObject(this);
// Inform the parent about change to allow invalidations at // evtl. existing parent visualisations, but also react on // newly inserted SdrObjects (as e.g. GraphCtrlUserCall does)
impChildInserted(*pNewObj);
pNewObj->InsertedStateChange();
// TODO: We need a different broadcast here. if (pNewObj->getSdrPageFromSdrObject()!=nullptr) {
SdrHint aHint(SdrHintKind::ObjectInserted, *pNewObj);
pNewObj->getSdrModelFromSdrObject().Broadcast(aHint);
}
rtl::Reference<SdrObject> pObj=maList[nOldObjNum]; if (nOldObjNum==nNewObjNum) return pObj.get();
DBG_ASSERT(pObj!=nullptr,"SdrObjList::SetObjectOrdNum: Object not found."); if (pObj!=nullptr) {
DBG_ASSERT(pObj->IsInserted(),"SdrObjList::SetObjectOrdNum: the object does not have status Inserted.");
RemoveObjectFromContainer(nOldObjNum);
InsertObjectIntoContainer(*pObj,nNewObjNum);
// No need to delete visualisation data since same object // gets inserted again. Also a single ActionChanged is enough
pObj->ActionChanged();
// TODO: We need a different broadcast here. if (pObj->getSdrPageFromSdrObject()!=nullptr)
pObj->getSdrModelFromSdrObject().Broadcast(SdrHint(SdrHintKind::ObjectChange, *pObj));
pObj->getSdrModelFromSdrObject().SetChanged();
} return pObj.get();
}
void SdrObjList::SetExistingObjectOrdNum(SdrObject* pObj, size_t nNewObjNum)
{
assert(std::find(maList.begin(), maList.end(), pObj) != maList.end() && "This method requires that the child object already be inserted");
assert(pObj->IsInserted() && "SdrObjList::SetObjectOrdNum: the object does not have status Inserted.");
// I am deliberately bypassing getOrdNum() because I don't want to unnecessarily // trigger RecalcObjOrdNums() const sal_uInt32 nOldOrdNum = pObj->m_nOrdNum; if (!mbObjOrdNumsDirty && nOldOrdNum == nNewObjNum) return;
// Update the navigation positions. if (HasObjectNavigationOrder())
{
unotools::WeakReference<SdrObject> aReference (pObj); auto iObject = ::std::find(
mxNavigationOrder->begin(),
mxNavigationOrder->end(),
aReference);
mxNavigationOrder->erase(iObject);
mbIsNavigationOrderDirty = true; // The new object does not have a user defined position so append it // to the list.
pObj->SetNavigationPosition(mxNavigationOrder->size());
mxNavigationOrder->push_back(pObj);
} if (nOldOrdNum < maList.size() && maList[nOldOrdNum] == pObj)
maList.erase(maList.begin()+nOldOrdNum); else
{ auto it = std::find(maList.begin(), maList.end(), pObj);
maList.erase(it);
} // Insert object into object list. Because the insert() method requires // a valid iterator as insertion position, we have to use push_back() to // insert at the end of the list. if (nNewObjNum >= maList.size())
maList.push_back(pObj); else
maList.insert(maList.begin()+nNewObjNum, pObj);
mbObjOrdNumsDirty=true;
// No need to delete visualisation data since same object // gets inserted again. Also a single ActionChanged is enough
pObj->ActionChanged();
// TODO: We need a different broadcast here. if (pObj->getSdrPageFromSdrObject()!=nullptr)
pObj->getSdrModelFromSdrObject().Broadcast(SdrHint(SdrHintKind::ObjectChange, *pObj));
pObj->getSdrModelFromSdrObject().SetChanged();
}
void SdrObjList::sort( std::vector<sal_Int32>& sortOrder)
{ // no negative indexes and indexes larger than maList size are allowed auto it = std::find_if( sortOrder.begin(), sortOrder.end(), [this](const sal_Int32& rIt)
{ return ( rIt < 0 || o3tl::make_unsigned(rIt) >= maList.size() ); } ); if ( it != sortOrder.end()) throw css::lang::IllegalArgumentException(u"negative index of shape"_ustr, nullptr, 1);
// no duplicates
std::vector<bool> aNoDuplicates(sortOrder.size(), false); for (const sal_Int32 nSortOrder : sortOrder )
{
size_t idx = static_cast<size_t>( nSortOrder );
if ( aNoDuplicates[idx] ) throw css::lang::IllegalArgumentException(u"duplicate index of shape"_ustr, nullptr, 2);
aNoDuplicates[idx] = true;
}
// example sortOrder [2 0 1] // example maList [T T S T T] ( T T = shape with textbox, S = just a shape ) // (shapes at positions 0 and 2 have a textbox)
if ( maList.size() > 1)
{ for (size_t i = 1; i< maList.size(); ++i)
{ // if this shape is a textbox, then look at its left neighbour // (shape this textbox is in) // and insert the number of textboxes to the left of it if (maList[i]->IsTextBox())
aShapesWithTextbox.insert( i - 1 - aShapesWithTextbox.size() );
} // example aShapesWithTextbox [0 2]
}
if (aShapesWithTextbox.size() != maList.size() - sortOrder.size())
{ throw lang::IllegalArgumentException(u"mismatch of no. of shapes"_ustr, nullptr, 0);
}
for (size_t i = 0; i< sortOrder.size(); ++i)
{
if (aShapesWithTextbox.count(sortOrder[i]) > 0)
aDuplicates.push_back(sortOrder[i]);
const tools::Rectangle& SdrObjList::GetAllObjBoundRect() const
{ // #i106183# for deep group hierarchies like in chart2, the invalidates // through the hierarchy are not correct; use a 2nd hint for the needed // recalculation. Future versions will have no bool flag at all, but // just maSdrObjListOutRect in empty state to represent an invalid state, thus // it's a step in the right direction. if (mbRectsDirty || maSdrObjListOutRect.IsEmpty())
{ const_cast<SdrObjList*>(this)->RecalcRects(); const_cast<SdrObjList*>(this)->mbRectsDirty=false;
} return maSdrObjListOutRect;
}
/** steps over all available objects and reformats all edge objects that are connected to other objects so that they may reposition themselves.
*/ void SdrObjList::ReformatAllEdgeObjects()
{
ImplReformatAllEdgeObjects(*this);
}
void SdrObjList::ImplReformatAllEdgeObjects(const SdrObjList& rObjList)
{ // #i120437# go over whole hierarchy, not only over object level null (seen from grouping) for(size_t nIdx(0), nCount(rObjList.GetObjCount()); nIdx < nCount; ++nIdx)
{
SdrObject* pSdrObject(rObjList.GetObjectForNavigationPosition(nIdx)); const SdrObjList* pChildren(pSdrObject->getChildrenOfSdrObject()); constbool bIsGroup(nullptr != pChildren); if(!bIsGroup)
{ // Check IsVirtualObj because sometimes we get SwDrawVirtObj here if (pSdrObject->GetObjIdentifier() == SdrObjKind::Edge
&& !pSdrObject->IsVirtualObj())
{
SdrEdgeObj* pSdrEdgeObj = static_cast< SdrEdgeObj* >(pSdrObject);
pSdrEdgeObj->Reformat();
}
} else
{
ImplReformatAllEdgeObjects(*pChildren);
}
}
}
void SdrObjList::UnGroupObj( size_t nObjNum )
{ // if the given object is no group, this method is a noop
SdrObject* pUngroupObj = GetObj( nObjNum ); if( pUngroupObj )
{
SdrObjList* pSrcLst = pUngroupObj->GetSubList(); if(pSrcLst) if(auto pUngroupGroup = dynamic_cast<SdrObjGroup*>( pUngroupObj))
{ // ungroup recursively (has to be head recursion, // otherwise our indices will get trashed when doing it in // the loop)
pSrcLst->FlattenGroups();
// the position at which we insert the members of rUngroupGroup
size_t nInsertPos( pUngroupGroup->GetOrdNum() );
void SdrObjList::SetObjectNavigationPosition (
SdrObject& rObject, const sal_uInt32 nNewPosition)
{ // When the navigation order container has not yet been created then // create one now. It is initialized with the z-order taken from // maList. if (!mxNavigationOrder)
{
mxNavigationOrder.emplace(maList.begin(), maList.end());
}
OSL_ASSERT(bool(mxNavigationOrder));
OSL_ASSERT( mxNavigationOrder->size() == maList.size());
// Look up the object whose navigation position is to be changed. auto iObject = ::std::find(
mxNavigationOrder->begin(),
mxNavigationOrder->end(),
aReference); if (iObject == mxNavigationOrder->end())
{ // The given object is not a member of the navigation order. return;
}
// Move the object to its new position. const sal_uInt32 nOldPosition = ::std::distance(mxNavigationOrder->begin(), iObject); if (nOldPosition == nNewPosition) return;
mxNavigationOrder->erase(iObject);
sal_uInt32 nInsertPosition (nNewPosition); // Adapt insertion position for the just erased object. if (nNewPosition >= nOldPosition)
nInsertPosition -= 1; if (nInsertPosition >= mxNavigationOrder->size())
mxNavigationOrder->push_back(aReference); else
mxNavigationOrder->insert(mxNavigationOrder->begin()+nInsertPosition, aReference);
mbIsNavigationOrderDirty = true;
// The navigation order is written out to file so mark the model as modified.
rObject.getSdrModelFromSdrObject().SetChanged();
}
SdrObject* SdrObjList::GetObjectForNavigationPosition (const sal_uInt32 nNavigationPosition) const
{ if (HasObjectNavigationOrder())
{ // There is a user defined navigation order. Make sure the object // index is correct and look up the object in mxNavigationOrder. if (nNavigationPosition >= mxNavigationOrder->size())
{
OSL_ASSERT(nNavigationPosition < mxNavigationOrder->size());
} else return (*mxNavigationOrder)[nNavigationPosition].get().get();
} else
{ // There is no user defined navigation order. Use the z-order // instead. if (nNavigationPosition >= maList.size())
{
OSL_ASSERT(nNavigationPosition < maList.size());
} else return maList[nNavigationPosition].get();
} return nullptr;
}
// Update the navigation positions. if (HasObjectNavigationOrder())
{ // The new object does not have a user defined position so append it // to the list.
rObject.SetNavigationPosition(mxNavigationOrder->size());
mxNavigationOrder->push_back(&rObject);
}
// Insert object into object list. Because the insert() method requires // a valid iterator as insertion position, we have to use push_back() to // insert at the end of the list. if (nInsertPosition >= maList.size())
maList.push_back(&rObject); else
maList.insert(maList.begin()+nInsertPosition, &rObject);
mbObjOrdNumsDirty=true;
}
// Update the navigation positions. if (HasObjectNavigationOrder())
{ // A user defined position of the object that is to be replaced is // not transferred to the new object so erase the former and append // the later object from/to the navigation order.
OSL_ASSERT(nObjectPosition < maList.size());
unotools::WeakReference<SdrObject> aReference (maList[nObjectPosition].get()); auto iObject = ::std::find(
mxNavigationOrder->begin(),
mxNavigationOrder->end(),
aReference); if (iObject != mxNavigationOrder->end())
mxNavigationOrder->erase(iObject);
void SdrPageProperties::setTheme(std::shared_ptr<model::Theme> const& pTheme)
{ // Only set the theme on a master page, else set it on the model
if (mrSdrPage.IsMasterPage())
{ if (mpTheme != pTheme)
mpTheme = pTheme;
} else
{
mrSdrPage.getSdrModelFromSdrPage().setTheme(pTheme);
}
}
std::shared_ptr<model::Theme> const& SdrPageProperties::getTheme() const
{ // If the page theme is available use that, else get the theme from the model if (mpTheme) return mpTheme; else return mrSdrPage.getSdrModelFromSdrPage().getTheme();
}
// tell all the registered PageUsers that the page is in destruction // This causes some (all?) PageUsers to remove themselves from the list // of page users. Therefore we have to use a copy of the list for the // iteration.
sdr::PageUserVector aListCopy (maPageUsers.begin(), maPageUsers.end()); for(sdr::PageUser* pPageUser : aListCopy)
{
DBG_ASSERT(pPageUser, "SdrPage::~SdrPage: corrupt PageUser list (!)");
pPageUser->PageInDestruction(*this);
}
// Clear the vector. This means that user do not need to call RemovePageUser() // when they get called from PageInDestruction().
maPageUsers.clear();
// copy all the local parameters to make this instance // a valid copy of source page before copying and inserting // the contained objects
mbMaster = rSrcPage.mbMaster;
mbPageBorderOnlyLeftRight = rSrcPage.mbPageBorderOnlyLeftRight;
mnWidth = rSrcPage.mnWidth;
mnHeight = rSrcPage.mnHeight;
mnBorderLeft = rSrcPage.mnBorderLeft;
mnBorderUpper = rSrcPage.mnBorderUpper;
mnBorderRight = rSrcPage.mnBorderRight;
mnBorderLower = rSrcPage.mnBorderLower;
mbBackgroundFullSize = rSrcPage.mbBackgroundFullSize;
m_nPageNum = rSrcPage.m_nPageNum;
void SdrPage::SetOrientation(Orientation eOri)
{ // square: handle like portrait format
Size aSiz(GetSize()); if (aSiz.Width()!=aSiz.Height()) { if ((eOri==Orientation::Portrait) == (aSiz.Width()>aSiz.Height())) { // coverity[swapped_arguments : FALSE] - this is in the correct order
SetSize(Size(aSiz.Height(),aSiz.Width()));
}
}
}
Orientation SdrPage::GetOrientation() const
{ // square: handle like portrait format
Orientation eRet=Orientation::Portrait;
Size aSiz(GetSize()); if (aSiz.Width()>aSiz.Height()) eRet=Orientation::Landscape; return eRet;
}
// #i68775# React on PageNum changes (from Model in most cases) void SdrPage::SetPageNum(sal_uInt16 nNew)
{ if(nNew != m_nPageNum)
{ // change
m_nPageNum = nNew;
// notify visualisations, also notifies e.g. buffered MasterPages
ActionChanged();
}
}
sal_uInt16 SdrPage::GetPageNum() const
{ if (!mbInserted) return 0;
if (mbMaster) { if (getSdrModelFromSdrPage().IsMPgNumsDirty())
getSdrModelFromSdrPage().RecalcPageNums(true);
} else { if (getSdrModelFromSdrPage().IsPagNumsDirty())
getSdrModelFromSdrPage().RecalcPageNums(false);
} return m_nPageNum;
}
void SdrPage::SetChanged()
{ // For test purposes, use the new ViewContact for change // notification now.
ActionChanged();
getSdrModelFromSdrPage().SetChanged();
}
// the flushViewObjectContacts() will do needed invalidates by deleting the involved VOCs
mpMasterPageDescriptor->GetUsedPage().GetViewContact().flushViewObjectContacts();
mpMasterPageDescriptor.reset();
}
}
SdrPage& SdrPage::TRG_GetMasterPage() const
{
DBG_ASSERT(mpMasterPageDescriptor != nullptr, "TRG_GetMasterPage(): No MasterPage available. Use TRG_HasMasterPage() before access (!)"); return mpMasterPageDescriptor->GetUsedPage();
}
const SdrLayerIDSet& SdrPage::TRG_GetMasterPageVisibleLayers() const
{
DBG_ASSERT(mpMasterPageDescriptor != nullptr, "TRG_GetMasterPageVisibleLayers(): No MasterPage available. Use TRG_HasMasterPage() before access (!)"); return mpMasterPageDescriptor->GetVisibleLayers();
}
void SdrPage::TRG_SetMasterPageVisibleLayers(const SdrLayerIDSet& rNew)
{
DBG_ASSERT(mpMasterPageDescriptor != nullptr, "TRG_SetMasterPageVisibleLayers(): No MasterPage available. Use TRG_HasMasterPage() before access (!)");
mpMasterPageDescriptor->SetVisibleLayers(rNew);
}
sdr::contact::ViewContact& SdrPage::TRG_GetMasterPageDescriptorViewContact() const
{
DBG_ASSERT(mpMasterPageDescriptor != nullptr, "TRG_GetMasterPageDescriptorViewContact(): No MasterPage available. Use TRG_HasMasterPage() before access (!)"); return mpMasterPageDescriptor->GetViewContact();
}
// used from SdrModel::RemoveMasterPage void SdrPage::TRG_ImpMasterPageRemoved(const SdrPage& rRemovedPage)
{ if(TRG_HasMasterPage())
{ if(&TRG_GetMasterPage() == &rRemovedPage)
{
TRG_ClearMasterPage();
}
}
}
void SdrPage::MakePageObjectsNamesUnique()
{
std::unordered_set<OUString> aNameSet; for (const rtl::Reference<SdrObject>& pObj : *this)
{ if (!pObj->GetName().isEmpty())
{
pObj->MakeNameUnique(aNameSet);
SdrObjList* pSdrObjList = pObj->GetSubList(); // group if (pSdrObjList)
{
SdrObject* pListObj;
SdrObjListIter aIter(pSdrObjList, SdrIterMode::DeepWithGroups); while (aIter.IsMore())
{
pListObj = aIter.Next();
pListObj->MakeNameUnique(aNameSet);
}
}
}
}
}
/** returns an averaged background color of this page */ // #i75566# GetBackgroundColor -> GetPageBackgroundColor and bScreenDisplay hint value
Color SdrPage::GetPageBackgroundColor( SdrPageView const * pView, bool bScreenDisplay ) const
{
Color aColor;
if(!IsMasterPage() && TRG_HasMasterPage())
{ if(drawing::FillStyle_NONE == pBackgroundFill->Get(XATTR_FILLSTYLE).GetValue())
{ // See unomodel.cxx: "It is guaranteed, that after a standard page the corresponding notes page follows." bool notesPage = GetPageNum() % 2 == 0;
if (!comphelper::LibreOfficeKit::isActive() || !notesPage || !getSdrModelFromSdrPage().IsImpress())
pBackgroundFill = &TRG_GetMasterPage().getSdrPageProperties().GetItemSet(); else
{ /* See sdrmasterpagedescriptor.cxx: e.g. the Notes MasterPage has no StyleSheet set (and there maybe others).
*/
// This is a notes page. Try to get itemset from standard page's master. if (getSdrModelFromSdrPage().GetPage(GetPageNum() - 1))
pBackgroundFill = &getSdrModelFromSdrPage().GetPage(GetPageNum() - 1)->TRG_GetMasterPage().getSdrPageProperties().GetItemSet(); else
pBackgroundFill = &TRG_GetMasterPage().getSdrPageProperties().GetItemSet();
}
}
}
if (auto oColor = GetDraftFillColor(*pBackgroundFill))
aColor = *oColor;
return aColor;
}
/** *deprecated, use GetBackgroundColor with SdrPageView */
Color SdrPage::GetPageBackgroundColor() const // #i75566# GetBackgroundColor -> GetPageBackgroundColor
{ return GetPageBackgroundColor( nullptr );
}
/** this method returns true if the object from the ViewObjectContact should be visible on this page while rendering. bEdit selects if visibility test is for an editing view or a final render, like printing.
*/ bool SdrPage::checkVisibility( const sdr::contact::ViewObjectContact& /*rOriginal*/, const sdr::contact::DisplayInfo& /*rDisplayInfo*/, bool/*bEdit*/)
{ // this will be handled in the application if needed 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.