/* -*- 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 .
*/
Point aPos(rPos);
ImpGetPasteObjList(aPos,pLst);
ImpLimitToWorkArea( aPos ); if (pLst==nullptr) returnfalse;
SdrLayerID nLayer; if (!ImpGetPasteLayer(pLst,nLayer)) returnfalse; bool bUnmark = (nOptions & (SdrInsertFlags::DONTMARK|SdrInsertFlags::ADDMARK))==SdrInsertFlags::NONE && !IsTextEdit(); if (bUnmark) UnmarkAllObj();
tools::Rectangle aTextRect(0,0,500,500);
SdrPage* pPage=pLst->getSdrPageFromSdrObjList(); if (pPage!=nullptr) {
aTextRect.SetSize(pPage->GetSize());
}
rtl::Reference<SdrRectObj> pObj = new SdrRectObj(
getSdrModelFromSdrView(),
SdrObjKind::Text,
aTextRect);
pObj->SetLayer(nLayer);
pObj->NbcSetText(rStr); // SetText before SetAttr, else SetAttr doesn't work! if (mpDefaultStyleSheet!=nullptr) pObj->NbcSetStyleSheet(mpDefaultStyleSheet, false);
pObj->SetMergedItemSet(maDefaultAttr);
SfxItemSet aTempAttr(GetModel().GetItemPool()); // no fill, no line
aTempAttr.Put(XLineStyleItem(drawing::LineStyle_NONE));
aTempAttr.Put(XFillStyleItem(drawing::FillStyle_NONE));
bool SdrExchangeView::Paste(SvStream& rInput, EETextFormat eFormat, const Point& rPos, SdrObjList* pLst, SdrInsertFlags nOptions)
{
Point aPos(rPos);
ImpGetPasteObjList(aPos,pLst);
ImpLimitToWorkArea( aPos ); if (pLst==nullptr) returnfalse;
SdrLayerID nLayer; if (!ImpGetPasteLayer(pLst,nLayer)) returnfalse; bool bUnmark=(nOptions&(SdrInsertFlags::DONTMARK|SdrInsertFlags::ADDMARK))==SdrInsertFlags::NONE && !IsTextEdit(); if (bUnmark) UnmarkAllObj();
tools::Rectangle aTextRect(0,0,500,500);
SdrPage* pPage=pLst->getSdrPageFromSdrObjList(); if (pPage!=nullptr) {
aTextRect.SetSize(pPage->GetSize());
}
rtl::Reference<SdrRectObj> pObj = new SdrRectObj(
getSdrModelFromSdrView(),
SdrObjKind::Text,
aTextRect);
pObj->SetLayer(nLayer); if (mpDefaultStyleSheet!=nullptr) pObj->NbcSetStyleSheet(mpDefaultStyleSheet, false);
pObj->SetMergedItemSet(maDefaultAttr);
SfxItemSet aTempAttr(GetModel().GetItemPool()); // no fill, no line
aTempAttr.Put(XLineStyleItem(drawing::LineStyle_NONE));
aTempAttr.Put(XFillStyleItem(drawing::FillStyle_NONE));
// #i13033# // New mechanism to re-create the connections of cloned connectors
CloneList aCloneList;
std::unordered_set<rtl::OUString> aNameSet; for (size_t nOb=0; nOb<nObjCount; ++nOb)
{ const SdrObject* pSrcOb=pSrcPg->GetObj(nOb);
if (bMark) { // Don't already set Markhandles! // That is instead being done by ModelHasChanged in MarkView.
MarkObj(pNewObj.get(),pMarkPV,false,true);
}
bool bMark = pMarkPV!=nullptr && !IsTextEdit() && (nOptions&SdrInsertFlags::DONTMARK)==SdrInsertFlags::NONE; if (bMark)
{ // select object the first PageView we found
MarkObj(pObj,pMarkPV);
}
}
if (aBmp.IsEmpty() && rMarkList.GetMarkCount() != 0)
{ // choose conversion directly using primitives to bitmap to avoid // rendering errors with tiled bitmap fills (these will be tiled in a // in-between metafile, but tend to show 'gaps' since the target is *no* // bitmap rendering)
::std::vector< SdrObject* > aSdrObjects(GetMarkedObjects()); const size_t nCount(aSdrObjects.size());
// collect sub-primitives as group objects, thus no expensive append // to existing sequence is needed
drawinglayer::primitive2d::Primitive2DContainer xPrimitives(nCount);
for (size_t a(0); a < nCount; a++)
{ const SdrObject* pCandidate = aSdrObjects[a];
if (auto pSdrGrafObj = dynamic_cast<const SdrGrafObj*>(pCandidate))
{ // #122753# To ensure existence of graphic content, force swap in
pSdrGrafObj->ForceSwapIn();
}
drawinglayer::primitive2d::Primitive2DContainer xRetval;
pCandidate->GetViewContact().getViewIndependentPrimitive2DContainer(xRetval);
xPrimitives[a] = new drawinglayer::primitive2d::GroupPrimitive2D(
std::move(xRetval));
}
// get logic range const drawinglayer::geometry::ViewInformation2D aViewInformation2D; const basegfx::B2DRange aRange(xPrimitives.getB2DRange(aViewInformation2D));
if (GetModel().IsWriter())
{
eRangeUnit = o3tl::Length::twip;
}
// if we have geometry and it has a range, convert to BitmapEx using // common tooling
aBmp = drawinglayer::convertPrimitive2DContainerToBitmapEx(
std::move(xPrimitives),
aRange,
nMaximumQuadraticPixels,
eRangeUnit,
rTargetDPI);
}
}
// moving the result is more reliable then setting a relative MapMode at the VDev (used // before), also see #i99268# in GetObjGraphic() below. Some draw actions at // the OutDev are simply not handled correctly when a MapMode is set at the // target device, e.g. MetaFloatTransparentAction. Even the Move for this action // was missing the manipulation of the embedded Metafile
aMtf.Move(-aBound.Left(), -aBound.Top());
aMtf.SetPrefMapMode( aMap );
// removed PrefSize extension. It is principally wrong to set a reduced size at // the created MetaFile. The mentioned errors occur at output time since the integer // MapModes from VCL lead to errors. It is now corrected in the VCLRenderer for // primitives (and may later be done in breaking up a MetaFile to primitives)
aMtf.SetPrefSize(aBoundSize);
}
}
// tdf#155479 bSVG: need to know it's SVG export, default is false
Graphic SdrExchangeView::GetObjGraphic(const SdrObject& rSdrObject, bool bSVG)
{
Graphic aRet;
if (!rSdrObject.HasText())
{ // 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->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();
}
} elseif (pSdrOle2Obj)
{ if (const Graphic* pGraphic = pSdrOle2Obj->GetGraphic())
{
aRet = *pGraphic;
}
} else
{ // Support extracting a snapshot from video media, if possible. const SdrMediaObj* pSdrMediaObj = dynamic_cast<const SdrMediaObj*>(&rSdrObject); if (pSdrMediaObj)
{ const css::uno::Reference<css::graphic::XGraphic>& xGraphic
= pSdrMediaObj->getSnapshot(); if (xGraphic.is())
aRet = Graphic(xGraphic);
}
}
}
// 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());
// #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());
for( size_t n = 0, nCount = rMarkList.GetMarkCount(); n < nCount; ++n )
{
SdrMark* pMark = rMarkList.GetMark( n );
// paint objects on control layer on top of all other objects if( nControlLayerId == pMark->GetMarkedSdrObj()->GetLayer() )
rObjVector2.push_back( pMark ); else
rObjVector1.push_back( pMark );
}
// do processing
aPainter.ProcessDisplay(aDisplayInfo);
}
}
std::unique_ptr<SdrModel> SdrExchangeView::CreateMarkedObjModel() const
{ // Sorting the MarkList here might be problematic in the future, so // use a copy. const SdrMarkList& rMarkList = GetMarkedObjectList();
rMarkList.ForceSort();
std::unique_ptr<SdrModel> pNewModel(GetModel().AllocModel());
rtl::Reference<SdrPage> pNewPage = pNewModel->AllocPage(false);
pNewModel->InsertPage(pNewPage.get());
::std::vector< SdrObject* > aSdrObjects(GetMarkedObjects());
// #i13033# // New mechanism to re-create the connections of cloned connectors
CloneList aCloneList;
if(nullptr != dynamic_cast< const SdrPageObj* >(pObj))
{ // convert SdrPageObj's to a graphic representation, because // virtual connection to referenced page gets lost in new model
pNewObj = new SdrGrafObj(
*pNewModel,
GetObjGraphic(*pObj),
pObj->GetLogicRect());
} elseif(nullptr != dynamic_cast< const sdr::table::SdrTableObj* >(pObj))
{ // check if we have a valid selection *different* from whole table // being selected if(mxSelectionController.is())
{
pNewObj = mxSelectionController->GetMarkedSdrObjClone(*pNewModel);
}
}
if(!pNewObj)
{ // not cloned yet if(pObj->GetObjIdentifier() == SdrObjKind::OLE2 && nullptr == GetModel().GetPersist())
{ // tdf#125520 - former fix was wrong, the SdrModel // has to have a GetPersist() already, see task. // We can still warn here when this is not the case
SAL_WARN( "svx", "OLE gets cloned Persist, EmbeddedObjectContainer will not be copied" );
}
// use default way
pNewObj = pObj->CloneSdrObject(*pNewModel);
}
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.