LibreOffice Module sw (master) 1
dcontact.hxx
Go to the documentation of this file.
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_DCONTACT_HXX
20#define INCLUDED_SW_INC_DCONTACT_HXX
21
22#include <svx/svdobj.hxx>
23#include <svx/svdovirt.hxx>
24#include "fmtanchr.hxx"
25#include "frmfmt.hxx"
26#include <list>
27#include <vector>
28#include <memory>
29
30#include "calbck.hxx"
32
33class SwFlyFrame;
34class SwFrame;
35class SwPageFrame;
37class SwFlyDrawObj;
38class SwRect;
39class SwDrawContact;
40struct SwPosition;
41class SdrTextObj;
42class SwContact;
43
50inline const SwFrameFormat *FindFrameFormat( const SdrObject *pObj )
51{ return ::FindFrameFormat( const_cast<SdrObject*>(pObj) ); }
52bool HasWrap( const SdrObject* pObj );
53
54void setContextWritingMode( SdrObject* pObj, SwFrame const * pAnchor );
55
58
61
63bool IsMarqueeTextObj( const SdrObject& rObj );
64
66class SAL_DLLPUBLIC_RTTI SwContact : public SdrObjUserCall, public SwClient
67{
72
93 void MoveObjToLayer( const bool _bToVisible,
94 SdrObject* _pDrawObj );
95
96protected:
97 void SetInDTOR();
98 virtual void SwClientNotify(const SwModify&, const SfxHint& rHint) override;
99
100public:
101
103 SwContact( SwFrameFormat *pToRegisterIn );
104 virtual ~SwContact() override;
105
106 virtual const SwAnchoredObject* GetAnchoredObj( const SdrObject* _pSdrObj ) const = 0;
107 virtual SwAnchoredObject* GetAnchoredObj( SdrObject* _pSdrObj ) = 0;
108
109 virtual const SdrObject *GetMaster() const = 0;
110 virtual SdrObject *GetMaster() = 0;
111
112 SwFrameFormat *GetFormat() { return static_cast<SwFrameFormat*>(GetRegisteredIn()); }
114 { return static_cast<const SwFrameFormat*>(GetRegisteredIn()); }
115
116 bool IsInDTOR() const { return mbInDTOR;}
117
125 virtual void MoveObjToVisibleLayer( SdrObject* _pDrawObj );
126
134 virtual void MoveObjToInvisibleLayer( SdrObject* _pDrawObj );
135
139 {
140 assert( GetFormat() );
141
142 return GetFormat()->GetAnchor();
143 }
144
145 RndStdIds GetAnchorId() const { return GetAnchorFormat().GetAnchorId(); }
146 bool ObjAnchoredAtPage() const { return GetAnchorId() == RndStdIds::FLY_AT_PAGE; }
147 bool ObjAnchoredAtFly() const { return GetAnchorId() == RndStdIds::FLY_AT_FLY; }
148 bool ObjAnchoredAtPara() const { return GetAnchorId() == RndStdIds::FLY_AT_PARA; }
149 bool ObjAnchoredAtChar() const { return GetAnchorId() == RndStdIds::FLY_AT_CHAR; }
150 bool ObjAnchoredAsChar() const { return GetAnchorId() == RndStdIds::FLY_AS_CHAR; }
151
153 {
154 assert( GetAnchorFormat().GetContentAnchor() );
155 return *(GetAnchorFormat().GetContentAnchor());
156 }
157
159 virtual void GetAnchoredObjs( std::vector<SwAnchoredObject*>& _roAnchoredObjs ) const = 0;
160
164 sal_uInt32 GetMinOrdNum() const;
165
169 sal_uInt32 GetMaxOrdNum() const;
170};
171
176{
177private:
178 typedef std::unique_ptr< SwFlyDrawObj, SdrObjectFreeOp > SwFlyDrawObjPtr;
179
181 void SwClientNotify(const SwModify&, const SfxHint& rHint) override;
182 sal_uInt32 GetOrdNumForNewRef(const SwFlyFrame* pFly, SwFrame const& rAnchorFrame);
183
184public:
185
187 SwFlyDrawContact(SwFlyFrameFormat* pToRegisterIn, SdrModel& rTargetModel);
188 static SwVirtFlyDrawObj* CreateNewRef(SwFlyFrame* pFly, SwFlyFrameFormat* pFormat, SwFrame const& rAnchorFrame);
189 virtual ~SwFlyDrawContact() override;
190
191 virtual const SwAnchoredObject* GetAnchoredObj( const SdrObject* _pSdrObj ) const override;
192 virtual SwAnchoredObject* GetAnchoredObj( SdrObject* _pSdrObj ) override;
193
194 virtual const SdrObject* GetMaster() const override
195 { return const_cast<SwFlyDrawContact*>(this)->GetMaster(); };
196 virtual SdrObject* GetMaster() override;
197
201 virtual void MoveObjToVisibleLayer( SdrObject* _pDrawObj ) override;
202 virtual void MoveObjToInvisibleLayer( SdrObject* _pDrawObj ) override;
203
205 virtual void GetAnchoredObjs( std::vector<SwAnchoredObject*>& _roAnchoredObjs ) const override;
206};
207
212class SwDrawVirtObj final : public SdrVirtObj
213{
214 private:
215 // data for connection to writer layout
219
224
228 virtual std::unique_ptr<sdr::contact::ViewContact> CreateObjectSpecificViewContact() override;
229
230 // protected destructor
231 virtual ~SwDrawVirtObj() override;
232
233 public:
235 SdrModel& rSdrModel,
236 SdrObject& _rNewObj,
237 SwDrawContact& _rDrawContact);
238 // copy constructor
239 SwDrawVirtObj(SdrModel& rSdrModel, SwDrawVirtObj const & rSource);
240
242 virtual Point GetOffset() const override;
243
244 virtual SwDrawVirtObj* CloneSdrObject(SdrModel& rTargetModel) const override;
245
249 const SwFrame* GetAnchorFrame() const;
252
254 void AddToDrawingPage(SwFrame const& rAnchorFrame);
256
259 bool IsConnected() const;
260
261 virtual void NbcSetAnchorPos(const Point& rPnt) override;
262
264 virtual void RecalcBoundRect() override;
265 virtual ::basegfx::B2DPolyPolygon TakeXorPoly() const override;
266 virtual ::basegfx::B2DPolyPolygon TakeContour() const override;
267 virtual void AddToHdlList(SdrHdlList& rHdlList) const override;
268 virtual void NbcMove(const Size& rSiz) override;
269 virtual void NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact) override;
270 virtual void NbcRotate(const Point& rRef, Degree100 nAngle, double sn, double cs) override;
271 virtual void NbcMirror(const Point& rRef1, const Point& rRef2) override;
272 virtual void NbcShear(const Point& rRef, Degree100 nAngle, double tn, bool bVShear) override;
273 virtual void Move(const Size& rSiz) override;
274 virtual void Resize(const Point& rRef, const Fraction& xFact, const Fraction& yFact, bool bUnsetRelative = true) override;
275 virtual void Rotate(const Point& rRef, Degree100 nAngle, double sn, double cs) override;
276 virtual void Mirror(const Point& rRef1, const Point& rRef2) override;
277 virtual void Shear(const Point& rRef, Degree100 nAngle, double tn, bool bVShear) override;
278 virtual void RecalcSnapRect() override;
279 virtual const tools::Rectangle& GetSnapRect() const override;
280 virtual void SetSnapRect(const tools::Rectangle& rRect) override;
281 virtual void NbcSetSnapRect(const tools::Rectangle& rRect) override;
282 virtual const tools::Rectangle& GetLogicRect() const override;
283 virtual void SetLogicRect(const tools::Rectangle& rRect) override;
284 virtual void NbcSetLogicRect(const tools::Rectangle& rRect) override;
285 virtual Point GetSnapPoint(sal_uInt32 i) const override;
286 virtual Point GetPoint(sal_uInt32 i) const override;
287 virtual void NbcSetPoint(const Point& rPnt, sal_uInt32 i) override;
288
289 virtual bool HasTextEdit() const override;
290
291 virtual SdrLayerID GetLayer() const override;
292 virtual void NbcSetLayer(SdrLayerID nLayer) override;
293 virtual void SetLayer(SdrLayerID nLayer) override;
294
295 virtual void SetBoundRectDirty() override;
296 virtual const tools::Rectangle& GetCurrentBoundRect() const override;
297 virtual const tools::Rectangle& GetLastBoundRect() const override;
298};
299
300bool CheckControlLayer( const SdrObject *pObj );
301
305typedef std::unique_ptr< SwDrawVirtObj, SdrObjectFreeOp > SwDrawVirtObjPtr;
306
307class SAL_DLLPUBLIC_RTTI SwDrawContact final : public SwContact
308{
309 private:
313
315 std::vector< SwDrawVirtObjPtr > maDrawVirtObjs;
316
320
324
331
332 friend class NestedUserCallHdl;
333
334
335 void RemoveAllVirtObjs();
336
337 void InvalidateObjs_( const bool _bUpdateSortedObjsList = false );
338
339 SwDrawContact( const SwDrawContact& ) = delete;
341
342 virtual void SwClientNotify(const SwModify&, const SfxHint& rHint) override;
343
344 public:
345
346 SwDrawContact( SwFrameFormat *pToRegisterIn, SdrObject *pObj );
347 virtual ~SwDrawContact() override;
348
349 virtual const SwAnchoredObject* GetAnchoredObj( const SdrObject* _pSdrObj ) const override;
350 virtual SwAnchoredObject* GetAnchoredObj( SdrObject* _pSdrObj ) override;
351
352 virtual const SdrObject* GetMaster() const override
353 { return const_cast<SwDrawContact*>(this)->GetMaster(); };
354 virtual SdrObject* GetMaster() override;
355
356 const SwFrame* GetAnchorFrame( const SdrObject* _pDrawObj = nullptr ) const;
357 SwFrame* GetAnchorFrame( SdrObject const * _pDrawObj = nullptr );
358
360 {
361 return maAnchoredDrawObj.GetPageFrame();
362 }
364 {
365 return maAnchoredDrawObj.GetPageFrame();
366 }
367 void ChkPage();
368 SwPageFrame* FindPage( const SwRect &rRect );
369
373 void ConnectToLayout( const SwFormatAnchor *pAnch = nullptr );
376 void InsertMasterIntoDrawPage();
377
378 void DisconnectFromLayout( bool _bMoveMasterToInvisibleLayer = true );
381 void DisconnectObjFromLayout( SdrObject* _pDrawObj );
388 void RemoveMasterFromDrawPage();
389
392 SdrObject* GetDrawObjectByAnchorFrame( const SwFrame& _rAnchorFrame );
393
395 virtual void Changed(const SdrObject& rObj, SdrUserCallType eType, const tools::Rectangle& rOldBoundRect) override;
396
399 void Changed_(const SdrObject& rObj, SdrUserCallType eType, const tools::Rectangle* pOldBoundRect);
400
402 void ChangeMasterObject( SdrObject *pNewMaster );
403
404 SwDrawVirtObj* AddVirtObj(SwFrame const& rAnchorFrame);
405
406 void NotifyBackgroundOfAllVirtObjs( const tools::Rectangle* pOldBoundRect );
407
410 static void GetTextObjectsFromFormat( std::list<SdrTextObj*>&, SwDoc& );
411 virtual void GetAnchoredObjs( std::vector<SwAnchoredObject*>& _roAnchoredObjs ) const override;
412};
413
414#endif
415
416/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
helper class for method <SwDrawContact::Changed_(..)> for handling nested <SdrObjUserCall> events
Definition: dcontact.cxx:1018
virtual void Changed(const SdrObject &rObj, SdrUserCallType eType, const tools::Rectangle &rOldBoundRect)
class for the positioning of drawing objects
wrapper class for the positioning of Writer fly frames and drawing objects
SwPageFrame * GetPageFrame()
const SwModify * GetRegisteredIn() const
Definition: calbck.hxx:164
virtual void SwClientNotify(const SwModify &, const SfxHint &rHint) override
Definition: calbck.cxx:120
Base class for the following contact objects (frame + draw objects).
Definition: dcontact.hxx:67
virtual const SwAnchoredObject * GetAnchoredObj(const SdrObject *_pSdrObj) const =0
virtual SdrObject * GetMaster()=0
bool IsInDTOR() const
Definition: dcontact.hxx:116
virtual const SdrObject * GetMaster() const =0
bool ObjAnchoredAtPage() const
Definition: dcontact.hxx:146
bool ObjAnchoredAsChar() const
Definition: dcontact.hxx:150
bool ObjAnchoredAtFly() const
Definition: dcontact.hxx:147
virtual void MoveObjToVisibleLayer(SdrObject *_pDrawObj)
method to move drawing object to corresponding visible layer
Definition: dcontact.cxx:210
const SwFrameFormat * GetFormat() const
Definition: dcontact.hxx:113
const SwPosition & GetContentAnchor() const
Definition: dcontact.hxx:152
virtual void SwClientNotify(const SwModify &, const SfxHint &rHint) override
Definition: dcontact.cxx:421
virtual void GetAnchoredObjs(std::vector< SwAnchoredObject * > &_roAnchoredObjs) const =0
get data collection of anchored objects, handled by with contact
bool ObjAnchoredAtChar() const
Definition: dcontact.hxx:149
bool ObjAnchoredAtPara() const
Definition: dcontact.hxx:148
virtual void MoveObjToInvisibleLayer(SdrObject *_pDrawObj)
method to move drawing object to corresponding invisible layer
Definition: dcontact.cxx:237
const SwFormatAnchor & GetAnchorFormat() const
some virtual helper methods for information about the object (Writer fly frame resp.
Definition: dcontact.hxx:138
bool mbInDTOR
boolean, indicating destruction of contact object important note: boolean has to be set at the beginn...
Definition: dcontact.hxx:71
RndStdIds GetAnchorId() const
Definition: dcontact.hxx:145
virtual SwAnchoredObject * GetAnchoredObj(SdrObject *_pSdrObj)=0
SwFrameFormat * GetFormat()
Definition: dcontact.hxx:112
Definition: doc.hxx:188
bool mbDisconnectInProgress
internal flag to indicate that disconnect from layout is in progress
Definition: dcontact.hxx:323
SwDrawContact & operator=(const SwDrawContact &)=delete
std::vector< SwDrawVirtObjPtr > maDrawVirtObjs
container for 'virtual' drawing object supporting drawing objects in headers/footers.
Definition: dcontact.hxx:315
SwAnchoredDrawObject maAnchoredDrawObj
anchored drawing object instance for the 'master' drawing object
Definition: dcontact.hxx:312
const SwPageFrame * GetPageFrame() const
Definition: dcontact.hxx:359
bool mbUserCallActive
Needed data for handling of nested <SdrObjUserCall> events in method <Changed_(..)>
Definition: dcontact.hxx:327
SdrUserCallType meEventTypeOfCurrentUserCall
event type, which is handled for <mpSdrObjHandledByCurrentUserCall>.
Definition: dcontact.hxx:330
SwDrawContact(const SwDrawContact &)=delete
virtual const SdrObject * GetMaster() const override
Definition: dcontact.hxx:352
bool mbMasterObjCleared
boolean indicating set 'master' drawing object has been cleared.
Definition: dcontact.hxx:319
SwPageFrame * GetPageFrame()
Definition: dcontact.hxx:363
new class for re-direct methods calls at a 'virtual' drawing object to its referenced object.
Definition: dcontact.hxx:213
virtual void SetLayer(SdrLayerID nLayer) override
Definition: dcontact.cxx:2626
virtual void NbcResize(const Point &rRef, const Fraction &xFact, const Fraction &yFact) override
Definition: dcontact.cxx:2459
virtual void RecalcBoundRect() override
All overridden methods which need to use the offset.
Definition: dcontact.cxx:2413
virtual void NbcSetLayer(SdrLayerID nLayer) override
Definition: dcontact.cxx:2620
virtual void SetSnapRect(const tools::Rectangle &rRect) override
Definition: dcontact.cxx:2543
virtual const tools::Rectangle & GetSnapRect() const override
Definition: dcontact.cxx:2535
virtual void NbcSetLogicRect(const tools::Rectangle &rRect) override
Definition: dcontact.cxx:2579
virtual ::basegfx::B2DPolyPolygon TakeContour() const override
Definition: dcontact.cxx:2431
virtual void AddToHdlList(SdrHdlList &rHdlList) const override
Definition: dcontact.cxx:2439
const SwFrame * GetAnchorFrame() const
Definition: dcontact.cxx:2276
virtual ~SwDrawVirtObj() override
Definition: dcontact.cxx:2267
virtual const tools::Rectangle & GetCurrentBoundRect() const override
Definition: dcontact.cxx:2379
virtual void NbcShear(const Point &rRef, Degree100 nAngle, double tn, bool bVShear) override
Definition: dcontact.cxx:2477
virtual void NbcSetSnapRect(const tools::Rectangle &rRect) override
Definition: dcontact.cxx:2553
SwAnchoredObject & AnchoredObj()
Definition: dcontact.hxx:248
virtual void RecalcSnapRect() override
Definition: dcontact.cxx:2529
virtual const tools::Rectangle & GetLogicRect() const override
Definition: dcontact.cxx:2561
virtual bool HasTextEdit() const override
Definition: dcontact.cxx:2608
SwFrame * AnchorFrame()
Definition: dcontact.cxx:2282
virtual std::unique_ptr< sdr::contact::ViewContact > CreateObjectSpecificViewContact() override
AW: Need own sdr::contact::ViewContact since AnchorPos from parent is not used but something own (top...
Definition: dcontact.cxx:2232
virtual void Mirror(const Point &rRef1, const Point &rRef2) override
Definition: dcontact.cxx:2510
virtual void Resize(const Point &rRef, const Fraction &xFact, const Fraction &yFact, bool bUnsetRelative=true) override
Definition: dcontact.cxx:2488
void RemoveFromDrawingPage()
Definition: dcontact.cxx:2353
virtual Point GetPoint(sal_uInt32 i) const override
Definition: dcontact.cxx:2595
virtual void NbcSetPoint(const Point &rPnt, sal_uInt32 i) override
Definition: dcontact.cxx:2600
virtual void NbcMove(const Size &rSiz) override
Definition: dcontact.cxx:2454
SwDrawContact & mrDrawContact
writer-drawing contact object the 'virtual' drawing object is controlled by.
Definition: dcontact.hxx:223
void RemoveFromWriterLayout()
Definition: dcontact.cxx:2288
virtual void NbcSetAnchorPos(const Point &rPnt) override
Definition: dcontact.cxx:2371
SwDrawVirtObj(SdrModel &rSdrModel, SdrObject &_rNewObj, SwDrawContact &_rDrawContact)
Definition: dcontact.cxx:2237
virtual ::basegfx::B2DPolyPolygon TakeXorPoly() const override
Definition: dcontact.cxx:2423
virtual void SetLogicRect(const tools::Rectangle &rRect) override
Definition: dcontact.cxx:2569
virtual void Rotate(const Point &rRef, Degree100 nAngle, double sn, double cs) override
Definition: dcontact.cxx:2499
virtual void Shear(const Point &rRef, Degree100 nAngle, double tn, bool bVShear) override
Definition: dcontact.cxx:2518
virtual const tools::Rectangle & GetLastBoundRect() const override
Definition: dcontact.cxx:2389
virtual void SetBoundRectDirty() override
Definition: dcontact.cxx:2408
virtual SwDrawVirtObj * CloneSdrObject(SdrModel &rTargetModel) const override
Definition: dcontact.cxx:2271
bool IsConnected() const
is 'virtual' drawing object connected to writer layout and / to drawing layer.
Definition: dcontact.cxx:2363
virtual Point GetOffset() const override
access to offset
Definition: dcontact.cxx:2394
void AddToDrawingPage(SwFrame const &rAnchorFrame)
connection to drawing layer
Definition: dcontact.cxx:2298
const SwAnchoredObject & GetAnchoredObj() const
connection to writer layout
Definition: dcontact.hxx:247
virtual void Move(const Size &rSiz) override
Definition: dcontact.cxx:2483
virtual void NbcRotate(const Point &rRef, Degree100 nAngle, double sn, double cs) override
Definition: dcontact.cxx:2465
virtual Point GetSnapPoint(sal_uInt32 i) const override
Definition: dcontact.cxx:2587
virtual SdrLayerID GetLayer() const override
Definition: dcontact.cxx:2615
virtual void NbcMirror(const Point &rRef1, const Point &rRef2) override
Definition: dcontact.cxx:2471
SwAnchoredDrawObject maAnchoredDrawObj
anchored drawing object instance for the 'virtual' drawing object
Definition: dcontact.hxx:218
ContactObject for connection between frames (or their formats respectively) in SwClient and the drawo...
Definition: dcontact.hxx:176
SwFlyDrawObjPtr mpMasterObj
Definition: dcontact.hxx:180
std::unique_ptr< SwFlyDrawObj, SdrObjectFreeOp > SwFlyDrawObjPtr
Definition: dcontact.hxx:178
virtual const SdrObject * GetMaster() const override
Definition: dcontact.hxx:194
general base class for all free-flowing frames
Definition: flyfrm.hxx:79
FlyAnchors.
Definition: fmtanchr.hxx:35
Style of a layout element.
Definition: frmfmt.hxx:61
Base class of the Writer layout elements.
Definition: frame.hxx:315
A page of the document layout.
Definition: pagefrm.hxx:58
Of course Writer needs its own rectangles.
Definition: swrect.hxx:35
bool IsMarqueeTextObj(const SdrObject &rObj)
Returns true if the SrdObject is a Marquee-Object (scrolling text)
Definition: dcontact.cxx:183
std::unique_ptr< SwDrawVirtObj, SdrObjectFreeOp > SwDrawVirtObjPtr
ContactObject for connection of formats as representatives of draw objects in SwClient and the object...
Definition: dcontact.hxx:305
SwRect GetBoundRectOfAnchoredObj(const SdrObject *pObj)
returns the BoundRect inclusive distance of the object.
Definition: dcontact.cxx:155
SwContact * GetUserCall(const SdrObject *)
Returns the UserCall if applicable from the group object.
Definition: dcontact.cxx:172
void setContextWritingMode(SdrObject *pObj, SwFrame const *pAnchor)
Definition: dcontact.cxx:103
SW_DLLPUBLIC SwFrameFormat * FindFrameFormat(SdrObject *pObj)
The other way round: Search format for given object.
Definition: dcontact.cxx:121
bool HasWrap(const SdrObject *pObj)
Definition: dcontact.cxx:140
bool CheckControlLayer(const SdrObject *pObj)
Definition: dcontact.cxx:680
virtual SotClipboardFormatId GetFormat(const TransferableDataHelper &aHelper) override
const SwFrame * FindPage(const SwRect &rRect, const SwFrame *pPage)
Definition: frmtool.cxx:3728
Marks a position in the document model.
Definition: pam.hxx:37
SdrUserCallType
#define SW_DLLPUBLIC
Definition: swdllapi.h:28
RndStdIds