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"
31 #include "anchoreddrawobject.hxx"
32 
33 class SwFlyFrame;
34 class SwFrame;
35 class SwPageFrame;
36 class SwVirtFlyDrawObj;
37 class SwFlyDrawObj;
38 class SwRect;
39 class SwDrawContact;
40 struct SwPosition;
41 class SdrTextObj;
42 class SwContact;
43 
50 inline const SwFrameFormat *FindFrameFormat( const SdrObject *pObj )
51 { return ::FindFrameFormat( const_cast<SdrObject*>(pObj) ); }
52 bool HasWrap( const SdrObject* pObj );
53 
54 void setContextWritingMode( SdrObject* pObj, SwFrame const * pAnchor );
55 
58 
61 
63 bool IsMarqueeTextObj( const SdrObject& rObj );
64 
66 class SAL_DLLPUBLIC_RTTI SwContact : public SdrObjUserCall, public SwClient
67 {
71  bool mbInDTOR;
72 
93  void MoveObjToLayer( const bool _bToVisible,
94  SdrObject* _pDrawObj );
95 
96 protected:
97  void SetInDTOR();
98  virtual void SwClientNotify(const SwModify&, const SfxHint& rHint) override;
99 
100 public:
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()); }
113  const SwFrameFormat *GetFormat() const
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 {
177 private:
178  typedef std::unique_ptr< SwFlyDrawObj, SdrObjectFreeOp > SwFlyDrawObjPtr;
179 
180  SwFlyDrawObjPtr mpMasterObj;
181  void SwClientNotify(const SwModify&, const SfxHint& rHint) override;
182  sal_uInt32 GetOrdNumForNewRef(const SwFlyFrame* pFly);
183 
184 public:
185 
187  SwFlyDrawContact(SwFlyFrameFormat* pToRegisterIn, SdrModel& rTargetModel);
188  static SwVirtFlyDrawObj* CreateNewRef(SwFlyFrame* pFly, SwFlyFrameFormat* pFormat);
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 
210 class SwDrawVirtObj final : public SdrVirtObj
211 {
212  private:
213  // data for connection to writer layout
217 
222 
226  virtual std::unique_ptr<sdr::contact::ViewContact> CreateObjectSpecificViewContact() override;
227 
228  // protected destructor
229  virtual ~SwDrawVirtObj() override;
230 
231  public:
233  SdrModel& rSdrModel,
234  SdrObject& _rNewObj,
235  SwDrawContact& _rDrawContact);
236 
238  virtual Point GetOffset() const override;
239 
240  virtual SwDrawVirtObj* CloneSdrObject(SdrModel& rTargetModel) const override;
241  SwDrawVirtObj& operator= (const SwDrawVirtObj& rObj);
242 
246  const SwFrame* GetAnchorFrame() const;
247  SwFrame* AnchorFrame();
248  void RemoveFromWriterLayout();
249 
251  void AddToDrawingPage();
252  void RemoveFromDrawingPage();
253 
256  bool IsConnected() const;
257 
258  virtual void NbcSetAnchorPos(const Point& rPnt) override;
259 
261  virtual void RecalcBoundRect() override;
262  virtual ::basegfx::B2DPolyPolygon TakeXorPoly() const override;
263  virtual ::basegfx::B2DPolyPolygon TakeContour() const override;
264  virtual void AddToHdlList(SdrHdlList& rHdlList) const override;
265  virtual void NbcMove(const Size& rSiz) override;
266  virtual void NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact) override;
267  virtual void NbcRotate(const Point& rRef, long nAngle, double sn, double cs) override;
268  virtual void NbcMirror(const Point& rRef1, const Point& rRef2) override;
269  virtual void NbcShear(const Point& rRef, long nAngle, double tn, bool bVShear) override;
270  virtual void Move(const Size& rSiz) override;
271  virtual void Resize(const Point& rRef, const Fraction& xFact, const Fraction& yFact, bool bUnsetRelative = true) override;
272  virtual void Rotate(const Point& rRef, long nAngle, double sn, double cs) override;
273  virtual void Mirror(const Point& rRef1, const Point& rRef2) override;
274  virtual void Shear(const Point& rRef, long nAngle, double tn, bool bVShear) override;
275  virtual void RecalcSnapRect() override;
276  virtual const tools::Rectangle& GetSnapRect() const override;
277  virtual void SetSnapRect(const tools::Rectangle& rRect) override;
278  virtual void NbcSetSnapRect(const tools::Rectangle& rRect) override;
279  virtual const tools::Rectangle& GetLogicRect() const override;
280  virtual void SetLogicRect(const tools::Rectangle& rRect) override;
281  virtual void NbcSetLogicRect(const tools::Rectangle& rRect) override;
282  virtual Point GetSnapPoint(sal_uInt32 i) const override;
283  virtual Point GetPoint(sal_uInt32 i) const override;
284  virtual void NbcSetPoint(const Point& rPnt, sal_uInt32 i) override;
285 
286  virtual bool HasTextEdit() const override;
287 
288  virtual SdrLayerID GetLayer() const override;
289  virtual void NbcSetLayer(SdrLayerID nLayer) override;
290  virtual void SetLayer(SdrLayerID nLayer) override;
291 
292  virtual void SetBoundRectDirty() override;
293  virtual const tools::Rectangle& GetCurrentBoundRect() const override;
294  virtual const tools::Rectangle& GetLastBoundRect() const override;
295 };
296 
297 bool CheckControlLayer( const SdrObject *pObj );
298 
302 typedef std::unique_ptr< SwDrawVirtObj, SdrObjectFreeOp > SwDrawVirtObjPtr;
303 
304 class SAL_DLLPUBLIC_RTTI SwDrawContact final : public SwContact
305 {
306  private:
310 
312  std::vector< SwDrawVirtObjPtr > maDrawVirtObjs;
313 
316  bool mbMasterObjCleared : 1;
317 
320  bool mbDisconnectInProgress : 1;
321 
324  bool mbUserCallActive : 1;
328 
329  friend class NestedUserCallHdl;
330 
331 
332  void RemoveAllVirtObjs();
333 
334  void InvalidateObjs_( const bool _bUpdateSortedObjsList = false );
335 
336  SwDrawContact( const SwDrawContact& ) = delete;
337  SwDrawContact& operator=( const SwDrawContact& ) = delete;
338 
339  virtual void SwClientNotify(const SwModify&, const SfxHint& rHint) override;
340 
341  public:
342 
343  SwDrawContact( SwFrameFormat *pToRegisterIn, SdrObject *pObj );
344  virtual ~SwDrawContact() override;
345 
346  virtual const SwAnchoredObject* GetAnchoredObj( const SdrObject* _pSdrObj ) const override;
347  virtual SwAnchoredObject* GetAnchoredObj( SdrObject* _pSdrObj ) override;
348 
349  virtual const SdrObject* GetMaster() const override
350  { return const_cast<SwDrawContact*>(this)->GetMaster(); };
351  virtual SdrObject* GetMaster() override;
352 
353  const SwFrame* GetAnchorFrame( const SdrObject* _pDrawObj = nullptr ) const;
354  SwFrame* GetAnchorFrame( SdrObject const * _pDrawObj = nullptr );
355 
356  const SwPageFrame* GetPageFrame() const
357  {
358  return maAnchoredDrawObj.GetPageFrame();
359  }
361  {
362  return maAnchoredDrawObj.GetPageFrame();
363  }
364  void ChkPage();
365  SwPageFrame* FindPage( const SwRect &rRect );
366 
370  void ConnectToLayout( const SwFormatAnchor *pAnch = nullptr );
373  void InsertMasterIntoDrawPage();
374 
375  void DisconnectFromLayout( bool _bMoveMasterToInvisibleLayer = true );
378  void DisconnectObjFromLayout( SdrObject* _pDrawObj );
385  void RemoveMasterFromDrawPage();
386 
389  SdrObject* GetDrawObjectByAnchorFrame( const SwFrame& _rAnchorFrame );
390 
392  virtual void Changed(const SdrObject& rObj, SdrUserCallType eType, const tools::Rectangle& rOldBoundRect) override;
393 
396  void Changed_(const SdrObject& rObj, SdrUserCallType eType, const tools::Rectangle* pOldBoundRect);
397 
399  void ChangeMasterObject( SdrObject *pNewMaster );
400 
401  SwDrawVirtObj* AddVirtObj();
402 
403  void NotifyBackgrdOfAllVirtObjs( const tools::Rectangle* pOldBoundRect );
404 
407  static void GetTextObjectsFromFormat( std::list<SdrTextObj*>&, SwDoc* );
408  virtual void GetAnchoredObjs( std::vector<SwAnchoredObject*>& _roAnchoredObjs ) const override;
409 };
410 
411 #endif
412 
413 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
SwFrame * AnchorFrame()
Definition: dcontact.cxx:2208
Base class for the following contact objects (frame + draw objects).
Definition: dcontact.hxx:66
Base class of the Writer layout elements.
Definition: frame.hxx:295
SwFlyDrawObjPtr mpMasterObj
Definition: dcontact.hxx:180
SwAnchoredDrawObject maAnchoredDrawObj
anchored drawing object instance for the 'virtual' drawing object
Definition: dcontact.hxx:216
Marks a position in the document model.
Definition: pam.hxx:35
class for the positioning of drawing objects
virtual SwDrawVirtObj * CloneSdrObject(SdrModel &rTargetModel) const override
Definition: dcontact.cxx:2189
std::unique_ptr< SwDrawVirtObj, SdrObjectFreeOp > SwDrawVirtObjPtr
ContactObject for connection of formats as representatives of draw objects in SwClient and the object...
Definition: dcontact.hxx:302
const SwFrame * FindPage(const SwRect &rRect, const SwFrame *pPage)
Definition: frmtool.cxx:3491
helper class for method for handling nested events ...
Definition: dcontact.cxx:994
SdrUserCallType
virtual ~SwDrawVirtObj() override
Definition: dcontact.cxx:2177
Definition: doc.hxx:185
SwDrawVirtObj(SdrModel &rSdrModel, SdrObject &_rNewObj, SwDrawContact &_rDrawContact)
Definition: dcontact.cxx:2162
virtual void AddToHdlList(SdrHdlList &rHdlList) const override
Definition: dcontact.cxx:2339
virtual void Move(const Size &rSiz) override
Definition: dcontact.cxx:2383
SdrUserCallType meEventTypeOfCurrentUserCall
event type, which is handled for .
Definition: dcontact.hxx:327
virtual void NbcMove(const Size &rSiz) override
Definition: dcontact.cxx:2354
bool IsInDTOR() const
Definition: dcontact.hxx:116
virtual void SwClientNotify(const SwModify &, const SfxHint &rHint) override
Definition: calbck.cxx:108
Of course Writer needs its own rectangles.
Definition: swrect.hxx:34
SwDrawContact & mrDrawContact
writer-drawing contact object the 'virtual' drawing object is controlled by.
Definition: dcontact.hxx:221
bool IsMarqueeTextObj(const SdrObject &rObj)
Returns true if the SrdObject is a Marquee-Object (scrolling text)
Definition: dcontact.cxx:181
virtual bool HasTextEdit() const override
Definition: dcontact.cxx:2508
virtual Point GetOffset() const override
access to offset
Definition: dcontact.cxx:2294
wrapper class for the positioning of Writer fly frames and drawing objects
SwDrawVirtObj & operator=(const SwDrawVirtObj &rObj)
Definition: dcontact.cxx:2181
virtual const tools::Rectangle & GetLogicRect() const override
Definition: dcontact.cxx:2461
virtual void SwClientNotify(const SwModify &, const SfxHint &rHint) override
Definition: dcontact.cxx:418
bool HasWrap(const SdrObject *pObj)
Definition: dcontact.cxx:138
virtual void NbcMirror(const Point &rRef1, const Point &rRef2) override
Definition: dcontact.cxx:2371
virtual void MoveObjToVisibleLayer(SdrObject *_pDrawObj)
method to move drawing object to corresponding visible layer
Definition: dcontact.cxx:207
virtual void Changed(const SdrObject &rObj, SdrUserCallType eType, const tools::Rectangle &rOldBoundRect)
bool mbInDTOR
boolean, indicating destruction of contact object important note: boolean has to be set at the beginn...
Definition: dcontact.hxx:71
ContactObject for connection between frames (or their formats respectively) in SwClient and the drawo...
Definition: dcontact.hxx:175
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:2157
void AddToDrawingPage()
connection to drawing layer
Definition: dcontact.cxx:2224
Style of a layout element.
Definition: frmfmt.hxx:57
std::unique_ptr< SwFlyDrawObj, SdrObjectFreeOp > SwFlyDrawObjPtr
Definition: dcontact.hxx:178
SwContact * GetUserCall(const SdrObject *)
Returns the UserCall if applicable from the group object.
Definition: dcontact.cxx:170
virtual const tools::Rectangle & GetCurrentBoundRect() const override
Definition: dcontact.cxx:2279
virtual void NbcSetLogicRect(const tools::Rectangle &rRect) override
Definition: dcontact.cxx:2479
SW_DLLPUBLIC SwFrameFormat * FindFrameFormat(SdrObject *pObj)
The other way round: Search format for given object.
Definition: dcontact.cxx:119
virtual SdrLayerID GetLayer() const override
Definition: dcontact.cxx:2515
SwFrameFormat * GetFormat()
Definition: dcontact.hxx:112
virtual void SetBoundRectDirty() override
Definition: dcontact.cxx:2308
RndStdIds GetAnchorId() const
Definition: dcontact.hxx:145
FlyAnchors.
Definition: fmtanchr.hxx:34
virtual void NbcShear(const Point &rRef, long nAngle, double tn, bool bVShear) override
Definition: dcontact.cxx:2377
SwPageFrame * GetPageFrame()
Definition: dcontact.hxx:360
bool ObjAnchoredAtPage() const
Definition: dcontact.hxx:146
virtual const SdrObject * GetMaster() const override
Definition: dcontact.hxx:349
const SwFrameFormat * GetFormat() const
Definition: dcontact.hxx:113
virtual const tools::Rectangle & GetLastBoundRect() const override
Definition: dcontact.cxx:2289
#define SW_DLLPUBLIC
Definition: swdllapi.h:28
virtual const SwAnchoredObject * GetAnchoredObj(const SdrObject *_pSdrObj) const =0
A page of the document layout.
Definition: pagefrm.hxx:40
virtual const SdrObject * GetMaster() const =0
virtual void NbcSetSnapRect(const tools::Rectangle &rRect) override
Definition: dcontact.cxx:2453
virtual void RecalcBoundRect() override
All overridden methods which need to use the offset.
Definition: dcontact.cxx:2313
virtual void RecalcSnapRect() override
Definition: dcontact.cxx:2429
virtual void SetLogicRect(const tools::Rectangle &rRect) override
Definition: dcontact.cxx:2469
virtual Point GetSnapPoint(sal_uInt32 i) const override
Definition: dcontact.cxx:2487
virtual void SetLayer(SdrLayerID nLayer) override
Definition: dcontact.cxx:2526
virtual const tools::Rectangle & GetSnapRect() const override
Definition: dcontact.cxx:2435
general base class for all free-flowing frames
Definition: flyfrm.hxx:60
virtual void Shear(const Point &rRef, long nAngle, double tn, bool bVShear) override
Definition: dcontact.cxx:2418
SwPageFrame * GetPageFrame()
virtual void Mirror(const Point &rRef1, const Point &rRef2) override
Definition: dcontact.cxx:2410
virtual void NbcSetLayer(SdrLayerID nLayer) override
Definition: dcontact.cxx:2520
const SwAnchoredObject & GetAnchoredObj() const
connection to writer layout
Definition: dcontact.hxx:244
const SwPageFrame * GetPageFrame() const
Definition: dcontact.hxx:356
virtual void NbcRotate(const Point &rRef, long nAngle, double sn, double cs) override
Definition: dcontact.cxx:2365
void RemoveFromDrawingPage()
Definition: dcontact.cxx:2253
new class for re-direct methods calls at a 'virtual' drawing object to its referenced object...
Definition: dcontact.hxx:210
const SwModify * GetRegisteredIn() const
Definition: calbck.hxx:157
virtual void Resize(const Point &rRef, const Fraction &xFact, const Fraction &yFact, bool bUnsetRelative=true) override
Definition: dcontact.cxx:2388
bool ObjAnchoredAtFly() const
Definition: dcontact.hxx:147
bool ObjAnchoredAsChar() const
Definition: dcontact.hxx:150
virtual void NbcResize(const Point &rRef, const Fraction &xFact, const Fraction &yFact) override
Definition: dcontact.cxx:2359
WriterListener & operator=(WriterListener const &)=delete
std::vector< SwDrawVirtObjPtr > maDrawVirtObjs
container for 'virtual' drawing object supporting drawing objects in headers/footers.
Definition: dcontact.hxx:312
virtual void GetAnchoredObjs(std::vector< SwAnchoredObject * > &_roAnchoredObjs) const =0
get data collection of anchored objects, handled by with contact
virtual void MoveObjToInvisibleLayer(SdrObject *_pDrawObj)
method to move drawing object to corresponding invisible layer
Definition: dcontact.cxx:234
virtual ::basegfx::B2DPolyPolygon TakeXorPoly() const override
Definition: dcontact.cxx:2323
virtual ::basegfx::B2DPolyPolygon TakeContour() const override
Definition: dcontact.cxx:2331
void RemoveFromWriterLayout()
Definition: dcontact.cxx:2214
const SwFrame * GetAnchorFrame() const
Definition: dcontact.cxx:2202
RndStdIds
virtual void SetSnapRect(const tools::Rectangle &rRect) override
Definition: dcontact.cxx:2443
virtual void Rotate(const Point &rRef, long nAngle, double sn, double cs) override
Definition: dcontact.cxx:2399
virtual void NbcSetAnchorPos(const Point &rPnt) override
Definition: dcontact.cxx:2271
SwAnchoredDrawObject maAnchoredDrawObj
anchored drawing object instance for the 'master' drawing object
Definition: dcontact.hxx:309
virtual void NbcSetPoint(const Point &rPnt, sal_uInt32 i) override
Definition: dcontact.cxx:2500
void setContextWritingMode(SdrObject *pObj, SwFrame const *pAnchor)
Definition: dcontact.cxx:101
const SwFormatAnchor & GetAnchorFormat() const
some virtual helper methods for information about the object (Writer fly frame resp.
Definition: dcontact.hxx:138
SwRect GetBoundRectOfAnchoredObj(const SdrObject *pObj)
returns the BoundRect inclusive distance of the object.
Definition: dcontact.cxx:153
const SwPosition & GetContentAnchor() const
Definition: dcontact.hxx:152
bool ObjAnchoredAtPara() const
Definition: dcontact.hxx:148
virtual Point GetPoint(sal_uInt32 i) const override
Definition: dcontact.cxx:2495
bool ObjAnchoredAtChar() const
Definition: dcontact.hxx:149
SwAnchoredObject & AnchoredObj()
Definition: dcontact.hxx:245
bool IsConnected() const
is 'virtual' drawing object connected to writer layout and / to drawing layer.
Definition: dcontact.cxx:2263
virtual const SdrObject * GetMaster() const override
Definition: dcontact.hxx:194
bool CheckControlLayer(const SdrObject *pObj)
Definition: dcontact.cxx:656