29 #include <osl/diagnose.h>
31 #include <drawview.hxx>
35 #include <document.hxx>
41 #include <globstr.hrc>
46 #include <com/sun/star/embed/NoVisualAreaSizeException.hpp>
47 #include <com/sun/star/embed/Aspects.hpp>
48 #include <com/sun/star/embed/XEmbeddedObject.hpp>
49 #include <com/sun/star/chart2/XChartTypeContainer.hpp>
50 #include <com/sun/star/chart2/XCoordinateSystemContainer.hpp>
51 #include <com/sun/star/chart2/XDataSeriesContainer.hpp>
52 #include <com/sun/star/chart2/XChartDocument.hpp>
60 if ( !AreObjectsMarked() )
69 bool bAnyOle, bOneOle;
70 const SdrMarkList& rMarkList = GetMarkedObjectList();
71 CheckOle( rMarkList, bAnyOle, bOneOle );
80 std::unique_ptr<SdrModel> pModel(CreateMarkedObjModel());
97 pTransferObj->SetDrawPersist( aDragShellRef.
get() );
98 pTransferObj->SetDragSource(
this );
100 SC_MOD()->SetDragObject(
nullptr, pTransferObj.get() );
106 void getRangeFromDataSource( uno::Reference< chart2::data::XDataSource >
const & xDataSource, std::vector<OUString>& rRangeRep)
108 const uno::Sequence<uno::Reference<chart2::data::XLabeledDataSequence> > xSeqs = xDataSource->getDataSequences();
109 for (
const uno::Reference<chart2::data::XLabeledDataSequence>& xLS : xSeqs)
111 uno::Reference<chart2::data::XDataSequence> xSeq = xLS->getValues();
114 OUString aRep = xSeq->getSourceRangeRepresentation();
115 rRangeRep.push_back(aRep);
117 xSeq = xLS->getLabel();
120 OUString aRep = xSeq->getSourceRangeRepresentation();
121 rRangeRep.push_back(aRep);
126 void getRangeFromErrorBar(
const uno::Reference< chart2::XChartDocument >& rChartDoc, std::vector<OUString>& rRangeRep)
128 uno::Reference <chart2::XDiagram > xDiagram = rChartDoc->getFirstDiagram();
132 uno::Reference< chart2::XCoordinateSystemContainer > xCooSysContainer( xDiagram, uno::UNO_QUERY);
133 if(!xCooSysContainer.is())
136 const uno::Sequence< uno::Reference< chart2::XCoordinateSystem > > xCooSysSequence( xCooSysContainer->getCoordinateSystems());
137 for(
const auto& rCooSys : xCooSysSequence)
139 uno::Reference< chart2::XChartTypeContainer > xChartTypeContainer( rCooSys, uno::UNO_QUERY);
140 if(!xChartTypeContainer.is())
143 const uno::Sequence< uno::Reference< chart2::XChartType > > xChartTypeSequence( xChartTypeContainer->getChartTypes() );
144 for(
const auto& rChartType : xChartTypeSequence)
146 uno::Reference< chart2::XDataSeriesContainer > xDataSequenceContainer( rChartType, uno::UNO_QUERY);
147 if(!xDataSequenceContainer.is())
150 const uno::Sequence< uno::Reference< chart2::XDataSeries > > xSeriesSequence( xDataSequenceContainer->getDataSeries() );
151 for(
const uno::Reference<chart2::XDataSeries>& xSeries : xSeriesSequence)
153 uno::Reference< beans::XPropertySet > xPropSet( xSeries, uno::UNO_QUERY);
154 uno::Reference< chart2::data::XDataSource > xErrorBarY;
155 xPropSet->getPropertyValue(
"ErrorBarY") >>= xErrorBarY;
157 getRangeFromDataSource(xErrorBarY, rRangeRep);
158 uno::Reference< chart2::data::XDataSource > xErrorBarX;
159 xPropSet->getPropertyValue(
"ErrorBarX") >>= xErrorBarX;
161 getRangeFromDataSource(xErrorBarX, rRangeRep);
167 void getRangeFromOle2Object(
const SdrOle2Obj& rObj, std::vector<OUString>& rRangeRep)
173 const uno::Reference<embed::XEmbeddedObject>& xObj = rObj.
GetObjRef();
177 uno::Reference<chart2::XChartDocument> xChartDoc(xObj->getComponent(), uno::UNO_QUERY);
181 if(xChartDoc->hasInternalDataProvider())
184 getRangeFromErrorBar(xChartDoc, rRangeRep);
186 uno::Reference<chart2::data::XDataSource> xDataSource(xChartDoc, uno::UNO_QUERY);
187 if (!xDataSource.is())
191 getRangeFromDataSource(xDataSource, rRangeRep);
197 void getOleSourceRanges(
const SdrMarkList& rMarkList,
bool& rAnyOle,
bool& rOneOle, std::vector<ScRange>* pRanges =
nullptr,
const ScDocument* pDoc =
nullptr )
199 bool bCalcSourceRanges = pRanges && pDoc;
200 std::vector<OUString> aRangeReps;
201 rAnyOle = rOneOle =
false;
203 for (
size_t i=0;
i<nCount; ++
i)
214 if (nSdrObjKind == SdrObjKind::OLE2)
217 rOneOle = (nCount == 1);
218 if ( bCalcSourceRanges )
219 getRangeFromOle2Object( static_cast<const SdrOle2Obj&>( *pObj ), aRangeReps );
223 else if ( dynamic_cast<const SdrObjGroup*>( pObj) !=
nullptr )
233 if ( !bCalcSourceRanges )
236 getRangeFromOle2Object( static_cast<const SdrOle2Obj&>( *pSubObj ), aRangeReps );
238 pSubObj = aIter.Next();
243 if (!bCalcSourceRanges)
247 for (
const auto& rRangeRep : aRangeReps)
253 pRanges->insert(pRanges->end(), aRange.
begin(), aRange.
end());
256 pRanges->push_back(aAddr);
264 std::vector<SCTAB>& mrTabs;
266 explicit InsertTabIndex(std::vector<SCTAB>& rTabs) : mrTabs(rTabs) {}
267 void operator() (
const ScRange& rRange)
280 void operator() (
const ScRange& rRange)
286 if (!mrDest.
GetTable(aTabName, nTab))
294 void copyChartRefDataToClipDoc(
ScDocument& rSrcDoc,
ScDocument& rClipDoc,
const std::vector<ScRange>& rRanges)
297 std::vector<SCTAB> aTabs;
298 std::for_each(rRanges.begin(), rRanges.end(), InsertTabIndex(aTabs));
299 std::sort(aTabs.begin(), aTabs.end());
300 aTabs.erase(std::unique(aTabs.begin(), aTabs.end()), aTabs.end());
308 std::vector<SCTAB>::const_iterator it = aTabs.begin(), itEnd = aTabs.end();
309 if (!rSrcDoc.
GetName(*it, aName))
314 for (++it; it != itEnd; ++it)
316 if (!rSrcDoc.
GetName(*it, aName))
322 std::for_each(rRanges.begin(), rRanges.end(), CopyRangeData(rSrcDoc, rClipDoc));
329 getOleSourceRanges( rMarkList, rAnyOle, rOneOle );
334 const SdrMarkList& rMarkList = GetMarkedObjectList();
335 std::vector<ScRange> aRanges;
336 bool bAnyOle =
false, bOneOle =
false;
337 getOleSourceRanges( rMarkList, bAnyOle, bOneOle, &aRanges, &rDoc );
347 copyChartRefDataToClipDoc(rDoc, rClipDoc, aRanges);
349 std::unique_ptr<SdrModel> pModel(CreateMarkedObjModel());
357 ScDocShell* pDocSh = pViewData->GetDocShell();
371 pTransferObj->CopyToClipboard( pViewData->GetActiveWin() );
376 bool bAnyOle, bOneOle;
377 const SdrMarkList& rMarkList = GetMarkedObjectList();
378 CheckOle( rMarkList, bAnyOle, bOneOle );
382 std::unique_ptr<SdrModel> pModel( CreateMarkedObjModel() );
391 ScDocShell* pDocSh = pViewData->GetDocShell();
416 nPPTX /= pViewData->GetDocShell()->GetOutputFactor();
420 rDoc.GetTableArea( nTab, nEndCol, nEndRow );
428 nPPTX, nPPTY, rFractX,rFractY );
433 std::unique_ptr<SdrUndoGroup> pUndoGroup(
new SdrUndoGroup(*GetModel()));
435 const SdrMarkList& rMarkList = GetMarkedObjectList();
438 for (
size_t i=0;
i<nCount; ++
i)
444 if (nIdent == SdrObjKind::OLE2)
447 uno::Reference < embed::XEmbeddedObject > xObj =
static_cast<SdrOle2Obj*
>(pObj)->GetObjRef();
450 sal_Int64 nAspect =
static_cast<SdrOle2Obj*
>(pObj)->GetAspect();
452 if ( nAspect == embed::Aspects::MSOLE_ICON )
454 MapMode aMapMode( MapUnit::Map100thMM );
455 aOriginalSize =
static_cast<SdrOle2Obj*
>(pObj)->GetOrigObjSize( &aMapMode );
463 awt::Size aSz = xObj->getVisualAreaSize( static_cast<SdrOle2Obj*>(pObj)->GetAspect() );
465 Size( aSz.Width, aSz.Height ),
469 }
catch( embed::NoVisualAreaSizeException& )
471 OSL_ENSURE(
false,
"Can't get the original size of the object!" );
476 else if (nIdent == SdrObjKind::Graphic)
481 MapMode aDestMap( MapUnit::Map100thMM );
482 if (aSourceMap.
GetMapUnit() == MapUnit::MapPixel)
486 CalcNormScale( aNormScaleX, aNormScaleY );
506 pUndoGroup->AddAction( std::make_unique<SdrUndoGeoObj>( *pObj ) );
513 if (nDone && pViewData)
515 pUndoGroup->SetComment(
ScResId( STR_UNDO_ORIGINALSIZE ));
516 ScDocShell* pDocSh = pViewData->GetDocShell();
524 const SdrMarkList& rMarkList = GetMarkedObjectList();
528 SAL_WARN(
"sc.ui",
"Fit to cell only works with one graphic!");
537 SAL_WARN(
"sc.ui",
"Fit to cell only works with cell anchored graphics!");
544 SAL_WARN(
"sc.ui",
"Missing ScDrawObjData!");
548 std::unique_ptr<SdrUndoGroup> pUndoGroup(
new SdrUndoGroup(*GetModel()));
556 assert(nWidth &&
"div-by-zero");
557 double fScaleX =
static_cast<double>(aCellRect.
GetWidth()) / static_cast<double>(nWidth);
559 assert(nHeight &&
"div-by-zero");
560 double fScaleY =
static_cast<double>(aCellRect.
GetHeight()) / static_cast<double>(nHeight);
561 double fScaleMin = std::min(fScaleX, fScaleY);
563 aCellRect.
setWidth(static_cast<double>(aGraphicRect.
GetWidth()) * fScaleMin);
567 pUndoGroup->AddAction( std::make_unique<SdrUndoGeoObj>( *pObj ) );
573 pUndoGroup->SetComment(
ScResId( STR_UNDO_FITCELLSIZE ));
574 ScDocShell* pDocSh = pViewData->GetDocShell();
ScRefFlags Parse(std::u16string_view, const ScDocument &, formula::FormulaGrammar::AddressConvention eConv=formula::FormulaGrammar::CONV_OOO, SCTAB nDefaultTab=0, sal_Unicode cDelimiter=0)
size_t GetMarkCount() const
virtual void Resize(const Point &rRef, const Fraction &xFact, const Fraction &yFact, bool bUnsetRelative=true)
OUString ScResId(TranslateId aId)
css::uno::Reference< css::embed::XEmbeddedObject > const & GetObjRef() const
SAL_WARN_UNUSED_RESULT Point LogicToLogic(const Point &rPtSource, const MapMode *pMapModeSource, const MapMode *pMapModeDest) const
void CalcNormScale(Fraction &rFractX, Fraction &rFractY) const
static SfxObjectShell * SetDrawClipDoc(bool bAnyOle)
static ScDrawObjData * GetObjData(SdrObject *pObj, bool bCreate=false)
#define DND_ACTION_COPYMOVE
SdrMark * GetMark(size_t nNum) const
static tools::Rectangle GetCellRect(const ScDocument &rDoc, const ScAddress &rPos, bool bMergedCell)
Returns the rectangle for the passed cell address in 1/100 mm.
virtual SdrObjKind GetObjIdentifier() const
void FillTransferableObjectDescriptor(TransferableObjectDescriptor &rDesc) const
virtual const tools::Rectangle & GetSnapRect() const
SC_DLLPUBLIC void CopyStaticToDocument(const ScRange &rSrcRange, SCTAB nDestTab, ScDocument &rDestDoc)
Copy only raw cell values to another document.
virtual SfxUndoManager * GetUndoManager() override
constexpr tools::Long Width() const
static void SetGlobalDrawPersist(SfxObjectShell *pPersist)
SC_DLLPUBLIC bool GetTable(const OUString &rName, SCTAB &rTab) const
void BeginDrag(vcl::Window *pWindow, const Point &rStartPos)
void SetTabNameOnLoad(SCTAB nTab, const OUString &rName)
SdrObject * GetMarkedSdrObj() const
virtual void AddUndoAction(std::unique_ptr< SfxUndoAction > pAction, bool bTryMerg=false)
void SetScaleX(const Fraction &rScaleX)
static void CheckOle(const SdrMarkList &rMarkList, bool &rAnyOle, bool &rOneOle)
static ScAnchorType GetAnchorType(const SdrObject &)
static tools::SvRef< ScDocShell > xDrawClipDocShellRef
static SC_DLLPUBLIC double nScreenPPTY
Vertical pixel per twips factor.
virtual void AdjustToMaxRect(const tools::Rectangle &rMaxRect, bool bShrinkOnly=false)
::std::vector< ScRange >::const_iterator end() const
void SetScaleY(const Fraction &rScaleY)
MapUnit GetMapUnit() const
Size LogicToLogic(const Size &rSzSource, const MapMode *pMapModeSource, const MapMode *pMapModeDest) const
void SetMarkedOriginalSize()
void AppendTabOnLoad(const OUString &rName)
static MapUnit UnoEmbed2VCLMapUnit(sal_Int32 nUnoEmbedMapUnit)
MapMode GetPrefMapMode() const
constexpr tools::Long Height() const
const INetURLObject & GetURLObject() const
static SC_DLLPUBLIC double nScreenPPTX
Horizontal pixel per twips factor.
const ScDocument & GetDocument() const
OUString GetURLNoPass(DecodeMechanism eMechanism=DecodeMechanism::ToIUri, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
css::uno::Reference< css::datatransfer::XTransferable > CopyToTransferable()
virtual void SetSnapRect(const tools::Rectangle &rRect)
virtual bool shouldKeepAspectRatio() const
#define SAL_WARN(area, stream)
::std::vector< ScRange >::const_iterator begin() const
void SetDrawModified()
SetDrawModified - without Formula update.
SC_DLLPUBLIC ScRefFlags Parse(const OUString &, const ScDocument &, const Details &rDetails=detailsOOOa1, ExternalInfo *pExtInfo=nullptr, const css::uno::Sequence< css::sheet::ExternalLinkInfo > *pExternalLinks=nullptr, sal_Int32 *pSheetEndPos=nullptr, const OUString *pErrRef=nullptr)
virtual const tools::Rectangle & GetLogicRect() const
static void CalcScale(const ScDocument &rDoc, SCTAB nTab, SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, const OutputDevice *pDev, const Fraction &rZoomX, const Fraction &rZoomY, double nPPTX, double nPPTY, Fraction &rScaleX, Fraction &rScaleY)
SC_DLLPUBLIC bool GetName(SCTAB nTab, OUString &rName) const
SfxMedium * GetMedium() const