1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  *   Licensed to the Apache Software Foundation (ASF) under one or more
12  *   contributor license agreements. See the NOTICE file distributed
13  *   with this work for additional information regarding copyright
14  *   ownership. The ASF licenses this file to you under the Apache
15  *   License, Version 2.0 (the "License"); you may not use this file
16  *   except in compliance with the License. You may obtain a copy of
17  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 #ifndef INCLUDED_SW_INC_NDOLE_HXX
20 #define INCLUDED_SW_INC_NDOLE_HXX
21 
22 #include "ndnotxt.hxx"
23 #include <svtools/embedhlp.hxx>
24 #include <drawinglayer/primitive2d/baseprimitive2d.hxx>
25 #include <rtl/ref.hxx>
26 
27 class SwGrfFormatColl;
28 class SwDoc;
29 class SwOLENode;
30 class SwOLEListener_Impl;
31 class SwEmbedObjectLink;
32 class DeflateData;
33 
34 class SW_DLLPUBLIC SwOLEObj
35 {
36     friend class SwOLENode;
37 
38     const SwOLENode* m_pOLENode;
39     rtl::Reference<SwOLEListener_Impl> m_xListener;
40 
41     /** Either ref or name are known. If only name is known, ref is obtained
42        on demand by GetOleRef() from Sfx. */
43     svt::EmbeddedObjectRef m_xOLERef;
44     OUString m_aName;
45 
46     // eventually buffered data if it is a chart OLE
47     drawinglayer::primitive2d::Primitive2DContainer     m_aPrimitive2DSequence;
48     basegfx::B2DRange                                   m_aRange;
49     std::unique_ptr<DeflateData>                        m_pDeflateData;
50 
51     SwOLEObj( const SwOLEObj& rObj ) = delete;
52 
53     void SetNode( SwOLENode* pNode );
54 
55 public:
56     SwOLEObj( const svt::EmbeddedObjectRef& pObj );
57     SwOLEObj( const OUString &rName, sal_Int64 nAspect );
58     ~SwOLEObj() COVERITY_NOEXCEPT_FALSE;
59 
60     bool UnloadObject();
61     static bool UnloadObject( css::uno::Reference< css::embed::XEmbeddedObject > const & xObj,
62                                 const SwDoc* pDoc,
63                                 sal_Int64 nAspect );
64 
65     OUString GetDescription();
66 
67     css::uno::Reference < css::embed::XEmbeddedObject > const & GetOleRef();
68     svt::EmbeddedObjectRef& GetObject();
GetCurrentPersistName() const69     const OUString& GetCurrentPersistName() const { return m_aName; }
70     OUString GetStyleString();
71     bool IsOleRef() const;  ///< To avoid unnecessary loading of object.
72 
73     // try to get OLE visualization in form of a Primitive2DSequence
74     // and the corresponding B2DRange. This data may be locally buffered
75     drawinglayer::primitive2d::Primitive2DContainer const & tryToGetChartContentAsPrimitive2DSequence(
76         basegfx::B2DRange& rRange,
77         bool bSynchron);
78     void resetBufferedData();
79 
80     void dumpAsXml(xmlTextWriterPtr pWriter) const;
81 };
82 
83 // SwOLENode
84 
85 class SW_DLLPUBLIC SwOLENode: public SwNoTextNode
86 {
87     friend class SwNodes;
88     mutable SwOLEObj maOLEObj;
89     OUString msChartTableName;     ///< with chart objects: name of referenced table.
90     bool   mbOLESizeInvalid; /**< Should be considered at SwDoc::PrtOLENotify
91                                    (e.g. copied). Is not persistent. */
92 
93     SwEmbedObjectLink*  mpObjectLink;
94     OUString maLinkURL;
95 
96     SwOLENode(  const SwNodeIndex &rWhere,
97                 const svt::EmbeddedObjectRef&,
98                 SwGrfFormatColl *pGrfColl,
99                 SwAttrSet const * pAutoAttr );
100 
101     SwOLENode(  const SwNodeIndex &rWhere,
102                 const OUString &rName,
103                 sal_Int64 nAspect,
104                 SwGrfFormatColl *pGrfColl,
105                 SwAttrSet const * pAutoAttr );
106 
107     SwOLENode( const SwOLENode & ) = delete;
108 
109     using SwNoTextNode::GetGraphic;
110 
111 public:
GetOLEObj() const112     const SwOLEObj& GetOLEObj() const { return maOLEObj; }
GetOLEObj()113           SwOLEObj& GetOLEObj()       { return maOLEObj; }
114     virtual ~SwOLENode() override;
115 
116     /// Is in ndcopy.cxx.
117     virtual SwContentNode* MakeCopy(SwDoc*, const SwNodeIndex&, bool bNewFrames) const override;
118 
119     virtual Size GetTwipSize() const override;
120 
121     const Graphic* GetGraphic();
122 
123     void GetNewReplacement();
124 
125     virtual bool SavePersistentData() override;
126     virtual bool RestorePersistentData() override;
127 
128     virtual void dumpAsXml(xmlTextWriterPtr pWriter) const override;
129 
130     bool IsInGlobalDocSection() const;
131     bool IsOLEObjectDeleted() const;
132 
IsOLESizeInvalid() const133     bool IsOLESizeInvalid() const   { return mbOLESizeInvalid; }
SetOLESizeInvalid(bool b)134     void SetOLESizeInvalid( bool b ){ mbOLESizeInvalid = b; }
135 
GetAspect() const136     sal_Int64 GetAspect() const { return maOLEObj.GetObject().GetViewAspect(); }
SetAspect(sal_Int64 nAspect)137     void SetAspect( sal_Int64 nAspect) { maOLEObj.GetObject().SetViewAspect( nAspect ); }
138 
139     /** Remove OLE-object from "memory".
140        inline void Unload() { aOLEObj.Unload(); } */
GetDescription() const141     OUString GetDescription() const { return maOLEObj.GetDescription(); }
142 
143     bool UpdateLinkURL_Impl();
144     void BreakFileLink_Impl();
145     void DisconnectFileLink_Impl();
146 
147     void CheckFileLink_Impl();
148 
149     // #i99665#
150     bool IsChart() const;
151 
GetChartTableName() const152     const OUString& GetChartTableName() const { return msChartTableName; }
SetChartTableName(const OUString & rNm)153     void SetChartTableName( const OUString& rNm ) { msChartTableName = rNm; }
154 
155 
156     // react on visual change (invalidate)
157     void SetChanged();
158 };
159 
160 /// Inline methods from Node.hxx
GetOLENode()161 inline SwOLENode *SwNode::GetOLENode()
162 {
163      return SwNodeType::Ole == m_nNodeType ? static_cast<SwOLENode*>(this) : nullptr;
164 }
165 
GetOLENode() const166 inline const SwOLENode *SwNode::GetOLENode() const
167 {
168      return SwNodeType::Ole == m_nNodeType ? static_cast<const SwOLENode*>(this) : nullptr;
169 }
170 
171 #endif  // _ INCLUDED_SW_INC_NDOLE_HXX
172 
173 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
174