1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 #ifndef _DCONTACT_HXX 28 #define _DCONTACT_HXX 29 30 #include <svx/svdobj.hxx> 31 #include <svx/svdovirt.hxx> 32 #include <swtypes.hxx> 33 #include <fmtanchr.hxx> 34 #include <frmfmt.hxx> 35 #include <list> 36 37 #include "calbck.hxx" 38 #include <anchoreddrawobject.hxx> 39 40 class SfxPoolItem; 41 class SwFrmFmt; 42 class SwFlyFrmFmt; 43 class SwFlyFrm; 44 class SwFrm; 45 class SwPageFrm; 46 class SwVirtFlyDrawObj; 47 class SwFmtAnchor; 48 class SwFlyDrawObj; 49 class SwRect; 50 class SwDrawContact; 51 struct SwPosition; 52 class SwIndex; 53 class SdrTextObj; 54 55 //Der Umgekehrte Weg: Sucht das Format zum angegebenen Objekt. 56 //Wenn das Object ein SwVirtFlyDrawObj ist so wird das Format von 57 //selbigem besorgt. 58 //Anderfalls ist es eben ein einfaches Zeichenobjekt. Diese hat einen 59 //UserCall und der ist Client vom gesuchten Format. 60 //Implementierung in dcontact.cxx 61 SW_DLLPUBLIC SwFrmFmt *FindFrmFmt( SdrObject *pObj ); 62 inline const SwFrmFmt *FindFrmFmt( const SdrObject *pObj ) 63 { return ::FindFrmFmt( (SdrObject*)pObj ); } 64 sal_Bool HasWrap( const SdrObject* pObj ); 65 66 void setContextWritingMode( SdrObject* pObj, SwFrm* pAnchor ); 67 68 //Bei Aenderungen das Objekt aus dem ContourCache entfernen. 69 //Implementierung in TxtFly.Cxx 70 void ClrContourCache( const SdrObject *pObj ); 71 72 // liefert BoundRect inklusive Abstand 73 // --> OD 2006-08-15 #i68520# - change naming 74 SwRect GetBoundRectOfAnchoredObj( const SdrObject* pObj ); 75 // <-- 76 77 //Liefert den UserCall ggf. vom Gruppenobjekt 78 // OD 2004-03-31 #i26791# - change return type 79 SwContact* GetUserCall( const SdrObject* ); 80 81 // liefert sal_True falls das SrdObject ein Marquee-Object (Lauftext) ist 82 sal_Bool IsMarqueeTextObj( const SdrObject& rObj ); 83 84 //Basisklasse fuer die folgenden KontaktObjekte (Rahmen+Zeichenobjekte) 85 class SwContact : public SdrObjUserCall, public SwClient 86 { 87 // OD 05.09.2003 #112039# - boolean, indicating destruction of contact object 88 // important note: boolean has to be set at the beginning of each destructor 89 // in the subclasses using method <SetInDTOR()>. 90 bool mbInDTOR; 91 92 /** method to move object to visible/invisible layer 93 94 OD 21.08.2003 #i18447# 95 Implementation for the public method <MoveObjToVisibleLayer(..)> 96 and <MoveObjToInvisibleLayer(..)> 97 If object is in invisble respectively visible layer, its moved to 98 the corresponding visible respectively invisible layers. 99 For group object the members are individually moved to the corresponding 100 layer, because <SdrObjGroup::GetLayer()> does return 0, if members 101 aren't on the same layer as the group object, and 102 <SdrObjGroup::SetLayer(..)|NbcSetLayer(..)> sets also the layer of 103 the members. 104 OD 2004-01-15 #110582# - moved from subclass <SwDrawContact> 105 106 @author OD 107 108 @param _bToVisible 109 input parameter - boolean indicating, if object has to be moved to 110 visible (== true) or invisible (== false) layer. 111 112 @param _pDrawObj 113 input parameter, which will be changed - drawing object, which will 114 change its layer. 115 */ 116 void _MoveObjToLayer( const bool _bToVisible, 117 SdrObject* _pDrawObj ); 118 119 protected: 120 // OD 05.09.2003 #112039# - accessor to set member <mbInDTOR> 121 void SetInDTOR(); 122 123 public: 124 TYPEINFO(); 125 126 //Fuer den Reader, es wir nur die Verbindung hergestellt. 127 SwContact( SwFrmFmt *pToRegisterIn ); 128 virtual ~SwContact(); 129 130 // OD 2004-03-29 #i26791# 131 virtual const SwAnchoredObject* GetAnchoredObj( const SdrObject* _pSdrObj ) const = 0; 132 virtual SwAnchoredObject* GetAnchoredObj( SdrObject* _pSdrObj ) = 0; 133 134 // OD 13.05.2003 #108784# - made methods virtual and not inline 135 // OD 2004-04-01 #i26791# - made methods pure virtual 136 virtual const SdrObject *GetMaster() const = 0; 137 virtual SdrObject *GetMaster() = 0; 138 virtual void SetMaster( SdrObject* _pNewMaster ) = 0; 139 140 SwFrmFmt *GetFmt(){ return (SwFrmFmt*)GetRegisteredIn(); } 141 const SwFrmFmt *GetFmt() const 142 { return (const SwFrmFmt*)GetRegisteredIn(); } 143 144 // OD 05.09.2003 #112039# - accessor for member <mbInDTOR> 145 bool IsInDTOR() const; 146 147 /** method to move drawing object to corresponding visible layer 148 149 OD 21.08.2003 #i18447# 150 uses method <_MoveObjToLayer(..)> 151 OD 2004-01-15 #110582# - moved from subclass <SwDrawContact> and made virtual 152 153 @author OD 154 155 @param _pDrawObj 156 drawing object, which will be moved to the visible layer 157 */ 158 virtual void MoveObjToVisibleLayer( SdrObject* _pDrawObj ); 159 160 /** method to move drawing object to corresponding invisible layer 161 162 OD 21.08.2003 #i18447# 163 uses method <_MoveObjToLayer(..)> 164 OD 2004-01-15 #110582# - moved from subclass <SwDrawContact> and made virtual. 165 166 @author OD 167 168 @param _pDrawObj 169 drawing object, which will be moved to the visible layer 170 */ 171 virtual void MoveObjToInvisibleLayer( SdrObject* _pDrawObj ); 172 173 // ------------------------------------------------------------------------- 174 // OD 2004-01-16 #110582# - some virtual helper methods for information 175 // about the object (Writer fly frame resp. drawing object) 176 const SwFmtAnchor& GetAnchorFmt() const 177 { 178 ASSERT( GetFmt(), 179 "<SwContact::GetAnchorFmt()> - no frame format -> crash" ); 180 181 return GetFmt()->GetAnchor(); 182 } 183 184 RndStdIds GetAnchorId() const { return GetAnchorFmt().GetAnchorId(); } 185 bool ObjAnchoredAtPage() const { return GetAnchorId() == FLY_AT_PAGE; } 186 bool ObjAnchoredAtFly() const { return GetAnchorId() == FLY_AT_FLY; } 187 bool ObjAnchoredAtPara() const { return GetAnchorId() == FLY_AT_PARA; } 188 bool ObjAnchoredAtChar() const { return GetAnchorId() == FLY_AT_CHAR; } 189 bool ObjAnchoredAsChar() const { return GetAnchorId() == FLY_AS_CHAR; } 190 191 const SwPosition& GetCntntAnchor() const 192 { 193 ASSERT( GetAnchorFmt().GetCntntAnchor(), 194 "<SwContact::GetCntntAnchor()> - no content anchor -> crash" ); 195 196 return *(GetAnchorFmt().GetCntntAnchor()); 197 } 198 199 const SwIndex& GetCntntAnchorIndex() const; 200 201 // ------------------------------------------------------------------------- 202 203 /** get data collection of anchored objects, handled by with contact 204 205 OD 2004-08-23 #110810# 206 207 @author 208 */ 209 virtual void GetAnchoredObjs( std::list<SwAnchoredObject*>& _roAnchoredObjs ) const = 0; 210 211 /** get minimum order number of anchored objects handled by with contact 212 213 OD 2004-08-24 #110810# 214 215 @author 216 */ 217 sal_uInt32 GetMinOrdNum() const; 218 219 /** get maximum order number of anchored objects handled by with contact 220 221 OD 2004-08-24 #110810# 222 223 @author 224 */ 225 sal_uInt32 GetMaxOrdNum() const; 226 }; 227 228 //KontactObjekt fuer die Verbindung zwischen Rahmen bzw. deren Formaten 229 //im StarWriter (SwClient) und den Zeichenobjekten des Drawing (SdrObjUserCall) 230 231 class SW_DLLPUBLIC SwFlyDrawContact : public SwContact 232 { 233 private: 234 // OD 2004-04-01 #i26791# 235 SwFlyDrawObj* mpMasterObj; 236 237 protected: 238 // virtuelle Methoden von SwClient 239 virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew ); 240 241 public: 242 TYPEINFO(); 243 244 //Legt das DrawObjekt an und meldet es beim Model an. 245 SwFlyDrawContact( SwFlyFrmFmt* pToRegisterIn, SdrModel* pMod ); 246 virtual ~SwFlyDrawContact(); 247 248 // OD 2004-03-29 #i26791# 249 virtual const SwAnchoredObject* GetAnchoredObj( const SdrObject* _pSdrObj ) const; 250 virtual SwAnchoredObject* GetAnchoredObj( SdrObject* _pSdrObj ); 251 252 // OD 2004-04-01 #i26791# 253 virtual const SdrObject* GetMaster() const; 254 virtual SdrObject* GetMaster(); 255 virtual void SetMaster( SdrObject* _pNewMaster ); 256 257 // OD 2004-01-16 #110582# - override methods to control Writer fly frames, 258 // which are linked, and to assure that all objects anchored at/inside the 259 // Writer fly frame are also made visible/invisible. 260 virtual void MoveObjToVisibleLayer( SdrObject* _pDrawObj ); 261 virtual void MoveObjToInvisibleLayer( SdrObject* _pDrawObj ); 262 263 /** get data collection of anchored objects handled by with contact 264 265 OD 2004-08-23 #110810# 266 267 @author 268 */ 269 virtual void GetAnchoredObjs( std::list<SwAnchoredObject*>& _roAnchoredObjs ) const; 270 }; 271 272 // OD 16.05.2003 #108784# - new class for re-direct methods calls at a 'virtual' 273 // drawing object to its referenced object. 274 class SwDrawVirtObj : public SdrVirtObj 275 { 276 private: 277 // data for connection to writer layout 278 // OD 2004-03-25 #i26791# - anchored drawing object instance for the 279 // 'virtual' drawing object 280 SwAnchoredDrawObject maAnchoredDrawObj; 281 282 // writer-drawing contact object the 'virtual' drawing object is controlled by. 283 // This object is also the <UserCall> of the drawing object, if it's 284 // inserted into the drawing layer. 285 SwDrawContact& mrDrawContact; 286 287 using SdrVirtObj::GetPlusHdl; 288 289 protected: 290 // AW: Need own sdr::contact::ViewContact since AnchorPos from parent is 291 // not used but something own (top left of new SnapRect minus top left 292 // of original SnapRect) 293 virtual sdr::contact::ViewContact* CreateObjectSpecificViewContact(); 294 295 public: 296 TYPEINFO(); 297 298 SwDrawVirtObj( SdrObject& _rNewObj, 299 SwDrawContact& _rDrawContact ); 300 virtual ~SwDrawVirtObj(); 301 302 // access to offset 303 // OD 30.06.2003 #108784# - virtual!!! 304 virtual const Point GetOffset() const; 305 306 virtual SdrObject* Clone() const; 307 virtual void operator=( const SdrObject& rObj ); 308 309 // connection to writer layout 310 // OD 2004-03-29 #i26791# 311 const SwAnchoredObject* GetAnchoredObj() const; 312 SwAnchoredObject* AnchoredObj(); 313 const SwFrm* GetAnchorFrm() const; 314 SwFrm* AnchorFrm(); 315 void RemoveFromWriterLayout(); 316 317 // connection to drawing layer 318 void AddToDrawingPage(); 319 void RemoveFromDrawingPage(); 320 321 // is 'virtual' drawing object connected to writer layout and 322 // to drawing layer. 323 bool IsConnected() const; 324 325 virtual void NbcSetAnchorPos(const Point& rPnt); 326 327 // #108784# 328 // All overloaded methods which need to use the offset 329 virtual void RecalcBoundRect(); 330 virtual ::basegfx::B2DPolyPolygon TakeXorPoly() const; 331 virtual ::basegfx::B2DPolyPolygon TakeContour() const; 332 virtual SdrHdl* GetHdl(sal_uInt32 nHdlNum) const; 333 virtual SdrHdl* GetPlusHdl(const SdrHdl& rHdl, sal_uInt16 nPlNum) const; 334 virtual void NbcMove(const Size& rSiz); 335 virtual void NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact); 336 virtual void NbcRotate(const Point& rRef, long nWink, double sn, double cs); 337 virtual void NbcMirror(const Point& rRef1, const Point& rRef2); 338 virtual void NbcShear(const Point& rRef, long nWink, double tn, FASTBOOL bVShear); 339 virtual void Move(const Size& rSiz); 340 virtual void Resize(const Point& rRef, const Fraction& xFact, const Fraction& yFact); 341 virtual void Rotate(const Point& rRef, long nWink, double sn, double cs); 342 virtual void Mirror(const Point& rRef1, const Point& rRef2); 343 virtual void Shear(const Point& rRef, long nWink, double tn, FASTBOOL bVShear); 344 virtual void RecalcSnapRect(); 345 virtual const Rectangle& GetSnapRect() const; 346 virtual void SetSnapRect(const Rectangle& rRect); 347 virtual void NbcSetSnapRect(const Rectangle& rRect); 348 virtual const Rectangle& GetLogicRect() const; 349 virtual void SetLogicRect(const Rectangle& rRect); 350 virtual void NbcSetLogicRect(const Rectangle& rRect); 351 virtual Point GetSnapPoint(sal_uInt32 i) const; 352 virtual Point GetPoint(sal_uInt32 i) const; 353 virtual void NbcSetPoint(const Point& rPnt, sal_uInt32 i); 354 355 // #108784# 356 virtual FASTBOOL HasTextEdit() const; 357 358 // OD 17.06.2003 #108784# - overload 'layer' methods 359 virtual SdrLayerID GetLayer() const; 360 virtual void NbcSetLayer(SdrLayerID nLayer); 361 virtual void SetLayer(SdrLayerID nLayer); 362 363 // FullDrag support 364 virtual bool supportsFullDrag() const; 365 virtual SdrObject* getFullDragClone() const; 366 367 // #i97197# 368 virtual void SetBoundRectDirty(); 369 virtual const Rectangle& GetCurrentBoundRect() const; 370 virtual const Rectangle& GetLastBoundRect() const; 371 }; 372 373 // OD 26.06.2003 #108784# 374 bool CheckControlLayer( const SdrObject *pObj ); 375 376 //KontactObjekt fuer die Verbindung von Formaten als Repraesentanten der 377 //Zeichenobjekte im StarWriter (SwClient) und den Objekten selbst im Drawing 378 //(SdrObjUserCall). 379 380 // --> OD 2006-01-18 #129959# 381 class NestedUserCallHdl; 382 // <-- 383 384 class SwDrawContact : public SwContact 385 { 386 private: 387 // OD 2004-03-25 #i26791# - anchored drawing object instance for the 388 // 'master' drawing object 389 SwAnchoredDrawObject maAnchoredDrawObj; 390 391 // OD 16.05.2003 #108784# - data structure for collecting 'virtual' 392 // drawing object supporting drawing objects in headers/footers. 393 std::list<SwDrawVirtObj*> maDrawVirtObjs; 394 395 // OD 2004-04-01 #i26791# - boolean indicating set 'master' drawing 396 // object has been cleared. 397 bool mbMasterObjCleared : 1; 398 399 // OD 10.10.2003 #112299# - internal flag to indicate that disconnect 400 // from layout is in progress 401 bool mbDisconnectInProgress : 1; 402 403 // --> OD 2006-01-18 #129959# 404 // Needed data for handling of nested <SdrObjUserCall> events in 405 // method <_Changed(..)> 406 bool mbUserCallActive : 1; 407 // event type, which is handled for <mpSdrObjHandledByCurrentUserCall>. 408 // Note: value only valid, if <mbUserCallActive> is sal_True. 409 SdrUserCallType meEventTypeOfCurrentUserCall; 410 411 friend class NestedUserCallHdl; 412 // <-- 413 414 // unary function used by <list> iterator to find a disconnected 'virtual' 415 // drawing object 416 struct UsedOrUnusedVirtObjPred 417 { 418 bool mbUsedPred; 419 UsedOrUnusedVirtObjPred( bool _bUsed ) : mbUsedPred( _bUsed ) {}; 420 bool operator() ( const SwDrawVirtObj* _pDrawVirtObj ) 421 { 422 if ( mbUsedPred ) 423 { 424 return _pDrawVirtObj->IsConnected(); 425 } 426 else 427 { 428 return !_pDrawVirtObj->IsConnected(); 429 } 430 } 431 }; 432 433 // unary function used by <list> iterator to find a 'virtual' drawing 434 // object anchored at a given frame 435 struct VirtObjAnchoredAtFrmPred 436 { 437 const SwFrm* mpAnchorFrm; 438 VirtObjAnchoredAtFrmPred( const SwFrm& _rAnchorFrm ); 439 bool operator() ( const SwDrawVirtObj* _pDrawVirtObj ); 440 }; 441 442 // OD 16.05.2003 #108784# - method for adding/removing 'virtual' drawing object. 443 SwDrawVirtObj* CreateVirtObj(); 444 void DestroyVirtObj( SwDrawVirtObj* pVirtObj ); 445 void RemoveAllVirtObjs(); 446 447 // OD 2004-03-31 #i26791# 448 void _InvalidateObjs( const bool _bUpdateSortedObjsList = false ); 449 450 // --> OD 2006-01-23 #124157# 451 // no copy-constructor and no assignment operator 452 SwDrawContact( const SwDrawContact& ); 453 SwDrawContact& operator=( const SwDrawContact& ); 454 // <-- 455 456 protected: 457 // virtuelle Methoden von SwClient 458 virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew ); 459 460 public: 461 TYPEINFO(); 462 463 SwDrawContact( SwFrmFmt *pToRegisterIn, SdrObject *pObj ); 464 virtual ~SwDrawContact(); 465 466 // OD 2004-03-29 #i26791# 467 // --> OD 2005-01-06 #i30669# - no default value for parameter <_pSdrObj> 468 virtual const SwAnchoredObject* GetAnchoredObj( const SdrObject* _pSdrObj ) const; 469 virtual SwAnchoredObject* GetAnchoredObj( SdrObject* _pSdrObj ); 470 // <-- 471 472 // OD 2004-04-01 #i26791# 473 virtual const SdrObject* GetMaster() const; 474 virtual SdrObject* GetMaster(); 475 virtual void SetMaster( SdrObject* _pNewMaster ); 476 477 // OD 2004-03-29 #i26791# 478 const SwFrm* GetAnchorFrm( const SdrObject* _pDrawObj = 0L ) const; 479 SwFrm* GetAnchorFrm( SdrObject* _pDrawObj = 0L ); 480 481 // --> OD 2004-06-30 #i28701# - page frame is now stored at member <maAnchoredDrawObj> 482 inline const SwPageFrm* GetPageFrm() const 483 { 484 return maAnchoredDrawObj.GetPageFrm(); 485 } 486 inline SwPageFrm* GetPageFrm() 487 { 488 return maAnchoredDrawObj.GetPageFrm(); 489 } 490 void SetPageFrm( SwPageFrm* _pNewPageFrm ) 491 { 492 return maAnchoredDrawObj.SetPageFrm( _pNewPageFrm ); 493 } 494 // <-- 495 void ChkPage(); 496 SwPageFrm* FindPage( const SwRect &rRect ); 497 498 //Fuegt das SdrObject in die Arrays (SwPageFrm und SwFrm) des Layouts ein. 499 //Der Anker wird Anhand des Attributes SwFmtAnchor bestimmt. 500 //Das Objekt wird ggf. beim alten Anker abgemeldet. 501 void ConnectToLayout( const SwFmtAnchor *pAnch = 0 ); 502 // OD 27.06.2003 #108784# - method to insert 'master' drawing object 503 // into drawing page 504 void InsertMasterIntoDrawPage(); 505 506 void DisconnectFromLayout( bool _bMoveMasterToInvisibleLayer = true ); 507 // OD 19.06.2003 #108784# - disconnect for a dedicated drawing object - 508 // could be 'master' or 'virtual'. 509 void DisconnectObjFromLayout( SdrObject* _pDrawObj ); 510 // OD 26.06.2003 #108784# - method to remove 'master' drawing object 511 // from drawing page. 512 // To be used by the undo for delete of object. Call it after method 513 // <DisconnectFromLayout( bool = true )> is already performed. 514 // Note: <DisconnectFromLayout( bool )> no longer removes the 'master' 515 // drawing object from drawing page. 516 void RemoveMasterFromDrawPage(); 517 518 // OD 19.06.2003 #108784# - get drawing object ('master' or 'virtual') 519 // by frame. 520 SdrObject* GetDrawObjectByAnchorFrm( const SwFrm& _rAnchorFrm ); 521 522 // virtuelle Methoden von SdrObjUserCall 523 virtual void Changed(const SdrObject& rObj, SdrUserCallType eType, const Rectangle& rOldBoundRect); 524 525 // wird von Changed() und auch vom UndoDraw benutzt, uebernimmt 526 // das Notifien von Absaetzen, die ausweichen muessen 527 void _Changed(const SdrObject& rObj, SdrUserCallType eType, const Rectangle* pOldBoundRect); 528 529 //Moved alle SW-Verbindungen zu dem neuen Master. 530 void ChangeMasterObject( SdrObject *pNewMaster ); 531 532 // OD 19.06.2003 #108784# 533 SwDrawVirtObj* AddVirtObj(); 534 535 // OD 20.06.2003 #108784# 536 void NotifyBackgrdOfAllVirtObjs( const Rectangle* pOldBoundRect ); 537 538 /** get data collection of anchored objects, handled by with contact 539 540 OD 2004-08-23 #110810# 541 542 @author 543 */ 544 545 static void GetTextObjectsFromFmt( std::list<SdrTextObj*>&, SwDoc* ); 546 virtual void GetAnchoredObjs( std::list<SwAnchoredObject*>& _roAnchoredObjs ) const; 547 }; 548 549 #endif 550